From abb7d699b70b70ff16372a93bdd2d8b34df4066f Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 12 Nov 2015 20:01:33 -0500 Subject: [PATCH] Little bit of rewriting --- .../cache/definitions/SpriteDefinition.java | 203 +++++++----------- .../definitions/loaders/SpriteLoader.java | 137 +++++++++++- .../runelite/cache/renderable/RGBSprite.java | 123 ++++++----- .../cache/loaders/SpriteLoaderTest.java | 15 +- 4 files changed, 302 insertions(+), 176 deletions(-) diff --git a/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java b/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java index e06115880a..2a78da204d 100644 --- a/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java +++ b/src/main/java/net/runelite/cache/definitions/SpriteDefinition.java @@ -1,141 +1,102 @@ package net.runelite.cache.definitions; -import net.runelite.cache.io.InputStream; +import net.runelite.cache.definitions.loaders.SpriteLoader; -/** - * Created by Allen Kinzalow on 3/15/2015. - */ -public class SpriteDefinition extends Definition { +public class SpriteDefinition +{ + private SpriteLoader loader; + private int offsetX; + private int offsetY; + private int width; + private int height; + private byte[] pixels; + private int maxWidth; + private int maxHeight; - int offsetX; - int offsetY; - int width; - int height; - int[] palette; - byte[] pixels; - int maxWidth; - int maxHeight; + public SpriteDefinition(SpriteLoader loader) + { + this.loader = loader; + } - public static int paletteChildCount; - public static int[] loadedSpriteOffsetX; - public static int[] loadedSpriteOffsetY; - public static int[] loadedSpriteWidth; - public static int[] loadedSpriteHeight; - public static byte[][] loadedSpritePixels; - public static int[] loadedPalette; - public static int loadedSpriteMaxWidth; - public static int loadedSpriteMaxHeight; + public SpriteLoader getLoader() + { + return loader; + } - public SpriteDefinition(int definitionID) { - super(definitionID); - } + public void setLoader(SpriteLoader loader) + { + this.loader = loader; + } - @Override - public void decode(InputStream stream) { - stream.setOffset(stream.getLength() - 2); - paletteChildCount = stream.readUnsignedShort(); - loadedSpriteOffsetX = new int[paletteChildCount ]; - loadedSpriteOffsetY = new int[paletteChildCount]; - loadedSpriteWidth = new int[paletteChildCount]; - loadedSpriteHeight = new int[paletteChildCount]; - loadedSpritePixels = new byte[paletteChildCount][]; - stream.setOffset(stream.getLength() - 7 - paletteChildCount * 8); - loadedSpriteMaxWidth = stream.readUnsignedShort(); - loadedSpriteMaxHeight = stream.readUnsignedShort(); - int var3 = (stream.readUnsignedByte() & 255) + 1; + public int getOffsetX() + { + return offsetX; + } - int spriteIndex; - for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { - loadedSpriteOffsetX[spriteIndex] = stream.readUnsignedShort(); - } + public void setOffsetX(int offsetX) + { + this.offsetX = offsetX; + } - for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { - loadedSpriteOffsetY[spriteIndex] = stream.readUnsignedShort(); - } + public int getOffsetY() + { + return offsetY; + } - for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { - loadedSpriteWidth[spriteIndex] = stream.readUnsignedShort(); - } + public void setOffsetY(int offsetY) + { + this.offsetY = offsetY; + } - for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { - loadedSpriteHeight[spriteIndex] = stream.readUnsignedShort(); - } + public int getWidth() + { + return width; + } - stream.setOffset(stream.getLength() - 7 - paletteChildCount * 8 - (var3 - 1) * 3); - loadedPalette = new int[var3]; + public void setWidth(int width) + { + this.width = width; + } - for(spriteIndex = 1; spriteIndex < var3; ++spriteIndex) { - loadedPalette[spriteIndex] = stream.read24BitInt(); - if(0 == loadedPalette[spriteIndex]) { - loadedPalette[spriteIndex] = 1; - } - } + public int getHeight() + { + return height; + } - stream.setOffset(0); + public void setHeight(int height) + { + this.height = height; + } - for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { - int width = loadedSpriteWidth[spriteIndex]; - int height = loadedSpriteHeight[spriteIndex]; - int dimmension = width * height; - byte[] loadPixels = new byte[dimmension]; - loadedSpritePixels[spriteIndex] = loadPixels; - int var4 = stream.readUnsignedByte(); - int var5; - if(var4 == 0) { - for(var5 = 0; var5 < dimmension; ++var5) { - loadPixels[var5] = (byte)stream.readByte(); - } - } else if(1 == var4) { - for(var5 = 0; var5 < width; ++var5) { - for(int var8 = 0; var8 < height; ++var8) { - loadPixels[width * var8 + var5] = (byte)stream.readByte(); - } - } - } - } - } + public byte[] getPixels() + { + return pixels; + } - public static SpriteDefinition getLastLoadedPaletteSprite() { - SpriteDefinition paletteSprite = new SpriteDefinition(0); - paletteSprite.maxWidth = loadedSpriteMaxWidth; - paletteSprite.maxHeight = loadedSpriteMaxHeight; - paletteSprite.offsetX = loadedSpriteOffsetX[0]; - paletteSprite.offsetY = loadedSpriteOffsetY[0]; - paletteSprite.width = loadedSpriteWidth[0]; - paletteSprite.height = loadedSpriteHeight[0]; - paletteSprite.palette = loadedPalette; - paletteSprite.pixels = loadedSpritePixels[0]; - resetLastPaletteValues(); - return paletteSprite; - } + public void setPixels(byte[] pixels) + { + this.pixels = pixels; + } - public static void resetLastPaletteValues() { - loadedSpriteOffsetX = null; - loadedSpriteOffsetY = null; - loadedSpriteWidth = null; - loadedSpriteHeight = null; - loadedPalette = null; - loadedSpritePixels = null; - } + public int getMaxWidth() + { + return maxWidth; + } - public static SpriteDefinition[] loadPaletteSpriteSet() { - SpriteDefinition[] palettes = new SpriteDefinition[paletteChildCount]; - for (int paletteIndex = 0; paletteIndex < paletteChildCount; ++paletteIndex) { - SpriteDefinition palette = palettes[paletteIndex] = new SpriteDefinition(0); - palette.maxWidth = loadedSpriteMaxWidth; - palette.maxHeight = loadedSpriteMaxHeight; - palette.offsetX = loadedSpriteOffsetX[paletteIndex]; - palette.offsetY = loadedSpriteOffsetY[paletteIndex]; - palette.width = loadedSpriteWidth[paletteIndex]; - palette.height = loadedSpriteHeight[paletteIndex]; - palette.palette = loadedPalette; - palette.pixels = loadedSpritePixels[paletteIndex]; - } + public void setMaxWidth(int maxWidth) + { + this.maxWidth = maxWidth; + } - resetLastPaletteValues(); - return palettes; - } - - @Override - void decodeValues(int opcode, InputStream stream) { } + public int getMaxHeight() + { + return maxHeight; + } + + public void setMaxHeight(int maxHeight) + { + this.maxHeight = maxHeight; + } + + } diff --git a/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java b/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java index c94aabe88b..8a83885dde 100644 --- a/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java +++ b/src/main/java/net/runelite/cache/definitions/loaders/SpriteLoader.java @@ -1,6 +1,141 @@ package net.runelite.cache.definitions.loaders; +import java.util.HashSet; +import java.util.List; +import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.io.InputStream; + public class SpriteLoader { -fff + private SpriteDefinition[] sprites; + //private List sprites = new HashSet<>(); +// public int paletteChildCount; +// public int[] loadedSpriteOffsetX; +// public int[] loadedSpriteOffsetY; +// public int[] loadedSpriteWidth; +// public int[] loadedSpriteHeight; +// public byte[][] loadedSpritePixels; + public int[] loadedPalette; + public int loadedSpriteMaxWidth; + public int loadedSpriteMaxHeight; + + //@Override + public void decode(InputStream stream) + { + stream.setOffset(stream.getLength() - 2); + int paletteChildCount = stream.readUnsignedShort(); + sprites = new SpriteDefinition[paletteChildCount]; + for (int i = 0; i < paletteChildCount; ++i) + sprites[i] = new SpriteDefinition(this); + //loadedSpriteOffsetX = new int[paletteChildCount ]; + //loadedSpriteOffsetY = new int[paletteChildCount]; + //loadedSpriteWidth = new int[paletteChildCount]; + //loadedSpriteHeight = new int[paletteChildCount]; + //loadedSpritePixels = new byte[paletteChildCount][]; + stream.setOffset(stream.getLength() - 7 - paletteChildCount * 8); + loadedSpriteMaxWidth = stream.readUnsignedShort(); + loadedSpriteMaxHeight = stream.readUnsignedShort(); + int var3 = (stream.readUnsignedByte() & 255) + 1; + + int spriteIndex; + for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { + sprites[spriteIndex].setOffsetX(stream.readUnsignedShort()); + } + + for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { + sprites[spriteIndex].setOffsetY(stream.readUnsignedShort()); + } + + for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { + sprites[spriteIndex].setWidth(stream.readUnsignedShort()); + } + + for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { + sprites[spriteIndex].setHeight(stream.readUnsignedShort()); + } + + stream.setOffset(stream.getLength() - 7 - paletteChildCount * 8 - (var3 - 1) * 3); + loadedPalette = new int[var3]; + + for(spriteIndex = 1; spriteIndex < var3; ++spriteIndex) { + loadedPalette[spriteIndex] = stream.read24BitInt(); + if(0 == loadedPalette[spriteIndex]) { + loadedPalette[spriteIndex] = 1; + } + } + + stream.setOffset(0); + + for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { + SpriteDefinition def = sprites[spriteIndex]; + int width = def.getWidth(); + int height = def.getHeight(); + int dimmension = width * height; + byte[] loadPixels = new byte[dimmension]; + //loadedSpritePixels[spriteIndex] = loadPixels; + int var4 = stream.readUnsignedByte(); + int var5; + if(var4 == 0) { + for(var5 = 0; var5 < dimmension; ++var5) { + loadPixels[var5] = (byte)stream.readByte(); + } + } else if(1 == var4) { + for(var5 = 0; var5 < width; ++var5) { + for(int var8 = 0; var8 < height; ++var8) { + loadPixels[width * var8 + var5] = (byte)stream.readByte(); + } + } + } + def.setPixels(loadPixels); + } + } + + + +// public static SpriteDefinition getLastLoadedPaletteSprite() { +// SpriteDefinition paletteSprite = new SpriteDefinition(0); +// paletteSprite.maxWidth = loadedSpriteMaxWidth; +// paletteSprite.maxHeight = loadedSpriteMaxHeight; +// paletteSprite.offsetX = loadedSpriteOffsetX[0]; +// paletteSprite.offsetY = loadedSpriteOffsetY[0]; +// paletteSprite.width = loadedSpriteWidth[0]; +// paletteSprite.height = loadedSpriteHeight[0]; +// paletteSprite.palette = loadedPalette; +// paletteSprite.pixels = loadedSpritePixels[0]; +// resetLastPaletteValues(); +// return paletteSprite; +// } +// +// public static void resetLastPaletteValues() { +// loadedSpriteOffsetX = null; +// loadedSpriteOffsetY = null; +// loadedSpriteWidth = null; +// loadedSpriteHeight = null; +// loadedPalette = null; +// loadedSpritePixels = null; +// } +// +// public static SpriteDefinition[] loadPaletteSpriteSet() { +// SpriteDefinition[] palettes = new SpriteDefinition[paletteChildCount]; +// for (int paletteIndex = 0; paletteIndex < paletteChildCount; ++paletteIndex) { +// SpriteDefinition palette = palettes[paletteIndex] = new SpriteDefinition(0); +// palette.maxWidth = loadedSpriteMaxWidth; +// palette.maxHeight = loadedSpriteMaxHeight; +// palette.offsetX = loadedSpriteOffsetX[paletteIndex]; +// palette.offsetY = loadedSpriteOffsetY[paletteIndex]; +// palette.width = loadedSpriteWidth[paletteIndex]; +// palette.height = loadedSpriteHeight[paletteIndex]; +// palette.palette = loadedPalette; +// palette.pixels = loadedSpritePixels[paletteIndex]; +// } +// +// resetLastPaletteValues(); +// return palettes; +// } + + + public SpriteDefinition[] getSprites() + { + return sprites; + } } diff --git a/src/main/java/net/runelite/cache/renderable/RGBSprite.java b/src/main/java/net/runelite/cache/renderable/RGBSprite.java index 488cea9a83..b5ef0a36a6 100644 --- a/src/main/java/net/runelite/cache/renderable/RGBSprite.java +++ b/src/main/java/net/runelite/cache/renderable/RGBSprite.java @@ -4,20 +4,16 @@ package net.runelite.cache.renderable; import java.awt.*; import java.awt.image.*; import net.runelite.cache.definitions.SpriteDefinition; -import net.runelite.cache.fs.Store; -/** - * Created by Allen Kinzalow on 3/14/2015. - */ -public class RGBSprite /*extends Rasterizer2D*/ { - - public int offsetY; - public int spriteWidth; - public int spriteHeight; - public int offsetX; - public int maxHeight; - public int maxWidth; - public int[] pixels; +public class RGBSprite +{ + public int offsetY; + public int spriteWidth; + public int spriteHeight; + public int offsetX; + public int maxHeight; + public int maxWidth; + public int[] pixels; // public static RGBSprite getRGBSprite(Store store, int archiveId, int fileId, byte var3) { // if(!SpriteDefinition.loadPaletteSprite(store, archiveId, fileId, -1593817854)) { @@ -42,26 +38,51 @@ public class RGBSprite /*extends Rasterizer2D*/ { // return sprite; // } // } + + public static RGBSprite fromSpriteDefinition(SpriteDefinition def) + { + RGBSprite sprite = new RGBSprite(); + + sprite.maxWidth = def.getMaxWidth(); + sprite.maxHeight = def.getMaxHeight(); + sprite.offsetX = def.getOffsetX(); + sprite.offsetY = def.getOffsetY(); + sprite.spriteWidth = def.getWidth(); + sprite.spriteHeight = def.getHeight(); + + int dimmension = sprite.spriteWidth * sprite.spriteHeight; + byte[] pixels = def.getPixels(); + int[] palette = def.getLoader().loadedPalette; + + sprite.pixels = new int[dimmension]; - public static RGBSprite getRGBSprite(int index) { - RGBSprite sprite = new RGBSprite(); - sprite.maxWidth = SpriteDefinition.loadedSpriteMaxWidth; - sprite.maxHeight = SpriteDefinition.loadedSpriteMaxHeight; - sprite.offsetX = SpriteDefinition.loadedSpriteOffsetX[index]; - sprite.offsetY = SpriteDefinition.loadedSpriteOffsetY[index]; - sprite.spriteWidth = SpriteDefinition.loadedSpriteWidth[index]; - sprite.spriteHeight = SpriteDefinition.loadedSpriteHeight[index]; - int dimmension = sprite.spriteWidth * sprite.spriteHeight; - byte[] var6 = SpriteDefinition.loadedSpritePixels[index]; - sprite.pixels = new int[dimmension]; + for (int pos = 0; pos < dimmension; ++pos) + { + sprite.pixels[pos] = palette[pixels[pos] & 255]; + } - for(int pos = 0; pos < dimmension; ++pos) { - sprite.pixels[pos] = SpriteDefinition.loadedPalette[var6[pos] & 255]; - } - - //SpriteDefinition.resetLastPaletteValues(); - return sprite; - } + return sprite; + } +// +// public static RGBSprite getRGBSprite(int index) { +// RGBSprite sprite = new RGBSprite(); +// sprite.maxWidth = SpriteDefinition.loadedSpriteMaxWidth; +// sprite.maxHeight = SpriteDefinition.loadedSpriteMaxHeight; +// sprite.offsetX = SpriteDefinition.loadedSpriteOffsetX[index]; +// sprite.offsetY = SpriteDefinition.loadedSpriteOffsetY[index]; +// sprite.spriteWidth = SpriteDefinition.loadedSpriteWidth[index]; +// sprite.spriteHeight = SpriteDefinition.loadedSpriteHeight[index]; +// int dimmension = sprite.spriteWidth * sprite.spriteHeight; +// byte[] var6 = SpriteDefinition.loadedSpritePixels[index]; +// sprite.pixels = new int[dimmension]; +// +// for(int pos = 0; pos < dimmension; ++pos) { +// sprite.pixels[pos] = SpriteDefinition.loadedPalette[var6[pos] & 255]; +// } +// +// //SpriteDefinition.resetLastPaletteValues(); +// return sprite; +// } public BufferedImage getBufferedImage() { BufferedImage bi = new BufferedImage(spriteWidth, spriteHeight, BufferedImage.TYPE_INT_RGB); @@ -1435,25 +1456,25 @@ public class RGBSprite /*extends Rasterizer2D*/ { this.offsetX = this.maxWidth - this.spriteWidth - this.offsetX; } */ - - public RGBSprite(byte[] var1, Component var2) { - try { - Image var3 = Toolkit.getDefaultToolkit().createImage(var1); - MediaTracker var4 = new MediaTracker(var2); - var4.addImage(var3, 0); - var4.waitForAll(); - this.spriteWidth = var3.getWidth(var2); - this.spriteHeight = var3.getHeight(var2); - this.maxWidth = this.spriteWidth; - this.maxHeight = this.spriteHeight; - this.offsetX = 0; - this.offsetY = 0; - this.pixels = new int[this.spriteWidth * this.spriteHeight]; - PixelGrabber var5 = new PixelGrabber(var3, 0, 0, this.spriteWidth, this.spriteHeight, this.pixels, 0, this.spriteWidth); - var5.grabPixels(); - } catch (InterruptedException var6) { - ; - } - } +// +// public RGBSprite(byte[] var1, Component var2) { +// try { +// Image var3 = Toolkit.getDefaultToolkit().createImage(var1); +// MediaTracker var4 = new MediaTracker(var2); +// var4.addImage(var3, 0); +// var4.waitForAll(); +// this.spriteWidth = var3.getWidth(var2); +// this.spriteHeight = var3.getHeight(var2); +// this.maxWidth = this.spriteWidth; +// this.maxHeight = this.spriteHeight; +// this.offsetX = 0; +// this.offsetY = 0; +// this.pixels = new int[this.spriteWidth * this.spriteHeight]; +// PixelGrabber var5 = new PixelGrabber(var3, 0, 0, this.spriteWidth, this.spriteHeight, this.pixels, 0, this.spriteWidth); +// var5.grabPixels(); +// } catch (InterruptedException var6) { +// ; +// } +// } } diff --git a/src/test/java/net/runelite/cache/loaders/SpriteLoaderTest.java b/src/test/java/net/runelite/cache/loaders/SpriteLoaderTest.java index 29abccedf4..0aa1a1f329 100644 --- a/src/test/java/net/runelite/cache/loaders/SpriteLoaderTest.java +++ b/src/test/java/net/runelite/cache/loaders/SpriteLoaderTest.java @@ -7,6 +7,7 @@ import javax.imageio.ImageIO; import net.runelite.cache.IndexType; import net.runelite.cache.StoreLocation; import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.definitions.loaders.SpriteLoader; import net.runelite.cache.fs.Archive; import net.runelite.cache.fs.File; import net.runelite.cache.fs.Index; @@ -37,12 +38,20 @@ public class SpriteLoaderTest File file = files.get(0); byte[] contents = file.getContents(); - SpriteDefinition def = new SpriteDefinition(42); - def.decode(new InputStream(contents)); + SpriteLoader loader = new SpriteLoader(); + loader.decode(new InputStream(contents)); - RGBSprite sp = RGBSprite.getRGBSprite(0); + SpriteDefinition[] defs = loader.getSprites(); +// Assert.assertEquals(1, defs.length); + //SpriteDefinition def = new SpriteDefinition(42); + //def.decode(new InputStream(contents)); + + RGBSprite sp = RGBSprite.fromSpriteDefinition(defs[0]); + + // I don't know why this happens if (sp.spriteHeight <= 0 || sp.spriteWidth <= 0) continue; + BufferedImage image = sp.getBufferedImage(); java.io.File targ = new java.io.File(base, "sprites/" + a.getArchiveId() + ".png"); targ.mkdirs();