Revert "Make CFX_FontMgr member variables private."
[pdfium.git] / core / src / fxge / ge / fx_ge_linux.cpp
index 33cfcfe..72971f7 100644 (file)
-// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
\r
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
-\r
-#include "../../../include/fxge/fx_ge.h"\r
-#include "../agg/include/fx_agg_driver.h"\r
-#include "text_int.h"\r
-#if !defined(_FPDFAPI_MINI_) &&  _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_\r
-#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))\r
-void CFX_AggDeviceDriver::InitPlatform()\r
-{\r
-}\r
-void CFX_AggDeviceDriver::DestroyPlatform()\r
-{\r
-}\r
-void CFX_FaceCache::InitPlatform()\r
-{\r
-}\r
-FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\r
-        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,\r
-        FX_FLOAT font_size, FX_DWORD argb)\r
-{\r
-    return FALSE;\r
-}\r
-CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,\r
-        int dest_width, int anti_alias)\r
-{\r
-    return NULL;\r
-}\r
-void CFX_Font::ReleasePlatformResource()\r
-{\r
-}\r
-#endif\r
-static const struct {\r
-    FX_LPCSTR  m_pName;\r
-    FX_LPCSTR  m_pSubstName;\r
-}\r
-Base14Substs[] = {\r
-    {"Courier", "Courier New"},\r
-    {"Courier-Bold", "Courier New Bold"},\r
-    {"Courier-BoldOblique", "Courier New Bold Italic"},\r
-    {"Courier-Oblique", "Courier New Italic"},\r
-    {"Helvetica", "Arial"},\r
-    {"Helvetica-Bold", "Arial Bold"},\r
-    {"Helvetica-BoldOblique", "Arial Bold Italic"},\r
-    {"Helvetica-Oblique", "Arial Italic"},\r
-    {"Times-Roman", "Times New Roman"},\r
-    {"Times-Bold", "Times New Roman Bold"},\r
-    {"Times-BoldItalic", "Times New Roman Bold Italic"},\r
-    {"Times-Italic", "Times New Roman Italic"},\r
-};\r
-class CFX_LinuxFontInfo : public CFX_FolderFontInfo\r
-{\r
-public:\r
-    virtual void*              MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);\r
-    FX_BOOL                            ParseFontCfg();\r
-    void*                              FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);\r
-};\r
-#define LINUX_GPNAMESIZE       6\r
-static const struct {\r
-    FX_LPCSTR NameArr[LINUX_GPNAMESIZE];\r
-}\r
-LinuxGpFontList[] = {\r
-    {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},\r
-    {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},\r
-    {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},\r
-    {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},\r
-};\r
-static const FX_LPCSTR g_LinuxGbFontList[] = {\r
-    "AR PL UMing CN Light",\r
-    "WenQuanYi Micro Hei",\r
-    "AR PL UKai CN",\r
-};\r
-static const FX_LPCSTR g_LinuxB5FontList[] = {\r
-    "AR PL UMing TW Light",\r
-    "WenQuanYi Micro Hei",\r
-    "AR PL UKai TW",\r
-};\r
-static const FX_LPCSTR g_LinuxHGFontList[] = {\r
-    "UnDotum",\r
-};\r
-static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)\r
-{\r
-    CFX_ByteString face = facearr;\r
-    if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {\r
-        if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {\r
-            return 0;\r
-        } else {\r
-            return 1;\r
-        }\r
-    } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {\r
-        if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {\r
-            return 2;\r
-        } else {\r
-            return 3;\r
-        }\r
-    }\r
-    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {\r
-        return 0;\r
-    }\r
-    return 2;\r
-}\r
-void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)\r
-{\r
-    CFX_ByteString face = cstr_face;\r
-    int iBaseFont;\r
-    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)\r
-        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {\r
-            face = Base14Substs[iBaseFont].m_pSubstName;\r
-            bExact = TRUE;\r
-            break;\r
-        }\r
-    if (iBaseFont < 12) {\r
-        return GetFont(face);\r
-    }\r
-    FX_LPVOID p = NULL;\r
-    FX_BOOL bCJK = TRUE;\r
-    switch (charset) {\r
-        case FXFONT_SHIFTJIS_CHARSET: {\r
-                FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);\r
-                if (index < 0) {\r
-                    break;\r
-                }\r
-                for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)\r
-                    if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {\r
-                        return p;\r
-                    }\r
-            }\r
-            break;\r
-        case FXFONT_GB2312_CHARSET: {\r
-                static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);\r
-                for (FX_INT32 i = 0; i < s_gbCount; i++)\r
-                    if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {\r
-                        return p;\r
-                    }\r
-            }\r
-            break;\r
-        case FXFONT_CHINESEBIG5_CHARSET: {\r
-                static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);\r
-                for (FX_INT32 i = 0; i < s_b5Count; i++)\r
-                    if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {\r
-                        return p;\r
-                    }\r
-            }\r
-            break;\r
-        case FXFONT_HANGEUL_CHARSET: {\r
-                static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);\r
-                for (FX_INT32 i = 0; i < s_hgCount; i++)\r
-                    if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {\r
-                        return p;\r
-                    }\r
-            }\r
-            break;\r
-        default:\r
-            bCJK = FALSE;\r
-            break;\r
-    }\r
-    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {\r
-        return GetFont("Courier New");\r
-    }\r
-    return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);\r
-}\r
-static FX_DWORD _LinuxGetCharset(int charset)\r
-{\r
-    switch(charset) {\r
-        case FXFONT_SHIFTJIS_CHARSET:\r
-            return CHARSET_FLAG_SHIFTJIS;\r
-        case FXFONT_GB2312_CHARSET:\r
-            return CHARSET_FLAG_GB;\r
-        case FXFONT_CHINESEBIG5_CHARSET:\r
-            return CHARSET_FLAG_BIG5;\r
-        case FXFONT_HANGEUL_CHARSET:\r
-            return CHARSET_FLAG_KOREAN;\r
-        case FXFONT_SYMBOL_CHARSET:\r
-            return CHARSET_FLAG_SYMBOL;\r
-        case FXFONT_ANSI_CHARSET:\r
-            return CHARSET_FLAG_ANSI;\r
-        default:\r
-            break;\r
-    }\r
-    return 0;\r
-}\r
-static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)\r
-{\r
-    FX_INT32 iSimilarValue = 0;\r
-    if ((style & FXFONT_BOLD) == (weight > 400)) {\r
-        iSimilarValue += 16;\r
-    }\r
-    if ((style & FXFONT_ITALIC) == bItalic) {\r
-        iSimilarValue += 16;\r
-    }\r
-    if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {\r
-        iSimilarValue += 16;\r
-    }\r
-    if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {\r
-        iSimilarValue += 8;\r
-    }\r
-    if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {\r
-        iSimilarValue += 8;\r
-    }\r
-    return iSimilarValue;\r
-}\r
-void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)\r
-{\r
-    CFontFaceInfo* pFind = NULL;\r
-    FX_DWORD charset_flag = _LinuxGetCharset(charset);\r
-    FX_INT32 iBestSimilar = 0;\r
-    FX_POSITION pos = m_FontList.GetStartPosition();\r
-    while (pos) {\r
-        CFX_ByteString bsName;\r
-        CFontFaceInfo* pFont = NULL;\r
-        m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);\r
-        if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {\r
-            continue;\r
-        }\r
-        FX_INT32 iSimilarValue = 0;\r
-        FX_INT32 index = bsName.Find(family);\r
-        if (bMatchName && index < 0) {\r
-            continue;\r
-        }\r
-        if (!bMatchName && index > 0) {\r
-            iSimilarValue += 64;\r
-        }\r
-        iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);\r
-        if (iSimilarValue > iBestSimilar) {\r
-            iBestSimilar = iSimilarValue;\r
-            pFind = pFont;\r
-        }\r
-    }\r
-    return pFind;\r
-}\r
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()\r
-{\r
-    CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;\r
-    if (!pInfo) {\r
-        return NULL;\r
-    }\r
-    if (!pInfo->ParseFontCfg()) {\r
-        pInfo->AddPath("/usr/share/fonts");\r
-        pInfo->AddPath("/usr/share/X11/fonts/Type1");\r
-        pInfo->AddPath("/usr/share/X11/fonts/TTF");\r
-        pInfo->AddPath("/usr/local/share/fonts");\r
-    }\r
-    return pInfo;\r
-}\r
-FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()\r
-{\r
-    return FALSE;\r
-}\r
-void CFX_GEModule::InitPlatform()\r
-{\r
-    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());\r
-}\r
-void CFX_GEModule::DestroyPlatform()\r
-{\r
-}\r
-#endif\r
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "text_int.h"
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+class CFX_LinuxFontInfo : public CFX_FolderFontInfo {
+ public:
+  void* MapFont(int weight,
+                FX_BOOL bItalic,
+                int charset,
+                int pitch_family,
+                const FX_CHAR* family,
+                int& iExact) override;
+  FX_BOOL ParseFontCfg(const char** pUserPaths);
+};
+#define LINUX_GPNAMESIZE 6
+static const struct {
+  const FX_CHAR* NameArr[LINUX_GPNAMESIZE];
+} LinuxGpFontList[] = {
+    {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic",
+      "VL Gothic regular"}},
+    {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL,
+      "VL Gothic regular"}},
+    {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL,
+      "VL Gothic regular"}},
+    {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL,
+      "VL Gothic regular"}},
+};
+static const FX_CHAR* const g_LinuxGbFontList[] = {
+    "AR PL UMing CN Light", "WenQuanYi Micro Hei", "AR PL UKai CN",
+};
+static const FX_CHAR* const g_LinuxB5FontList[] = {
+    "AR PL UMing TW Light", "WenQuanYi Micro Hei", "AR PL UKai TW",
+};
+static const FX_CHAR* const g_LinuxHGFontList[] = {
+    "UnDotum",
+};
+static int32_t GetJapanesePreference(const FX_CHAR* facearr,
+                                     int weight,
+                                     int picth_family) {
+  CFX_ByteString face = facearr;
+  if (face.Find("Gothic") >= 0 ||
+      face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+    if (face.Find("PGothic") >= 0 ||
+        face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+      return 0;
+    }
+    return 1;
+  }
+  if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+    if (face.Find("PMincho") >= 0 ||
+        face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+      return 2;
+    }
+    return 3;
+  }
+  if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+    return 0;
+  }
+  return 2;
+}
+void* CFX_LinuxFontInfo::MapFont(int weight,
+                                 FX_BOOL bItalic,
+                                 int charset,
+                                 int pitch_family,
+                                 const FX_CHAR* cstr_face,
+                                 int& iExact) {
+  void* font = GetSubstFont(cstr_face);
+  if (font) {
+    iExact = 1;
+    return font;
+  }
+  FX_BOOL bCJK = TRUE;
+  switch (charset) {
+    case FXFONT_SHIFTJIS_CHARSET: {
+      int32_t index = GetJapanesePreference(cstr_face, weight, pitch_family);
+      if (index < 0) {
+        break;
+      }
+      for (int32_t i = 0; i < LINUX_GPNAMESIZE; i++) {
+        auto it = m_FontList.find(LinuxGpFontList[index].NameArr[i]);
+        if (it != m_FontList.end()) {
+          return it->second;
+        }
+      }
+    } break;
+    case FXFONT_GB2312_CHARSET: {
+      for (size_t i = 0; i < FX_ArraySize(g_LinuxGbFontList); ++i) {
+        auto it = m_FontList.find(g_LinuxGbFontList[i]);
+        if (it != m_FontList.end()) {
+          return it->second;
+        }
+      }
+    } break;
+    case FXFONT_CHINESEBIG5_CHARSET: {
+      for (size_t i = 0; i < FX_ArraySize(g_LinuxB5FontList); ++i) {
+        auto it = m_FontList.find(g_LinuxB5FontList[i]);
+        if (it != m_FontList.end()) {
+          return it->second;
+        }
+      }
+    } break;
+    case FXFONT_HANGEUL_CHARSET: {
+      for (size_t i = 0; i < FX_ArraySize(g_LinuxHGFontList); ++i) {
+        auto it = m_FontList.find(g_LinuxHGFontList[i]);
+        if (it != m_FontList.end()) {
+          return it->second;
+        }
+      }
+    } break;
+    default:
+      bCJK = FALSE;
+      break;
+  }
+  return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
+}
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) {
+  CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo;
+  if (!pInfo->ParseFontCfg(pUserPaths)) {
+    pInfo->AddPath("/usr/share/fonts");
+    pInfo->AddPath("/usr/share/X11/fonts/Type1");
+    pInfo->AddPath("/usr/share/X11/fonts/TTF");
+    pInfo->AddPath("/usr/local/share/fonts");
+  }
+  return pInfo;
+}
+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) {
+  if (!pUserPaths) {
+    return FALSE;
+  }
+  for (const char** pPath = pUserPaths; *pPath; ++pPath) {
+    AddPath(*pPath);
+  }
+  return TRUE;
+}
+void CFX_GEModule::InitPlatform() {
+  m_pFontMgr->SetSystemFontInfo(
+      IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths));
+}
+void CFX_GEModule::DestroyPlatform() {}
+#endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_