summaryrefslogtreecommitdiff
path: root/src/blitter
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-06-17 17:25:22 +0000
committersmatz <smatz@openttd.org>2008-06-17 17:25:22 +0000
commitdedb0033b3647d795a23118a22f227d7af33960d (patch)
tree9b850fb11338018338cebc973ce92041435aaeb3 /src/blitter
parent6d4590ec7c4ab5d3a8335d1231ac13c932d42134 (diff)
downloadopenttd-dedb0033b3647d795a23118a22f227d7af33960d.tar.xz
(svn r13551) -Codechange: store offsets to different zoom levels in a distinguished struct instead in the data stream for 8bpp-optimized
Diffstat (limited to 'src/blitter')
-rw-r--r--src/blitter/8bpp_optimized.cpp18
-rw-r--r--src/blitter/8bpp_optimized.hpp5
2 files changed, 14 insertions, 9 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);