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;
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;
}
}

View File

@@ -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<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.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) {
// ;
// }
// }
}

View File

@@ -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();