changeset 6856:7d2e01558528 draft

(svn r10096) -Fix r10092: freetype bypassed the Blitter::Encode, making fonts look weird
author truelight <truelight@openttd.org>
date Mon, 11 Jun 2007 13:38:11 +0000
parents 1c7bdcb2f55c
children 0005a9ed1903
files src/blitter/8bpp_debug.cpp src/blitter/8bpp_debug.hpp src/blitter/8bpp_optimized.cpp src/blitter/8bpp_optimized.hpp src/blitter/8bpp_slow.cpp src/blitter/8bpp_slow.hpp src/blitter/blitter.hpp src/fontcache.cpp src/spritecache.cpp
diffstat 9 files changed, 31 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	}
 }
 
-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;
--- a/src/blitter/8bpp_debug.hpp
+++ b/src/blitter/8bpp_debug.hpp
@@ -15,7 +15,7 @@
 
 	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> {
--- 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 @@
 	}
 }
 
-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 @@
 	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;
--- a/src/blitter/8bpp_optimized.hpp
+++ b/src/blitter/8bpp_optimized.hpp
@@ -15,7 +15,7 @@
 
 	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> {
--- 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 @@
 	}
 }
 
-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;
--- a/src/blitter/8bpp_slow.hpp
+++ b/src/blitter/8bpp_slow.hpp
@@ -15,7 +15,7 @@
 
 	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> {
--- a/src/blitter/blitter.hpp
+++ b/src/blitter/blitter.hpp
@@ -35,6 +35,8 @@
 		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 @@
 	/**
 	 * 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() { }
 };
--- 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 @@
 	_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 @@
 	FT_GlyphSlot slot;
 	GlyphEntry new_glyph;
 	GlyphEntry *glyph;
-	Sprite *sprite;
+	SpriteLoader::Sprite sprite;
 	int width;
 	int height;
 	int x;
@@ -398,20 +405,20 @@
 	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 @@
 	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;
 }
 
 
--- a/src/spritecache.cpp
+++ b/src/spritecache.cpp
@@ -152,7 +152,7 @@
 
 	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;