From 6b101cc177a9e689dd193041b82661ab140b817c Mon Sep 17 00:00:00 2001 From: truelight Date: Mon, 11 Jun 2007 11:50:49 +0000 Subject: (svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code -Add: make it possible to pick your own blitter (-b , -h for overview) -Add: added a new optimized 8bpp blitter (default, caches sprites of all zoom-levels) -Add: added a debug 8bpp blitter and a very slow normal 8bpp blitter --- src/spritecache.cpp | 60 +++++++++++++++++------------------------------------ 1 file changed, 19 insertions(+), 41 deletions(-) (limited to 'src/spritecache.cpp') diff --git a/src/spritecache.cpp b/src/spritecache.cpp index c45c92d96..f3ea8a1e4 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -11,10 +11,11 @@ #include "table/sprites.h" #include "fileio.h" #include "helpers.hpp" +#include "spriteloader/grf.hpp" +#include "blitter/blitter.hpp" - -/* Default of 2MB spritecache */ -uint _sprite_cache_size = 2; +/* Default of 4MB spritecache */ +uint _sprite_cache_size = 4; struct SpriteCache { @@ -115,12 +116,10 @@ bool SpriteExists(SpriteID id) return GetSpriteCache(id)->file_pos != 0; } -static void* AllocSprite(size_t); +void* AllocSprite(size_t); static void* ReadSprite(SpriteCache *sc, SpriteID id) { - uint num; - byte type; uint32 file_pos = sc->file_pos; DEBUG(sprite, 9, "Load sprite %d", id); @@ -135,49 +134,28 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id) FioSeekToFile(file_pos); - num = FioReadWord(); - type = FioReadByte(); + /* Read the size and type */ + int num = FioReadWord(); + byte type = FioReadByte(); + /* Type 0xFF indicates either a colormap or some other non-sprite info */ if (type == 0xFF) { - byte* dest = (byte*)AllocSprite(num); + byte *dest = (byte *)AllocSprite(num); sc->ptr = dest; FioReadBlock(dest, num); return dest; - } else { - uint height = FioReadByte(); - uint width = FioReadWord(); - Sprite* sprite; - byte* dest; - - num = (type & 0x02) ? width * height : num - 8; - sprite = (Sprite*)AllocSprite(sizeof(*sprite) + num); - sc->ptr = sprite; - sprite->info = type; - sprite->height = (id != 142) ? height : 10; // Compensate for a TTD bug - sprite->width = width; - sprite->x_offs = FioReadWord(); - sprite->y_offs = FioReadWord(); - - dest = sprite->data; - while (num > 0) { - int8 i = FioReadByte(); - - if (i >= 0) { - num -= i; - for (; i > 0; --i) *dest++ = FioReadByte(); - } else { - const byte* rel = dest - (((i & 7) << 8) | FioReadByte()); + } - i = -(i >> 3); - num -= i; + SpriteLoaderGrf sprite_loader; + SpriteLoader::Sprite sprite; - for (; i > 0; --i) *dest++ = *rel++; - } - } + if (!sprite_loader.LoadSprite(&sprite, file_pos)) return NULL; + if (id == 142) sprite.height = 10; // Compensate for a TTD bug + sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite); + free(sprite.data); - return sprite; - } + return sc->ptr; } @@ -348,7 +326,7 @@ static void DeleteEntryFromSpriteCache() } } -static void* AllocSprite(size_t mem_req) +void* AllocSprite(size_t mem_req) { mem_req += sizeof(MemBlock); -- cgit v1.2.3-54-g00ecf