| 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 |