| 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 "core/fxge/include/ifx_systemfontinfo.h" | 9 #include "core/fxge/include/ifx_systemfontinfo.h" |
| 10 #include "core/fxge/include/fx_font.h" | 10 #include "core/fxge/include/fx_font.h" |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, | 154 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, |
| 155 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, | 155 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, |
| 156 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, | 156 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, |
| 157 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, | 157 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, |
| 158 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, | 158 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, |
| 159 {10081, 86}, | 159 {10081, 86}, |
| 160 }; | 160 }; |
| 161 | 161 |
| 162 int CompareFontFamilyString(const void* key, const void* element) { | 162 int CompareFontFamilyString(const void* key, const void* element) { |
| 163 CFX_ByteString str_key((const FX_CHAR*)key); | 163 CFX_ByteString str_key((const FX_CHAR*)key); |
| 164 if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) { | 164 if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) |
| 165 return 0; | 165 return 0; |
| 166 } | |
| 167 return FXSYS_stricmp((const FX_CHAR*)key, | 166 return FXSYS_stricmp((const FX_CHAR*)key, |
| 168 ((AltFontFamily*)element)->m_pFontName); | 167 ((AltFontFamily*)element)->m_pFontName); |
| 169 } | 168 } |
| 170 | 169 |
| 171 int CompareString(const void* key, const void* element) { | 170 int CompareString(const void* key, const void* element) { |
| 172 return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); | 171 return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); |
| 173 } | 172 } |
| 174 | 173 |
| 175 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { | 174 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
| 176 CFX_ByteString norm(family); | 175 CFX_ByteString norm(family); |
| 177 norm.Remove(' '); | 176 norm.Remove(' '); |
| 178 norm.Remove('-'); | 177 norm.Remove('-'); |
| 179 norm.Remove(','); | 178 norm.Remove(','); |
| 180 int pos = norm.Find('+'); | 179 int pos = norm.Find('+'); |
| 181 if (pos > 0) { | 180 if (pos > 0) |
| 182 norm = norm.Left(pos); | 181 norm = norm.Left(pos); |
| 183 } | |
| 184 norm.MakeLower(); | 182 norm.MakeLower(); |
| 185 return norm; | 183 return norm; |
| 186 } | 184 } |
| 187 | 185 |
| 188 uint8_t GetCharsetFromCodePage(uint16_t codepage) { | 186 uint8_t GetCharsetFromCodePage(uint16_t codepage) { |
| 189 const CODEPAGE_MAP* pEnd = | 187 const CODEPAGE_MAP* pEnd = |
| 190 g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); | 188 g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); |
| 191 const CODEPAGE_MAP* pCharmap = | 189 const CODEPAGE_MAP* pCharmap = |
| 192 std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, | 190 std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, |
| 193 [](const CODEPAGE_MAP& charset, uint16_t page) { | 191 [](const CODEPAGE_MAP& charset, uint16_t page) { |
| 194 return charset.codepage < page; | 192 return charset.codepage < page; |
| 195 }); | 193 }); |
| 196 if (pCharmap < pEnd && codepage == pCharmap->codepage) | 194 if (pCharmap < pEnd && codepage == pCharmap->codepage) |
| 197 return pCharmap->charset; | 195 return pCharmap->charset; |
| 198 return FXFONT_DEFAULT_CHARSET; | 196 return FXFONT_DEFAULT_CHARSET; |
| 199 } | 197 } |
| 200 | 198 |
| 201 CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) { | 199 CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) { |
| 202 if (fontName.Find("Script") >= 0) { | 200 if (fontName.Find("Script") >= 0) { |
| 203 if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) { | 201 if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) |
| 204 fontName = "ScriptMTBold"; | 202 fontName = "ScriptMTBold"; |
| 205 } else if (fontName.Find("Palace") >= 0) { | 203 else if (fontName.Find("Palace") >= 0) |
| 206 fontName = "PalaceScriptMT"; | 204 fontName = "PalaceScriptMT"; |
| 207 } else if (fontName.Find("French") >= 0) { | 205 else if (fontName.Find("French") >= 0) |
| 208 fontName = "FrenchScriptMT"; | 206 fontName = "FrenchScriptMT"; |
| 209 } else if (fontName.Find("FreeStyle") >= 0) { | 207 else if (fontName.Find("FreeStyle") >= 0) |
| 210 fontName = "FreeStyleScript"; | 208 fontName = "FreeStyleScript"; |
| 211 } | |
| 212 return fontName; | 209 return fontName; |
| 213 } | 210 } |
| 214 AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch( | 211 AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch( |
| 215 fontName.c_str(), g_AltFontFamilies, | 212 fontName.c_str(), g_AltFontFamilies, |
| 216 sizeof g_AltFontFamilies / sizeof(AltFontFamily), sizeof(AltFontFamily), | 213 sizeof g_AltFontFamilies / sizeof(AltFontFamily), sizeof(AltFontFamily), |
| 217 CompareFontFamilyString); | 214 CompareFontFamilyString); |
| 218 return found ? CFX_ByteString(found->m_pFontFamily) : fontName; | 215 return found ? CFX_ByteString(found->m_pFontFamily) : fontName; |
| 219 } | 216 } |
| 220 | 217 |
| 221 CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { | 218 CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { |
| 222 CFX_ByteTextBuf buf; | 219 CFX_ByteTextBuf buf; |
| 223 if (!iLen || iLen <= iIndex) { | 220 if (!iLen || iLen <= iIndex) |
| 224 return buf.MakeString(); | 221 return buf.MakeString(); |
| 225 } | |
| 226 while (iIndex < iLen) { | 222 while (iIndex < iLen) { |
| 227 if (pStyle[iIndex] == ',') { | 223 if (pStyle[iIndex] == ',') |
| 228 break; | 224 break; |
| 229 } | |
| 230 buf.AppendChar(pStyle[iIndex]); | 225 buf.AppendChar(pStyle[iIndex]); |
| 231 ++iIndex; | 226 ++iIndex; |
| 232 } | 227 } |
| 233 return buf.MakeString(); | 228 return buf.MakeString(); |
| 234 } | 229 } |
| 235 | 230 |
| 236 int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) { | 231 int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) { |
| 237 int32_t iLen = bsStyle.GetLength(); | 232 int32_t iLen = bsStyle.GetLength(); |
| 238 if (!iLen) { | 233 if (!iLen) |
| 239 return -1; | 234 return -1; |
| 240 } | |
| 241 int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle); | 235 int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle); |
| 242 const FX_FontStyle* pStyle = nullptr; | 236 const FX_FontStyle* pStyle = nullptr; |
| 243 for (int i = iSize - 1; i >= 0; --i) { | 237 for (int i = iSize - 1; i >= 0; --i) { |
| 244 pStyle = g_FontStyles + i; | 238 pStyle = g_FontStyles + i; |
| 245 if (!pStyle || pStyle->len > iLen) { | 239 if (!pStyle || pStyle->len > iLen) |
| 246 continue; | 240 continue; |
| 247 } | |
| 248 if (!bRevert) { | 241 if (!bRevert) { |
| 249 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) { | 242 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) |
| 250 return i; | 243 return i; |
| 251 } | |
| 252 } else { | 244 } else { |
| 253 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) { | 245 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) |
| 254 return i; | 246 return i; |
| 255 } | |
| 256 } | 247 } |
| 257 } | 248 } |
| 258 return -1; | 249 return -1; |
| 259 } | 250 } |
| 260 | 251 |
| 261 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { | 252 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
| 262 if (name == "MyriadPro") { | 253 if (name == "MyriadPro") { |
| 263 PitchFamily &= ~FXFONT_FF_ROMAN; | 254 PitchFamily &= ~FXFONT_FF_ROMAN; |
| 264 return TRUE; | 255 return TRUE; |
| 265 } | 256 } |
| 266 return FALSE; | 257 return FALSE; |
| 267 } | 258 } |
| 268 | 259 |
| 260 void UpdatePitchFamily(uint32_t flags, int& PitchFamily) { |
| 261 if (flags & FXFONT_SERIF) |
| 262 PitchFamily |= FXFONT_FF_ROMAN; |
| 263 if (flags & FXFONT_SCRIPT) |
| 264 PitchFamily |= FXFONT_FF_SCRIPT; |
| 265 if (flags & FXFONT_FIXED_PITCH) |
| 266 PitchFamily |= FXFONT_FF_FIXEDPITCH; |
| 267 } |
| 268 |
| 269 } // namespace | 269 } // namespace |
| 270 | 270 |
| 271 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) | 271 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) |
| 272 : m_bListLoaded(FALSE), m_pFontMgr(mgr) { | 272 : m_bListLoaded(FALSE), m_pFontMgr(mgr) { |
| 273 m_MMFaces[0] = nullptr; | 273 m_MMFaces[0] = nullptr; |
| 274 m_MMFaces[1] = nullptr; | 274 m_MMFaces[1] = nullptr; |
| 275 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); | 275 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); |
| 276 } | 276 } |
| 277 | 277 |
| 278 CFX_FontMapper::~CFX_FontMapper() { | 278 CFX_FontMapper::~CFX_FontMapper() { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 m_pFontInfo->EnumFontList(this); | 355 m_pFontInfo->EnumFontList(this); |
| 356 m_bListLoaded = TRUE; | 356 m_bListLoaded = TRUE; |
| 357 } | 357 } |
| 358 | 358 |
| 359 CFX_ByteString CFX_FontMapper::MatchInstalledFonts( | 359 CFX_ByteString CFX_FontMapper::MatchInstalledFonts( |
| 360 const CFX_ByteString& norm_name) { | 360 const CFX_ByteString& norm_name) { |
| 361 LoadInstalledFonts(); | 361 LoadInstalledFonts(); |
| 362 int i; | 362 int i; |
| 363 for (i = pdfium::CollectionSize<int>(m_InstalledTTFonts) - 1; i >= 0; i--) { | 363 for (i = pdfium::CollectionSize<int>(m_InstalledTTFonts) - 1; i >= 0; i--) { |
| 364 CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); | 364 CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); |
| 365 if (norm1 == norm_name) { | 365 if (norm1 == norm_name) |
| 366 break; | 366 break; |
| 367 } | |
| 368 } | 367 } |
| 369 if (i < 0) { | 368 if (i < 0) |
| 370 return CFX_ByteString(); | 369 return CFX_ByteString(); |
| 371 } | |
| 372 CFX_ByteString match = m_InstalledTTFonts[i]; | 370 CFX_ByteString match = m_InstalledTTFonts[i]; |
| 373 if (match[0] == ' ') { | 371 if (match[0] == ' ') |
| 374 match = m_InstalledTTFonts[i + 1]; | 372 match = m_InstalledTTFonts[i + 1]; |
| 375 } | |
| 376 return match; | 373 return match; |
| 377 } | 374 } |
| 378 | 375 |
| 379 FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, | 376 FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, |
| 380 int iBaseFont, | 377 int iBaseFont, |
| 381 int italic_angle, | 378 int italic_angle, |
| 382 int weight, | 379 int weight, |
| 383 int picthfamily) { | 380 int picthfamily) { |
| 384 if (iBaseFont < 12) { | 381 if (iBaseFont < 12) { |
| 385 if (m_FoxitFaces[iBaseFont]) { | 382 if (m_FoxitFaces[iBaseFont]) |
| 386 return m_FoxitFaces[iBaseFont]; | 383 return m_FoxitFaces[iBaseFont]; |
| 387 } | |
| 388 const uint8_t* pFontData = nullptr; | 384 const uint8_t* pFontData = nullptr; |
| 389 uint32_t size = 0; | 385 uint32_t size = 0; |
| 390 if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) { | 386 if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) { |
| 391 m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 387 m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 392 return m_FoxitFaces[iBaseFont]; | 388 return m_FoxitFaces[iBaseFont]; |
| 393 } | 389 } |
| 394 } | 390 } |
| 395 pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM; | 391 pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM; |
| 396 pSubstFont->m_ItalicAngle = italic_angle; | 392 pSubstFont->m_ItalicAngle = italic_angle; |
| 397 if (weight) { | 393 if (weight) |
| 398 pSubstFont->m_Weight = weight; | 394 pSubstFont->m_Weight = weight; |
| 399 } | |
| 400 if (picthfamily & FXFONT_FF_ROMAN) { | 395 if (picthfamily & FXFONT_FF_ROMAN) { |
| 401 pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5; | 396 pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5; |
| 402 pSubstFont->m_Family = "Chrome Serif"; | 397 pSubstFont->m_Family = "Chrome Serif"; |
| 403 if (m_MMFaces[1]) { | 398 if (m_MMFaces[1]) |
| 404 return m_MMFaces[1]; | 399 return m_MMFaces[1]; |
| 405 } | |
| 406 const uint8_t* pFontData = nullptr; | 400 const uint8_t* pFontData = nullptr; |
| 407 uint32_t size = 0; | 401 uint32_t size = 0; |
| 408 m_pFontMgr->GetBuiltinFont(14, &pFontData, &size); | 402 m_pFontMgr->GetBuiltinFont(14, &pFontData, &size); |
| 409 m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 403 m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 410 return m_MMFaces[1]; | 404 return m_MMFaces[1]; |
| 411 } | 405 } |
| 412 pSubstFont->m_Family = "Chrome Sans"; | 406 pSubstFont->m_Family = "Chrome Sans"; |
| 413 if (m_MMFaces[0]) { | 407 if (m_MMFaces[0]) |
| 414 return m_MMFaces[0]; | 408 return m_MMFaces[0]; |
| 415 } | |
| 416 const uint8_t* pFontData = nullptr; | 409 const uint8_t* pFontData = nullptr; |
| 417 uint32_t size = 0; | 410 uint32_t size = 0; |
| 418 m_pFontMgr->GetBuiltinFont(15, &pFontData, &size); | 411 m_pFontMgr->GetBuiltinFont(15, &pFontData, &size); |
| 419 m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 412 m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 420 return m_MMFaces[0]; | 413 return m_MMFaces[0]; |
| 421 } | 414 } |
| 422 | 415 |
| 423 FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, | 416 FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, |
| 424 FX_BOOL bTrueType, | 417 FX_BOOL bTrueType, |
| 425 uint32_t flags, | 418 uint32_t flags, |
| 426 int weight, | 419 int weight, |
| 427 int italic_angle, | 420 int italic_angle, |
| 428 int WindowCP, | 421 int WindowCP, |
| 429 CFX_SubstFont* pSubstFont) { | 422 CFX_SubstFont* pSubstFont) { |
| 430 if (!(flags & FXFONT_USEEXTERNATTR)) { | 423 if (!(flags & FXFONT_USEEXTERNATTR)) { |
| 431 weight = FXFONT_FW_NORMAL; | 424 weight = FXFONT_FW_NORMAL; |
| 432 italic_angle = 0; | 425 italic_angle = 0; |
| 433 } | 426 } |
| 434 CFX_ByteString SubstName = name; | 427 CFX_ByteString SubstName = name; |
| 435 SubstName.Remove(0x20); | 428 SubstName.Remove(0x20); |
| 436 if (bTrueType) { | 429 if (bTrueType && name[0] == '@') |
| 437 if (name[0] == '@') { | 430 SubstName = name.Mid(1); |
| 438 SubstName = name.Mid(1); | |
| 439 } | |
| 440 } | |
| 441 PDF_GetStandardFontName(&SubstName); | 431 PDF_GetStandardFontName(&SubstName); |
| 442 if (SubstName == "Symbol" && !bTrueType) { | 432 if (SubstName == "Symbol" && !bTrueType) { |
| 443 pSubstFont->m_Family = "Chrome Symbol"; | 433 pSubstFont->m_Family = "Chrome Symbol"; |
| 444 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; | 434 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; |
| 445 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 435 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
| 446 if (m_FoxitFaces[12]) { | 436 if (m_FoxitFaces[12]) |
| 447 return m_FoxitFaces[12]; | 437 return m_FoxitFaces[12]; |
| 448 } | |
| 449 const uint8_t* pFontData = nullptr; | 438 const uint8_t* pFontData = nullptr; |
| 450 uint32_t size = 0; | 439 uint32_t size = 0; |
| 451 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); | 440 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); |
| 452 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 441 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 453 return m_FoxitFaces[12]; | 442 return m_FoxitFaces[12]; |
| 454 } | 443 } |
| 455 if (SubstName == "ZapfDingbats") { | 444 if (SubstName == "ZapfDingbats") { |
| 456 pSubstFont->m_Family = "Chrome Dingbats"; | 445 pSubstFont->m_Family = "Chrome Dingbats"; |
| 457 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; | 446 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; |
| 458 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 447 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
| 459 if (m_FoxitFaces[13]) { | 448 if (m_FoxitFaces[13]) |
| 460 return m_FoxitFaces[13]; | 449 return m_FoxitFaces[13]; |
| 461 } | |
| 462 const uint8_t* pFontData = nullptr; | 450 const uint8_t* pFontData = nullptr; |
| 463 uint32_t size = 0; | 451 uint32_t size = 0; |
| 464 m_pFontMgr->GetBuiltinFont(13, &pFontData, &size); | 452 m_pFontMgr->GetBuiltinFont(13, &pFontData, &size); |
| 465 m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 453 m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 466 return m_FoxitFaces[13]; | 454 return m_FoxitFaces[13]; |
| 467 } | 455 } |
| 468 int iBaseFont = 0; | 456 int iBaseFont = 0; |
| 469 CFX_ByteString family, style; | 457 CFX_ByteString family, style; |
| 470 FX_BOOL bHasComma = FALSE; | 458 FX_BOOL bHasComma = FALSE; |
| 471 FX_BOOL bHasHypen = FALSE; | 459 FX_BOOL bHasHypen = FALSE; |
| 472 int find = SubstName.Find(",", 0); | 460 int find = SubstName.Find(",", 0); |
| 473 if (find >= 0) { | 461 if (find >= 0) { |
| 474 family = SubstName.Left(find); | 462 family = SubstName.Left(find); |
| 475 PDF_GetStandardFontName(&family); | 463 PDF_GetStandardFontName(&family); |
| 476 style = SubstName.Mid(find + 1); | 464 style = SubstName.Mid(find + 1); |
| 477 bHasComma = TRUE; | 465 bHasComma = TRUE; |
| 478 } else { | 466 } else { |
| 479 family = SubstName; | 467 family = SubstName; |
| 480 } | 468 } |
| 481 for (; iBaseFont < 12; iBaseFont++) | 469 for (; iBaseFont < 12; iBaseFont++) { |
| 482 if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) { | 470 if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) |
| 483 break; | 471 break; |
| 484 } | 472 } |
| 485 int PitchFamily = 0; | 473 int PitchFamily = 0; |
| 486 FX_BOOL bItalic = FALSE; | 474 FX_BOOL bItalic = FALSE; |
| 487 uint32_t nStyle = 0; | 475 uint32_t nStyle = 0; |
| 488 FX_BOOL bStyleAvail = FALSE; | 476 FX_BOOL bStyleAvail = FALSE; |
| 489 if (iBaseFont < 12) { | 477 if (iBaseFont < 12) { |
| 490 family = g_Base14FontNames[iBaseFont]; | 478 if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) |
| 491 if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) { | |
| 492 nStyle |= FX_FONT_STYLE_Bold; | 479 nStyle |= FX_FONT_STYLE_Bold; |
| 493 } | 480 if ((iBaseFont % 4) / 2) |
| 494 if ((iBaseFont % 4) / 2) { | |
| 495 nStyle |= FX_FONT_STYLE_Italic; | 481 nStyle |= FX_FONT_STYLE_Italic; |
| 496 } | 482 if (iBaseFont < 4) |
| 497 if (iBaseFont < 4) { | |
| 498 PitchFamily |= FXFONT_FF_FIXEDPITCH; | 483 PitchFamily |= FXFONT_FF_FIXEDPITCH; |
| 499 } | 484 if (iBaseFont >= 8) |
| 500 if (iBaseFont >= 8) { | |
| 501 PitchFamily |= FXFONT_FF_ROMAN; | 485 PitchFamily |= FXFONT_FF_ROMAN; |
| 502 } | |
| 503 } else { | 486 } else { |
| 504 if (!bHasComma) { | 487 if (!bHasComma) { |
| 505 find = family.ReverseFind('-'); | 488 find = family.ReverseFind('-'); |
| 506 if (find >= 0) { | 489 if (find >= 0) { |
| 507 style = family.Mid(find + 1); | 490 style = family.Mid(find + 1); |
| 508 family = family.Left(find); | 491 family = family.Left(find); |
| 509 bHasHypen = TRUE; | 492 bHasHypen = TRUE; |
| 510 } | 493 } |
| 511 } | 494 } |
| 512 if (!bHasHypen) { | 495 if (!bHasHypen) { |
| 513 int nLen = family.GetLength(); | 496 int nLen = family.GetLength(); |
| 514 int32_t nRet = GetStyleType(family, TRUE); | 497 int32_t nRet = GetStyleType(family, TRUE); |
| 515 if (nRet > -1) { | 498 if (nRet > -1) { |
| 516 family = family.Left(nLen - g_FontStyles[nRet].len); | 499 family = family.Left(nLen - g_FontStyles[nRet].len); |
| 517 if (nRet == 0) { | 500 if (nRet == 0) |
| 518 nStyle |= FX_FONT_STYLE_Bold; | 501 nStyle |= FX_FONT_STYLE_Bold; |
| 519 } | 502 if (nRet == 1) |
| 520 if (nRet == 1) { | |
| 521 nStyle |= FX_FONT_STYLE_Italic; | 503 nStyle |= FX_FONT_STYLE_Italic; |
| 522 } | 504 if (nRet == 2) |
| 523 if (nRet == 2) { | |
| 524 nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic); | 505 nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic); |
| 525 } | |
| 526 } | 506 } |
| 527 } | 507 } |
| 528 if (flags & FXFONT_SERIF) { | 508 UpdatePitchFamily(flags, PitchFamily); |
| 529 PitchFamily |= FXFONT_FF_ROMAN; | |
| 530 } | |
| 531 if (flags & FXFONT_SCRIPT) { | |
| 532 PitchFamily |= FXFONT_FF_SCRIPT; | |
| 533 } | |
| 534 if (flags & FXFONT_FIXED_PITCH) { | |
| 535 PitchFamily |= FXFONT_FF_FIXEDPITCH; | |
| 536 } | |
| 537 } | 509 } |
| 538 if (!style.IsEmpty()) { | 510 if (!style.IsEmpty()) { |
| 539 int nLen = style.GetLength(); | 511 int nLen = style.GetLength(); |
| 540 const FX_CHAR* pStyle = style.c_str(); | 512 const FX_CHAR* pStyle = style.c_str(); |
| 541 int i = 0; | 513 int i = 0; |
| 542 FX_BOOL bFirstItem = TRUE; | 514 FX_BOOL bFirstItem = TRUE; |
| 543 CFX_ByteString buf; | 515 CFX_ByteString buf; |
| 544 while (i < nLen) { | 516 while (i < nLen) { |
| 545 buf = ParseStyle(pStyle, nLen, i); | 517 buf = ParseStyle(pStyle, nLen, i); |
| 546 int32_t nRet = GetStyleType(buf, FALSE); | 518 int32_t nRet = GetStyleType(buf, FALSE); |
| 547 if ((i && !bStyleAvail) || (!i && nRet < 0)) { | 519 if ((i && !bStyleAvail) || (!i && nRet < 0)) { |
| 548 family = SubstName; | 520 family = SubstName; |
| 549 iBaseFont = 12; | 521 iBaseFont = 12; |
| 550 break; | 522 break; |
| 551 } else if (nRet >= 0) { | 523 } else if (nRet >= 0) { |
| 552 bStyleAvail = TRUE; | 524 bStyleAvail = TRUE; |
| 553 } | 525 } |
| 554 if (nRet == 0) { | 526 if (nRet == 0) { |
| 555 if (nStyle & FX_FONT_STYLE_Bold) { | 527 if (nStyle & FX_FONT_STYLE_Bold) |
| 556 nStyle |= FX_FONT_STYLE_BoldBold; | 528 nStyle |= FX_FONT_STYLE_BoldBold; |
| 557 } else { | 529 else |
| 558 nStyle |= FX_FONT_STYLE_Bold; | 530 nStyle |= FX_FONT_STYLE_Bold; |
| 559 } | |
| 560 bFirstItem = FALSE; | 531 bFirstItem = FALSE; |
| 561 } | 532 } |
| 562 if (nRet == 1) { | 533 if (nRet == 1) { |
| 563 if (bFirstItem) { | 534 if (bFirstItem) { |
| 564 nStyle |= FX_FONT_STYLE_Italic; | 535 nStyle |= FX_FONT_STYLE_Italic; |
| 565 } else { | 536 } else { |
| 566 family = SubstName; | 537 family = SubstName; |
| 567 iBaseFont = 12; | 538 iBaseFont = 12; |
| 568 } | 539 } |
| 569 break; | 540 break; |
| 570 } | 541 } |
| 571 if (nRet == 2) { | 542 if (nRet == 2) { |
| 572 nStyle |= FX_FONT_STYLE_Italic; | 543 nStyle |= FX_FONT_STYLE_Italic; |
| 573 if (nStyle & FX_FONT_STYLE_Bold) { | 544 if (nStyle & FX_FONT_STYLE_Bold) |
| 574 nStyle |= FX_FONT_STYLE_BoldBold; | 545 nStyle |= FX_FONT_STYLE_BoldBold; |
| 575 } else { | 546 else |
| 576 nStyle |= FX_FONT_STYLE_Bold; | 547 nStyle |= FX_FONT_STYLE_Bold; |
| 577 } | |
| 578 bFirstItem = FALSE; | 548 bFirstItem = FALSE; |
| 579 } | 549 } |
| 580 i += buf.GetLength() + 1; | 550 i += buf.GetLength() + 1; |
| 581 } | 551 } |
| 582 } | 552 } |
| 583 weight = weight ? weight : FXFONT_FW_NORMAL; | 553 weight = weight ? weight : FXFONT_FW_NORMAL; |
| 584 int old_weight = weight; | 554 int old_weight = weight; |
| 585 if (nStyle) { | 555 if (nStyle) { |
| 586 weight = | 556 weight = |
| 587 nStyle & FX_FONT_STYLE_BoldBold | 557 nStyle & FX_FONT_STYLE_BoldBold |
| 588 ? 900 | 558 ? 900 |
| 589 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); | 559 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); |
| 590 } | 560 } |
| 591 if (nStyle & FX_FONT_STYLE_Italic) { | 561 if (nStyle & FX_FONT_STYLE_Italic) |
| 592 bItalic = TRUE; | 562 bItalic = TRUE; |
| 593 } | |
| 594 FX_BOOL bCJK = FALSE; | 563 FX_BOOL bCJK = FALSE; |
| 595 int iExact = 0; | 564 int iExact = 0; |
| 596 int Charset = FXFONT_ANSI_CHARSET; | 565 int Charset = FXFONT_ANSI_CHARSET; |
| 597 if (WindowCP) { | 566 if (WindowCP) |
| 598 Charset = GetCharsetFromCodePage(WindowCP); | 567 Charset = GetCharsetFromCodePage(WindowCP); |
| 599 } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) { | 568 else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) |
| 600 Charset = FXFONT_SYMBOL_CHARSET; | 569 Charset = FXFONT_SYMBOL_CHARSET; |
| 601 } | |
| 602 if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET || | 570 if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET || |
| 603 Charset == FXFONT_HANGEUL_CHARSET || | 571 Charset == FXFONT_HANGEUL_CHARSET || |
| 604 Charset == FXFONT_CHINESEBIG5_CHARSET) { | 572 Charset == FXFONT_CHINESEBIG5_CHARSET) { |
| 605 bCJK = TRUE; | 573 bCJK = TRUE; |
| 606 } | 574 } |
| 607 if (!m_pFontInfo) { | 575 if (!m_pFontInfo) { |
| 608 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 576 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
| 609 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, | 577 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, |
| 610 PitchFamily); | 578 PitchFamily); |
| 611 } | 579 } |
| 612 family = GetFontFamily(family, nStyle); | 580 family = GetFontFamily(family, nStyle); |
| 613 CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); | 581 CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); |
| 614 if (match.IsEmpty() && family != SubstName && | 582 if (match.IsEmpty() && family != SubstName && |
| 615 (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) { | 583 (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) { |
| 616 match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str())); | 584 match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str())); |
| 617 } | 585 } |
| 618 if (match.IsEmpty() && iBaseFont >= 12) { | 586 if (match.IsEmpty() && iBaseFont >= 12) { |
| 619 if (!bCJK) { | 587 if (!bCJK) { |
| 620 if (!CheckSupportThirdPartFont(family, PitchFamily)) { | 588 if (!CheckSupportThirdPartFont(family, PitchFamily)) { |
| 621 if (italic_angle != 0) { | 589 if (italic_angle != 0) |
| 622 bItalic = TRUE; | 590 bItalic = TRUE; |
| 623 } else { | 591 else |
| 624 bItalic = FALSE; | 592 bItalic = FALSE; |
| 625 } | |
| 626 weight = old_weight; | 593 weight = old_weight; |
| 627 } | 594 } |
| 628 } else { | 595 } else { |
| 629 pSubstFont->m_bSubstCJK = true; | 596 pSubstFont->m_bSubstCJK = true; |
| 630 if (nStyle) { | 597 if (nStyle) |
| 631 pSubstFont->m_WeightCJK = weight; | 598 pSubstFont->m_WeightCJK = weight; |
| 632 } else { | 599 else |
| 633 pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL; | 600 pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL; |
| 634 } | 601 if (nStyle & FX_FONT_STYLE_Italic) |
| 635 if (nStyle & FX_FONT_STYLE_Italic) { | |
| 636 pSubstFont->m_bItalicCJK = true; | 602 pSubstFont->m_bItalicCJK = true; |
| 637 } | |
| 638 } | 603 } |
| 639 } else { | 604 } else { |
| 640 italic_angle = 0; | 605 italic_angle = 0; |
| 641 weight = | 606 weight = |
| 642 nStyle & FX_FONT_STYLE_BoldBold | 607 nStyle & FX_FONT_STYLE_BoldBold |
| 643 ? 900 | 608 ? 900 |
| 644 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); | 609 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); |
| 645 } | 610 } |
| 646 if (!match.IsEmpty() || iBaseFont < 12) { | 611 if (!match.IsEmpty() || iBaseFont < 12) { |
| 647 if (!match.IsEmpty()) { | 612 if (!match.IsEmpty()) |
| 648 family = match; | 613 family = match; |
| 649 } | |
| 650 if (iBaseFont < 12) { | 614 if (iBaseFont < 12) { |
| 651 if (nStyle && !(iBaseFont % 4)) { | 615 if (nStyle && !(iBaseFont % 4)) { |
| 652 if ((nStyle & 0x3) == 1) { | 616 if ((nStyle & 0x3) == 1) |
| 653 iBaseFont += 1; | 617 iBaseFont += 1; |
| 654 } | 618 if ((nStyle & 0x3) == 2) |
| 655 if ((nStyle & 0x3) == 2) { | |
| 656 iBaseFont += 3; | 619 iBaseFont += 3; |
| 657 } | 620 if ((nStyle & 0x3) == 3) |
| 658 if ((nStyle & 0x3) == 3) { | |
| 659 iBaseFont += 2; | 621 iBaseFont += 2; |
| 660 } | |
| 661 } | 622 } |
| 662 family = g_Base14FontNames[iBaseFont]; | 623 family = g_Base14FontNames[iBaseFont]; |
| 663 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 624 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
| 664 } | 625 } |
| 665 } else { | 626 } else { |
| 666 if (flags & FXFONT_ITALIC) { | 627 if (flags & FXFONT_ITALIC) |
| 667 bItalic = TRUE; | 628 bItalic = TRUE; |
| 668 } | |
| 669 } | 629 } |
| 670 iExact = !match.IsEmpty(); | 630 iExact = !match.IsEmpty(); |
| 671 void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, | 631 void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, |
| 672 family.c_str(), iExact); | 632 family.c_str(), iExact); |
| 673 if (iExact) { | 633 if (iExact) |
| 674 pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT; | 634 pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT; |
| 675 } | |
| 676 if (!hFont) { | 635 if (!hFont) { |
| 677 #ifdef PDF_ENABLE_XFA | 636 #ifdef PDF_ENABLE_XFA |
| 678 if (flags & FXFONT_EXACTMATCH) { | 637 if (flags & FXFONT_EXACTMATCH) |
| 679 return nullptr; | 638 return nullptr; |
| 680 } | |
| 681 #endif // PDF_ENABLE_XFA | 639 #endif // PDF_ENABLE_XFA |
| 682 if (bCJK) { | 640 if (bCJK) { |
| 683 if (italic_angle != 0) { | 641 if (italic_angle != 0) |
| 684 bItalic = TRUE; | 642 bItalic = TRUE; |
| 685 } else { | 643 else |
| 686 bItalic = FALSE; | 644 bItalic = FALSE; |
| 687 } | |
| 688 weight = old_weight; | 645 weight = old_weight; |
| 689 } | 646 } |
| 690 if (!match.IsEmpty()) { | 647 if (!match.IsEmpty()) { |
| 691 hFont = m_pFontInfo->GetFont(match.c_str()); | 648 hFont = m_pFontInfo->GetFont(match.c_str()); |
| 692 if (!hFont) { | 649 if (!hFont) { |
| 693 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, | 650 return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, |
| 694 PitchFamily); | 651 PitchFamily); |
| 695 } | 652 } |
| 696 } else { | 653 } else { |
| 697 if (Charset == FXFONT_SYMBOL_CHARSET) { | 654 if (Charset == FXFONT_SYMBOL_CHARSET) { |
| 698 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ | 655 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ |
| 699 _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ | 656 _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ |
| 700 if (SubstName == "Symbol") { | 657 if (SubstName == "Symbol") { |
| 701 pSubstFont->m_Family = "Chrome Symbol"; | 658 pSubstFont->m_Family = "Chrome Symbol"; |
| 702 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; | 659 pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD; |
| 703 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; | 660 pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; |
| 704 if (m_FoxitFaces[12]) { | 661 if (m_FoxitFaces[12]) |
| 705 return m_FoxitFaces[12]; | 662 return m_FoxitFaces[12]; |
| 706 } | |
| 707 const uint8_t* pFontData = nullptr; | 663 const uint8_t* pFontData = nullptr; |
| 708 uint32_t size = 0; | 664 uint32_t size = 0; |
| 709 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); | 665 m_pFontMgr->GetBuiltinFont(12, &pFontData, &size); |
| 710 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 666 m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| 711 return m_FoxitFaces[12]; | 667 return m_FoxitFaces[12]; |
| 712 } | 668 } |
| 713 #endif | 669 #endif |
| 714 pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL; | 670 pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL; |
| 715 return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, | 671 return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, |
| 716 weight, italic_angle, 0, pSubstFont); | 672 weight, italic_angle, 0, pSubstFont); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 731 PitchFamily); | 687 PitchFamily); |
| 732 } | 688 } |
| 733 hFont = m_pFontInfo->GetFont(it->name.c_str()); | 689 hFont = m_pFontInfo->GetFont(it->name.c_str()); |
| 734 } | 690 } |
| 735 } | 691 } |
| 736 pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont); | 692 pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont); |
| 737 if (!hFont) | 693 if (!hFont) |
| 738 return nullptr; | 694 return nullptr; |
| 739 | 695 |
| 740 m_pFontInfo->GetFaceName(hFont, SubstName); | 696 m_pFontInfo->GetFaceName(hFont, SubstName); |
| 741 if (Charset == FXFONT_DEFAULT_CHARSET) { | 697 if (Charset == FXFONT_DEFAULT_CHARSET) |
| 742 m_pFontInfo->GetFontCharset(hFont, Charset); | 698 m_pFontInfo->GetFontCharset(hFont, Charset); |
| 743 } | |
| 744 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, nullptr, 0); | 699 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, nullptr, 0); |
| 745 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); | 700 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); |
| 746 if (font_size == 0 && ttc_size == 0) { | 701 if (font_size == 0 && ttc_size == 0) { |
| 747 m_pFontInfo->DeleteFont(hFont); | 702 m_pFontInfo->DeleteFont(hFont); |
| 748 return nullptr; | 703 return nullptr; |
| 749 } | 704 } |
| 750 FXFT_Face face = nullptr; | 705 FXFT_Face face = nullptr; |
| 751 if (ttc_size) { | 706 if (ttc_size) |
| 752 uint8_t temp[1024]; | 707 face = GetCachedTTCFace(hFont, kTableTTCF, ttc_size, font_size); |
| 753 m_pFontInfo->GetFontData(hFont, kTableTTCF, temp, 1024); | 708 else |
| 754 uint32_t checksum = 0; | 709 face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); |
| 755 for (int i = 0; i < 256; i++) { | |
| 756 checksum += ((uint32_t*)temp)[i]; | |
| 757 } | |
| 758 uint8_t* pFontData; | |
| 759 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, | |
| 760 ttc_size - font_size, pFontData); | |
| 761 if (!face) { | |
| 762 pFontData = FX_Alloc(uint8_t, ttc_size); | |
| 763 m_pFontInfo->GetFontData(hFont, kTableTTCF, pFontData, ttc_size); | |
| 764 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, | |
| 765 ttc_size, ttc_size - font_size); | |
| 766 } | |
| 767 } else { | |
| 768 uint8_t* pFontData; | |
| 769 face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); | |
| 770 if (!face) { | |
| 771 pFontData = FX_Alloc(uint8_t, font_size); | |
| 772 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); | |
| 773 face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, | |
| 774 font_size, | |
| 775 m_pFontInfo->GetFaceIndex(hFont)); | |
| 776 } | |
| 777 } | |
| 778 if (!face) { | 710 if (!face) { |
| 779 m_pFontInfo->DeleteFont(hFont); | 711 m_pFontInfo->DeleteFont(hFont); |
| 780 return nullptr; | 712 return nullptr; |
| 781 } | 713 } |
| 782 pSubstFont->m_Family = SubstName; | 714 pSubstFont->m_Family = SubstName; |
| 783 pSubstFont->m_Charset = Charset; | 715 pSubstFont->m_Charset = Charset; |
| 784 FX_BOOL bNeedUpdateWeight = FALSE; | 716 FX_BOOL bNeedUpdateWeight = FALSE; |
| 785 if (FXFT_Is_Face_Bold(face)) { | 717 if (FXFT_Is_Face_Bold(face)) { |
| 786 if (weight == FXFONT_FW_BOLD) { | 718 if (weight == FXFONT_FW_BOLD) |
| 787 bNeedUpdateWeight = FALSE; | 719 bNeedUpdateWeight = FALSE; |
| 788 } else { | 720 else |
| 789 bNeedUpdateWeight = TRUE; | 721 bNeedUpdateWeight = TRUE; |
| 790 } | |
| 791 } else { | 722 } else { |
| 792 if (weight == FXFONT_FW_NORMAL) { | 723 if (weight == FXFONT_FW_NORMAL) |
| 793 bNeedUpdateWeight = FALSE; | 724 bNeedUpdateWeight = FALSE; |
| 794 } else { | 725 else |
| 795 bNeedUpdateWeight = TRUE; | 726 bNeedUpdateWeight = TRUE; |
| 796 } | |
| 797 } | 727 } |
| 798 if (bNeedUpdateWeight) { | 728 if (bNeedUpdateWeight) |
| 799 pSubstFont->m_Weight = weight; | 729 pSubstFont->m_Weight = weight; |
| 800 } | |
| 801 if (bItalic && !FXFT_Is_Face_Italic(face)) { | 730 if (bItalic && !FXFT_Is_Face_Italic(face)) { |
| 802 if (italic_angle == 0) { | 731 if (italic_angle == 0) |
| 803 italic_angle = -12; | 732 italic_angle = -12; |
| 804 } else if (FXSYS_abs(italic_angle) < 5) { | 733 else if (FXSYS_abs(italic_angle) < 5) |
| 805 italic_angle = 0; | 734 italic_angle = 0; |
| 806 } | |
| 807 pSubstFont->m_ItalicAngle = italic_angle; | 735 pSubstFont->m_ItalicAngle = italic_angle; |
| 808 } | 736 } |
| 809 m_pFontInfo->DeleteFont(hFont); | 737 m_pFontInfo->DeleteFont(hFont); |
| 810 return face; | 738 return face; |
| 811 } | 739 } |
| 740 |
| 812 #ifdef PDF_ENABLE_XFA | 741 #ifdef PDF_ENABLE_XFA |
| 813 FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, | 742 FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, |
| 814 uint32_t flags, | 743 uint32_t flags, |
| 815 int weight, | 744 int weight, |
| 816 int italic_angle) { | 745 int italic_angle) { |
| 817 if (!m_pFontInfo) | 746 if (!m_pFontInfo) |
| 818 return nullptr; | 747 return nullptr; |
| 819 | 748 |
| 820 FX_BOOL bItalic = (flags & FXFONT_ITALIC) != 0; | 749 FX_BOOL bItalic = (flags & FXFONT_ITALIC) != 0; |
| 821 int PitchFamily = 0; | 750 int PitchFamily = 0; |
| 822 if (flags & FXFONT_SERIF) { | 751 UpdatePitchFamily(flags, PitchFamily); |
| 823 PitchFamily |= FXFONT_FF_ROMAN; | |
| 824 } | |
| 825 if (flags & FXFONT_SCRIPT) { | |
| 826 PitchFamily |= FXFONT_FF_SCRIPT; | |
| 827 } | |
| 828 if (flags & FXFONT_FIXED_PITCH) { | |
| 829 PitchFamily |= FXFONT_FF_FIXEDPITCH; | |
| 830 } | |
| 831 void* hFont = | 752 void* hFont = |
| 832 m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily); | 753 m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily); |
| 833 if (!hFont) | 754 if (!hFont) |
| 834 return nullptr; | 755 return nullptr; |
| 835 | 756 |
| 836 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, nullptr, 0); | 757 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, nullptr, 0); |
| 837 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); | 758 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); |
| 838 if (font_size == 0 && ttc_size == 0) { | 759 if (font_size == 0 && ttc_size == 0) { |
| 839 m_pFontInfo->DeleteFont(hFont); | 760 m_pFontInfo->DeleteFont(hFont); |
| 840 return nullptr; | 761 return nullptr; |
| 841 } | 762 } |
| 842 FXFT_Face face = nullptr; | 763 FXFT_Face face = nullptr; |
| 843 if (ttc_size) { | 764 if (ttc_size) { |
| 844 uint8_t temp[1024]; | 765 face = GetCachedTTCFace(hFont, 0x74746366, ttc_size, font_size); |
| 845 m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024); | |
| 846 uint32_t checksum = 0; | |
| 847 for (int i = 0; i < 256; i++) { | |
| 848 checksum += ((uint32_t*)temp)[i]; | |
| 849 } | |
| 850 uint8_t* pFontData; | |
| 851 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, | |
| 852 ttc_size - font_size, pFontData); | |
| 853 if (!face) { | |
| 854 pFontData = FX_Alloc(uint8_t, ttc_size); | |
| 855 if (pFontData) { | |
| 856 m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size); | |
| 857 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, | |
| 858 ttc_size, ttc_size - font_size); | |
| 859 } | |
| 860 } | |
| 861 } else { | 766 } else { |
| 862 CFX_ByteString SubstName; | 767 CFX_ByteString SubstName; |
| 863 m_pFontInfo->GetFaceName(hFont, SubstName); | 768 m_pFontInfo->GetFaceName(hFont, SubstName); |
| 864 uint8_t* pFontData; | 769 face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); |
| 865 face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); | |
| 866 if (!face) { | |
| 867 pFontData = FX_Alloc(uint8_t, font_size); | |
| 868 if (!pFontData) { | |
| 869 m_pFontInfo->DeleteFont(hFont); | |
| 870 return nullptr; | |
| 871 } | |
| 872 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); | |
| 873 face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, | |
| 874 font_size, | |
| 875 m_pFontInfo->GetFaceIndex(hFont)); | |
| 876 } | |
| 877 } | 770 } |
| 878 m_pFontInfo->DeleteFont(hFont); | 771 m_pFontInfo->DeleteFont(hFont); |
| 879 return face; | 772 return face; |
| 880 } | 773 } |
| 881 #endif // PDF_ENABLE_XFA | 774 #endif // PDF_ENABLE_XFA |
| 882 | 775 |
| 883 int CFX_FontMapper::GetFaceSize() const { | 776 int CFX_FontMapper::GetFaceSize() const { |
| 884 return pdfium::CollectionSize<int>(m_FaceArray); | 777 return pdfium::CollectionSize<int>(m_FaceArray); |
| 885 } | 778 } |
| 886 | 779 |
| 887 FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { | 780 FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { |
| 888 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { | 781 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { |
| 889 if (m_MMFaces[i] == face) { | 782 if (m_MMFaces[i] == face) |
| 890 return TRUE; | 783 return TRUE; |
| 891 } | |
| 892 } | 784 } |
| 893 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { | 785 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { |
| 894 if (m_FoxitFaces[i] == face) { | 786 if (m_FoxitFaces[i] == face) |
| 895 return TRUE; | 787 return TRUE; |
| 896 } | |
| 897 } | 788 } |
| 898 return FALSE; | 789 return FALSE; |
| 899 } | 790 } |
| 900 | 791 |
| 792 FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, |
| 793 const uint32_t tableTTCF, |
| 794 uint32_t ttc_size, |
| 795 uint32_t font_size) { |
| 796 FXFT_Face face; |
| 797 uint8_t temp[1024]; |
| 798 m_pFontInfo->GetFontData(hFont, tableTTCF, temp, 1024); |
| 799 uint32_t checksum = 0; |
| 800 for (int i = 0; i < 256; i++) |
| 801 checksum += ((uint32_t*)temp)[i]; |
| 802 uint8_t* pFontData; |
| 803 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, |
| 804 pFontData); |
| 805 if (!face) { |
| 806 pFontData = FX_Alloc(uint8_t, ttc_size); |
| 807 m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); |
| 808 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, |
| 809 ttc_size - font_size); |
| 810 } |
| 811 return face; |
| 812 } |
| 813 |
| 814 FXFT_Face CFX_FontMapper::GetCachedFace(void* hFont, |
| 815 CFX_ByteString SubstName, |
| 816 int weight, |
| 817 FX_BOOL bItalic, |
| 818 uint32_t font_size) { |
| 819 FXFT_Face face; |
| 820 uint8_t* pFontData; |
| 821 face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); |
| 822 if (!face) { |
| 823 pFontData = FX_Alloc(uint8_t, font_size); |
| 824 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); |
| 825 face = |
| 826 m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, |
| 827 font_size, m_pFontInfo->GetFaceIndex(hFont)); |
| 828 } |
| 829 return face; |
| 830 } |
| 831 |
| 901 int PDF_GetStandardFontName(CFX_ByteString* name) { | 832 int PDF_GetStandardFontName(CFX_ByteString* name) { |
| 902 AltFontName* found = static_cast<AltFontName*>( | 833 AltFontName* found = static_cast<AltFontName*>( |
| 903 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), | 834 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |
| 904 sizeof(AltFontName), CompareString)); | 835 sizeof(AltFontName), CompareString)); |
| 905 if (!found) | 836 if (!found) |
| 906 return -1; | 837 return -1; |
| 907 | 838 |
| 908 *name = g_Base14FontNames[found->m_Index]; | 839 *name = g_Base14FontNames[found->m_Index]; |
| 909 return found->m_Index; | 840 return found->m_Index; |
| 910 } | 841 } |
| OLD | NEW |