1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "core/include/fxge/fx_ge.h" 8 #include "core/src/fxge/agg/include/fx_agg_driver.h" 9 #include "text_int.h" 10 11 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ 12 class CFX_LinuxFontInfo : public CFX_FolderFontInfo { 13 public: 14 void* MapFont(int weight, 15 FX_BOOL bItalic, 16 int charset, 17 int pitch_family, 18 const FX_CHAR* family, 19 int& iExact) override; 20 FX_BOOL ParseFontCfg(const char** pUserPaths); 21 }; 22 #define LINUX_GPNAMESIZE 6 23 static const struct { 24 const FX_CHAR* NameArr[LINUX_GPNAMESIZE]; 25 } LinuxGpFontList[] = { 26 {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", 27 "VL Gothic regular"}}, 28 {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, 29 "VL Gothic regular"}}, 30 {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, 31 "VL Gothic regular"}}, 32 {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, 33 "VL Gothic regular"}}, 34 }; 35 static const FX_CHAR* const g_LinuxGbFontList[] = { 36 "AR PL UMing CN Light", "WenQuanYi Micro Hei", "AR PL UKai CN", 37 }; 38 static const FX_CHAR* const g_LinuxB5FontList[] = { 39 "AR PL UMing TW Light", "WenQuanYi Micro Hei", "AR PL UKai TW", 40 }; 41 static const FX_CHAR* const g_LinuxHGFontList[] = { 42 "UnDotum", 43 }; 44 static int32_t GetJapanesePreference(const FX_CHAR* facearr, 45 int weight, 46 int picth_family) { 47 CFX_ByteString face = facearr; 48 if (face.Find("Gothic") >= 0 || 49 face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { 50 if (face.Find("PGothic") >= 0 || 51 face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { 52 return 0; 53 } 54 return 1; 55 } 56 if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) { 57 if (face.Find("PMincho") >= 0 || 58 face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) { 59 return 2; 60 } 61 return 3; 62 } 63 if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) { 64 return 0; 65 } 66 return 2; 67 } 68 void* CFX_LinuxFontInfo::MapFont(int weight, 69 FX_BOOL bItalic, 70 int charset, 71 int pitch_family, 72 const FX_CHAR* cstr_face, 73 int& iExact) { 74 void* font = GetSubstFont(cstr_face); 75 if (font) { 76 iExact = 1; 77 return font; 78 } 79 FX_BOOL bCJK = TRUE; 80 switch (charset) { 81 case FXFONT_SHIFTJIS_CHARSET: { 82 int32_t index = GetJapanesePreference(cstr_face, weight, pitch_family); 83 if (index < 0) { 84 break; 85 } 86 for (int32_t i = 0; i < LINUX_GPNAMESIZE; i++) { 87 auto it = m_FontList.find(LinuxGpFontList[index].NameArr[i]); 88 if (it != m_FontList.end()) { 89 return it->second; 90 } 91 } 92 } break; 93 case FXFONT_GB2312_CHARSET: { 94 for (size_t i = 0; i < FX_ArraySize(g_LinuxGbFontList); ++i) { 95 auto it = m_FontList.find(g_LinuxGbFontList[i]); 96 if (it != m_FontList.end()) { 97 return it->second; 98 } 99 } 100 } break; 101 case FXFONT_CHINESEBIG5_CHARSET: { 102 for (size_t i = 0; i < FX_ArraySize(g_LinuxB5FontList); ++i) { 103 auto it = m_FontList.find(g_LinuxB5FontList[i]); 104 if (it != m_FontList.end()) { 105 return it->second; 106 } 107 } 108 } break; 109 case FXFONT_HANGEUL_CHARSET: { 110 for (size_t i = 0; i < FX_ArraySize(g_LinuxHGFontList); ++i) { 111 auto it = m_FontList.find(g_LinuxHGFontList[i]); 112 if (it != m_FontList.end()) { 113 return it->second; 114 } 115 } 116 } break; 117 default: 118 bCJK = FALSE; 119 break; 120 } 121 return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); 122 } 123 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) { 124 CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo; 125 if (!pInfo->ParseFontCfg(pUserPaths)) { 126 pInfo->AddPath("/usr/share/fonts"); 127 pInfo->AddPath("/usr/share/X11/fonts/Type1"); 128 pInfo->AddPath("/usr/share/X11/fonts/TTF"); 129 pInfo->AddPath("/usr/local/share/fonts"); 130 } 131 return pInfo; 132 } 133 FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) { 134 if (!pUserPaths) { 135 return FALSE; 136 } 137 for (const char** pPath = pUserPaths; *pPath; ++pPath) { 138 AddPath(*pPath); 139 } 140 return TRUE; 141 } 142 void CFX_GEModule::InitPlatform() { 143 m_pFontMgr->SetSystemFontInfo( 144 IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths)); 145 } 146 void CFX_GEModule::DestroyPlatform() {} 147 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ 148