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

Side by Side Diff: core/fxge/ge/cfx_fontmapper.cpp

Issue 2277323002: Simplify some code in CFX_FontMapper. (Closed)
Patch Set: nits Created 4 years, 3 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698