From 8a41530585402c7850ce68542ec1ea551d2cb277 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Fri, 7 Oct 2011 07:48:59 +0000 Subject: (svn r23009) -Change: Improve appearance of antialiased text with shadow. --- src/fontcache.cpp | 8 +++++++- src/fontcache.h | 6 ++++++ src/gfx.cpp | 9 ++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 616c54a9e..8b00ab5cc 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -1045,7 +1045,7 @@ const Sprite *GetGlyph(FontSize size, WChar key) sprite.y_offs = _ascender[size] - slot->bitmap_top; /* Draw shadow for medium size */ - if (size == FS_NORMAL) { + if (size == FS_NORMAL && !aa) { for (y = 0; y < slot->bitmap.rows; y++) { for (x = 0; x < slot->bitmap.width; x++) { if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HasBit(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) { @@ -1074,6 +1074,12 @@ const Sprite *GetGlyph(FontSize size, WChar key) } +bool GetDrawGlyphShadow() +{ + return GetFontFace(FS_NORMAL) != NULL && GetFontAAState(FS_NORMAL); +} + + uint GetGlyphWidth(FontSize size, WChar key) { FT_Face face = GetFontFace(size); diff --git a/src/fontcache.h b/src/fontcache.h index 8148cba3c..726ba4d9f 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -45,6 +45,7 @@ void InitFreeType(); void UninitFreeType(); const Sprite *GetGlyph(FontSize size, uint32 key); uint GetGlyphWidth(FontSize size, uint32 key); +bool GetDrawGlyphShadow(); typedef bool (SetFallbackFontCallback)(const char **); /** @@ -82,6 +83,11 @@ static inline uint GetGlyphWidth(FontSize size, uint32 key) return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + (size != FS_NORMAL) : 0; } +static inline bool GetDrawGlyphShadow() +{ + return false; +} + #endif /* WITH_FREETYPE */ #endif /* FONTCACHE_H */ diff --git a/src/gfx.cpp b/src/gfx.cpp index c5fbcac2f..9d6d0b1ae 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1057,6 +1057,7 @@ void DrawCharCentered(WChar c, int x, int y, TextColour colour) static int ReallyDoDrawString(const UChar *string, int x, int y, DrawStringParams ¶ms, bool parse_string_also_when_clipped) { DrawPixelInfo *dpi = _cur_dpi; + bool draw_shadow = GetDrawGlyphShadow(); UChar c; int xo = x; @@ -1087,7 +1088,13 @@ skip_cont:; if (IsPrintable(c) && !IsTextDirectionChar(c)) { if (x >= dpi->left + dpi->width) goto skip_char; if (x + _max_char_width >= dpi->left) { - GfxMainBlitter(GetGlyph(params.fontsize, c), x, y, BM_COLOUR_REMAP); + const Sprite *glyph = GetGlyph(params.fontsize, c); + if (draw_shadow && params.fontsize == FS_NORMAL && params.cur_colour != TC_BLACK && !(c >= SCC_SPRITE_START && c <= SCC_SPRITE_END)) { + SetColourRemap(TC_BLACK); + GfxMainBlitter(glyph, x + 1, y + 1, BM_COLOUR_REMAP); + SetColourRemap(params.cur_colour); + } + GfxMainBlitter(glyph, x, y, BM_COLOUR_REMAP); } x += GetCharacterWidth(params.fontsize, c); } else if (c == '\n') { // newline = {} -- cgit v1.2.3-70-g09d2