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

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

Issue 1729823004: refactor CPDF_Font and subclasses (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: address comments Created 4 years, 10 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/include/fpdfapi/fpdf_resource.h ('k') | core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/src/fpdfapi/fpdf_font/font_int.h" 7 #include "core/src/fpdfapi/fpdf_font/font_int.h"
8 8
9 #include "core/include/fpdfapi/fpdf_module.h" 9 #include "core/include/fpdfapi/fpdf_module.h"
10 #include "core/include/fpdfapi/fpdf_page.h" 10 #include "core/include/fpdfapi/fpdf_page.h"
11 #include "core/include/fpdfapi/fpdf_pageobj.h" 11 #include "core/include/fpdfapi/fpdf_pageobj.h"
12 #include "core/include/fpdfapi/fpdf_resource.h" 12 #include "core/include/fpdfapi/fpdf_resource.h"
13 #include "core/include/fxcrt/fx_ext.h" 13 #include "core/include/fxcrt/fx_ext.h"
14 #include "core/include/fxge/fx_freetype.h" 14 #include "core/include/fxge/fx_freetype.h"
15 #include "core/src/fpdfapi/fpdf_page/pageint.h" 15 #include "core/src/fpdfapi/fpdf_page/pageint.h"
16 #include "third_party/base/stl_util.h" 16 #include "third_party/base/stl_util.h"
17 17
18 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 18 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
19 #include "core/src/fxge/apple/apple_int.h" 19 #include "core/src/fxge/apple/apple_int.h"
20 #endif 20 #endif
21 21
22 namespace {
23
24 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
25 struct GlyphNameMap {
26 const FX_CHAR* m_pStrAdobe;
27 const FX_CHAR* m_pStrUnicode;
28 };
29
30 const GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"},
31 {"fi", "uniFB01"},
32 {"fl", "uniFB02"},
33 {"ffi", "uniFB03"},
34 {"ffl", "uniFB04"}};
35
36 int compareString(const void* key, const void* element) {
37 return FXSYS_stricmp((const FX_CHAR*)key,
38 ((GlyphNameMap*)element)->m_pStrAdobe);
39 }
40
41 const FX_CHAR* GlyphNameRemap(const FX_CHAR* pStrAdobe) {
42 GlyphNameMap* found = (GlyphNameMap*)FXSYS_bsearch(
43 pStrAdobe, g_GlyphNameSubsts,
44 sizeof(g_GlyphNameSubsts) / sizeof(GlyphNameMap), sizeof(GlyphNameMap),
45 compareString);
46 if (found)
47 return found->m_pStrUnicode;
48 return NULL;
49 }
50 #endif
51
52 const uint8_t ChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00},
53 {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
54 {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
55 {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
56 {0xD0, 0xC2, 0xCB, 0xCE, 0x00}};
57
58 FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value) {
59 if (value == "WinAnsiEncoding") {
60 basemap = PDFFONT_ENCODING_WINANSI;
61 } else if (value == "MacRomanEncoding") {
62 basemap = PDFFONT_ENCODING_MACROMAN;
63 } else if (value == "MacExpertEncoding") {
64 basemap = PDFFONT_ENCODING_MACEXPERT;
65 } else if (value == "PDFDocEncoding") {
66 basemap = PDFFONT_ENCODING_PDFDOC;
67 } else {
68 return FALSE;
69 }
70 return TRUE;
71 }
72
73 FX_BOOL FT_UseType1Charmap(FXFT_Face face) {
74 if (FXFT_Get_Face_CharmapCount(face) == 0) {
75 return FALSE;
76 }
77 if (FXFT_Get_Face_CharmapCount(face) == 1 &&
78 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
79 FXFT_ENCODING_UNICODE) {
80 return FALSE;
81 }
82 if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
83 FXFT_ENCODING_UNICODE) {
84 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
85 } else {
86 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
87 }
88 return TRUE;
89 }
90
91 } // namespace
92
22 FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) { 93 FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) {
23 for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { 94 for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) {
24 if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == 95 if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) ==
25 platform_id && 96 platform_id &&
26 FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == 97 FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) ==
27 encoding_id) { 98 encoding_id) {
28 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]); 99 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
29 return TRUE; 100 return TRUE;
30 } 101 }
31 } 102 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 void CPDF_FontGlobals::Set(CPDF_Document* pDoc, int index, CPDF_Font* pFont) { 145 void CPDF_FontGlobals::Set(CPDF_Document* pDoc, int index, CPDF_Font* pFont) {
75 if (!pdfium::ContainsKey(m_StockMap, pDoc)) 146 if (!pdfium::ContainsKey(m_StockMap, pDoc))
76 m_StockMap[pDoc].reset(new CFX_StockFontArray); 147 m_StockMap[pDoc].reset(new CFX_StockFontArray);
77 m_StockMap[pDoc]->SetFont(index, pFont); 148 m_StockMap[pDoc]->SetFont(index, pFont);
78 } 149 }
79 150
80 void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) { 151 void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) {
81 m_StockMap.erase(pDoc); 152 m_StockMap.erase(pDoc);
82 } 153 }
83 154
84 CPDF_Font::CPDF_Font(int fonttype) : m_FontType(fonttype) { 155 CPDF_Font::CPDF_Font()
85 m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0; 156 : m_pFontFile(nullptr),
86 m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0; 157 m_pFontDict(nullptr),
87 m_pFontFile = NULL; 158 m_pToUnicodeMap(nullptr),
88 m_Flags = 0; 159 m_bToUnicodeLoaded(FALSE),
89 m_pToUnicodeMap = NULL; 160 m_Flags(0),
90 m_bToUnicodeLoaded = FALSE; 161 m_StemV(0),
91 } 162 m_Ascent(0),
163 m_Descent(0),
164 m_ItalicAngle(0) {}
165
92 CPDF_Font::~CPDF_Font() { 166 CPDF_Font::~CPDF_Font() {
93 delete m_pToUnicodeMap; 167 delete m_pToUnicodeMap;
94 m_pToUnicodeMap = NULL; 168 m_pToUnicodeMap = NULL;
95 169
96 if (m_pFontFile) { 170 if (m_pFontFile) {
97 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( 171 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc(
98 const_cast<CPDF_Stream*>(m_pFontFile->GetStream()->AsStream())); 172 const_cast<CPDF_Stream*>(m_pFontFile->GetStream()->AsStream()));
99 } 173 }
100 } 174 }
175
101 FX_BOOL CPDF_Font::IsVertWriting() const { 176 FX_BOOL CPDF_Font::IsVertWriting() const {
102 FX_BOOL bVertWriting = FALSE; 177 FX_BOOL bVertWriting = FALSE;
103 CPDF_CIDFont* pCIDFont = GetCIDFont(); 178 const CPDF_CIDFont* pCIDFont = AsCIDFont();
104 if (pCIDFont) { 179 if (pCIDFont) {
105 bVertWriting = pCIDFont->IsVertWriting(); 180 bVertWriting = pCIDFont->IsVertWriting();
106 } else { 181 } else {
107 bVertWriting = m_Font.IsVertical(); 182 bVertWriting = m_Font.IsVertical();
108 } 183 }
109 return bVertWriting; 184 return bVertWriting;
110 } 185 }
111 CFX_ByteString CPDF_Font::GetFontTypeName() const { 186
112 switch (m_FontType) { 187 int CPDF_Font::AppendChar(FX_CHAR* buf, FX_DWORD charcode) const {
113 case PDFFONT_TYPE1: 188 *buf = (FX_CHAR)charcode;
114 return "Type1"; 189 return 1;
115 case PDFFONT_TRUETYPE:
116 return "TrueType";
117 case PDFFONT_TYPE3:
118 return "Type3";
119 case PDFFONT_CIDFONT:
120 return "Type0";
121 }
122 return CFX_ByteString();
123 } 190 }
191
124 void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const { 192 void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const {
125 char buf[4]; 193 char buf[4];
126 int len = AppendChar(buf, charcode); 194 int len = AppendChar(buf, charcode);
127 if (len == 1) { 195 if (len == 1) {
128 str += buf[0]; 196 str += buf[0];
129 } else { 197 } else {
130 str += CFX_ByteString(buf, len); 198 str += CFX_ByteString(buf, len);
131 } 199 }
132 } 200 }
201
133 CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const { 202 CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const {
134 if (!m_bToUnicodeLoaded) { 203 if (!m_bToUnicodeLoaded)
135 ((CPDF_Font*)this)->LoadUnicodeMap(); 204 ((CPDF_Font*)this)->LoadUnicodeMap();
136 } 205
137 if (m_pToUnicodeMap) { 206 if (m_pToUnicodeMap)
138 CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode); 207 return m_pToUnicodeMap->Lookup(charcode);
139 if (!wsRet.IsEmpty()) { 208 return CFX_WideString();
140 return wsRet;
141 }
142 }
143 FX_WCHAR unicode = _UnicodeFromCharCode(charcode);
144 if (unicode == 0) {
145 return CFX_WideString();
146 }
147 return unicode;
148 } 209 }
210
149 FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const { 211 FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const {
150 if (!m_bToUnicodeLoaded) { 212 if (!m_bToUnicodeLoaded)
151 ((CPDF_Font*)this)->LoadUnicodeMap(); 213 ((CPDF_Font*)this)->LoadUnicodeMap();
152 } 214
153 if (m_pToUnicodeMap) { 215 if (m_pToUnicodeMap)
154 FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode); 216 return m_pToUnicodeMap->ReverseLookup(unicode);
155 if (charcode) { 217 return 0;
156 return charcode;
157 }
158 }
159 return _CharCodeFromUnicode(unicode);
160 } 218 }
161 219
162 void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) { 220 void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) {
163 m_Flags = pFontDesc->GetIntegerBy("Flags", PDFFONT_NONSYMBOLIC); 221 m_Flags = pFontDesc->GetIntegerBy("Flags", PDFFONT_NONSYMBOLIC);
164 int ItalicAngle = 0; 222 int ItalicAngle = 0;
165 FX_BOOL bExistItalicAngle = FALSE; 223 FX_BOOL bExistItalicAngle = FALSE;
166 if (pFontDesc->KeyExist("ItalicAngle")) { 224 if (pFontDesc->KeyExist("ItalicAngle")) {
167 ItalicAngle = pFontDesc->GetIntegerBy("ItalicAngle"); 225 ItalicAngle = pFontDesc->GetIntegerBy("ItalicAngle");
168 bExistItalicAngle = TRUE; 226 bExistItalicAngle = TRUE;
169 } 227 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 } 284 }
227 } 285 }
228 286
229 short TT2PDF(int m, FXFT_Face face) { 287 short TT2PDF(int m, FXFT_Face face) {
230 int upm = FXFT_Get_Face_UnitsPerEM(face); 288 int upm = FXFT_Get_Face_UnitsPerEM(face);
231 if (upm == 0) { 289 if (upm == 0) {
232 return (short)m; 290 return (short)m;
233 } 291 }
234 return (m * 1000 + upm / 2) / upm; 292 return (m * 1000 + upm / 2) / upm;
235 } 293 }
294
236 void CPDF_Font::CheckFontMetrics() { 295 void CPDF_Font::CheckFontMetrics() {
237 if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && 296 if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 &&
238 m_FontBBox.right == 0) { 297 m_FontBBox.right == 0) {
239 FXFT_Face face = m_Font.GetFace(); 298 FXFT_Face face = m_Font.GetFace();
240 if (face) { 299 if (face) {
241 m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face); 300 m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face);
242 m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(face), face); 301 m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(face), face);
243 m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(face), face); 302 m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(face), face);
244 m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(face), face); 303 m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(face), face);
245 m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(face), face); 304 m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(face), face);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 m_Ascent = rect.top; 340 m_Ascent = rect.top;
282 } 341 }
283 GetCharBBox('g', rect); 342 GetCharBBox('g', rect);
284 if (rect.bottom == rect.top) { 343 if (rect.bottom == rect.top) {
285 m_Descent = m_FontBBox.bottom; 344 m_Descent = m_FontBBox.bottom;
286 } else { 345 } else {
287 m_Descent = rect.bottom; 346 m_Descent = rect.bottom;
288 } 347 }
289 } 348 }
290 } 349 }
350
291 void CPDF_Font::LoadUnicodeMap() { 351 void CPDF_Font::LoadUnicodeMap() {
292 m_bToUnicodeLoaded = TRUE; 352 m_bToUnicodeLoaded = TRUE;
293 CPDF_Stream* pStream = m_pFontDict->GetStreamBy("ToUnicode"); 353 CPDF_Stream* pStream = m_pFontDict->GetStreamBy("ToUnicode");
294 if (!pStream) { 354 if (!pStream) {
295 return; 355 return;
296 } 356 }
297 m_pToUnicodeMap = new CPDF_ToUnicodeMap; 357 m_pToUnicodeMap = new CPDF_ToUnicodeMap;
298 m_pToUnicodeMap->Load(pStream); 358 m_pToUnicodeMap->Load(pStream);
299 } 359 }
360
300 int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) { 361 int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) {
301 int offset = 0; 362 int offset = 0;
302 int width = 0; 363 int width = 0;
303 while (offset < size) { 364 while (offset < size) {
304 FX_DWORD charcode = GetNextChar(pString, size, offset); 365 FX_DWORD charcode = GetNextChar(pString, size, offset);
305 width += GetCharWidthF(charcode); 366 width += GetCharWidthF(charcode);
306 } 367 }
307 return width; 368 return width;
308 } 369 }
309 int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode) {
310 if (!m_Font.GetFace())
311 return 0;
312
313 int glyph_index = GlyphFromCharCode(charcode);
314 if (glyph_index == 0xffff) {
315 return 0;
316 }
317 return m_Font.GetGlyphWidth(glyph_index);
318 }
319 370
320 CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, 371 CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc,
321 const CFX_ByteStringC& name) { 372 const CFX_ByteStringC& name) {
322 CFX_ByteString fontname(name); 373 CFX_ByteString fontname(name);
323 int font_id = PDF_GetStandardFontName(&fontname); 374 int font_id = PDF_GetStandardFontName(&fontname);
324 if (font_id < 0) { 375 if (font_id < 0) {
325 return nullptr; 376 return nullptr;
326 } 377 }
327 CPDF_FontGlobals* pFontGlobals = 378 CPDF_FontGlobals* pFontGlobals =
328 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); 379 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
329 CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id); 380 CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);
330 if (pFont) { 381 if (pFont) {
331 return pFont; 382 return pFont;
332 } 383 }
333 CPDF_Dictionary* pDict = new CPDF_Dictionary; 384 CPDF_Dictionary* pDict = new CPDF_Dictionary;
334 pDict->SetAtName("Type", "Font"); 385 pDict->SetAtName("Type", "Font");
335 pDict->SetAtName("Subtype", "Type1"); 386 pDict->SetAtName("Subtype", "Type1");
336 pDict->SetAtName("BaseFont", fontname); 387 pDict->SetAtName("BaseFont", fontname);
337 pDict->SetAtName("Encoding", "WinAnsiEncoding"); 388 pDict->SetAtName("Encoding", "WinAnsiEncoding");
338 pFont = CPDF_Font::CreateFontF(NULL, pDict); 389 pFont = CPDF_Font::CreateFontF(NULL, pDict);
339 pFontGlobals->Set(pDoc, font_id, pFont); 390 pFontGlobals->Set(pDoc, font_id, pFont);
340 return pFont; 391 return pFont;
341 } 392 }
342 const uint8_t ChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00}, 393
343 {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
344 {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
345 {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
346 {0xD0, 0xC2, 0xCB, 0xCE, 0x00}};
347 CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, 394 CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc,
348 CPDF_Dictionary* pFontDict) { 395 CPDF_Dictionary* pFontDict) {
349 CFX_ByteString type = pFontDict->GetStringBy("Subtype"); 396 CFX_ByteString type = pFontDict->GetStringBy("Subtype");
350 CPDF_Font* pFont; 397 CPDF_Font* pFont;
351 if (type == "TrueType") { 398 if (type == "TrueType") {
352 { 399 {
353 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \ 400 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \
354 _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ 401 _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \
355 _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || \ 402 _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || \
356 _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 403 _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
357 CFX_ByteString basefont = pFontDict->GetStringBy("BaseFont"); 404 CFX_ByteString basefont = pFontDict->GetStringBy("BaseFont");
358 CFX_ByteString tag = basefont.Left(4); 405 CFX_ByteString tag = basefont.Left(4);
359 int i; 406 int i;
360 int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]); 407 int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);
361 for (i = 0; i < count; ++i) { 408 for (i = 0; i < count; ++i) {
362 if (tag == CFX_ByteString((const FX_CHAR*)ChineseFontNames[i])) { 409 if (tag == CFX_ByteString((const FX_CHAR*)ChineseFontNames[i])) {
363 break; 410 break;
364 } 411 }
365 } 412 }
366 if (i < count) { 413 if (i < count) {
367 CPDF_Dictionary* pFontDesc = pFontDict->GetDictBy("FontDescriptor"); 414 CPDF_Dictionary* pFontDesc = pFontDict->GetDictBy("FontDescriptor");
368 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) { 415 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) {
369 pFont = new CPDF_CIDFont; 416 pFont = new CPDF_CIDFont;
370 pFont->m_pFontDict = pFontDict; 417 pFont->m_pFontDict = pFontDict;
371 pFont->m_pDocument = pDoc; 418 pFont->m_pDocument = pDoc;
419 pFont->m_BaseFont = pFontDict->GetStringBy("BaseFont");
372 if (!pFont->Load()) { 420 if (!pFont->Load()) {
373 delete pFont; 421 delete pFont;
374 return NULL; 422 return NULL;
375 } 423 }
376 return pFont; 424 return pFont;
377 } 425 }
378 } 426 }
379 #endif 427 #endif
380 } 428 }
381 pFont = new CPDF_TrueTypeFont; 429 pFont = new CPDF_TrueTypeFont;
382 } else if (type == "Type3") { 430 } else if (type == "Type3") {
383 pFont = new CPDF_Type3Font; 431 pFont = new CPDF_Type3Font;
384 } else if (type == "Type0") { 432 } else if (type == "Type0") {
385 pFont = new CPDF_CIDFont; 433 pFont = new CPDF_CIDFont;
386 } else { 434 } else {
387 pFont = new CPDF_Type1Font; 435 pFont = new CPDF_Type1Font;
388 } 436 }
389 pFont->m_pFontDict = pFontDict; 437 pFont->m_pFontDict = pFontDict;
390 pFont->m_pDocument = pDoc; 438 pFont->m_pDocument = pDoc;
439 pFont->m_BaseFont = pFontDict->GetStringBy("BaseFont");
391 if (!pFont->Load()) { 440 if (!pFont->Load()) {
392 delete pFont; 441 delete pFont;
393 return NULL; 442 return NULL;
394 } 443 }
395 return pFont; 444 return pFont;
396 } 445 }
397 FX_BOOL CPDF_Font::Load() {
398 if (!m_pFontDict) {
399 return FALSE;
400 }
401 CFX_ByteString type = m_pFontDict->GetStringBy("Subtype");
402 m_BaseFont = m_pFontDict->GetStringBy("BaseFont");
403 if (type == "MMType1") {
404 type = "Type1";
405 }
406 return _Load();
407 }
408 446
409 CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode) { 447 CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode) {
410 auto it = m_Map.find(charcode); 448 auto it = m_Map.find(charcode);
411 if (it != m_Map.end()) { 449 if (it != m_Map.end()) {
412 FX_DWORD value = it->second; 450 FX_DWORD value = it->second;
413 FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff); 451 FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);
414 if (unicode != 0xffff) { 452 if (unicode != 0xffff) {
415 return unicode; 453 return unicode;
416 } 454 }
417 const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer(); 455 const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer();
418 FX_DWORD buf_len = m_MultiCharBuf.GetLength(); 456 FX_DWORD buf_len = m_MultiCharBuf.GetLength();
419 if (!buf || buf_len == 0) { 457 if (!buf || buf_len == 0) {
420 return CFX_WideString(); 458 return CFX_WideString();
421 } 459 }
422 FX_DWORD index = value >> 16; 460 FX_DWORD index = value >> 16;
423 if (index >= buf_len) { 461 if (index >= buf_len) {
424 return CFX_WideString(); 462 return CFX_WideString();
425 } 463 }
426 FX_DWORD len = buf[index]; 464 FX_DWORD len = buf[index];
427 if (index + len < index || index + len >= buf_len) { 465 if (index + len < index || index + len >= buf_len) {
428 return CFX_WideString(); 466 return CFX_WideString();
429 } 467 }
430 return CFX_WideString(buf + index + 1, len); 468 return CFX_WideString(buf + index + 1, len);
431 } 469 }
432 if (m_pBaseMap) { 470 if (m_pBaseMap) {
433 return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode); 471 return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);
434 } 472 }
435 return CFX_WideString(); 473 return CFX_WideString();
436 } 474 }
475
437 FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) { 476 FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) {
438 for (const auto& pair : m_Map) { 477 for (const auto& pair : m_Map) {
439 if (pair.second == unicode) 478 if (pair.second == unicode)
440 return pair.first; 479 return pair.first;
441 } 480 }
442 return 0; 481 return 0;
443 } 482 }
444 483
445 // Static. 484 // Static.
446 FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) { 485 FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) {
447 const FX_CHAR* buf = str.GetCStr(); 486 const FX_CHAR* buf = str.GetCStr();
448 int len = str.GetLength(); 487 int len = str.GetLength();
449 if (len == 0) 488 if (len == 0)
450 return 0; 489 return 0;
451 490
452 int result = 0; 491 int result = 0;
453 if (buf[0] == '<') { 492 if (buf[0] == '<') {
454 for (int i = 1; i < len && std::isxdigit(buf[i]); ++i) 493 for (int i = 1; i < len && std::isxdigit(buf[i]); ++i)
455 result = result * 16 + FXSYS_toHexDigit(buf[i]); 494 result = result * 16 + FXSYS_toHexDigit(buf[i]);
456 return result; 495 return result;
457 } 496 }
458 497
459 for (int i = 0; i < len && std::isdigit(buf[i]); ++i) 498 for (int i = 0; i < len && std::isdigit(buf[i]); ++i)
460 result = result * 10 + FXSYS_toDecimalDigit(buf[i]); 499 result = result * 10 + FXSYS_toDecimalDigit(buf[i]);
461 500
462 return result; 501 return result;
463 } 502 }
503
464 static CFX_WideString StringDataAdd(CFX_WideString str) { 504 static CFX_WideString StringDataAdd(CFX_WideString str) {
465 CFX_WideString ret; 505 CFX_WideString ret;
466 int len = str.GetLength(); 506 int len = str.GetLength();
467 FX_WCHAR value = 1; 507 FX_WCHAR value = 1;
468 for (int i = len - 1; i >= 0; --i) { 508 for (int i = len - 1; i >= 0; --i) {
469 FX_WCHAR ch = str[i] + value; 509 FX_WCHAR ch = str[i] + value;
470 if (ch < str[i]) { 510 if (ch < str[i]) {
471 ret.Insert(0, 0); 511 ret.Insert(0, 0);
472 } else { 512 } else {
473 ret.Insert(0, ch); 513 ret.Insert(0, ch);
(...skipping 24 matching lines...) Expand all
498 if (byte_pos == 4) { 538 if (byte_pos == 4) {
499 result += ch; 539 result += ch;
500 byte_pos = 0; 540 byte_pos = 0;
501 ch = 0; 541 ch = 0;
502 } 542 }
503 } 543 }
504 return result; 544 return result;
505 } 545 }
506 return result; 546 return result;
507 } 547 }
548
508 void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { 549 void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
509 CIDSet cid_set = CIDSET_UNKNOWN; 550 CIDSet cid_set = CIDSET_UNKNOWN;
510 CPDF_StreamAcc stream; 551 CPDF_StreamAcc stream;
511 stream.LoadAllData(pStream, FALSE); 552 stream.LoadAllData(pStream, FALSE);
512 CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); 553 CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());
513 while (1) { 554 while (1) {
514 CFX_ByteStringC word = parser.GetWord(); 555 CFX_ByteStringC word = parser.GetWord();
515 if (word.IsEmpty()) { 556 if (word.IsEmpty()) {
516 break; 557 break;
517 } 558 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 } 646 }
606 if (cid_set) { 647 if (cid_set) {
607 m_pBaseMap = CPDF_ModuleMgr::Get() 648 m_pBaseMap = CPDF_ModuleMgr::Get()
608 ->GetPageModule() 649 ->GetPageModule()
609 ->GetFontGlobals() 650 ->GetFontGlobals()
610 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); 651 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE);
611 } else { 652 } else {
612 m_pBaseMap = NULL; 653 m_pBaseMap = NULL;
613 } 654 }
614 } 655 }
615 static FX_BOOL GetPredefinedEncoding(int& basemap, 656
616 const CFX_ByteString& value) { 657 FX_DWORD CPDF_Font::GetNextChar(const FX_CHAR* pString,
617 if (value == "WinAnsiEncoding") { 658 int nStrLen,
618 basemap = PDFFONT_ENCODING_WINANSI; 659 int& offset) const {
619 } else if (value == "MacRomanEncoding") { 660 if (offset < 0 || nStrLen < 1) {
620 basemap = PDFFONT_ENCODING_MACROMAN; 661 return 0;
621 } else if (value == "MacExpertEncoding") {
622 basemap = PDFFONT_ENCODING_MACEXPERT;
623 } else if (value == "PDFDocEncoding") {
624 basemap = PDFFONT_ENCODING_PDFDOC;
625 } else {
626 return FALSE;
627 } 662 }
628 return TRUE; 663 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1];
664 return static_cast<FX_DWORD>(ch);
629 } 665 }
666
630 void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, 667 void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding,
631 int& iBaseEncoding, 668 int& iBaseEncoding,
632 CFX_ByteString*& pCharNames, 669 CFX_ByteString*& pCharNames,
633 FX_BOOL bEmbedded, 670 FX_BOOL bEmbedded,
634 FX_BOOL bTrueType) { 671 FX_BOOL bTrueType) {
635 if (!pEncoding) { 672 if (!pEncoding) {
636 if (m_BaseFont == "Symbol") { 673 if (m_BaseFont == "Symbol") {
637 iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL 674 iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL
638 : PDFFONT_ENCODING_ADOBE_SYMBOL; 675 : PDFFONT_ENCODING_ADOBE_SYMBOL;
639 } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) { 676 } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 if (cur_code < 256) 727 if (cur_code < 256)
691 pCharNames[cur_code] = pName->GetString(); 728 pCharNames[cur_code] = pName->GetString();
692 cur_code++; 729 cur_code++;
693 } else { 730 } else {
694 cur_code = pElement->GetInteger(); 731 cur_code = pElement->GetInteger();
695 } 732 }
696 } 733 }
697 } 734 }
698 735
699 FX_BOOL CPDF_Font::IsStandardFont() const { 736 FX_BOOL CPDF_Font::IsStandardFont() const {
700 if (m_FontType != PDFFONT_TYPE1) 737 if (!IsType1Font())
701 return FALSE; 738 return FALSE;
702 if (m_pFontFile) 739 if (m_pFontFile)
703 return FALSE; 740 return FALSE;
704 if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) 741 if (AsType1Font()->GetBase14Font() < 0)
705 return FALSE; 742 return FALSE;
706 return TRUE; 743 return TRUE;
707 } 744 }
708 CPDF_SimpleFont::CPDF_SimpleFont(int fonttype) : CPDF_Font(fonttype) { 745
746 CPDF_SimpleFont::CPDF_SimpleFont() {
709 FXSYS_memset(m_CharBBox, 0xff, sizeof m_CharBBox); 747 FXSYS_memset(m_CharBBox, 0xff, sizeof m_CharBBox);
710 FXSYS_memset(m_CharWidth, 0xff, sizeof m_CharWidth); 748 FXSYS_memset(m_CharWidth, 0xff, sizeof m_CharWidth);
711 FXSYS_memset(m_GlyphIndex, 0xff, sizeof m_GlyphIndex); 749 FXSYS_memset(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);
712 FXSYS_memset(m_ExtGID, 0xff, sizeof m_ExtGID); 750 FXSYS_memset(m_ExtGID, 0xff, sizeof m_ExtGID);
713 m_pCharNames = NULL; 751 m_pCharNames = NULL;
714 m_BaseEncoding = PDFFONT_ENCODING_BUILTIN; 752 m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
715 } 753 }
754
716 CPDF_SimpleFont::~CPDF_SimpleFont() { 755 CPDF_SimpleFont::~CPDF_SimpleFont() {
717 delete[] m_pCharNames; 756 delete[] m_pCharNames;
718 } 757 }
758
719 int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { 759 int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) {
720 if (pVertGlyph) { 760 if (pVertGlyph) {
721 *pVertGlyph = FALSE; 761 *pVertGlyph = FALSE;
722 } 762 }
723 if (charcode > 0xff) { 763 if (charcode > 0xff) {
724 return -1; 764 return -1;
725 } 765 }
726 int index = m_GlyphIndex[(uint8_t)charcode]; 766 int index = m_GlyphIndex[(uint8_t)charcode];
727 if (index == 0xffff) { 767 if (index == 0xffff) {
728 return -1; 768 return -1;
729 } 769 }
730 return index; 770 return index;
731 } 771 }
772
732 void CPDF_SimpleFont::LoadCharMetrics(int charcode) { 773 void CPDF_SimpleFont::LoadCharMetrics(int charcode) {
733 if (!m_Font.GetFace()) 774 if (!m_Font.GetFace())
734 return; 775 return;
735 776
736 if (charcode < 0 || charcode > 0xff) { 777 if (charcode < 0 || charcode > 0xff) {
737 return; 778 return;
738 } 779 }
739 int glyph_index = m_GlyphIndex[charcode]; 780 int glyph_index = m_GlyphIndex[charcode];
740 if (glyph_index == 0xffff) { 781 if (glyph_index == 0xffff) {
741 if (!m_pFontFile && charcode != 32) { 782 if (!m_pFontFile && charcode != 32) {
(...skipping 23 matching lines...) Expand all
765 if (m_CharWidth[charcode] == 0xffff) { 806 if (m_CharWidth[charcode] == 0xffff) {
766 m_CharWidth[charcode] = TT_Width; 807 m_CharWidth[charcode] = TT_Width;
767 } else if (TT_Width && !IsEmbedded()) { 808 } else if (TT_Width && !IsEmbedded()) {
768 m_CharBBox[charcode].Right = 809 m_CharBBox[charcode].Right =
769 m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width; 810 m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;
770 m_CharBBox[charcode].Left = 811 m_CharBBox[charcode].Left =
771 m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width; 812 m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;
772 } 813 }
773 } 814 }
774 } 815 }
816
775 int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level) { 817 int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level) {
776 if (charcode > 0xff) { 818 if (charcode > 0xff) {
777 charcode = 0; 819 charcode = 0;
778 } 820 }
779 if (m_CharWidth[charcode] == 0xffff) { 821 if (m_CharWidth[charcode] == 0xffff) {
780 LoadCharMetrics(charcode); 822 LoadCharMetrics(charcode);
781 if (m_CharWidth[charcode] == 0xffff) { 823 if (m_CharWidth[charcode] == 0xffff) {
782 m_CharWidth[charcode] = 0; 824 m_CharWidth[charcode] = 0;
783 } 825 }
784 } 826 }
785 return (int16_t)m_CharWidth[charcode]; 827 return (int16_t)m_CharWidth[charcode];
786 } 828 }
829
787 void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { 830 void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) {
788 if (charcode > 0xff) { 831 if (charcode > 0xff) {
789 charcode = 0; 832 charcode = 0;
790 } 833 }
791 if (m_CharBBox[charcode].Left == (int16_t)0xffff) { 834 if (m_CharBBox[charcode].Left == (int16_t)0xffff) {
792 LoadCharMetrics(charcode); 835 LoadCharMetrics(charcode);
793 } 836 }
794 rect.left = m_CharBBox[charcode].Left; 837 rect.left = m_CharBBox[charcode].Left;
795 rect.right = m_CharBBox[charcode].Right; 838 rect.right = m_CharBBox[charcode].Right;
796 rect.bottom = m_CharBBox[charcode].Bottom; 839 rect.bottom = m_CharBBox[charcode].Bottom;
797 rect.top = m_CharBBox[charcode].Top; 840 rect.top = m_CharBBox[charcode].Top;
798 } 841 }
842
799 const FX_CHAR* GetAdobeCharName(int iBaseEncoding, 843 const FX_CHAR* GetAdobeCharName(int iBaseEncoding,
800 const CFX_ByteString* pCharNames, 844 const CFX_ByteString* pCharNames,
801 int charcode) { 845 int charcode) {
802 ASSERT(charcode >= 0 && charcode < 256); 846 ASSERT(charcode >= 0 && charcode < 256);
803 if (charcode < 0 || charcode >= 256) { 847 if (charcode < 0 || charcode >= 256) {
804 return NULL; 848 return NULL;
805 } 849 }
806 const FX_CHAR* name = NULL; 850 const FX_CHAR* name = NULL;
807 if (pCharNames) { 851 if (pCharNames) {
808 name = pCharNames[charcode]; 852 name = pCharNames[charcode];
809 } 853 }
810 if ((!name || name[0] == 0) && iBaseEncoding) { 854 if ((!name || name[0] == 0) && iBaseEncoding) {
811 name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode); 855 name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);
812 } 856 }
813 return name && name[0] ? name : nullptr; 857 return name && name[0] ? name : nullptr;
814 } 858 }
859
815 FX_BOOL CPDF_SimpleFont::LoadCommon() { 860 FX_BOOL CPDF_SimpleFont::LoadCommon() {
816 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); 861 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor");
817 if (pFontDesc) { 862 if (pFontDesc) {
818 LoadFontDescriptor(pFontDesc); 863 LoadFontDescriptor(pFontDesc);
819 } 864 }
820 CPDF_Array* pWidthArray = m_pFontDict->GetArrayBy("Widths"); 865 CPDF_Array* pWidthArray = m_pFontDict->GetArrayBy("Widths");
821 int width_start = 0, width_end = -1; 866 int width_start = 0, width_end = -1;
822 m_bUseFontWidth = TRUE; 867 m_bUseFontWidth = TRUE;
823 if (pWidthArray) { 868 if (pWidthArray) {
824 m_bUseFontWidth = FALSE; 869 m_bUseFontWidth = FALSE;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 if (m_CharWidth[i - 32]) { 918 if (m_CharWidth[i - 32]) {
874 m_CharWidth[i] = m_CharWidth[i - 32]; 919 m_CharWidth[i] = m_CharWidth[i - 32];
875 m_CharBBox[i] = m_CharBBox[i - 32]; 920 m_CharBBox[i] = m_CharBBox[i - 32];
876 } 921 }
877 } 922 }
878 } 923 }
879 } 924 }
880 CheckFontMetrics(); 925 CheckFontMetrics();
881 return TRUE; 926 return TRUE;
882 } 927 }
928
883 void CPDF_SimpleFont::LoadSubstFont() { 929 void CPDF_SimpleFont::LoadSubstFont() {
884 if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) { 930 if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {
885 int width = 0, i; 931 int width = 0, i;
886 for (i = 0; i < 256; i++) { 932 for (i = 0; i < 256; i++) {
887 if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) { 933 if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {
888 continue; 934 continue;
889 } 935 }
890 if (width == 0) { 936 if (width == 0) {
891 width = m_CharWidth[i]; 937 width = m_CharWidth[i];
892 } else if (width != m_CharWidth[i]) { 938 } else if (width != m_CharWidth[i]) {
893 break; 939 break;
894 } 940 }
895 } 941 }
896 if (i == 256 && width) { 942 if (i == 256 && width) {
897 m_Flags |= PDFFONT_FIXEDPITCH; 943 m_Flags |= PDFFONT_FIXEDPITCH;
898 } 944 }
899 } 945 }
900 int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140); 946 int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
901 m_Font.LoadSubst(m_BaseFont, IsFontType(PDFFONT_TRUETYPE), m_Flags, weight, 947 m_Font.LoadSubst(m_BaseFont, IsTrueTypeFont(), m_Flags, weight, m_ItalicAngle,
902 m_ItalicAngle, 0); 948 0);
903 if (m_Font.GetSubstFont()->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) { 949 if (m_Font.GetSubstFont()->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
904 } 950 }
905 } 951 }
952
906 FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const { 953 FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const {
907 return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && 954 return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN &&
908 m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && 955 m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
909 m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS; 956 m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;
910 } 957 }
911 CPDF_Type1Font::CPDF_Type1Font() : CPDF_SimpleFont(PDFFONT_TYPE1) { 958
912 m_Base14Font = -1; 959 CFX_WideString CPDF_SimpleFont::UnicodeFromCharCode(FX_DWORD charcode) const {
960 CFX_WideString unicode = CPDF_Font::UnicodeFromCharCode(charcode);
961 if (!unicode.IsEmpty())
962 return unicode;
963 FX_WCHAR ret = m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
964 if (ret == 0)
965 return CFX_WideString();
966 return ret;
913 } 967 }
914 FX_BOOL CPDF_Type1Font::_Load() { 968
969 FX_DWORD CPDF_SimpleFont::CharCodeFromUnicode(FX_WCHAR unicode) const {
970 FX_DWORD ret = CPDF_Font::CharCodeFromUnicode(unicode);
971 if (ret)
972 return ret;
973 return m_Encoding.CharCodeFromUnicode(unicode);
974 }
975
976 CPDF_Type1Font::CPDF_Type1Font() : m_Base14Font(-1) {}
977
978 FX_BOOL CPDF_Type1Font::Load() {
915 m_Base14Font = PDF_GetStandardFontName(&m_BaseFont); 979 m_Base14Font = PDF_GetStandardFontName(&m_BaseFont);
916 if (m_Base14Font >= 0) { 980 if (m_Base14Font >= 0) {
917 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); 981 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor");
918 if (pFontDesc && pFontDesc->KeyExist("Flags")) { 982 if (pFontDesc && pFontDesc->KeyExist("Flags")) {
919 m_Flags = pFontDesc->GetIntegerBy("Flags"); 983 m_Flags = pFontDesc->GetIntegerBy("Flags");
920 } else { 984 } else {
921 m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC; 985 m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;
922 } 986 }
923 if (m_Base14Font < 4) 987 if (m_Base14Font < 4)
924 for (int i = 0; i < 256; i++) { 988 for (int i = 0; i < 256; i++) {
925 m_CharWidth[i] = 600; 989 m_CharWidth[i] = 600;
926 } 990 }
927 if (m_Base14Font == 12) { 991 if (m_Base14Font == 12) {
928 m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL; 992 m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
929 } else if (m_Base14Font == 13) { 993 } else if (m_Base14Font == 13) {
930 m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS; 994 m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;
931 } else if (m_Flags & PDFFONT_NONSYMBOLIC) { 995 } else if (m_Flags & PDFFONT_NONSYMBOLIC) {
932 m_BaseEncoding = PDFFONT_ENCODING_STANDARD; 996 m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
933 } 997 }
934 } 998 }
935 return LoadCommon(); 999 return LoadCommon();
936 } 1000 }
937 static FX_BOOL FT_UseType1Charmap(FXFT_Face face) { 1001
938 if (FXFT_Get_Face_CharmapCount(face) == 0) {
939 return FALSE;
940 }
941 if (FXFT_Get_Face_CharmapCount(face) == 1 &&
942 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
943 FXFT_ENCODING_UNICODE) {
944 return FALSE;
945 }
946 if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
947 FXFT_ENCODING_UNICODE) {
948 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
949 } else {
950 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
951 }
952 return TRUE;
953 }
954 int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode) { 1002 int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode) {
955 if (charcode > 0xff) { 1003 if (charcode > 0xff) {
956 return -1; 1004 return -1;
957 } 1005 }
958 int index = m_ExtGID[(uint8_t)charcode]; 1006 int index = m_ExtGID[(uint8_t)charcode];
959 if (index == 0xffff) { 1007 if (index == 0xffff) {
960 return -1; 1008 return -1;
961 } 1009 }
962 return index; 1010 return index;
963 } 1011 }
964 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1012
965 struct _GlyphNameMap {
966 const FX_CHAR* m_pStrAdobe;
967 const FX_CHAR* m_pStrUnicode;
968 };
969 static const _GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"},
970 {"fi", "uniFB01"},
971 {"fl", "uniFB02"},
972 {"ffi", "uniFB03"},
973 {"ffl", "uniFB04"}};
974 extern "C" {
975 static int compareString(const void* key, const void* element) {
976 return FXSYS_stricmp((const FX_CHAR*)key,
977 ((_GlyphNameMap*)element)->m_pStrAdobe);
978 }
979 }
980 static const FX_CHAR* _GlyphNameRemap(const FX_CHAR* pStrAdobe) {
981 _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(
982 pStrAdobe, g_GlyphNameSubsts,
983 sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),
984 compareString);
985 if (found) {
986 return found->m_pStrUnicode;
987 }
988 return NULL;
989 }
990 #endif
991 void CPDF_Type1Font::LoadGlyphMap() { 1013 void CPDF_Type1Font::LoadGlyphMap() {
992 if (!m_Font.GetFace()) 1014 if (!m_Font.GetFace())
993 return; 1015 return;
994 1016
995 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1017 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
996 FX_BOOL bCoreText = TRUE; 1018 FX_BOOL bCoreText = TRUE;
997 CQuartz2D& quartz2d = 1019 CQuartz2D& quartz2d =
998 ((CApplePlatform*)CFX_GEModule::Get()->GetPlatformData())->_quartz2d; 1020 ((CApplePlatform*)CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
999 if (!m_Font.GetPlatformFont()) { 1021 if (!m_Font.GetPlatformFont()) {
1000 if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) { 1022 if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { 1172 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
1151 bUnicode = TRUE; 1173 bUnicode = TRUE;
1152 } 1174 }
1153 for (int charcode = 0; charcode < 256; charcode++) { 1175 for (int charcode = 0; charcode < 256; charcode++) {
1154 const FX_CHAR* name = 1176 const FX_CHAR* name =
1155 GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode); 1177 GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
1156 if (!name) { 1178 if (!name) {
1157 continue; 1179 continue;
1158 } 1180 }
1159 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); 1181 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
1160 const FX_CHAR* pStrUnicode = _GlyphNameRemap(name); 1182 const FX_CHAR* pStrUnicode = GlyphNameRemap(name);
1161 if (pStrUnicode && 1183 if (pStrUnicode &&
1162 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) { 1184 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) {
1163 name = pStrUnicode; 1185 name = pStrUnicode;
1164 } 1186 }
1165 m_GlyphIndex[charcode] = 1187 m_GlyphIndex[charcode] =
1166 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); 1188 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
1167 CFStringRef name_ct = CFStringCreateWithCStringNoCopy( 1189 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
1168 kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull); 1190 kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
1169 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName( 1191 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
1170 (CGFontRef)m_Font.GetPlatformFont(), name_ct); 1192 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1295 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
1274 if (!bCoreText) { 1296 if (!bCoreText) {
1275 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); 1297 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
1276 } 1298 }
1277 #endif 1299 #endif
1278 } 1300 }
1279 1301
1280 CPDF_FontEncoding::CPDF_FontEncoding() { 1302 CPDF_FontEncoding::CPDF_FontEncoding() {
1281 FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes)); 1303 FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes));
1282 } 1304 }
1305
1283 int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const { 1306 int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const {
1284 for (int i = 0; i < 256; i++) 1307 for (int i = 0; i < 256; i++)
1285 if (m_Unicodes[i] == unicode) { 1308 if (m_Unicodes[i] == unicode) {
1286 return i; 1309 return i;
1287 } 1310 }
1288 return -1; 1311 return -1;
1289 } 1312 }
1313
1290 CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding) { 1314 CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding) {
1291 const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding); 1315 const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);
1292 if (!pSrc) { 1316 if (!pSrc) {
1293 FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes)); 1317 FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes));
1294 } else 1318 } else
1295 for (int i = 0; i < 256; i++) { 1319 for (int i = 0; i < 256; i++) {
1296 m_Unicodes[i] = pSrc[i]; 1320 m_Unicodes[i] = pSrc[i];
1297 } 1321 }
1298 } 1322 }
1323
1299 FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const { 1324 FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const {
1300 return FXSYS_memcmp(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 1325 return FXSYS_memcmp(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) ==
1301 0; 1326 0;
1302 } 1327 }
1328
1303 CPDF_Object* CPDF_FontEncoding::Realize() { 1329 CPDF_Object* CPDF_FontEncoding::Realize() {
1304 int predefined = 0; 1330 int predefined = 0;
1305 for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; 1331 for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS;
1306 cs++) { 1332 cs++) {
1307 const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs); 1333 const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);
1308 FX_BOOL match = TRUE; 1334 FX_BOOL match = TRUE;
1309 for (int i = 0; i < 256; ++i) { 1335 for (int i = 0; i < 256; ++i) {
1310 if (m_Unicodes[i] != pSrc[i]) { 1336 if (m_Unicodes[i] != pSrc[i]) {
1311 match = FALSE; 1337 match = FALSE;
1312 break; 1338 break;
(...skipping 25 matching lines...) Expand all
1338 } 1364 }
1339 pDiff->Add(new CPDF_Number(i)); 1365 pDiff->Add(new CPDF_Number(i));
1340 pDiff->Add(new CPDF_Name(PDF_AdobeNameFromUnicode(m_Unicodes[i]))); 1366 pDiff->Add(new CPDF_Name(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
1341 } 1367 }
1342 1368
1343 CPDF_Dictionary* pDict = new CPDF_Dictionary; 1369 CPDF_Dictionary* pDict = new CPDF_Dictionary;
1344 pDict->SetAtName("BaseEncoding", "WinAnsiEncoding"); 1370 pDict->SetAtName("BaseEncoding", "WinAnsiEncoding");
1345 pDict->SetAt("Differences", pDiff); 1371 pDict->SetAt("Differences", pDiff);
1346 return pDict; 1372 return pDict;
1347 } 1373 }
1348 CPDF_TrueTypeFont::CPDF_TrueTypeFont() : CPDF_SimpleFont(PDFFONT_TRUETYPE) {} 1374
1349 FX_BOOL CPDF_TrueTypeFont::_Load() { 1375 CPDF_TrueTypeFont::CPDF_TrueTypeFont() {}
1376
1377 FX_BOOL CPDF_TrueTypeFont::Load() {
1350 return LoadCommon(); 1378 return LoadCommon();
1351 } 1379 }
1380
1352 void CPDF_TrueTypeFont::LoadGlyphMap() { 1381 void CPDF_TrueTypeFont::LoadGlyphMap() {
1353 if (!m_Font.GetFace()) 1382 if (!m_Font.GetFace())
1354 return; 1383 return;
1355 1384
1356 int baseEncoding = m_BaseEncoding; 1385 int baseEncoding = m_BaseEncoding;
1357 if (m_pFontFile && m_Font.GetFace()->num_charmaps > 0 && 1386 if (m_pFontFile && m_Font.GetFace()->num_charmaps > 0 &&
1358 (baseEncoding == PDFFONT_ENCODING_MACROMAN || 1387 (baseEncoding == PDFFONT_ENCODING_MACROMAN ||
1359 baseEncoding == PDFFONT_ENCODING_WINANSI) && 1388 baseEncoding == PDFFONT_ENCODING_WINANSI) &&
1360 (m_Flags & PDFFONT_SYMBOLIC)) { 1389 (m_Flags & PDFFONT_SYMBOLIC)) {
1361 FX_BOOL bSupportWin = FALSE; 1390 FX_BOOL bSupportWin = FALSE;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 if (bGotOne) { 1568 if (bGotOne) {
1540 return; 1569 return;
1541 } 1570 }
1542 } 1571 }
1543 for (int charcode = 0; charcode < 256; charcode++) { 1572 for (int charcode = 0; charcode < 256; charcode++) {
1544 m_GlyphIndex[charcode] = charcode; 1573 m_GlyphIndex[charcode] = charcode;
1545 } 1574 }
1546 } 1575 }
1547 1576
1548 CPDF_Type3Font::CPDF_Type3Font() 1577 CPDF_Type3Font::CPDF_Type3Font()
1549 : CPDF_SimpleFont(PDFFONT_TYPE3), 1578 : m_pCharProcs(nullptr),
1550 m_pCharProcs(nullptr),
1551 m_pPageResources(nullptr), 1579 m_pPageResources(nullptr),
1552 m_pFontResources(nullptr) { 1580 m_pFontResources(nullptr) {
1553 FXSYS_memset(m_CharWidthL, 0, sizeof(m_CharWidthL)); 1581 FXSYS_memset(m_CharWidthL, 0, sizeof(m_CharWidthL));
1554 } 1582 }
1555 1583
1556 CPDF_Type3Font::~CPDF_Type3Font() { 1584 CPDF_Type3Font::~CPDF_Type3Font() {
1557 for (auto it : m_CacheMap) 1585 for (auto it : m_CacheMap)
1558 delete it.second; 1586 delete it.second;
1559 } 1587 }
1560 1588
1561 FX_BOOL CPDF_Type3Font::_Load() { 1589 FX_BOOL CPDF_Type3Font::Load() {
1562 m_pFontResources = m_pFontDict->GetDictBy("Resources"); 1590 m_pFontResources = m_pFontDict->GetDictBy("Resources");
1563 CPDF_Array* pMatrix = m_pFontDict->GetArrayBy("FontMatrix"); 1591 CPDF_Array* pMatrix = m_pFontDict->GetArrayBy("FontMatrix");
1564 FX_FLOAT xscale = 1.0f, yscale = 1.0f; 1592 FX_FLOAT xscale = 1.0f, yscale = 1.0f;
1565 if (pMatrix) { 1593 if (pMatrix) {
1566 m_FontMatrix = pMatrix->GetMatrix(); 1594 m_FontMatrix = pMatrix->GetMatrix();
1567 xscale = m_FontMatrix.a; 1595 xscale = m_FontMatrix.a;
1568 yscale = m_FontMatrix.d; 1596 yscale = m_FontMatrix.d;
1569 } 1597 }
1570 CPDF_Array* pBBox = m_pFontDict->GetArrayBy("FontBBox"); 1598 CPDF_Array* pBBox = m_pFontDict->GetArrayBy("FontBBox");
1571 if (pBBox) { 1599 if (pBBox) {
(...skipping 25 matching lines...) Expand all
1597 for (int i = 0; i < 256; i++) { 1625 for (int i = 0; i < 256; i++) {
1598 m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]); 1626 m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);
1599 if (m_Encoding.m_Unicodes[i] == 0) { 1627 if (m_Encoding.m_Unicodes[i] == 0) {
1600 m_Encoding.m_Unicodes[i] = i; 1628 m_Encoding.m_Unicodes[i] = i;
1601 } 1629 }
1602 } 1630 }
1603 } 1631 }
1604 } 1632 }
1605 return TRUE; 1633 return TRUE;
1606 } 1634 }
1635
1607 void CPDF_Type3Font::CheckType3FontMetrics() { 1636 void CPDF_Type3Font::CheckType3FontMetrics() {
1608 CheckFontMetrics(); 1637 CheckFontMetrics();
1609 } 1638 }
1610 1639
1611 CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level) { 1640 CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level) {
1612 if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) 1641 if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_)
1613 return nullptr; 1642 return nullptr;
1614 1643
1615 auto it = m_CacheMap.find(charcode); 1644 auto it = m_CacheMap.find(charcode);
1616 if (it != m_CacheMap.end()) 1645 if (it != m_CacheMap.end())
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1687 rect = pChar->m_BBox; 1716 rect = pChar->m_BBox;
1688 } 1717 }
1689 1718
1690 CPDF_Type3Char::CPDF_Type3Char(CPDF_Form* pForm) 1719 CPDF_Type3Char::CPDF_Type3Char(CPDF_Form* pForm)
1691 : m_pForm(pForm), m_pBitmap(nullptr), m_bColored(FALSE) {} 1720 : m_pForm(pForm), m_pBitmap(nullptr), m_bColored(FALSE) {}
1692 1721
1693 CPDF_Type3Char::~CPDF_Type3Char() { 1722 CPDF_Type3Char::~CPDF_Type3Char() {
1694 delete m_pForm; 1723 delete m_pForm;
1695 delete m_pBitmap; 1724 delete m_pBitmap;
1696 } 1725 }
OLDNEW
« no previous file with comments | « core/include/fpdfapi/fpdf_resource.h ('k') | core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698