Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: core/fpdfapi/fpdf_font/cpdf_type1font.cpp

Issue 2392773003: Move core/fpdfapi/fpdf_font to core/fpdfapi/font (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fpdfapi/fpdf_font/cpdf_type1font.h ('k') | core/fpdfapi/fpdf_font/cpdf_type3char.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 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/fpdfapi/fpdf_font/cpdf_type1font.h"
8
9 #include "core/fpdfapi/fpdf_font/font_int.h"
10 #include "core/fpdfapi/fpdf_parser/cpdf_dictionary.h"
11 #include "core/fxge/cfx_gemodule.h"
12 #include "core/fxge/fx_freetype.h"
13
14 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
15 #include "core/fxge/apple/apple_int.h"
16 #endif
17
18 namespace {
19
20 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
21 struct GlyphNameMap {
22 const FX_CHAR* m_pStrAdobe;
23 const FX_CHAR* m_pStrUnicode;
24 };
25
26 const GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"},
27 {"ffi", "uniFB03"},
28 {"ffl", "uniFB04"},
29 {"fi", "uniFB01"},
30 {"fl", "uniFB02"}};
31
32 int compareString(const void* key, const void* element) {
33 return FXSYS_stricmp(static_cast<const FX_CHAR*>(key),
34 static_cast<const GlyphNameMap*>(element)->m_pStrAdobe);
35 }
36
37 const FX_CHAR* GlyphNameRemap(const FX_CHAR* pStrAdobe) {
38 const GlyphNameMap* found = static_cast<const GlyphNameMap*>(FXSYS_bsearch(
39 pStrAdobe, g_GlyphNameSubsts, FX_ArraySize(g_GlyphNameSubsts),
40 sizeof(GlyphNameMap), compareString));
41 return found ? found->m_pStrUnicode : nullptr;
42 }
43
44 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
45
46 FX_BOOL FT_UseType1Charmap(FXFT_Face face) {
47 if (FXFT_Get_Face_CharmapCount(face) == 0) {
48 return FALSE;
49 }
50 if (FXFT_Get_Face_CharmapCount(face) == 1 &&
51 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
52 FXFT_ENCODING_UNICODE) {
53 return FALSE;
54 }
55 if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
56 FXFT_ENCODING_UNICODE) {
57 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
58 } else {
59 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
60 }
61 return TRUE;
62 }
63
64 } // namespace
65
66 CPDF_Type1Font::CPDF_Type1Font() : m_Base14Font(-1) {}
67
68 bool CPDF_Type1Font::IsType1Font() const {
69 return true;
70 }
71
72 const CPDF_Type1Font* CPDF_Type1Font::AsType1Font() const {
73 return this;
74 }
75
76 CPDF_Type1Font* CPDF_Type1Font::AsType1Font() {
77 return this;
78 }
79
80 bool CPDF_Type1Font::Load() {
81 m_Base14Font = PDF_GetStandardFontName(&m_BaseFont);
82 if (m_Base14Font >= 0) {
83 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictFor("FontDescriptor");
84 if (pFontDesc && pFontDesc->KeyExist("Flags"))
85 m_Flags = pFontDesc->GetIntegerFor("Flags");
86 else
87 m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;
88
89 if (m_Base14Font < 4) {
90 for (int i = 0; i < 256; i++)
91 m_CharWidth[i] = 600;
92 }
93 if (m_Base14Font == 12)
94 m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
95 else if (m_Base14Font == 13)
96 m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;
97 else if (m_Flags & PDFFONT_NONSYMBOLIC)
98 m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
99 }
100 return LoadCommon();
101 }
102
103 int CPDF_Type1Font::GlyphFromCharCodeExt(uint32_t charcode) {
104 if (charcode > 0xff) {
105 return -1;
106 }
107 int index = m_ExtGID[(uint8_t)charcode];
108 if (index == 0xffff) {
109 return -1;
110 }
111 return index;
112 }
113
114 void CPDF_Type1Font::LoadGlyphMap() {
115 if (!m_Font.GetFace())
116 return;
117
118 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
119 bool bCoreText = true;
120 CQuartz2D& quartz2d =
121 static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
122 ->m_quartz2d;
123 if (!m_Font.GetPlatformFont()) {
124 if (m_Font.GetPsName() == "DFHeiStd-W5")
125 bCoreText = false;
126
127 m_Font.SetPlatformFont(
128 quartz2d.CreateFont(m_Font.GetFontData(), m_Font.GetSize()));
129 if (!m_Font.GetPlatformFont())
130 bCoreText = false;
131 }
132 #endif
133 if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
134 if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) {
135 FX_BOOL bGotOne = FALSE;
136 for (int charcode = 0; charcode < 256; charcode++) {
137 const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
138 for (int j = 0; j < 4; j++) {
139 uint16_t unicode = prefix[j] * 256 + charcode;
140 m_GlyphIndex[charcode] =
141 FXFT_Get_Char_Index(m_Font.GetFace(), unicode);
142 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
143 FX_CHAR name_glyph[256];
144 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
145 name_glyph, 256);
146 name_glyph[255] = 0;
147 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
148 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
149 kCFAllocatorNull);
150 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
151 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
152 if (name_ct) {
153 CFRelease(name_ct);
154 }
155 #endif
156 if (m_GlyphIndex[charcode]) {
157 bGotOne = TRUE;
158 break;
159 }
160 }
161 }
162 if (bGotOne) {
163 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
164 if (!bCoreText)
165 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
166 #endif
167 return;
168 }
169 }
170 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
171 if (m_BaseEncoding == 0) {
172 m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
173 }
174 for (int charcode = 0; charcode < 256; charcode++) {
175 const FX_CHAR* name =
176 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
177 if (!name)
178 continue;
179
180 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
181 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
182 m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]);
183 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
184 FX_CHAR name_glyph[256];
185 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph,
186 256);
187 name_glyph[255] = 0;
188 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
189 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
190 kCFAllocatorNull);
191 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
192 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
193 if (name_ct) {
194 CFRelease(name_ct);
195 }
196 #endif
197 if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
198 m_Encoding.m_Unicodes[charcode] = 0x20;
199 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20);
200 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
201 FX_CHAR name_glyph[256];
202 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
203 name_glyph, 256);
204 name_glyph[255] = 0;
205 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
206 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
207 kCFAllocatorNull);
208 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
209 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
210 if (name_ct) {
211 CFRelease(name_ct);
212 }
213 #endif
214 }
215 }
216 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
217 if (!bCoreText)
218 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
219 #endif
220 return;
221 }
222 FT_UseType1Charmap(m_Font.GetFace());
223 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
224 if (bCoreText) {
225 if (m_Flags & PDFFONT_SYMBOLIC) {
226 for (int charcode = 0; charcode < 256; charcode++) {
227 const FX_CHAR* name =
228 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
229 if (name) {
230 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
231 m_GlyphIndex[charcode] =
232 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
233 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
234 kCFAllocatorDefault, name, kCFStringEncodingASCII,
235 kCFAllocatorNull);
236 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
237 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
238 if (name_ct) {
239 CFRelease(name_ct);
240 }
241 } else {
242 m_GlyphIndex[charcode] =
243 FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
244 FX_WCHAR unicode = 0;
245 if (m_GlyphIndex[charcode]) {
246 unicode =
247 FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
248 }
249 FX_CHAR name_glyph[256];
250 FXSYS_memset(name_glyph, 0, sizeof(name_glyph));
251 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
252 name_glyph, 256);
253 name_glyph[255] = 0;
254 if (unicode == 0 && name_glyph[0] != 0) {
255 unicode = PDF_UnicodeFromAdobeName(name_glyph);
256 }
257 m_Encoding.m_Unicodes[charcode] = unicode;
258 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
259 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
260 kCFAllocatorNull);
261 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
262 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
263 if (name_ct) {
264 CFRelease(name_ct);
265 }
266 }
267 }
268 return;
269 }
270 FX_BOOL bUnicode = FALSE;
271 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
272 bUnicode = TRUE;
273 }
274 for (int charcode = 0; charcode < 256; charcode++) {
275 const FX_CHAR* name =
276 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
277 if (!name) {
278 continue;
279 }
280 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
281 const FX_CHAR* pStrUnicode = GlyphNameRemap(name);
282 if (pStrUnicode &&
283 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) {
284 name = pStrUnicode;
285 }
286 m_GlyphIndex[charcode] =
287 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
288 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
289 kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
290 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
291 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
292 if (name_ct) {
293 CFRelease(name_ct);
294 }
295 if (m_GlyphIndex[charcode] == 0) {
296 if (FXSYS_strcmp(name, ".notdef") != 0 &&
297 FXSYS_strcmp(name, "space") != 0) {
298 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
299 m_Font.GetFace(),
300 bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
301 FX_CHAR name_glyph[256];
302 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
303 name_glyph, 256);
304 name_glyph[255] = 0;
305 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
306 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
307 kCFAllocatorNull);
308 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
309 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
310 if (name_ct) {
311 CFRelease(name_ct);
312 }
313 } else {
314 m_Encoding.m_Unicodes[charcode] = 0x20;
315 m_GlyphIndex[charcode] =
316 bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff;
317 FX_CHAR name_glyph[256];
318 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
319 name_glyph, 256);
320 name_glyph[255] = 0;
321 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
322 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
323 kCFAllocatorNull);
324 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
325 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
326 if (name_ct) {
327 CFRelease(name_ct);
328 }
329 }
330 }
331 }
332 return;
333 }
334 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
335 if (m_Flags & PDFFONT_SYMBOLIC) {
336 for (int charcode = 0; charcode < 256; charcode++) {
337 const FX_CHAR* name =
338 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
339 if (name) {
340 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
341 m_GlyphIndex[charcode] =
342 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
343 } else {
344 m_GlyphIndex[charcode] =
345 FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
346 if (m_GlyphIndex[charcode]) {
347 FX_WCHAR unicode =
348 FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
349 if (unicode == 0) {
350 FX_CHAR name_glyph[256];
351 FXSYS_memset(name_glyph, 0, sizeof(name_glyph));
352 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
353 name_glyph, 256);
354 name_glyph[255] = 0;
355 if (name_glyph[0] != 0) {
356 unicode = PDF_UnicodeFromAdobeName(name_glyph);
357 }
358 }
359 m_Encoding.m_Unicodes[charcode] = unicode;
360 }
361 }
362 }
363 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
364 if (!bCoreText)
365 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
366
367 #endif
368 return;
369 }
370 FX_BOOL bUnicode = FALSE;
371 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
372 bUnicode = TRUE;
373 }
374 for (int charcode = 0; charcode < 256; charcode++) {
375 const FX_CHAR* name =
376 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
377 if (!name) {
378 continue;
379 }
380 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
381 m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
382 if (m_GlyphIndex[charcode] == 0) {
383 if (FXSYS_strcmp(name, ".notdef") != 0 &&
384 FXSYS_strcmp(name, "space") != 0) {
385 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
386 m_Font.GetFace(),
387 bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
388 } else {
389 m_Encoding.m_Unicodes[charcode] = 0x20;
390 m_GlyphIndex[charcode] = 0xffff;
391 }
392 }
393 }
394 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
395 if (!bCoreText)
396 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
397 #endif
398 }
OLDNEW
« no previous file with comments | « core/fpdfapi/fpdf_font/cpdf_type1font.h ('k') | core/fpdfapi/fpdf_font/cpdf_type3char.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698