diff options
-rw-r--r-- | core/fxge/ge/fx_ge_fontmap.cpp | 6 | ||||
-rw-r--r-- | core/fxge/ge/fx_ge_text.cpp | 9 | ||||
-rw-r--r-- | core/fxge/include/fx_font.h | 2 |
3 files changed, 15 insertions, 2 deletions
diff --git a/core/fxge/ge/fx_ge_fontmap.cpp b/core/fxge/ge/fx_ge_fontmap.cpp index e8af2dce53..7938e10984 100644 --- a/core/fxge/ge/fx_ge_fontmap.cpp +++ b/core/fxge/ge/fx_ge_fontmap.cpp @@ -454,7 +454,8 @@ int CTTFontDesc::ReleaseFace(FXFT_Face face) { return 0; } -CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) { +CFX_FontMgr::CFX_FontMgr() + : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { m_pBuiltinMapper.reset(new CFX_FontMapper(this)); } @@ -472,6 +473,9 @@ void CFX_FontMgr::InitFTLibrary() { if (m_FTLibrary) return; FXFT_Init_FreeType(&m_FTLibrary); + m_FTLibrarySupportsHinting = + FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != + FT_Err_Unimplemented_Feature; } void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { diff --git a/core/fxge/ge/fx_ge_text.cpp b/core/fxge/ge/fx_ge_text.cpp index b0f6a6e63a..46edaf7cbe 100644 --- a/core/fxge/ge/fx_ge_text.cpp +++ b/core/fxge/ge/fx_ge_text.cpp @@ -257,7 +257,14 @@ FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, } else { bClearType = text_flags & FXTEXT_CLEARTYPE; } - if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) { + if (!CFX_GEModule::Get()->GetFontMgr()->FTLibrarySupportsHinting()) { + // Some Freetype implementations (like the one packaged with Fedora) do + // not support hinting due to patents 6219025, 6239783, 6307566, + // 6225973, 6243070, 6393145, 6421054, 6282327, and 6624828; the latest + // one expires 10/7/19. This makes LCD antialiasing very ugly, so we + // instead fall back on NORMAL antialiasing. + anti_alias = FXFT_RENDER_MODE_NORMAL; + } else if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) { anti_alias = FXFT_RENDER_MODE_LCD; bNormal = TRUE; } else if (m_bpp < 16) { diff --git a/core/fxge/include/fx_font.h b/core/fxge/include/fx_font.h index dad10f2ccb..6bc9b2e4c2 100644 --- a/core/fxge/include/fx_font.h +++ b/core/fxge/include/fx_font.h @@ -280,11 +280,13 @@ class CFX_FontMgr { bool GetBuiltinFont(size_t index, const uint8_t** pFontData, uint32_t* size); CFX_FontMapper* GetBuiltinMapper() const { return m_pBuiltinMapper.get(); } FXFT_Library GetFTLibrary() const { return m_FTLibrary; } + bool FTLibrarySupportsHinting() const { return m_FTLibrarySupportsHinting; } private: std::unique_ptr<CFX_FontMapper> m_pBuiltinMapper; std::map<CFX_ByteString, CTTFontDesc*> m_FaceMap; FXFT_Library m_FTLibrary; + bool m_FTLibrarySupportsHinting; }; class CFX_FontMapper { |