mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 22:28:56 +00:00
(svn r10166) -Feature(tte): Add support for antialiased typefaces via FreeType. This is configurable for each font size in the configuration settings and requires using the 32bpp blitter and suitable fonts.
This commit is contained in:
parent
d6267f5539
commit
ef099dbc27
@ -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)
|
const Sprite *GetGlyph(FontSize size, WChar key)
|
||||||
{
|
{
|
||||||
FT_Face face = GetFontFace(size);
|
FT_Face face = GetFontFace(size);
|
||||||
@ -397,8 +412,10 @@ const Sprite *GetGlyph(FontSize size, WChar key)
|
|||||||
|
|
||||||
slot = face->glyph;
|
slot = face->glyph;
|
||||||
|
|
||||||
|
bool aa = GetFontAAState(size);
|
||||||
|
|
||||||
FT_Load_Char(face, key, FT_LOAD_DEFAULT);
|
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 */
|
/* 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));
|
width = max(1, slot->bitmap.width + (size == FS_NORMAL));
|
||||||
@ -417,9 +434,9 @@ const Sprite *GetGlyph(FontSize size, WChar key)
|
|||||||
if (size == FS_NORMAL) {
|
if (size == FS_NORMAL) {
|
||||||
for (y = 0; y < slot->bitmap.rows; y++) {
|
for (y = 0; y < slot->bitmap.rows; y++) {
|
||||||
for (x = 0; x < slot->bitmap.width; x++) {
|
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].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 (y = 0; y < slot->bitmap.rows; y++) {
|
||||||
for (x = 0; x < slot->bitmap.width; x++) {
|
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].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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,9 @@ struct FreeTypeSettings {
|
|||||||
uint small_size;
|
uint small_size;
|
||||||
uint medium_size;
|
uint medium_size;
|
||||||
uint large_size;
|
uint large_size;
|
||||||
|
bool small_aa;
|
||||||
|
bool medium_aa;
|
||||||
|
bool large_aa;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern FreeTypeSettings _freetype;
|
extern FreeTypeSettings _freetype;
|
||||||
|
@ -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("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("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_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
|
#endif
|
||||||
SDTG_VAR("sprite_cache_size",SLE_UINT, S, 0, _sprite_cache_size, 4, 1, 64, 0, STR_NULL, NULL),
|
SDTG_VAR("sprite_cache_size",SLE_UINT, S, 0, _sprite_cache_size, 4, 1, 64, 0, STR_NULL, NULL),
|
||||||
SDTG_END()
|
SDTG_END()
|
||||||
|
Loading…
Reference in New Issue
Block a user