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 <memory>
8 #include <utility>
9
10 #include "core/fxcrt/fx_codepage.h"
11 #include "core/fxge/cfx_folderfontinfo.h"
12 #include "core/fxge/cfx_fontmgr.h"
13 #include "core/fxge/cfx_gemodule.h"
14 #include "core/fxge/ifx_systemfontinfo.h"
15 #include "third_party/base/ptr_util.h"
16
17 #if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
18 namespace {
19
20 const size_t kLinuxGpNameSize = 6;
21
22 const char* const g_LinuxGpFontList[][kLinuxGpNameSize] = {
23 {"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic",
24 "VL Gothic regular"},
25 {"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", nullptr,
26 "VL Gothic regular"},
27 {"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", nullptr,
28 "VL Gothic regular"},
29 {"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", nullptr,
30 "VL Gothic regular"},
31 };
32
33 const char* const g_LinuxGbFontList[] = {
34 "AR PL UMing CN Light", "WenQuanYi Micro Hei", "AR PL UKai CN",
35 };
36
37 const char* const g_LinuxB5FontList[] = {
38 "AR PL UMing TW Light", "WenQuanYi Micro Hei", "AR PL UKai TW",
39 };
40
41 const char* const g_LinuxHGFontList[] = {
42 "UnDotum",
43 };
44
GetJapanesePreference(const char * facearr,int weight,int pitch_family)45 size_t GetJapanesePreference(const char* facearr,
46 int weight,
47 int pitch_family) {
48 ByteString face = facearr;
49 if (face.Contains("Gothic") ||
50 face.Contains("\x83\x53\x83\x56\x83\x62\x83\x4e")) {
51 if (face.Contains("PGothic") ||
52 face.Contains("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e")) {
53 return 0;
54 }
55 return 1;
56 }
57 if (face.Contains("Mincho") || face.Contains("\x96\xbe\x92\xa9")) {
58 if (face.Contains("PMincho") || face.Contains("\x82\x6f\x96\xbe\x92\xa9")) {
59 return 2;
60 }
61 return 3;
62 }
63 if (!FontFamilyIsRoman(pitch_family) && weight > 400)
64 return 0;
65
66 return 2;
67 }
68
69 class CFX_LinuxFontInfo : public CFX_FolderFontInfo {
70 public:
CFX_LinuxFontInfo()71 CFX_LinuxFontInfo() {}
~CFX_LinuxFontInfo()72 ~CFX_LinuxFontInfo() override {}
73
74 void* MapFont(int weight,
75 bool bItalic,
76 int charset,
77 int pitch_family,
78 const char* family) override;
79 bool ParseFontCfg(const char** pUserPaths);
80 };
81
MapFont(int weight,bool bItalic,int charset,int pitch_family,const char * cstr_face)82 void* CFX_LinuxFontInfo::MapFont(int weight,
83 bool bItalic,
84 int charset,
85 int pitch_family,
86 const char* cstr_face) {
87 void* font = GetSubstFont(cstr_face);
88 if (font)
89 return font;
90
91 bool bCJK = true;
92 switch (charset) {
93 case FX_CHARSET_ShiftJIS: {
94 size_t index = GetJapanesePreference(cstr_face, weight, pitch_family);
95 ASSERT(index < FX_ArraySize(g_LinuxGpFontList));
96 for (size_t i = 0; i < kLinuxGpNameSize; i++) {
97 auto it = m_FontList.find(g_LinuxGpFontList[index][i]);
98 if (it != m_FontList.end())
99 return it->second.get();
100 }
101 break;
102 }
103 case FX_CHARSET_ChineseSimplified: {
104 for (const char* name : g_LinuxGbFontList) {
105 auto it = m_FontList.find(name);
106 if (it != m_FontList.end())
107 return it->second.get();
108 }
109 break;
110 }
111 case FX_CHARSET_ChineseTraditional: {
112 for (const char* name : g_LinuxB5FontList) {
113 auto it = m_FontList.find(name);
114 if (it != m_FontList.end())
115 return it->second.get();
116 }
117 break;
118 }
119 case FX_CHARSET_Hangul: {
120 for (const char* name : g_LinuxHGFontList) {
121 auto it = m_FontList.find(name);
122 if (it != m_FontList.end())
123 return it->second.get();
124 }
125 break;
126 }
127 default:
128 bCJK = false;
129 break;
130 }
131 return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
132 }
133
ParseFontCfg(const char ** pUserPaths)134 bool CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) {
135 if (!pUserPaths)
136 return false;
137
138 for (const char** pPath = pUserPaths; *pPath; ++pPath)
139 AddPath(*pPath);
140 return true;
141 }
142
143 } // namespace
144
CreateDefault(const char ** pUserPaths)145 std::unique_ptr<IFX_SystemFontInfo> IFX_SystemFontInfo::CreateDefault(
146 const char** pUserPaths) {
147 auto pInfo = pdfium::MakeUnique<CFX_LinuxFontInfo>();
148 if (!pInfo->ParseFontCfg(pUserPaths)) {
149 pInfo->AddPath("/usr/share/fonts");
150 pInfo->AddPath("/usr/share/X11/fonts/Type1");
151 pInfo->AddPath("/usr/share/X11/fonts/TTF");
152 pInfo->AddPath("/usr/local/share/fonts");
153 }
154 return std::move(pInfo);
155 }
156
InitPlatform()157 void CFX_GEModule::InitPlatform() {
158 m_pFontMgr->SetSystemFontInfo(
159 IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths));
160 }
161
DestroyPlatform()162 void CFX_GEModule::DestroyPlatform() {}
163 #endif // _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
164