diff options
-rw-r--r-- | src/blitter/8bpp_debug.cpp | 6 | ||||
-rw-r--r-- | src/blitter/8bpp_debug.hpp | 2 | ||||
-rw-r--r-- | src/blitter/8bpp_optimized.cpp | 6 | ||||
-rw-r--r-- | src/blitter/8bpp_optimized.hpp | 2 | ||||
-rw-r--r-- | src/blitter/8bpp_slow.cpp | 6 | ||||
-rw-r--r-- | src/blitter/8bpp_slow.hpp | 2 | ||||
-rw-r--r-- | src/blitter/blitter.hpp | 4 | ||||
-rw-r--r-- | src/fontcache.cpp | 28 | ||||
-rw-r--r-- | src/spritecache.cpp | 2 |
9 files changed, 31 insertions, 27 deletions
diff --git a/src/blitter/8bpp_debug.cpp b/src/blitter/8bpp_debug.cpp index dea100c3f..3779508e9 100644 --- a/src/blitter/8bpp_debug.cpp +++ b/src/blitter/8bpp_debug.cpp @@ -6,8 +6,6 @@ static FBlitter_8bppDebug iFBlitter_8bppDebug; -extern void* AllocSprite(size_t); - void Blitter_8bppDebug::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) { const byte *src, *src_line; @@ -33,10 +31,10 @@ void Blitter_8bppDebug::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL } } -Sprite *Blitter_8bppDebug::Encode(SpriteLoader::Sprite *sprite) +Sprite *Blitter_8bppDebug::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator) { Sprite *dest_sprite; - dest_sprite = (Sprite *)AllocSprite(sizeof(*dest_sprite) + sprite->height * sprite->width); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sprite->height * sprite->width); dest_sprite->height = sprite->height; dest_sprite->width = sprite->width; diff --git a/src/blitter/8bpp_debug.hpp b/src/blitter/8bpp_debug.hpp index 67b12b652..c096200e6 100644 --- a/src/blitter/8bpp_debug.hpp +++ b/src/blitter/8bpp_debug.hpp @@ -15,7 +15,7 @@ public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); - Sprite *Encode(SpriteLoader::Sprite *sprite); + Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator); }; class FBlitter_8bppDebug: public BlitterFactory<FBlitter_8bppDebug> { diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index 62397a045..51e11767e 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -6,8 +6,6 @@ static FBlitter_8bppOptimized iFBlitter_8bppOptimized; -extern void* AllocSprite(size_t); - void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) { const byte *src, *src_next; @@ -100,7 +98,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z } } -Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite) +Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator) { Sprite *dest_sprite; byte *temp_dst; @@ -191,7 +189,7 @@ Sprite *Blitter_8bppOptimized::Encode(SpriteLoader::Sprite *sprite) assert(index < memory); /* Allocate the exact amount of memory we need */ - dest_sprite = (Sprite *)AllocSprite(sizeof(*dest_sprite) + index); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + index); dest_sprite->height = sprite->height; dest_sprite->width = sprite->width; diff --git a/src/blitter/8bpp_optimized.hpp b/src/blitter/8bpp_optimized.hpp index 8f251fb2c..761f0aea6 100644 --- a/src/blitter/8bpp_optimized.hpp +++ b/src/blitter/8bpp_optimized.hpp @@ -15,7 +15,7 @@ public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); - Sprite *Encode(SpriteLoader::Sprite *sprite); + Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator); }; class FBlitter_8bppOptimized: public BlitterFactory<FBlitter_8bppOptimized> { diff --git a/src/blitter/8bpp_slow.cpp b/src/blitter/8bpp_slow.cpp index 99c43a4f5..ad83cff20 100644 --- a/src/blitter/8bpp_slow.cpp +++ b/src/blitter/8bpp_slow.cpp @@ -5,8 +5,6 @@ static FBlitter_8bppSimple iFBlitter_8bppSimple; -extern void* AllocSprite(size_t); - void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) { const byte *src, *src_line; @@ -46,10 +44,10 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom } } -Sprite *Blitter_8bppSimple::Encode(SpriteLoader::Sprite *sprite) +Sprite *Blitter_8bppSimple::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator) { Sprite *dest_sprite; - dest_sprite = (Sprite *)AllocSprite(sizeof(*dest_sprite) + sprite->height * sprite->width); + dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sprite->height * sprite->width);; dest_sprite->height = sprite->height; dest_sprite->width = sprite->width; diff --git a/src/blitter/8bpp_slow.hpp b/src/blitter/8bpp_slow.hpp index ac60e3262..fabab0529 100644 --- a/src/blitter/8bpp_slow.hpp +++ b/src/blitter/8bpp_slow.hpp @@ -15,7 +15,7 @@ public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); - Sprite *Encode(SpriteLoader::Sprite *sprite); + Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator); }; class FBlitter_8bppSimple: public BlitterFactory<FBlitter_8bppSimple> { diff --git a/src/blitter/blitter.hpp b/src/blitter/blitter.hpp index 4920da426..1114dbf58 100644 --- a/src/blitter/blitter.hpp +++ b/src/blitter/blitter.hpp @@ -35,6 +35,8 @@ public: int pitch; ///< The pitch of the destination buffer }; + typedef void *AllocatorProc(size_t size); + /** * Get the screen depth this blitter works for. * This is either: 8, 16, 24 or 32. @@ -49,7 +51,7 @@ public: /** * Convert a sprite from the loader to our own format. */ - virtual Sprite *Encode(SpriteLoader::Sprite *sprite) = 0; + virtual Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator) = 0; virtual ~Blitter() { } }; diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 49a5d15be..ded1ffe72 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -14,6 +14,8 @@ #include "string.h" #include "fontcache.h" #include "helpers.hpp" +#include "spriteloader/spriteloader.hpp" +#include "blitter/blitter.hpp" #ifdef WITH_FREETYPE @@ -361,6 +363,11 @@ static void SetGlyphPtr(FontSize size, WChar key, const GlyphEntry *glyph) _glyph_ptr[size][GB(key, 8, 8)][GB(key, 0, 8)].width = glyph->width; } +void *AllocateFont(size_t size) +{ + return malloc(size); +} + const Sprite *GetGlyph(FontSize size, WChar key) { @@ -368,7 +375,7 @@ const Sprite *GetGlyph(FontSize size, WChar key) FT_GlyphSlot slot; GlyphEntry new_glyph; GlyphEntry *glyph; - Sprite *sprite; + SpriteLoader::Sprite sprite; int width; int height; int x; @@ -398,20 +405,20 @@ const Sprite *GetGlyph(FontSize size, WChar key) height = max(1, slot->bitmap.rows + (size == FS_NORMAL)); /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ - sprite = (Sprite*)calloc(width * height + 8, 1); - sprite->width = width; - sprite->height = height; - sprite->x_offs = slot->bitmap_left; + sprite.data = CallocT<SpriteLoader::CommonPixel>(width * height); + sprite.width = width; + sprite.height = height; + sprite.x_offs = slot->bitmap_left; // XXX 2 should be determined somehow... it's right for the normal face y_adj = (size == FS_NORMAL) ? 2 : 0; - sprite->y_offs = GetCharacterHeight(size) - slot->bitmap_top - y_adj; + sprite.y_offs = GetCharacterHeight(size) - slot->bitmap_top - y_adj; /* Draw shadow for medium size */ if (size == FS_NORMAL) { for (y = 0; y < slot->bitmap.rows; y++) { for (x = 0; x < slot->bitmap.width; x++) { if (HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) { - sprite->data[1 + x + (1 + y) * sprite->width] = SHADOW_COLOUR; + sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR; } } } @@ -420,17 +427,18 @@ const Sprite *GetGlyph(FontSize size, WChar key) for (y = 0; y < slot->bitmap.rows; y++) { for (x = 0; x < slot->bitmap.width; x++) { if (HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) { - sprite->data[x + y * sprite->width] = FACE_COLOUR; + sprite.data[x + y * sprite.width].m = FACE_COLOUR; } } } - new_glyph.sprite = sprite; + new_glyph.sprite = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, AllocateFont); + free(sprite.data); new_glyph.width = (slot->advance.x >> 6) + (size != FS_NORMAL); SetGlyphPtr(size, key, &new_glyph); - return sprite; + return new_glyph.sprite; } diff --git a/src/spritecache.cpp b/src/spritecache.cpp index f3ea8a1e4..d7f7a2b5a 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -152,7 +152,7 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id) 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); + sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); free(sprite.data); return sc->ptr; |