font: Provide our own fontconfig settings (bug #20337)
Due to an unfortunate combination of Cairo's use of premultiplied alpha
and our engine expecting to be able to blit pre-rasterized text surfaces
with an alpha channel into arbitrary surfaces, we can't safely use RGB
subpixel hinting without getting glyph color glitches. This is
particularly noticeable in GUI2 dialogs when the system fontconfig
settings dictate subpixel hinting to be enabled. Bug #21648 is just a
Windows-specific case of the same issue exacerbated by an as of yet
unaddressed peculiarity of Cairo's premultiplied alpha format on
Windows.
SDL_ttf avoids the issue entirely by always using an equivalent of
hintstyle=full and rgba=none with FreeType directly. There are very few
UI components in Wesnoth using SDL_ttf anymore, but they are still large
enough to make the rendering differences rather jarring (MP lobby,
preferences dialog, parts of the theme UI).
Our new custom fontconfig settings use hintstyle=full and rgba=none to
produce the same results with both SDL_ttf and Pango/Cairo render paths,
and eliminate the subpixel hinting glitches. This Works For Me™, but
fontconfig and Cairo generally seem unwilling to cooperate with me and
may produce different results on other systems.
It remains to be seen exactly how this patch impacts Apple OS X users
due to bugs #23560 and #23628. Windows users are unaffected and still
depend on the "fix" for #21648 because fontconfig is apparently disabled
for most intents and purposes on that particular platform (see also
commit cad8798d1a
).
This commit is contained in:
parent
b7e172994f
commit
cfb1f8e098
4 changed files with 54 additions and 0 deletions
|
@ -13,6 +13,10 @@ Version 1.12.4+dev:
|
|||
* Fix scenario ending to early for players that are defeated if there are
|
||||
still players fighting and victory_when_enemies_defeated=no.
|
||||
* Fix 'enemies defated' event causing OOS error in mp scenarios.
|
||||
* User interface:
|
||||
* Force uniform font rendering settings across X11 and Apple OS X, avoiding
|
||||
color glitches resulting from incorrect applications of subpixel hinting
|
||||
(bug #20337).
|
||||
* Miscellaneous and bug fixes:
|
||||
* Default to non-strict compilation with CMake.
|
||||
* Fixed strict compilation with clang 3.5 and 3.6.
|
||||
|
|
34
fonts/fonts.conf
Normal file
34
fonts/fonts.conf
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?xml version='1.0'?>
|
||||
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
|
||||
<fontconfig>
|
||||
<!--
|
||||
|
||||
Wesnoth's text rendering code is not very well suited to RGB subpixel hinting
|
||||
with Pango/Cairo (bug #20337), so we need to disable this feature to avoid
|
||||
color glitches in GUI2 dialogs and other places. We also force a uniform
|
||||
hintstyle for all platforms while at it.
|
||||
|
||||
-->
|
||||
|
||||
<match target="font">
|
||||
<edit mode="assign" name="rgba">
|
||||
<const>none</const>
|
||||
</edit>
|
||||
</match>
|
||||
<match target="font">
|
||||
<edit mode="assign" name="hinting">
|
||||
<bool>true</bool>
|
||||
</edit>
|
||||
</match>
|
||||
<match target="font">
|
||||
<edit mode="assign" name="hintstyle">
|
||||
<const>hintfull</const>
|
||||
</edit>
|
||||
</match>
|
||||
<match target="font">
|
||||
<edit mode="assign" name="antialias">
|
||||
<bool>true</bool>
|
||||
</edit>
|
||||
</match>
|
||||
|
||||
</fontconfig>
|
|
@ -6,6 +6,11 @@ Version 1.12.4+dev:
|
|||
* Language and i18n:
|
||||
* Updated translations: Latvian
|
||||
|
||||
* User interface:
|
||||
* Force uniform font rendering settings across X11 and Apple OS X, avoiding
|
||||
color glitches resulting from incorrect applications of subpixel hinting
|
||||
(bug #20337).
|
||||
|
||||
|
||||
Version 1.12.4:
|
||||
* Security fixes:
|
||||
|
|
11
src/font.cpp
11
src/font.cpp
|
@ -357,6 +357,17 @@ void manager::init() const
|
|||
ERR_FT << "Could not load the true type fonts\n";
|
||||
throw error();
|
||||
}
|
||||
|
||||
if(!FcConfigParseAndLoad(FcConfigGetCurrent(),
|
||||
reinterpret_cast<const FcChar8*>((game_config::path + "/fonts/fonts.conf").c_str()),
|
||||
FcFalse))
|
||||
{
|
||||
ERR_FT << "Could not load local font configuration\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_FT << "Local font configuration loaded\n";
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CAIRO_HAS_WIN32_FONT
|
||||
|
|
Loading…
Add table
Reference in a new issue