summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fontcache.cpp27
-rw-r--r--src/fontcache.h3
-rw-r--r--src/settings.cpp3
3 files changed, 28 insertions, 5 deletions
diff --git a/src/fontcache.cpp b/src/fontcache.cpp
index a04936aec..7363e4ef8 100644
--- a/src/fontcache.cpp
+++ b/src/fontcache.cpp
@@ -369,6 +369,21 @@ void *AllocateFont(size_t size)
}
+/* Check if a glyph should be rendered with antialiasing */
+static bool GetFontAAState(FontSize size)
+{
+ /* AA is only supported for 32 bpp */
+ if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() != 32) return false;
+
+ switch (size) {
+ default: NOT_REACHED();
+ case FS_NORMAL: return _freetype.medium_aa;
+ case FS_SMALL: return _freetype.small_aa;
+ case FS_LARGE: return _freetype.large_aa;
+ }
+}
+
+
const Sprite *GetGlyph(FontSize size, WChar key)
{
FT_Face face = GetFontFace(size);
@@ -397,8 +412,10 @@ const Sprite *GetGlyph(FontSize size, WChar key)
slot = face->glyph;
+ bool aa = GetFontAAState(size);
+
FT_Load_Char(face, key, FT_LOAD_DEFAULT);
- FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO);
+ FT_Render_Glyph(face->glyph, aa ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO);
/* Add 1 pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel */
width = max(1, slot->bitmap.width + (size == FS_NORMAL));
@@ -417,9 +434,9 @@ const Sprite *GetGlyph(FontSize size, WChar key)
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))) {
+ if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR;
- sprite.data[1 + x + (1 + y) * sprite.width].a = 0xFF;
+ sprite.data[1 + x + (1 + y) * sprite.width].a = aa ? slot->bitmap.buffer[x + y * slot->bitmap.pitch] : 0xFF;
}
}
}
@@ -427,9 +444,9 @@ 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))) {
+ if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
sprite.data[x + y * sprite.width].m = FACE_COLOUR;
- sprite.data[x + y * sprite.width].a = 0xFF;
+ sprite.data[x + y * sprite.width].a = aa ? slot->bitmap.buffer[x + y * slot->bitmap.pitch] : 0xFF;
}
}
}
diff --git a/src/fontcache.h b/src/fontcache.h
index f2240e6d2..b8f450cad 100644
--- a/src/fontcache.h
+++ b/src/fontcache.h
@@ -21,6 +21,9 @@ struct FreeTypeSettings {
uint small_size;
uint medium_size;
uint large_size;
+ bool small_aa;
+ bool medium_aa;
+ bool large_aa;
};
extern FreeTypeSettings _freetype;
diff --git a/src/settings.cpp b/src/settings.cpp
index 4363eec52..4b7452ac3 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1256,6 +1256,9 @@ static const SettingDescGlobVarList _misc_settings[] = {
SDTG_VAR("small_size", SLE_UINT, S, 0, _freetype.small_size, 6, 0, 72, 0, STR_NULL, NULL),
SDTG_VAR("medium_size", SLE_UINT, S, 0, _freetype.medium_size, 10, 0, 72, 0, STR_NULL, NULL),
SDTG_VAR("large_size", SLE_UINT, S, 0, _freetype.large_size, 16, 0, 72, 0, STR_NULL, NULL),
+ SDTG_BOOL("small_aa", S, 0, _freetype.small_aa, false, STR_NULL, NULL),
+ SDTG_BOOL("medium_aa", S, 0, _freetype.medium_aa, false, STR_NULL, NULL),
+ SDTG_BOOL("large_aa", S, 0, _freetype.large_aa, false, STR_NULL, NULL),
#endif
SDTG_VAR("sprite_cache_size",SLE_UINT, S, 0, _sprite_cache_size, 4, 1, 64, 0, STR_NULL, NULL),
SDTG_END()