summaryrefslogtreecommitdiff
path: root/src/spritecache.cpp
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2007-06-11 11:50:49 +0000
committertruelight <truelight@openttd.org>2007-06-11 11:50:49 +0000
commit6b101cc177a9e689dd193041b82661ab140b817c (patch)
tree2fcb96fde1458283649c1303c0436fcfb369de55 /src/spritecache.cpp
parent68c369ea98c4379c25300d055eb206ff8f4442cb (diff)
downloadopenttd-6b101cc177a9e689dd193041b82661ab140b817c.tar.xz
(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 <blitter>, -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
Diffstat (limited to 'src/spritecache.cpp')
-rw-r--r--src/spritecache.cpp60
1 files changed, 19 insertions, 41 deletions
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);