diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/blitter/8bpp_optimized.cpp | 18 | ||||
-rw-r--r-- | src/blitter/8bpp_optimized.hpp | 5 | ||||
-rw-r--r-- | src/sound.cpp | 2 | ||||
-rw-r--r-- | src/zoom_type.h | 3 |
4 files changed, 18 insertions, 10 deletions
diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index 05e4bf257..3fb20e74b 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -14,10 +14,11 @@ static FBlitter_8bppOptimized iFBlitter_8bppOptimized; void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) { /* Find the offset of this zoom-level */ - uint offset = ((const uint8 *)bp->sprite)[(int)(zoom - ZOOM_LVL_BEGIN) * 2] | ((const byte *)bp->sprite)[(int)(zoom - ZOOM_LVL_BEGIN) * 2 + 1] << 8; + const SpriteData *sprite_src = (const SpriteData *)bp->sprite; + uint offset = sprite_src->offset[zoom]; /* Find where to start reading in the source sprite */ - const uint8 *src = (const uint8 *)bp->sprite + offset; + const uint8 *src = sprite_src->data + offset; uint8 *dst_line = (uint8 *)bp->dst + bp->top * bp->pitch + bp->left; /* Skip over the top lines in the source image */ @@ -101,7 +102,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator) { /* Make memory for all zoom-levels */ - uint memory = (int)(ZOOM_LVL_END - ZOOM_LVL_BEGIN) * sizeof(uint16); + uint memory = sizeof(SpriteData); for (ZoomLevel i = ZOOM_LVL_BEGIN; i < ZOOM_LVL_END; i++) { memory += UnScaleByZoom(sprite->height, i) * UnScaleByZoom(sprite->width, i); @@ -109,15 +110,14 @@ Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::All /* We have no idea how much memory we really need, so just guess something */ memory *= 5; - byte *temp_dst = MallocT<byte>(memory); - byte *dst = &temp_dst[(ZOOM_LVL_END - ZOOM_LVL_BEGIN) * 2]; + SpriteData *temp_dst = (SpriteData *)MallocT<byte>(memory); + byte *dst = temp_dst->data; /* Make the sprites per zoom-level */ for (ZoomLevel i = ZOOM_LVL_BEGIN; i < ZOOM_LVL_END; i++) { /* Store the index table */ - uint index = dst - temp_dst; - temp_dst[i * 2] = index & 0xFF; - temp_dst[i * 2 + 1] = (index >> 8) & 0xFF; + uint offset = dst - temp_dst->data; + temp_dst->offset[i] = offset; /* cache values, because compiler can't cache it */ int scaled_height = UnScaleByZoom(sprite->height, i); @@ -179,7 +179,7 @@ Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::All } } - uint size = dst - temp_dst; + uint size = dst - (byte *)temp_dst; /* Safety check, to make sure we guessed the size correctly */ assert(size < memory); diff --git a/src/blitter/8bpp_optimized.hpp b/src/blitter/8bpp_optimized.hpp index d377b522a..85a7b06ad 100644 --- a/src/blitter/8bpp_optimized.hpp +++ b/src/blitter/8bpp_optimized.hpp @@ -10,6 +10,11 @@ class Blitter_8bppOptimized : public Blitter_8bppBase { public: + struct SpriteData { + uint32 offset[ZOOM_LVL_COUNT]; ///< offsets (from .data) to streams for different zoom levels + byte data[VARARRAY_SIZE]; ///< data, all zoomlevels + }; + /* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); /* virtual */ Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator); diff --git a/src/sound.cpp b/src/sound.cpp index e610c53a7..ab5872b12 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -167,7 +167,7 @@ static void StartSound(uint sound, int panning, uint volume) static const byte _vol_factor_by_zoom[] = {255, 190, 134, 87}; -assert_compile(lengthof(_vol_factor_by_zoom) == ZOOM_LVL_END - ZOOM_LVL_BEGIN); +assert_compile(lengthof(_vol_factor_by_zoom) == ZOOM_LVL_COUNT); static const byte _sound_base_vol[] = { 128, 90, 128, 128, 128, 128, 128, 128, diff --git a/src/zoom_type.h b/src/zoom_type.h index 2929e7309..af314ad11 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -16,6 +16,9 @@ enum ZoomLevel { ZOOM_LVL_OUT_8X, ZOOM_LVL_END, + /* Number of zoom levels */ + ZOOM_LVL_COUNT = ZOOM_LVL_END - ZOOM_LVL_BEGIN, + /* Here we define in which zoom viewports are */ ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL, ZOOM_LVL_NEWS = ZOOM_LVL_NORMAL, |