OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fxge/include/cfx_fontmapper.h" | 7 #include "core/fxge/include/cfx_fontmapper.h" |
8 | 8 |
| 9 #include <memory> |
| 10 #include <utility> |
| 11 #include <vector> |
| 12 |
9 #include "core/fxge/include/ifx_systemfontinfo.h" | 13 #include "core/fxge/include/ifx_systemfontinfo.h" |
10 #include "core/fxge/include/fx_font.h" | 14 #include "core/fxge/include/fx_font.h" |
11 | 15 |
12 #include "third_party/base/stl_util.h" | 16 #include "third_party/base/stl_util.h" |
13 | 17 |
14 #define FX_FONT_STYLE_None 0x00 | 18 #define FX_FONT_STYLE_None 0x00 |
15 #define FX_FONT_STYLE_Bold 0x01 | 19 #define FX_FONT_STYLE_Bold 0x01 |
16 #define FX_FONT_STYLE_Italic 0x02 | 20 #define FX_FONT_STYLE_Italic 0x02 |
17 #define FX_FONT_STYLE_BoldBold 0x04 | 21 #define FX_FONT_STYLE_BoldBold 0x04 |
18 | 22 |
19 namespace { | 23 namespace { |
20 | 24 |
| 25 const int kExternalFontIndex = 12; |
| 26 |
21 const FX_CHAR* const g_Base14FontNames[14] = { | 27 const FX_CHAR* const g_Base14FontNames[14] = { |
22 "Courier", | 28 "Courier", |
23 "Courier-Bold", | 29 "Courier-Bold", |
24 "Courier-BoldOblique", | 30 "Courier-BoldOblique", |
25 "Courier-Oblique", | 31 "Courier-Oblique", |
26 "Helvetica", | 32 "Helvetica", |
27 "Helvetica-Bold", | 33 "Helvetica-Bold", |
28 "Helvetica-BoldOblique", | 34 "Helvetica-BoldOblique", |
29 "Helvetica-Oblique", | 35 "Helvetica-Oblique", |
30 "Times-Roman", | 36 "Times-Roman", |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, | 160 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, |
155 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, | 161 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, |
156 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, | 162 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, |
157 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, | 163 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, |
158 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, | 164 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, |
159 {10081, 86}, | 165 {10081, 86}, |
160 }; | 166 }; |
161 | 167 |
162 int CompareFontFamilyString(const void* key, const void* element) { | 168 int CompareFontFamilyString(const void* key, const void* element) { |
163 CFX_ByteString str_key((const FX_CHAR*)key); | 169 CFX_ByteString str_key((const FX_CHAR*)key); |
164 if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) | 170 const AltFontFamily* family = reinterpret_cast<const AltFontFamily*>(element); |
| 171 if (str_key.Find(family->m_pFontName) != -1) |
165 return 0; | 172 return 0; |
166 return FXSYS_stricmp((const FX_CHAR*)key, | 173 return FXSYS_stricmp(reinterpret_cast<const FX_CHAR*>(key), |
167 ((AltFontFamily*)element)->m_pFontName); | 174 family->m_pFontName); |
168 } | 175 } |
169 | 176 |
170 int CompareString(const void* key, const void* element) { | 177 int CompareString(const void* key, const void* element) { |
171 return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); | 178 return FXSYS_stricmp(reinterpret_cast<const FX_CHAR*>(key), |
| 179 reinterpret_cast<const AltFontName*>(element)->m_pName); |
172 } | 180 } |
173 | 181 |
174 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { | 182 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
175 CFX_ByteString norm(family); | 183 CFX_ByteString norm(family); |
176 norm.Remove(' '); | 184 norm.Remove(' '); |
177 norm.Remove('-'); | 185 norm.Remove('-'); |
178 norm.Remove(','); | 186 norm.Remove(','); |
179 int pos = norm.Find('+'); | 187 int pos = norm.Find('+'); |
180 if (pos > 0) | 188 if (pos > 0) |
181 norm = norm.Left(pos); | 189 norm = norm.Left(pos); |
(...skipping 19 matching lines...) Expand all Loading... |
201 if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) | 209 if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) |
202 fontName = "ScriptMTBold"; | 210 fontName = "ScriptMTBold"; |
203 else if (fontName.Find("Palace") >= 0) | 211 else if (fontName.Find("Palace") >= 0) |
204 fontName = "PalaceScriptMT"; | 212 fontName = "PalaceScriptMT"; |
205 else if (fontName.Find("French") >= 0) | 213 else if (fontName.Find("French") >= 0) |
206 fontName = "FrenchScriptMT"; | 214 fontName = "FrenchScriptMT"; |
207 else if (fontName.Find("FreeStyle") >= 0) | 215 else if (fontName.Find("FreeStyle") >= 0) |
208 fontName = "FreeStyleScript"; | 216 fontName = "FreeStyleScript"; |
209 return fontName; | 217 return fontName; |
210 } | 218 } |
211 AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch( | 219 AltFontFamily* found = reinterpret_cast<AltFontFamily*>(FXSYS_bsearch( |
212 fontName.c_str(), g_AltFontFamilies, | 220 fontName.c_str(), g_AltFontFamilies, FX_ArraySize(g_AltFontFamilies), |
213 sizeof g_AltFontFamilies / sizeof(AltFontFamily), sizeof(AltFontFamily), | 221 sizeof(AltFontFamily), CompareFontFamilyString)); |
214 CompareFontFamilyString); | |
215 return found ? CFX_ByteString(found->m_pFontFamily) : fontName; | 222 return found ? CFX_ByteString(found->m_pFontFamily) : fontName; |
216 } | 223 } |
217 | 224 |
218 CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { | 225 CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { |
219 CFX_ByteTextBuf buf; | 226 CFX_ByteTextBuf buf; |
220 if (!iLen || iLen <= iIndex) | 227 if (!iLen || iLen <= iIndex) |
221 return buf.MakeString(); | 228 return buf.MakeString(); |
222 while (iIndex < iLen) { | 229 while (iIndex < iLen) { |
223 if (pStyle[iIndex] == ',') | 230 if (pStyle[iIndex] == ',') |
224 break; | 231 break; |
225 buf.AppendChar(pStyle[iIndex]); | 232 buf.AppendChar(pStyle[iIndex]); |
226 ++iIndex; | 233 ++iIndex; |
227 } | 234 } |
228 return buf.MakeString(); | 235 return buf.MakeString(); |
229 } | 236 } |
230 | 237 |
231 int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) { | 238 int32_t GetStyleType(const CFX_ByteString& bsStyle, bool bReverse) { |
232 int32_t iLen = bsStyle.GetLength(); | 239 int32_t iLen = bsStyle.GetLength(); |
233 if (!iLen) | 240 if (!iLen) |
234 return -1; | 241 return -1; |
235 int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle); | 242 int iSize = FX_ArraySize(g_FontStyles); |
236 const FX_FontStyle* pStyle = nullptr; | 243 const FX_FontStyle* pStyle = nullptr; |
237 for (int i = iSize - 1; i >= 0; --i) { | 244 for (int i = iSize - 1; i >= 0; --i) { |
238 pStyle = g_FontStyles + i; | 245 pStyle = g_FontStyles + i; |
239 if (!pStyle || pStyle->len > iLen) | 246 if (!pStyle || pStyle->len > iLen) |
240 continue; | 247 continue; |
241 if (!bRevert) { | 248 |
242 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) | 249 if (bReverse) { |
| 250 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) |
243 return i; | 251 return i; |
244 } else { | 252 } else { |
245 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) | 253 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) |
246 return i; | 254 return i; |
247 } | 255 } |
248 } | 256 } |
249 return -1; | 257 return -1; |
250 } | 258 } |
251 | 259 |
252 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { | 260 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
253 if (name == "MyriadPro") { | 261 if (name == "MyriadPro") { |
254 PitchFamily &= ~FXFONT_FF_ROMAN; | 262 PitchFamily &= ~FXFONT_FF_ROMAN; |
255 return TRUE; | 263 return TRUE; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 if (match[0] == ' ') | 379 if (match[0] == ' ') |
372 match = m_InstalledTTFonts[i + 1]; | 380 match = m_InstalledTTFonts[i + 1]; |
373 return match; | 381 return match; |
374 } | 382 } |
375 | 383 |
376 FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, | 384 FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, |
377 int iBaseFont, | 385 int iBaseFont, |
378 int italic_angle, | 386 int italic_angle, |
379 int weight, | 387 int weight, |
380 int picthfamily) { | 388 int picthfamily) { |
381 if (iBaseFont < 12) { | 389 if (iBaseFont < kExternalFontIndex) { |
382 if (m_FoxitFaces[iBaseFont]) | 390 if (m_FoxitFaces[iBaseFont]) |
383 return m_FoxitFaces[iBaseFont]; | 391 return m_FoxitFaces[iBaseFont]; |
384 const uint8_t* pFontData = nullptr; | 392 const uint8_t* pFontData = nullptr; |
385 uint32_t size = 0; | 393 uint32_t size = 0; |
386 if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) { | 394 if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) { |
387 m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 395 m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
388 return m_FoxitFaces[iBaseFont]; | 396 return m_FoxitFaces[iBaseFont]; |
389 } | 397 } |
390 } | 398 } |
391 pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM; | 399 pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM; |
(...skipping 26 matching lines...) Expand all Loading... |
418 uint32_t flags, | 426 uint32_t flags, |
419 int weight, | 427 int weight, |
420 int italic_angle, | 428 int italic_angle, |
421 int WindowCP, | 429 int WindowCP, |
422 CFX_SubstFont* pSubstFont) { | 430 CFX_SubstFont* pSubstFont) { |
423 if (!(flags & FXFONT_USEEXTERNATTR)) { | 431 if (!(flags & FXFONT_USEEXTERNATTR)) { |
424 weight = FXFONT_FW_NORMAL; | 432 weight = FXFONT_FW_NORMAL; |
425 italic_angle = 0; | 433 italic_angle = 0; |
426 } | 434 } |
427 CFX_ByteString SubstName = name; | 435 CFX_ByteString SubstName = name; |
428 SubstName.Remove(0x20); | 436 SubstName.Remove(' '); |
429 if (bTrueType && name[0] == '@') | 437 if (bTrueType && name[0] == '@') |
430 SubstName = name.Mid(1); | 438 SubstName = name.Mid(1); |
431 PDF_GetStandardFontName(&SubstName); | 439 PDF_GetStandardFontName(&SubstName); |
432 if (SubstName == "Symbol" && !bTrueType) { | 440 if (SubstName == "Symbol" && !bTrueType) { |
433 pSubstFont->m_Family = "Chrome Symbol"; | 441 pSubstFont->m_Family = "Chrome Symbol"; |
434 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; | 442 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; |
435 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 443 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
436 if (m_FoxitFaces[12]) | 444 if (m_FoxitFaces[12]) |
437 return m_FoxitFaces[12]; | 445 return m_FoxitFaces[12]; |
438 const uint8_t* pFontData = nullptr; | 446 const uint8_t* pFontData = nullptr; |
439 uint32_t size = 0; | 447 uint32_t size = 0; |
440 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); | 448 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); |
441 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 449 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
442 return m_FoxitFaces[12]; | 450 return m_FoxitFaces[12]; |
443 } | 451 } |
444 if (SubstName == "ZapfDingbats") { | 452 if (SubstName == "ZapfDingbats") { |
445 pSubstFont->m_Family = "Chrome Dingbats"; | 453 pSubstFont->m_Family = "Chrome Dingbats"; |
446 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; | 454 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; |
447 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 455 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
448 if (m_FoxitFaces[13]) | 456 if (m_FoxitFaces[13]) |
449 return m_FoxitFaces[13]; | 457 return m_FoxitFaces[13]; |
450 const uint8_t* pFontData = nullptr; | 458 const uint8_t* pFontData = nullptr; |
451 uint32_t size = 0; | 459 uint32_t size = 0; |
452 m_pFontMgr->GetBuiltinFont(13, &pFontData, &size); | 460 m_pFontMgr->GetBuiltinFont(13, &pFontData, &size); |
453 m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 461 m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
454 return m_FoxitFaces[13]; | 462 return m_FoxitFaces[13]; |
455 } | 463 } |
456 int iBaseFont = 0; | 464 int iBaseFont = 0; |
457 CFX_ByteString family, style; | 465 CFX_ByteString family; |
458 FX_BOOL bHasComma = FALSE; | 466 CFX_ByteString style; |
459 FX_BOOL bHasHypen = FALSE; | 467 bool bHasComma = false; |
| 468 bool bHasHyphen = false; |
460 int find = SubstName.Find(",", 0); | 469 int find = SubstName.Find(",", 0); |
461 if (find >= 0) { | 470 if (find >= 0) { |
462 family = SubstName.Left(find); | 471 family = SubstName.Left(find); |
463 PDF_GetStandardFontName(&family); | 472 PDF_GetStandardFontName(&family); |
464 style = SubstName.Mid(find + 1); | 473 style = SubstName.Mid(find + 1); |
465 bHasComma = TRUE; | 474 bHasComma = true; |
466 } else { | 475 } else { |
467 family = SubstName; | 476 family = SubstName; |
468 } | 477 } |
469 for (; iBaseFont < 12; iBaseFont++) { | 478 for (; iBaseFont < kExternalFontIndex; iBaseFont++) { |
470 if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) | 479 if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) |
471 break; | 480 break; |
472 } | 481 } |
473 int PitchFamily = 0; | 482 int PitchFamily = 0; |
474 FX_BOOL bItalic = FALSE; | 483 bool bItalic = false; |
475 uint32_t nStyle = 0; | 484 uint32_t nStyle = 0; |
476 FX_BOOL bStyleAvail = FALSE; | 485 bool bStyleAvail = false; |
477 if (iBaseFont < 12) { | 486 if (iBaseFont < kExternalFontIndex) { |
478 if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) | 487 if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) |
479 nStyle |= FX_FONT_STYLE_Bold; | 488 nStyle |= FX_FONT_STYLE_Bold; |
480 if ((iBaseFont % 4) / 2) | 489 if ((iBaseFont % 4) / 2) |
481 nStyle |= FX_FONT_STYLE_Italic; | 490 nStyle |= FX_FONT_STYLE_Italic; |
482 if (iBaseFont < 4) | 491 if (iBaseFont < 4) |
483 PitchFamily |= FXFONT_FF_FIXEDPITCH; | 492 PitchFamily |= FXFONT_FF_FIXEDPITCH; |
484 if (iBaseFont >= 8) | 493 if (iBaseFont >= 8) |
485 PitchFamily |= FXFONT_FF_ROMAN; | 494 PitchFamily |= FXFONT_FF_ROMAN; |
486 } else { | 495 } else { |
487 if (!bHasComma) { | 496 if (!bHasComma) { |
488 find = family.ReverseFind('-'); | 497 find = family.ReverseFind('-'); |
489 if (find >= 0) { | 498 if (find >= 0) { |
490 style = family.Mid(find + 1); | 499 style = family.Mid(find + 1); |
491 family = family.Left(find); | 500 family = family.Left(find); |
492 bHasHypen = TRUE; | 501 bHasHyphen = true; |
493 } | 502 } |
494 } | 503 } |
495 if (!bHasHypen) { | 504 if (!bHasHyphen) { |
496 int nLen = family.GetLength(); | 505 int nLen = family.GetLength(); |
497 int32_t nRet = GetStyleType(family, TRUE); | 506 int32_t nRet = GetStyleType(family, true); |
498 if (nRet > -1) { | 507 if (nRet > -1) { |
499 family = family.Left(nLen - g_FontStyles[nRet].len); | 508 family = family.Left(nLen - g_FontStyles[nRet].len); |
500 if (nRet == 0) | 509 if (nRet == 0) |
501 nStyle |= FX_FONT_STYLE_Bold; | 510 nStyle |= FX_FONT_STYLE_Bold; |
502 if (nRet == 1) | 511 else if (nRet == 1) |
503 nStyle |= FX_FONT_STYLE_Italic; | 512 nStyle |= FX_FONT_STYLE_Italic; |
504 if (nRet == 2) | 513 else if (nRet == 2) |
505 nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic); | 514 nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic); |
506 } | 515 } |
507 } | 516 } |
508 UpdatePitchFamily(flags, PitchFamily); | 517 UpdatePitchFamily(flags, PitchFamily); |
509 } | 518 } |
510 if (!style.IsEmpty()) { | 519 if (!style.IsEmpty()) { |
511 int nLen = style.GetLength(); | 520 int nLen = style.GetLength(); |
512 const FX_CHAR* pStyle = style.c_str(); | 521 const FX_CHAR* pStyle = style.c_str(); |
513 int i = 0; | 522 int i = 0; |
514 FX_BOOL bFirstItem = TRUE; | 523 bool bFirstItem = true; |
515 CFX_ByteString buf; | 524 CFX_ByteString buf; |
516 while (i < nLen) { | 525 while (i < nLen) { |
517 buf = ParseStyle(pStyle, nLen, i); | 526 buf = ParseStyle(pStyle, nLen, i); |
518 int32_t nRet = GetStyleType(buf, FALSE); | 527 int32_t nRet = GetStyleType(buf, false); |
519 if ((i && !bStyleAvail) || (!i && nRet < 0)) { | 528 if ((i && !bStyleAvail) || (!i && nRet < 0)) { |
520 family = SubstName; | 529 family = SubstName; |
521 iBaseFont = 12; | 530 iBaseFont = kExternalFontIndex; |
522 break; | 531 break; |
523 } else if (nRet >= 0) { | 532 } |
524 bStyleAvail = TRUE; | 533 if (nRet >= 0) { |
| 534 bStyleAvail = true; |
| 535 } |
| 536 if (nRet == 1) { |
| 537 if (bFirstItem) { |
| 538 nStyle |= FX_FONT_STYLE_Italic; |
| 539 } else { |
| 540 family = SubstName; |
| 541 iBaseFont = kExternalFontIndex; |
| 542 } |
| 543 break; |
525 } | 544 } |
526 if (nRet == 0) { | 545 if (nRet == 0) { |
527 if (nStyle & FX_FONT_STYLE_Bold) | 546 if (nStyle & FX_FONT_STYLE_Bold) |
528 nStyle |= FX_FONT_STYLE_BoldBold; | 547 nStyle |= FX_FONT_STYLE_BoldBold; |
529 else | 548 else |
530 nStyle |= FX_FONT_STYLE_Bold; | 549 nStyle |= FX_FONT_STYLE_Bold; |
531 bFirstItem = FALSE; | 550 bFirstItem = false; |
532 } | 551 } else if (nRet == 2) { |
533 if (nRet == 1) { | |
534 if (bFirstItem) { | |
535 nStyle |= FX_FONT_STYLE_Italic; | |
536 } else { | |
537 family = SubstName; | |
538 iBaseFont = 12; | |
539 } | |
540 break; | |
541 } | |
542 if (nRet == 2) { | |
543 nStyle |= FX_FONT_STYLE_Italic; | 552 nStyle |= FX_FONT_STYLE_Italic; |
544 if (nStyle & FX_FONT_STYLE_Bold) | 553 if (nStyle & FX_FONT_STYLE_Bold) |
545 nStyle |= FX_FONT_STYLE_BoldBold; | 554 nStyle |= FX_FONT_STYLE_BoldBold; |
546 else | 555 else |
547 nStyle |= FX_FONT_STYLE_Bold; | 556 nStyle |= FX_FONT_STYLE_Bold; |
548 bFirstItem = FALSE; | 557 bFirstItem = false; |
549 } | 558 } |
550 i += buf.GetLength() + 1; | 559 i += buf.GetLength() + 1; |
551 } | 560 } |
552 } | 561 } |
553 weight = weight ? weight : FXFONT_FW_NORMAL; | 562 weight = weight ? weight : FXFONT_FW_NORMAL; |
554 int old_weight = weight; | 563 int old_weight = weight; |
555 if (nStyle) { | 564 if (nStyle) { |
556 weight = | 565 weight = |
557 nStyle & FX_FONT_STYLE_BoldBold | 566 nStyle & FX_FONT_STYLE_BoldBold |
558 ? 900 | 567 ? 900 |
559 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); | 568 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); |
560 } | 569 } |
561 if (nStyle & FX_FONT_STYLE_Italic) | 570 if (nStyle & FX_FONT_STYLE_Italic) |
562 bItalic = TRUE; | 571 bItalic = true; |
563 FX_BOOL bCJK = FALSE; | |
564 int iExact = 0; | 572 int iExact = 0; |
565 int Charset = FXFONT_ANSI_CHARSET; | 573 int Charset = FXFONT_ANSI_CHARSET; |
566 if (WindowCP) | 574 if (WindowCP) |
567 Charset = GetCharsetFromCodePage(WindowCP); | 575 Charset = GetCharsetFromCodePage(WindowCP); |
568 else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) | 576 else if (iBaseFont == kExternalFontIndex && (flags & FXFONT_SYMBOLIC)) |
569 Charset = FXFONT_SYMBOL_CHARSET; | 577 Charset = FXFONT_SYMBOL_CHARSET; |
570 if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET || | 578 bool bCJK = |
571 Charset == FXFONT_HANGEUL_CHARSET || | 579 (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET || |
572 Charset == FXFONT_CHINESEBIG5_CHARSET) { | 580 Charset == FXFONT_HANGEUL_CHARSET || |
573 bCJK = TRUE; | 581 Charset == FXFONT_CHINESEBIG5_CHARSET); |
574 } | |
575 if (!m_pFontInfo) { | 582 if (!m_pFontInfo) { |
576 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 583 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
577 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, | 584 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, |
578 PitchFamily); | 585 PitchFamily); |
579 } | 586 } |
580 family = GetFontFamily(family, nStyle); | 587 family = GetFontFamily(family, nStyle); |
581 CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); | 588 CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); |
582 if (match.IsEmpty() && family != SubstName && | 589 if (match.IsEmpty() && family != SubstName && |
583 (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) { | 590 (!bHasComma && (!bHasHyphen || (bHasHyphen && !bStyleAvail)))) { |
584 match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str())); | 591 match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str())); |
585 } | 592 } |
586 if (match.IsEmpty() && iBaseFont >= 12) { | 593 if (match.IsEmpty() && iBaseFont >= kExternalFontIndex) { |
587 if (!bCJK) { | 594 if (!bCJK) { |
588 if (!CheckSupportThirdPartFont(family, PitchFamily)) { | 595 if (!CheckSupportThirdPartFont(family, PitchFamily)) { |
589 if (italic_angle != 0) | 596 bItalic = italic_angle != 0; |
590 bItalic = TRUE; | |
591 else | |
592 bItalic = FALSE; | |
593 weight = old_weight; | 597 weight = old_weight; |
594 } | 598 } |
595 } else { | 599 } else { |
596 pSubstFont->m_bSubstCJK = true; | 600 pSubstFont->m_bSubstCJK = true; |
597 if (nStyle) | 601 if (nStyle) |
598 pSubstFont->m_WeightCJK = weight; | 602 pSubstFont->m_WeightCJK = nStyle ? weight : FXFONT_FW_NORMAL; |
599 else | |
600 pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL; | |
601 if (nStyle & FX_FONT_STYLE_Italic) | 603 if (nStyle & FX_FONT_STYLE_Italic) |
602 pSubstFont->m_bItalicCJK = true; | 604 pSubstFont->m_bItalicCJK = true; |
603 } | 605 } |
604 } else { | 606 } else { |
605 italic_angle = 0; | 607 italic_angle = 0; |
606 weight = | 608 weight = |
607 nStyle & FX_FONT_STYLE_BoldBold | 609 nStyle & FX_FONT_STYLE_BoldBold |
608 ? 900 | 610 ? 900 |
609 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); | 611 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); |
610 } | 612 } |
611 if (!match.IsEmpty() || iBaseFont < 12) { | 613 if (!match.IsEmpty() || iBaseFont < kExternalFontIndex) { |
612 if (!match.IsEmpty()) | 614 if (!match.IsEmpty()) |
613 family = match; | 615 family = match; |
614 if (iBaseFont < 12) { | 616 if (iBaseFont < kExternalFontIndex) { |
615 if (nStyle && !(iBaseFont % 4)) { | 617 if (nStyle && !(iBaseFont % 4)) { |
616 if ((nStyle & 0x3) == 1) | 618 if ((nStyle & 0x3) == 1) |
617 iBaseFont += 1; | 619 iBaseFont += 1; |
618 if ((nStyle & 0x3) == 2) | 620 if ((nStyle & 0x3) == 2) |
619 iBaseFont += 3; | 621 iBaseFont += 3; |
620 if ((nStyle & 0x3) == 3) | 622 if ((nStyle & 0x3) == 3) |
621 iBaseFont += 2; | 623 iBaseFont += 2; |
622 } | 624 } |
623 family = g_Base14FontNames[iBaseFont]; | 625 family = g_Base14FontNames[iBaseFont]; |
624 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 626 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
625 } | 627 } |
626 } else { | 628 } else { |
627 if (flags & FXFONT_ITALIC) | 629 if (flags & FXFONT_ITALIC) |
628 bItalic = TRUE; | 630 bItalic = true; |
629 } | 631 } |
630 iExact = !match.IsEmpty(); | 632 iExact = !match.IsEmpty(); |
631 void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, | 633 void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, |
632 family.c_str(), iExact); | 634 family.c_str(), iExact); |
633 if (iExact) | 635 if (iExact) |
634 pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT; | 636 pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT; |
635 if (!hFont) { | 637 if (!hFont) { |
636 #ifdef PDF_ENABLE_XFA | 638 #ifdef PDF_ENABLE_XFA |
637 if (flags & FXFONT_EXACTMATCH) | 639 if (flags & FXFONT_EXACTMATCH) |
638 return nullptr; | 640 return nullptr; |
639 #endif // PDF_ENABLE_XFA | 641 #endif // PDF_ENABLE_XFA |
640 if (bCJK) { | 642 if (bCJK) { |
641 if (italic_angle != 0) | 643 bItalic = italic_angle != 0; |
642 bItalic = TRUE; | |
643 else | |
644 bItalic = FALSE; | |
645 weight = old_weight; | 644 weight = old_weight; |
646 } | 645 } |
647 if (!match.IsEmpty()) { | 646 if (!match.IsEmpty()) { |
648 hFont = m_pFontInfo->GetFont(match.c_str()); | 647 hFont = m_pFontInfo->GetFont(match.c_str()); |
649 if (!hFont) { | 648 if (!hFont) { |
650 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, | 649 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, |
651 PitchFamily); | 650 PitchFamily); |
652 } | 651 } |
653 } else { | 652 } else { |
654 if (Charset == FXFONT_SYMBOL_CHARSET) { | 653 if (Charset == FXFONT_SYMBOL_CHARSET) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 if (ttc_size) | 704 if (ttc_size) |
706 face = GetCachedTTCFace(hFont, kTableTTCF, ttc_size, font_size); | 705 face = GetCachedTTCFace(hFont, kTableTTCF, ttc_size, font_size); |
707 else | 706 else |
708 face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); | 707 face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); |
709 if (!face) { | 708 if (!face) { |
710 m_pFontInfo->DeleteFont(hFont); | 709 m_pFontInfo->DeleteFont(hFont); |
711 return nullptr; | 710 return nullptr; |
712 } | 711 } |
713 pSubstFont->m_Family = SubstName; | 712 pSubstFont->m_Family = SubstName; |
714 pSubstFont->m_Charset = Charset; | 713 pSubstFont->m_Charset = Charset; |
715 FX_BOOL bNeedUpdateWeight = FALSE; | 714 bool bNeedUpdateWeight = false; |
716 if (FXFT_Is_Face_Bold(face)) { | 715 if (FXFT_Is_Face_Bold(face)) |
717 if (weight == FXFONT_FW_BOLD) | 716 bNeedUpdateWeight = weight != FXFONT_FW_BOLD; |
718 bNeedUpdateWeight = FALSE; | 717 else |
719 else | 718 bNeedUpdateWeight = weight != FXFONT_FW_NORMAL; |
720 bNeedUpdateWeight = TRUE; | |
721 } else { | |
722 if (weight == FXFONT_FW_NORMAL) | |
723 bNeedUpdateWeight = FALSE; | |
724 else | |
725 bNeedUpdateWeight = TRUE; | |
726 } | |
727 if (bNeedUpdateWeight) | 719 if (bNeedUpdateWeight) |
728 pSubstFont->m_Weight = weight; | 720 pSubstFont->m_Weight = weight; |
729 if (bItalic && !FXFT_Is_Face_Italic(face)) { | 721 if (bItalic && !FXFT_Is_Face_Italic(face)) { |
730 if (italic_angle == 0) | 722 if (italic_angle == 0) |
731 italic_angle = -12; | 723 italic_angle = -12; |
732 else if (FXSYS_abs(italic_angle) < 5) | 724 else if (FXSYS_abs(italic_angle) < 5) |
733 italic_angle = 0; | 725 italic_angle = 0; |
734 pSubstFont->m_ItalicAngle = italic_angle; | 726 pSubstFont->m_ItalicAngle = italic_angle; |
735 } | 727 } |
736 m_pFontInfo->DeleteFont(hFont); | 728 m_pFontInfo->DeleteFont(hFont); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 return TRUE; | 778 return TRUE; |
787 } | 779 } |
788 return FALSE; | 780 return FALSE; |
789 } | 781 } |
790 | 782 |
791 FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, | 783 FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, |
792 const uint32_t tableTTCF, | 784 const uint32_t tableTTCF, |
793 uint32_t ttc_size, | 785 uint32_t ttc_size, |
794 uint32_t font_size) { | 786 uint32_t font_size) { |
795 FXFT_Face face; | 787 FXFT_Face face; |
796 uint8_t temp[1024]; | 788 uint8_t buffer[1024]; |
797 m_pFontInfo->GetFontData(hFont, tableTTCF, temp, 1024); | 789 m_pFontInfo->GetFontData(hFont, tableTTCF, buffer, FX_ArraySize(buffer)); |
| 790 uint32_t* pBuffer = reinterpret_cast<uint32_t*>(buffer); |
798 uint32_t checksum = 0; | 791 uint32_t checksum = 0; |
799 for (int i = 0; i < 256; i++) | 792 for (int i = 0; i < 256; i++) |
800 checksum += ((uint32_t*)temp)[i]; | 793 checksum += pBuffer[i]; |
801 uint8_t* pFontData; | 794 uint8_t* pFontData; |
802 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, | 795 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, |
803 pFontData); | 796 pFontData); |
804 if (!face) { | 797 if (!face) { |
805 pFontData = FX_Alloc(uint8_t, ttc_size); | 798 pFontData = FX_Alloc(uint8_t, ttc_size); |
806 m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); | 799 m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); |
807 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, | 800 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, |
808 ttc_size - font_size); | 801 ttc_size - font_size); |
809 } | 802 } |
810 return face; | 803 return face; |
(...skipping 20 matching lines...) Expand all Loading... |
831 int PDF_GetStandardFontName(CFX_ByteString* name) { | 824 int PDF_GetStandardFontName(CFX_ByteString* name) { |
832 AltFontName* found = static_cast<AltFontName*>( | 825 AltFontName* found = static_cast<AltFontName*>( |
833 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), | 826 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |
834 sizeof(AltFontName), CompareString)); | 827 sizeof(AltFontName), CompareString)); |
835 if (!found) | 828 if (!found) |
836 return -1; | 829 return -1; |
837 | 830 |
838 *name = g_Base14FontNames[found->m_Index]; | 831 *name = g_Base14FontNames[found->m_Index]; |
839 return found->m_Index; | 832 return found->m_Index; |
840 } | 833 } |
OLD | NEW |