From 86578fcc1227191c221c60d7c7a0d39b03746f61 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 17 Mar 2018 21:12:55 -0400 Subject: [PATCH] cache controller: expose item sprites --- .../http/service/cache/CacheController.java | 111 +++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/http-service/src/main/java/net/runelite/http/service/cache/CacheController.java b/http-service/src/main/java/net/runelite/http/service/cache/CacheController.java index ae11afff70..9e4c0ab0bb 100644 --- a/http-service/src/main/java/net/runelite/http/service/cache/CacheController.java +++ b/http-service/src/main/java/net/runelite/http/service/cache/CacheController.java @@ -24,30 +24,47 @@ */ package net.runelite.http.service.cache; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; +import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; import net.runelite.cache.ConfigType; import net.runelite.cache.IndexType; import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.definitions.ModelDefinition; import net.runelite.cache.definitions.NpcDefinition; import net.runelite.cache.definitions.ObjectDefinition; +import net.runelite.cache.definitions.SpriteDefinition; +import net.runelite.cache.definitions.TextureDefinition; import net.runelite.cache.definitions.loaders.ItemLoader; +import net.runelite.cache.definitions.loaders.ModelLoader; import net.runelite.cache.definitions.loaders.NpcLoader; import net.runelite.cache.definitions.loaders.ObjectLoader; +import net.runelite.cache.definitions.loaders.SpriteLoader; +import net.runelite.cache.definitions.loaders.TextureLoader; +import net.runelite.cache.definitions.providers.ItemProvider; +import net.runelite.cache.definitions.providers.ModelProvider; +import net.runelite.cache.definitions.providers.SpriteProvider; +import net.runelite.cache.definitions.providers.TextureProvider; import net.runelite.cache.fs.ArchiveFiles; +import net.runelite.cache.fs.Container; import net.runelite.cache.fs.FSFile; +import net.runelite.cache.item.ItemSpriteFactory; import net.runelite.http.api.cache.Cache; import net.runelite.http.api.cache.CacheArchive; import net.runelite.http.api.cache.CacheIndex; -import net.runelite.http.service.util.exception.NotFoundException; import net.runelite.http.service.cache.beans.ArchiveEntry; import net.runelite.http.service.cache.beans.CacheEntry; import net.runelite.http.service.cache.beans.IndexEntry; +import net.runelite.http.service.util.exception.NotFoundException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -204,6 +221,98 @@ public class CacheController return itemdef; } + @RequestMapping(path = "item/{itemId}/image", produces = "image/png") + public ResponseEntity getItemImage( + @PathVariable int itemId, + @RequestParam(defaultValue = "1") int quantity, + @RequestParam(defaultValue = "1") int border, + @RequestParam(defaultValue = "3153952") int shadowColor + ) throws IOException + { + final CacheEntry cache = cacheService.findMostRecent(); + ItemProvider itemProvider = new ItemProvider() + { + @Override + public ItemDefinition provide(int itemId) + { + try + { + return getItem(itemId); + } + catch (IOException ex) + { + log.warn(null, ex); + return null; + } + } + }; + ModelProvider modelProvider = new ModelProvider() + { + @Override + public ModelDefinition provide(int modelId) throws IOException + { + IndexEntry indexEntry = cacheService.findIndexForCache(cache, IndexType.MODELS.getNumber()); + ArchiveEntry archiveEntry = cacheService.findArchiveForIndex(indexEntry, modelId); + byte[] archiveData = Container.decompress(cacheService.getArchive(archiveEntry), null).data; + return new ModelLoader().load(modelId, archiveData); + } + }; + SpriteProvider spriteProvider = new SpriteProvider() + { + @Override + public SpriteDefinition provide(int spriteId, int frameId) + { + try + { + IndexEntry indexEntry = cacheService.findIndexForCache(cache, IndexType.SPRITES.getNumber()); + ArchiveEntry archiveEntry = cacheService.findArchiveForIndex(indexEntry, spriteId); + byte[] archiveData = Container.decompress(cacheService.getArchive(archiveEntry), null).data; + SpriteDefinition[] defs = new SpriteLoader().load(spriteId, archiveData); + return defs[frameId]; + } + catch (Exception ex) + { + log.warn(null, ex); + return null; + } + } + }; + + TextureProvider textureProvider2 = new TextureProvider() + { + @Override + public TextureDefinition[] provide() + { + try + { + IndexEntry indexEntry = cacheService.findIndexForCache(cache, IndexType.TEXTURES.getNumber()); + ArchiveEntry archiveEntry = cacheService.findArchiveForIndex(indexEntry, 0); + ArchiveFiles archiveFiles = cacheService.getArchiveFiles(archiveEntry); + TextureLoader loader = new TextureLoader(); + TextureDefinition[] defs = new TextureDefinition[archiveFiles.getFiles().size()]; + int i = 0; + for (FSFile file : archiveFiles.getFiles()) + { + TextureDefinition def = loader.load(file.getFileId(), file.getContents()); + defs[i++] = def; + } + return defs; + } + catch (Exception ex) + { + log.warn(null, ex); + return null; + } + } + }; + + BufferedImage itemImage = ItemSpriteFactory.createSprite(itemProvider, modelProvider, spriteProvider, textureProvider2, + itemId, quantity, border, shadowColor, false); + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + ImageIO.write(itemImage, "png", bao); + return ResponseEntity.ok(bao.toByteArray()); + } + @RequestMapping("object/{objectId}") public ObjectDefinition getObject( @PathVariable int objectId