Add new toBufferedOutline method to SpritePixels
Add method that returns item image with outline to SpritePixels. Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.api;
|
package net.runelite.api;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,4 +77,19 @@ public interface SpritePixels
|
|||||||
* @throws IllegalArgumentException if the width or height do not match
|
* @throws IllegalArgumentException if the width or height do not match
|
||||||
*/
|
*/
|
||||||
void toBufferedImage(BufferedImage img) throws IllegalArgumentException;
|
void toBufferedImage(BufferedImage img) throws IllegalArgumentException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the contents of the SpritePixels with chosen outline to the BufferedImage
|
||||||
|
*
|
||||||
|
* @param color target color
|
||||||
|
*/
|
||||||
|
BufferedImage toBufferedOutline(Color color);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the contents of the SpritePixels with chosen outline to the BufferedImage
|
||||||
|
*
|
||||||
|
* @param img target image
|
||||||
|
* @param color target color
|
||||||
|
*/
|
||||||
|
void toBufferedOutline(BufferedImage img, int color);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.mixins;
|
package net.runelite.mixins;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import net.runelite.api.mixins.Inject;
|
import net.runelite.api.mixins.Inject;
|
||||||
import net.runelite.api.mixins.Mixin;
|
import net.runelite.api.mixins.Mixin;
|
||||||
@@ -68,4 +69,68 @@ public abstract class RSSpritePixelsMixin implements RSSpritePixels
|
|||||||
|
|
||||||
img.setRGB(0, 0, width, height, transPixels, 0, width);
|
img.setRGB(0, 0, width, height, transPixels, 0, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Override
|
||||||
|
public BufferedImage toBufferedOutline(Color color)
|
||||||
|
{
|
||||||
|
BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
|
||||||
|
toBufferedOutline(img, color.getRGB());
|
||||||
|
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Override
|
||||||
|
public void toBufferedOutline(BufferedImage img, int color)
|
||||||
|
{
|
||||||
|
int width = getWidth();
|
||||||
|
int height = getHeight();
|
||||||
|
|
||||||
|
if (img.getWidth() != width || img.getHeight() != height)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Image bounds do not match SpritePixels");
|
||||||
|
}
|
||||||
|
|
||||||
|
int[] pixels = getPixels();
|
||||||
|
int[] newPixels = new int[width * height];
|
||||||
|
int pixelIndex = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < width; ++x)
|
||||||
|
{
|
||||||
|
int pixel = pixels[pixelIndex];
|
||||||
|
if (pixel == 16777215 || pixel == 0)
|
||||||
|
{
|
||||||
|
// W
|
||||||
|
if (x > 0 && pixels[pixelIndex - 1] != 0)
|
||||||
|
{
|
||||||
|
pixel = color;
|
||||||
|
}
|
||||||
|
// N
|
||||||
|
else if (y > 0 && pixels[pixelIndex - width] != 0)
|
||||||
|
{
|
||||||
|
pixel = color;
|
||||||
|
}
|
||||||
|
// E
|
||||||
|
else if (x < width - 1 && pixels[pixelIndex + 1] != 0)
|
||||||
|
{
|
||||||
|
pixel = color;
|
||||||
|
}
|
||||||
|
// S
|
||||||
|
else if (y < height - 1 && pixels[pixelIndex + width] != 0)
|
||||||
|
{
|
||||||
|
pixel = color;
|
||||||
|
}
|
||||||
|
newPixels[pixelIndex] = pixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixelIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img.setRGB(0, 0, width, height, newPixels, 0, width);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user