diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index 1b32e085c5..379e7e9647 100644 --- a/src/blitter/32bpp_anim_sse4.hpp +++ b/src/blitter/32bpp_anim_sse4.hpp @@ -39,7 +39,7 @@ public: template void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override { + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override { return Blitter_32bppSSE_Base::Encode(sprite, allocator); } const char *GetName() override { return "32bpp-sse4-anim"; } diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 104a3cc97d..5492178b51 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -272,7 +272,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, this->Draw(bp, mode, zoom); } -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* streams of pixels (a, r, g, b channels) * @@ -293,7 +293,7 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const ZoomLevel zoom_min; ZoomLevel zoom_max; - if (sprite->type == SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { zoom_min = ZOOM_LVL_NORMAL; zoom_max = ZOOM_LVL_NORMAL; } else { @@ -403,10 +403,10 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(SpriteData) + len); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; SpriteData *dst = (SpriteData *)dest_sprite->data; memset(dst, 0, sizeof(*dst)); @@ -425,10 +425,10 @@ template Sprite *Blitter_32bppOptimized::EncodeInternal(const return dest_sprite; } -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); -template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); +template Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); -Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { return this->EncodeInternal(sprite, allocator); } diff --git a/src/blitter/32bpp_optimized.hpp b/src/blitter/32bpp_optimized.hpp index 9df64eb6c6..e40a0ec667 100644 --- a/src/blitter/32bpp_optimized.hpp +++ b/src/blitter/32bpp_optimized.hpp @@ -22,7 +22,7 @@ public: }; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "32bpp-optimized"; } @@ -30,7 +30,7 @@ public: protected: template void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); - template Sprite *EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); + template Sprite *EncodeInternal(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); }; /** Factory for the optimised 32 bpp blitter (without palette animation). */ diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp index 97c0a6bb2b..30aff86b76 100644 --- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -109,20 +109,20 @@ void Blitter_32bppSimple::DrawColourMappingRect(void *dst, int width, int height Debug(misc, 0, "32bpp blitter doesn't know how to draw this colour table ('{}')", pal); } -Sprite *Blitter_32bppSimple::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Blitter_32bppSimple::Pixel *dst; - Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite->height * (size_t)sprite->width * sizeof(*dst)); + Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width * sizeof(*dst)); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; dst = (Blitter_32bppSimple::Pixel *)dest_sprite->data; - SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite->data; + SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite[ZOOM_LVL_NORMAL].data; - for (int i = 0; i < sprite->height * sprite->width; i++) { + for (int i = 0; i < sprite[ZOOM_LVL_NORMAL].height * sprite[ZOOM_LVL_NORMAL].width; i++) { if (src->m == 0) { dst[i].r = src->r; dst[i].g = src->g; diff --git a/src/blitter/32bpp_simple.hpp b/src/blitter/32bpp_simple.hpp index 9a7417d378..df154ce57d 100644 --- a/src/blitter/32bpp_simple.hpp +++ b/src/blitter/32bpp_simple.hpp @@ -26,7 +26,7 @@ class Blitter_32bppSimple : public Blitter_32bppBase { public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "32bpp-simple"; } }; diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp index e841713b09..1638127b56 100644 --- a/src/blitter/32bpp_sse2.cpp +++ b/src/blitter/32bpp_sse2.cpp @@ -20,7 +20,7 @@ /** Instantiation of the SSE2 32bpp blitter factory. */ static FBlitter_32bppSSE2 iFBlitter_32bppSSE2; -Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* First uint32_t of a line = the number of transparent pixels from the left. * Second uint32_t of a line = the number of transparent pixels from the right. @@ -28,7 +28,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca */ ZoomLevel zoom_min = ZOOM_LVL_NORMAL; ZoomLevel zoom_max = ZOOM_LVL_NORMAL; - if (sprite->type != SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type != SpriteType::Font) { zoom_min = _settings_client.gui.zoom_min; zoom_max = _settings_client.gui.zoom_max; if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_MAX; @@ -52,10 +52,10 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca } Sprite *dst_sprite = (Sprite *) allocator(sizeof(Sprite) + sizeof(SpriteData) + all_sprites_size); - dst_sprite->height = sprite->height; - dst_sprite->width = sprite->width; - dst_sprite->x_offs = sprite->x_offs; - dst_sprite->y_offs = sprite->y_offs; + dst_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dst_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dst_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dst_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; memcpy(dst_sprite->data, &sd, sizeof(SpriteData)); /* Copy colours and determine flags. */ diff --git a/src/blitter/32bpp_sse2.hpp b/src/blitter/32bpp_sse2.hpp index 37f9661b1d..fa643dd3cd 100644 --- a/src/blitter/32bpp_sse2.hpp +++ b/src/blitter/32bpp_sse2.hpp @@ -76,7 +76,7 @@ public: byte data[]; ///< Data, all zoomlevels. }; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator); + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator); }; DECLARE_ENUM_AS_BIT_SET(Blitter_32bppSSE_Base::SpriteFlags); @@ -88,7 +88,7 @@ public: template void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override { + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override { return Blitter_32bppSSE_Base::Encode(sprite, allocator); } diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index 4503ccb26f..0b6d7410c2 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -377,7 +377,7 @@ void Blitter_40bppAnim::DrawColourMappingRect(void *dst, int width, int height, } } -Sprite *Blitter_40bppAnim::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_40bppAnim::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { return this->EncodeInternal(sprite, allocator); } diff --git a/src/blitter/40bpp_anim.hpp b/src/blitter/40bpp_anim.hpp index fac3d64d3c..4371100914 100644 --- a/src/blitter/40bpp_anim.hpp +++ b/src/blitter/40bpp_anim.hpp @@ -27,7 +27,7 @@ public: void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) override; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; size_t BufferSize(uint width, uint height) override; Blitter::PaletteAnimation UsePaletteAnimation() override; bool NeedsAnimationBuffer() override; diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index bfc03f26c8..e86a2a2ff8 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -119,7 +119,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z } } -Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* Make memory for all zoom-levels */ uint memory = sizeof(SpriteData); @@ -127,7 +127,7 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloca ZoomLevel zoom_min; ZoomLevel zoom_max; - if (sprite->type == SpriteType::Font) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font) { zoom_min = ZOOM_LVL_NORMAL; zoom_max = ZOOM_LVL_NORMAL; } else { @@ -220,10 +220,10 @@ Sprite *Blitter_8bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloca /* Allocate the exact amount of memory we need */ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + size); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; memcpy(dest_sprite->data, temp_dst, size); return dest_sprite; diff --git a/src/blitter/8bpp_optimized.hpp b/src/blitter/8bpp_optimized.hpp index 59e9f017b5..169dee0c26 100644 --- a/src/blitter/8bpp_optimized.hpp +++ b/src/blitter/8bpp_optimized.hpp @@ -23,7 +23,7 @@ public: }; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "8bpp-optimized"; } }; diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index a6a556a3c7..be86ddcbe4 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -60,19 +60,19 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom } } -Sprite *Blitter_8bppSimple::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_8bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Sprite *dest_sprite; - dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite->height * (size_t)sprite->width); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + (size_t)sprite[ZOOM_LVL_NORMAL].height * (size_t)sprite[ZOOM_LVL_NORMAL].width); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; /* Copy over only the 'remap' channel, as that is what we care about in 8bpp */ - for (int i = 0; i < sprite->height * sprite->width; i++) { - dest_sprite->data[i] = sprite->data[i].m; + for (int i = 0; i < sprite[ZOOM_LVL_NORMAL].height * sprite[ZOOM_LVL_NORMAL].width; i++) { + dest_sprite->data[i] = sprite[ZOOM_LVL_NORMAL].data[i].m; } return dest_sprite; diff --git a/src/blitter/8bpp_simple.hpp b/src/blitter/8bpp_simple.hpp index 7f3c0a8aad..455d76d937 100644 --- a/src/blitter/8bpp_simple.hpp +++ b/src/blitter/8bpp_simple.hpp @@ -17,7 +17,7 @@ class Blitter_8bppSimple FINAL : public Blitter_8bppBase { public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; const char *GetName() override { return "8bpp-simple"; } }; diff --git a/src/blitter/null.cpp b/src/blitter/null.cpp index 29747b0f96..f73b5ae331 100644 --- a/src/blitter/null.cpp +++ b/src/blitter/null.cpp @@ -15,15 +15,15 @@ /** Instantiation of the null blitter factory. */ static FBlitter_Null iFBlitter_Null; -Sprite *Blitter_Null::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +Sprite *Blitter_Null::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { Sprite *dest_sprite; dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite)); - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; return dest_sprite; } diff --git a/src/blitter/null.hpp b/src/blitter/null.hpp index abf2a5b59f..61c5cab9de 100644 --- a/src/blitter/null.hpp +++ b/src/blitter/null.hpp @@ -18,7 +18,7 @@ public: uint8_t GetScreenDepth() override { return 0; } void Draw(Blitter::BlitterParams *, BlitterMode, ZoomLevel) override {}; void DrawColourMappingRect(void *, int, int, PaletteID) override {}; - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; void *MoveTo(void *, int, int) override { return nullptr; }; void SetPixel(void *, int, int, uint8_t) override {}; void DrawRect(void *, int, int, uint8_t) override {}; diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index bb6f282d0e..3e6ddd0f80 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -235,7 +235,8 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large"); /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, static_cast(width) * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -266,7 +267,7 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = slot->advance.x >> 6; this->SetGlyphPtr(key, &new_glyph); diff --git a/src/fontcache/truetypefontcache.cpp b/src/fontcache/truetypefontcache.cpp index ced99c3f47..196add775c 100644 --- a/src/fontcache/truetypefontcache.cpp +++ b/src/fontcache/truetypefontcache.cpp @@ -136,7 +136,7 @@ const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key) }; #undef CPSET #undef CP___ - static const SpriteLoader::Sprite builtin_questionmark = { + static const SpriteLoader::SpriteCollection builtin_questionmark = {{ { 10, // height 8, // width 0, // x_offs @@ -144,9 +144,9 @@ const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key) SpriteType::Font, SCC_PAL, builtin_questionmark_data - }; + } }}; - Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(&builtin_questionmark, SimpleSpriteAlloc); + Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(builtin_questionmark, SimpleSpriteAlloc); assert(spr != nullptr); GlyphEntry new_glyph; new_glyph.sprite = spr; diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index a9fad3764a..a41af5a26f 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -240,7 +240,8 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) /* Limit glyph size to prevent overflows later on. */ if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large"); - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); sprite.type = SpriteType::Font; sprite.colours = (use_aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -290,7 +291,7 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa) } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = (byte)std::round(CTFontGetAdvancesForGlyphs(this->font.get(), kCTFontOrientationDefault, &glyph, nullptr, 1)); this->SetGlyphPtr(key, &new_glyph); diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index ddc275fc45..3d863b4dc0 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -230,7 +230,8 @@ void Win32FontCache::ClearFontCache() GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat); /* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */ - SpriteLoader::Sprite sprite; + SpriteLoader::SpriteCollection spritecollection; + SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_NORMAL]; sprite.AllocateData(ZOOM_LVL_NORMAL, width * height); sprite.type = SpriteType::Font; sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL); @@ -270,7 +271,7 @@ void Win32FontCache::ClearFontCache() } GlyphEntry new_glyph; - new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc); + new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(spritecollection, SimpleSpriteAlloc); new_glyph.width = gm.gmCellIncX; this->SetGlyphPtr(key, &new_glyph); diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 1811a047fe..5857146348 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -213,7 +213,7 @@ uint GetMaxSpriteID() return _spritecache_items; } -static bool ResizeSpriteIn(SpriteLoader::Sprite *sprite, ZoomLevel src, ZoomLevel tgt) +static bool ResizeSpriteIn(SpriteLoader::SpriteCollection &sprite, ZoomLevel src, ZoomLevel tgt) { uint8_t scaled_1 = ScaleByZoom(1, (ZoomLevel)(src - tgt)); @@ -240,7 +240,7 @@ static bool ResizeSpriteIn(SpriteLoader::Sprite *sprite, ZoomLevel src, ZoomLeve return true; } -static void ResizeSpriteOut(SpriteLoader::Sprite *sprite, ZoomLevel zoom) +static void ResizeSpriteOut(SpriteLoader::SpriteCollection &sprite, ZoomLevel zoom) { /* Algorithm based on 32bpp_Optimized::ResizeSprite() */ sprite[zoom].width = UnScaleByZoom(sprite[ZOOM_LVL_NORMAL].width, zoom); @@ -323,7 +323,7 @@ static bool PadSingleSprite(SpriteLoader::Sprite *sprite, ZoomLevel zoom, uint p return true; } -static bool PadSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, SpriteEncoder *encoder) +static bool PadSprites(SpriteLoader::SpriteCollection &sprite, uint8_t sprite_avail, SpriteEncoder *encoder) { /* Get minimum top left corner coordinates. */ int min_xoffs = INT32_MAX; @@ -371,7 +371,7 @@ static bool PadSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, Sprit return true; } -static bool ResizeSprites(SpriteLoader::Sprite *sprite, uint8_t sprite_avail, SpriteEncoder *encoder) +static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, uint8_t sprite_avail, SpriteEncoder *encoder) { /* Create a fully zoomed image if it does not exist */ ZoomLevel first_avail = static_cast(FIND_FIRST_BIT(sprite_avail)); @@ -457,7 +457,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty Debug(sprite, 9, "Load sprite {}", id); - SpriteLoader::Sprite sprite[ZOOM_LVL_END]; + SpriteLoader::SpriteCollection sprite; uint8_t sprite_avail = 0; sprite[ZOOM_LVL_NORMAL].type = sprite_type; @@ -509,7 +509,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, allocator, encoder); } - if (sprite->type == SpriteType::Font && _font_zoom != ZOOM_LVL_NORMAL) { + if (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font && _font_zoom != ZOOM_LVL_NORMAL) { /* Make ZOOM_LVL_NORMAL be ZOOM_LVL_GUI */ sprite[ZOOM_LVL_NORMAL].width = sprite[_font_zoom].width; sprite[ZOOM_LVL_NORMAL].height = sprite[_font_zoom].height; diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index ce18212886..f88182935a 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -215,7 +215,7 @@ bool DecodeSingleSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t f return true; } -uint8_t LoadSpriteV1(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) +uint8_t LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) { /* Check the requested colour depth. */ if (load_32bpp) return 0; @@ -252,7 +252,7 @@ uint8_t LoadSpriteV1(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file return 0; } -uint8_t LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) +uint8_t LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { static const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_OUT_4X, ZOOM_LVL_NORMAL, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_8X, ZOOM_LVL_OUT_16X, ZOOM_LVL_OUT_32X}; @@ -350,7 +350,7 @@ uint8_t LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file return loaded_sprites; } -uint8_t SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) +uint8_t SpriteLoaderGrf::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { if (this->container_ver >= 2) { return LoadSpriteV2(sprite, file, file_pos, sprite_type, load_32bpp, control_flags); diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index e9ec85726a..338714401b 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -17,7 +17,7 @@ class SpriteLoaderGrf : public SpriteLoader { byte container_ver; public: SpriteLoaderGrf(byte container_ver) : container_ver(container_ver) {} - uint8_t LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) override; + uint8_t LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) override; }; #endif /* SPRITELOADER_GRF_HPP */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index c7157db61e..a835fbc5bb 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -65,6 +65,11 @@ public: static ReusableBuffer buffer[ZOOM_LVL_END]; }; + /** + * Type defining a collection of sprites, one for each zoom level. + */ + using SpriteCollection = std::array; + /** * Load a sprite from the disk and return a sprite struct which is the same for all loaders. * @param[out] sprite The sprites to fill with data. @@ -75,7 +80,7 @@ public: * @param control_flags Control flags, see SpriteCacheCtrlFlags. * @return Bit mask of the zoom levels successfully loaded or 0 if no sprite could be loaded. */ - virtual uint8_t LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) = 0; + virtual uint8_t LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) = 0; virtual ~SpriteLoader() = default; }; @@ -94,7 +99,7 @@ public: /** * Convert a sprite from the loader to our own format. */ - virtual Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) = 0; + virtual Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) = 0; /** * Get the value which the height and width on a sprite have to be aligned by. diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index 886a048ff0..641ebaca54 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -1264,23 +1264,23 @@ void OpenGLBackend::ReleaseAnimBuffer(const Rect &update_rect) } } -/* virtual */ Sprite *OpenGLBackend::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) +/* virtual */ Sprite *OpenGLBackend::Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) { /* Allocate and construct sprite data. */ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(OpenGLSprite)); OpenGLSprite *gl_sprite = (OpenGLSprite *)dest_sprite->data; - new (gl_sprite) OpenGLSprite(sprite->width, sprite->height, sprite->type == SpriteType::Font ? 1 : ZOOM_LVL_END, sprite->colours); + new (gl_sprite) OpenGLSprite(sprite[ZOOM_LVL_NORMAL].width, sprite[ZOOM_LVL_NORMAL].height, sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_END, sprite[ZOOM_LVL_NORMAL].colours); /* Upload texture data. */ - for (int i = 0; i < (sprite->type == SpriteType::Font ? 1 : ZOOM_LVL_END); i++) { + for (int i = 0; i < (sprite[ZOOM_LVL_NORMAL].type == SpriteType::Font ? 1 : ZOOM_LVL_END); i++) { gl_sprite->Update(sprite[i].width, sprite[i].height, i, sprite[i].data); } - dest_sprite->height = sprite->height; - dest_sprite->width = sprite->width; - dest_sprite->x_offs = sprite->x_offs; - dest_sprite->y_offs = sprite->y_offs; + dest_sprite->height = sprite[ZOOM_LVL_NORMAL].height; + dest_sprite->width = sprite[ZOOM_LVL_NORMAL].width; + dest_sprite->x_offs = sprite[ZOOM_LVL_NORMAL].x_offs; + dest_sprite->y_offs = sprite[ZOOM_LVL_NORMAL].y_offs; return dest_sprite; } diff --git a/src/video/opengl.h b/src/video/opengl.h index 9c0086fab4..7c5c0f70be 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -109,7 +109,7 @@ public: bool Is32BppSupported() override { return true; } uint GetSpriteAlignment() override { return 1u << (ZOOM_LVL_END - 1); } - Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; + Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; };