Don't use LCD antialiasing if Fontconfig doesn't support hinting

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.

A before/after on Fedora: https://bugs.chromium.org/p/chromium/issues/detail?id=479400#c31

BUG=479400

Review-Url: https://codereview.chromium.org/1982263004
diff --git a/core/fxge/ge/fx_ge_fontmap.cpp b/core/fxge/ge/fx_ge_fontmap.cpp
index e8af2dc..7938e10 100644
--- a/core/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/fxge/ge/fx_ge_fontmap.cpp
@@ -454,7 +454,8 @@
   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 @@
   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 b0f6a6e..46edaf7 100644
--- a/core/fxge/ge/fx_ge_text.cpp
+++ b/core/fxge/ge/fx_ge_text.cpp
@@ -257,7 +257,14 @@
       } 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 dad10f2..6bc9b2e 100644
--- a/core/fxge/include/fx_font.h
+++ b/core/fxge/include/fx_font.h
@@ -280,11 +280,13 @@
   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 {