Little bit of rewriting

This commit is contained in:
Adam
2015-11-12 20:01:33 -05:00
parent 1a8e11b7f9
commit abb7d699b7
4 changed files with 302 additions and 176 deletions

View File

@@ -1,141 +1,102 @@
package net.runelite.cache.definitions; package net.runelite.cache.definitions;
import net.runelite.cache.io.InputStream; import net.runelite.cache.definitions.loaders.SpriteLoader;
/** public class SpriteDefinition
* Created by Allen Kinzalow on 3/15/2015. {
*/ private SpriteLoader loader;
public class SpriteDefinition extends Definition { private int offsetX;
private int offsetY;
private int width;
private int height;
private byte[] pixels;
private int maxWidth;
private int maxHeight;
int offsetX; public SpriteDefinition(SpriteLoader loader)
int offsetY; {
int width; this.loader = loader;
int height; }
int[] palette;
byte[] pixels;
int maxWidth;
int maxHeight;
public static int paletteChildCount; public SpriteLoader getLoader()
public static int[] loadedSpriteOffsetX; {
public static int[] loadedSpriteOffsetY; return loader;
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 SpriteDefinition(int definitionID) { public void setLoader(SpriteLoader loader)
super(definitionID); {
} this.loader = loader;
}
@Override public int getOffsetX()
public void decode(InputStream stream) { {
stream.setOffset(stream.getLength() - 2); return offsetX;
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;
int spriteIndex; public void setOffsetX(int offsetX)
for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { {
loadedSpriteOffsetX[spriteIndex] = stream.readUnsignedShort(); this.offsetX = offsetX;
} }
for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { public int getOffsetY()
loadedSpriteOffsetY[spriteIndex] = stream.readUnsignedShort(); {
} return offsetY;
}
for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { public void setOffsetY(int offsetY)
loadedSpriteWidth[spriteIndex] = stream.readUnsignedShort(); {
} this.offsetY = offsetY;
}
for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { public int getWidth()
loadedSpriteHeight[spriteIndex] = stream.readUnsignedShort(); {
} return width;
}
stream.setOffset(stream.getLength() - 7 - paletteChildCount * 8 - (var3 - 1) * 3); public void setWidth(int width)
loadedPalette = new int[var3]; {
this.width = width;
}
for(spriteIndex = 1; spriteIndex < var3; ++spriteIndex) { public int getHeight()
loadedPalette[spriteIndex] = stream.read24BitInt(); {
if(0 == loadedPalette[spriteIndex]) { return height;
loadedPalette[spriteIndex] = 1; }
}
}
stream.setOffset(0); public void setHeight(int height)
{
this.height = height;
}
for(spriteIndex = 0; spriteIndex < paletteChildCount; ++spriteIndex) { public byte[] getPixels()
int width = loadedSpriteWidth[spriteIndex]; {
int height = loadedSpriteHeight[spriteIndex]; return pixels;
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 static SpriteDefinition getLastLoadedPaletteSprite() { public void setPixels(byte[] pixels)
SpriteDefinition paletteSprite = new SpriteDefinition(0); {
paletteSprite.maxWidth = loadedSpriteMaxWidth; this.pixels = pixels;
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() { public int getMaxWidth()
loadedSpriteOffsetX = null; {
loadedSpriteOffsetY = null; return maxWidth;
loadedSpriteWidth = null; }
loadedSpriteHeight = null;
loadedPalette = null;
loadedSpritePixels = null;
}
public static SpriteDefinition[] loadPaletteSpriteSet() { public void setMaxWidth(int maxWidth)
SpriteDefinition[] palettes = new SpriteDefinition[paletteChildCount]; {
for (int paletteIndex = 0; paletteIndex < paletteChildCount; ++paletteIndex) { this.maxWidth = maxWidth;
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(); public int getMaxHeight()
return palettes; {
} return maxHeight;
}
@Override
void decodeValues(int opcode, InputStream stream) { } public void setMaxHeight(int maxHeight)
{
this.maxHeight = maxHeight;
}
} }

View File

@@ -1,6 +1,141 @@
package net.runelite.cache.definitions.loaders; 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 public class SpriteLoader
{ {
fff private SpriteDefinition[] sprites;
//private List<SpriteDefinition> 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;
}
} }

View File

@@ -4,20 +4,16 @@ package net.runelite.cache.renderable;
import java.awt.*; import java.awt.*;
import java.awt.image.*; import java.awt.image.*;
import net.runelite.cache.definitions.SpriteDefinition; import net.runelite.cache.definitions.SpriteDefinition;
import net.runelite.cache.fs.Store;
/** public class RGBSprite
* Created by Allen Kinzalow on 3/14/2015. {
*/ public int offsetY;
public class RGBSprite /*extends Rasterizer2D*/ { public int spriteWidth;
public int spriteHeight;
public int offsetY; public int offsetX;
public int spriteWidth; public int maxHeight;
public int spriteHeight; public int maxWidth;
public int offsetX; public int[] pixels;
public int maxHeight;
public int maxWidth;
public int[] pixels;
// public static RGBSprite getRGBSprite(Store store, int archiveId, int fileId, byte var3) { // public static RGBSprite getRGBSprite(Store store, int archiveId, int fileId, byte var3) {
// if(!SpriteDefinition.loadPaletteSprite(store, archiveId, fileId, -1593817854)) { // if(!SpriteDefinition.loadPaletteSprite(store, archiveId, fileId, -1593817854)) {
@@ -42,26 +38,51 @@ public class RGBSprite /*extends Rasterizer2D*/ {
// return sprite; // 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) { for (int pos = 0; pos < dimmension; ++pos)
RGBSprite sprite = new RGBSprite(); {
sprite.maxWidth = SpriteDefinition.loadedSpriteMaxWidth; sprite.pixels[pos] = palette[pixels[pos] & 255];
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) { return sprite;
sprite.pixels[pos] = SpriteDefinition.loadedPalette[var6[pos] & 255]; }
} //
// public static RGBSprite getRGBSprite(int index) {
//SpriteDefinition.resetLastPaletteValues(); // RGBSprite sprite = new RGBSprite();
return sprite; // 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() { public BufferedImage getBufferedImage() {
BufferedImage bi = new BufferedImage(spriteWidth, spriteHeight, BufferedImage.TYPE_INT_RGB); 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; this.offsetX = this.maxWidth - this.spriteWidth - this.offsetX;
} }
*/ */
//
public RGBSprite(byte[] var1, Component var2) { // public RGBSprite(byte[] var1, Component var2) {
try { // try {
Image var3 = Toolkit.getDefaultToolkit().createImage(var1); // Image var3 = Toolkit.getDefaultToolkit().createImage(var1);
MediaTracker var4 = new MediaTracker(var2); // MediaTracker var4 = new MediaTracker(var2);
var4.addImage(var3, 0); // var4.addImage(var3, 0);
var4.waitForAll(); // var4.waitForAll();
this.spriteWidth = var3.getWidth(var2); // this.spriteWidth = var3.getWidth(var2);
this.spriteHeight = var3.getHeight(var2); // this.spriteHeight = var3.getHeight(var2);
this.maxWidth = this.spriteWidth; // this.maxWidth = this.spriteWidth;
this.maxHeight = this.spriteHeight; // this.maxHeight = this.spriteHeight;
this.offsetX = 0; // this.offsetX = 0;
this.offsetY = 0; // this.offsetY = 0;
this.pixels = new int[this.spriteWidth * this.spriteHeight]; // this.pixels = new int[this.spriteWidth * this.spriteHeight];
PixelGrabber var5 = new PixelGrabber(var3, 0, 0, this.spriteWidth, this.spriteHeight, this.pixels, 0, this.spriteWidth); // PixelGrabber var5 = new PixelGrabber(var3, 0, 0, this.spriteWidth, this.spriteHeight, this.pixels, 0, this.spriteWidth);
var5.grabPixels(); // var5.grabPixels();
} catch (InterruptedException var6) { // } catch (InterruptedException var6) {
; // ;
} // }
} // }
} }

View File

@@ -7,6 +7,7 @@ import javax.imageio.ImageIO;
import net.runelite.cache.IndexType; import net.runelite.cache.IndexType;
import net.runelite.cache.StoreLocation; import net.runelite.cache.StoreLocation;
import net.runelite.cache.definitions.SpriteDefinition; import net.runelite.cache.definitions.SpriteDefinition;
import net.runelite.cache.definitions.loaders.SpriteLoader;
import net.runelite.cache.fs.Archive; import net.runelite.cache.fs.Archive;
import net.runelite.cache.fs.File; import net.runelite.cache.fs.File;
import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Index;
@@ -37,12 +38,20 @@ public class SpriteLoaderTest
File file = files.get(0); File file = files.get(0);
byte[] contents = file.getContents(); byte[] contents = file.getContents();
SpriteDefinition def = new SpriteDefinition(42); SpriteLoader loader = new SpriteLoader();
def.decode(new InputStream(contents)); 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) if (sp.spriteHeight <= 0 || sp.spriteWidth <= 0)
continue; continue;
BufferedImage image = sp.getBufferedImage(); BufferedImage image = sp.getBufferedImage();
java.io.File targ = new java.io.File(base, "sprites/" + a.getArchiveId() + ".png"); java.io.File targ = new java.io.File(base, "sprites/" + a.getArchiveId() + ".png");
targ.mkdirs(); targ.mkdirs();