From d0250f6108d5f882ced1d5dff47354b41ca0c694 Mon Sep 17 00:00:00 2001 From: truelight Date: Mon, 11 Jun 2007 18:49:55 +0000 Subject: [PATCH] (svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks... --- src/spritecache.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/spritecache.cpp b/src/spritecache.cpp index d7f7a2b5a3..438becf72a 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -144,7 +144,46 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id) sc->ptr = dest; FioReadBlock(dest, num); - return dest; + return sc->ptr; + } + /* Ugly hack to work around the problem that the old landscape + * generator assumes that those sprites are stored uncompressed in + * the memory, and they are only read directly by the code, never + * send to the blitter. So do not send it to the blitter (which will + * result in a data array in the format the blitter likes most), but + * read the data directly from disk and store that as sprite. + * Ugly: yes. Other solution: no. Blame the original author or + * something ;) The image should really have been a data-stream + * (so type = 0xFF basicly). */ + if (id >= 4845 && id <= 4881) { + uint height = FioReadByte(); + uint width = FioReadWord(); + Sprite *sprite; + byte *dest; + + num = width * height; + sprite = (Sprite *)AllocSprite(sizeof(*sprite) + num); + sc->ptr = sprite; + sprite->height = height; + 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; + for (; i > 0; --i) *dest++ = *rel++; + } + } + + return sc->ptr; } SpriteLoaderGrf sprite_loader;