From 14d6cd967092a0374960c1f51b28f33b4e670270 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 22 Nov 2018 07:25:57 -0500 Subject: [PATCH] Add implementation of getSprites as it has been inlined --- .../net/runelite/mixins/RSClientMixin.java | 60 +++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 51 ++++++++++++++-- .../net/runelite/rs/api/RSSpritePixels.java | 12 ++++ 3 files changed, 119 insertions(+), 4 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index cab2e9be5a..8945139b9f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -38,6 +38,7 @@ import net.runelite.api.GraphicsObject; import net.runelite.api.HashTable; import net.runelite.api.HintArrowType; import net.runelite.api.Ignore; +import net.runelite.api.IndexDataBase; import net.runelite.api.IndexedSprite; import net.runelite.api.InventoryID; import net.runelite.api.MenuAction; @@ -105,6 +106,7 @@ import net.runelite.rs.api.RSFriendContainer; import net.runelite.rs.api.RSFriendManager; import net.runelite.rs.api.RSHashTable; import net.runelite.rs.api.RSIgnoreContainer; +import net.runelite.rs.api.RSIndexDataBase; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSItem; import net.runelite.rs.api.RSItemContainer; @@ -112,6 +114,7 @@ import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSName; import net.runelite.rs.api.RSNameable; import net.runelite.rs.api.RSPlayer; +import net.runelite.rs.api.RSSpritePixels; import net.runelite.rs.api.RSWidget; import org.slf4j.Logger; @@ -1321,4 +1324,61 @@ public abstract class RSClientMixin implements RSClient skills[++count - 1 & 31] = skill.ordinal(); client.setChangedSkillsCount(count); } + + @Inject + @Override + public RSSpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId) + { + RSIndexDataBase rsSource = (RSIndexDataBase) source; + byte[] configData = rsSource.getConfigData(archiveId, fileId); + if (configData == null) + { + return null; + } + + decodeSprite(configData); + + int indexedSpriteCount = getIndexedSpriteCount(); + int maxWidth = getIndexedSpriteWidth(); + int maxHeight = getIndexedSpriteHeight(); + int[] offsetX = getIndexedSpriteOffsetXs(); + int[] offsetY = getIndexedSpriteOffsetYs(); + int[] widths = getIndexSpriteWidths(); + int[] heights = getIndexedSpriteHeights(); + byte[][] spritePixelsArray = getSpritePixels(); + int[] indexedSpritePalette = getIndexedSpritePalette(); + + RSSpritePixels[] array = new RSSpritePixels[indexedSpriteCount]; + + for (int i = 0; i < indexedSpriteCount; ++i) + { + int width = widths[i]; + int height = heights[i]; + + byte[] pixelArray = spritePixelsArray[i]; + int[] pixels = new int[width * height]; + + RSSpritePixels spritePixels = createSpritePixels(pixels, width, height); + spritePixels.setMaxHeight(maxHeight); + spritePixels.setMaxWidth(maxWidth); + spritePixels.setOffsetX(offsetX[i]); + spritePixels.setOffsetY(offsetY[i]); + + for (int j = 0; j < width * height; ++j) + { + pixels[j] = indexedSpritePalette[pixelArray[j] & 0xff]; + } + + array[i] = spritePixels; + } + + setIndexedSpriteOffsetXs(null); + setIndexedSpriteOffsetYs(null); + setIndexSpriteWidths(null); + setIndexedSpriteHeights(null); + setIndexSpritePalette(null); + setSpritePixels(null); + + return array; + } } \ No newline at end of file diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index a417229b7c..ca08d4945e 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -26,7 +26,6 @@ package net.runelite.rs.api; import java.util.Map; import net.runelite.api.Client; -import net.runelite.api.IndexDataBase; import net.runelite.api.SpritePixels; import net.runelite.api.World; import net.runelite.api.widgets.Widget; @@ -373,9 +372,53 @@ public interface RSClient extends RSGameEngine, Client @Import("createSprite") RSSpritePixels createItemSprite(int itemId, int quantity, int thickness, int borderColor, int stackable, boolean noted); - @Import("getSpritesAsSpritePixels") - @Override - RSSpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId); + @Import("decodeSprite") + void decodeSprite(byte[] data); + + @Import("indexedSpriteCount") + int getIndexedSpriteCount(); + + @Import("indexedSpriteWidth") + int getIndexedSpriteWidth(); + + @Import("indexedSpriteHeight") + int getIndexedSpriteHeight(); + + @Import("indexedSpriteOffsetXs") + int[] getIndexedSpriteOffsetXs(); + + @Import("indexedSpriteOffsetXs") + void setIndexedSpriteOffsetXs(int[] indexedSpriteOffsetXs); + + @Import("indexedSpriteOffsetYs") + int[] getIndexedSpriteOffsetYs(); + + @Import("indexedSpriteOffsetYs") + void setIndexedSpriteOffsetYs(int[] indexedSpriteOffsetYs); + + @Import("indexSpriteWidths") + int[] getIndexSpriteWidths(); + + @Import("indexSpriteWidths") + void setIndexSpriteWidths(int[] indexSpriteWidths); + + @Import("indexedSpriteHeights") + int[] getIndexedSpriteHeights(); + + @Import("indexedSpriteHeights") + void setIndexedSpriteHeights(int[] indexedSpriteHeights); + + @Import("spritePixels") + byte[][] getSpritePixels(); + + @Import("spritePixels") + void setSpritePixels(byte[][] spritePixels); + + @Import("indexedSpritePalette") + int[] getIndexedSpritePalette(); + + @Import("indexedSpritePalette") + void setIndexSpritePalette(int[] indexSpritePalette); @Import("indexSprites") @Override diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java index 394c1c9f47..f69f90ed35 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java @@ -47,4 +47,16 @@ public interface RSSpritePixels extends SpritePixels @Import("setRaster") void setRaster(); + + @Import("maxWidth") + void setMaxWidth(int maxWidth); + + @Import("maxHeight") + void setMaxHeight(int maxHeight); + + @Import("offsetX") + void setOffsetX(int offsetX); + + @Import("offsetY") + void setOffsetY(int offsetY); }