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

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

Issue 1874433002: Record all fonts, not just one per charset. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 8 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 | xfa/fgas/font/fgas_stdfontmgr.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 734
735 std::vector<uint8_t> buffer(size); 735 std::vector<uint8_t> buffer(size);
736 uint8_t* buffer_ptr = buffer.data(); 736 uint8_t* buffer_ptr = buffer.data();
737 uint32_t bytes_read = 737 uint32_t bytes_read =
738 m_pFontInfo->GetFontData(hFont, kTableNAME, buffer_ptr, size); 738 m_pFontInfo->GetFontData(hFont, kTableNAME, buffer_ptr, size);
739 return bytes_read == size ? GetNameFromTT(buffer_ptr, bytes_read, 6) 739 return bytes_read == size ? GetNameFromTT(buffer_ptr, bytes_read, 6)
740 : CFX_ByteString(); 740 : CFX_ByteString();
741 } 741 }
742 742
743 void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { 743 void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) {
744 if (!m_pFontInfo) { 744 if (!m_pFontInfo)
745 return; 745 return;
746 } 746
747 if (m_CharsetArray.Find((uint32_t)charset) == -1) { 747 if (m_CharsetArray.Find((uint32_t)charset) == -1)
748 m_CharsetArray.Add((uint32_t)charset); 748 m_CharsetArray.Add((uint32_t)charset);
749 m_FaceArray.push_back(name); 749 m_FaceArray.push_back(name);
dsinclair 2016/04/07 19:03:22 This bit is the actual code change, m_FaceArray is
hong_zhang 2016/04/11 07:06:04 Actually we cannot make this change. See line 1160
dsinclair 2016/04/11 13:52:11 Ok, I've removed m_CharsetArray and merged it with
hong_zhang 2016/04/12 17:19:21 It is good. I confirmed with my team. Feel free to
750 } 750 if (name == m_LastFamily)
751 if (name == m_LastFamily) {
752 return; 751 return;
753 } 752
754 const uint8_t* ptr = name; 753 const uint8_t* ptr = name;
755 FX_BOOL bLocalized = FALSE; 754 FX_BOOL bLocalized = FALSE;
756 for (int i = 0; i < name.GetLength(); i++) 755 for (int i = 0; i < name.GetLength(); i++) {
757 if (ptr[i] > 0x80) { 756 if (ptr[i] > 0x80) {
758 bLocalized = TRUE; 757 bLocalized = TRUE;
759 break; 758 break;
760 } 759 }
760 }
761
761 if (bLocalized) { 762 if (bLocalized) {
762 void* hFont = m_pFontInfo->GetFont(name); 763 void* hFont = m_pFontInfo->GetFont(name);
763 if (!hFont) { 764 if (!hFont) {
764 int iExact; 765 int iExact;
765 hFont = 766 hFont =
766 m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, iExact); 767 m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, iExact);
767 if (!hFont) { 768 if (!hFont)
768 return; 769 return;
769 }
770 } 770 }
771
771 CFX_ByteString new_name = GetPSNameFromTT(hFont); 772 CFX_ByteString new_name = GetPSNameFromTT(hFont);
772 if (!new_name.IsEmpty()) { 773 if (!new_name.IsEmpty()) {
773 new_name.Insert(0, ' '); 774 new_name.Insert(0, ' ');
774 m_InstalledTTFonts.push_back(new_name); 775 m_InstalledTTFonts.push_back(new_name);
775 } 776 }
776 m_pFontInfo->DeleteFont(hFont); 777 m_pFontInfo->DeleteFont(hFont);
777 } 778 }
778 m_InstalledTTFonts.push_back(name); 779 m_InstalledTTFonts.push_back(name);
779 m_LastFamily = name; 780 m_LastFamily = name;
780 } 781 }
782
781 void CFX_FontMapper::LoadInstalledFonts() { 783 void CFX_FontMapper::LoadInstalledFonts() {
782 if (!m_pFontInfo) { 784 if (!m_pFontInfo) {
783 return; 785 return;
784 } 786 }
785 if (m_bListLoaded) { 787 if (m_bListLoaded) {
786 return; 788 return;
787 } 789 }
788 if (m_bListLoaded) { 790 if (m_bListLoaded) {
789 return; 791 return;
790 } 792 }
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 } 1366 }
1365 } 1367 }
1366 void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { 1368 void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) {
1367 m_PathList.push_back(path); 1369 m_PathList.push_back(path);
1368 } 1370 }
1369 void CFX_FolderFontInfo::Release() { 1371 void CFX_FolderFontInfo::Release() {
1370 delete this; 1372 delete this;
1371 } 1373 }
1372 FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { 1374 FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) {
1373 m_pMapper = pMapper; 1375 m_pMapper = pMapper;
1374 for (const auto& path : m_PathList) { 1376 for (const auto& path : m_PathList)
1375 ScanPath(path); 1377 ScanPath(path);
1376 }
1377 return TRUE; 1378 return TRUE;
1378 } 1379 }
1379 void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) { 1380 void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) {
1380 void* handle = FX_OpenFolder(path); 1381 void* handle = FX_OpenFolder(path);
1381 if (!handle) { 1382 if (!handle)
1382 return; 1383 return;
1383 } 1384
1384 CFX_ByteString filename; 1385 CFX_ByteString filename;
1385 FX_BOOL bFolder; 1386 FX_BOOL bFolder;
1386 while (FX_GetNextFile(handle, filename, bFolder)) { 1387 while (FX_GetNextFile(handle, filename, bFolder)) {
1387 if (bFolder) { 1388 if (bFolder) {
1388 if (filename == "." || filename == "..") { 1389 if (filename == "." || filename == "..")
1389 continue; 1390 continue;
1390 }
1391 } else { 1391 } else {
1392 CFX_ByteString ext = filename.Right(4); 1392 CFX_ByteString ext = filename.Right(4);
1393 ext.MakeUpper(); 1393 ext.MakeUpper();
1394 if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") { 1394 if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC")
1395 continue; 1395 continue;
1396 }
1397 } 1396 }
1397
1398 CFX_ByteString fullpath = path; 1398 CFX_ByteString fullpath = path;
1399 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 1399 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
1400 fullpath += "\\"; 1400 fullpath += "\\";
1401 #else 1401 #else
1402 fullpath += "/"; 1402 fullpath += "/";
1403 #endif 1403 #endif
1404
1404 fullpath += filename; 1405 fullpath += filename;
1405 if (bFolder) { 1406 bFolder ? ScanPath(fullpath) : ScanFile(fullpath);
1406 ScanPath(fullpath);
1407 } else {
1408 ScanFile(fullpath);
1409 }
1410 } 1407 }
1411 FX_CloseFolder(handle); 1408 FX_CloseFolder(handle);
1412 } 1409 }
1410
1413 void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) { 1411 void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) {
1414 FXSYS_FILE* pFile = FXSYS_fopen(path, "rb"); 1412 FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");
1415 if (!pFile) { 1413 if (!pFile)
1416 return; 1414 return;
1417 } 1415
1418 FXSYS_fseek(pFile, 0, FXSYS_SEEK_END); 1416 FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);
1417
1419 uint32_t filesize = FXSYS_ftell(pFile); 1418 uint32_t filesize = FXSYS_ftell(pFile);
1420 uint8_t buffer[16]; 1419 uint8_t buffer[16];
1421 FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET); 1420 FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);
1421
1422 size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile); 1422 size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);
1423 if (readCnt != 1) { 1423 if (readCnt != 1) {
1424 FXSYS_fclose(pFile); 1424 FXSYS_fclose(pFile);
1425 return; 1425 return;
1426 } 1426 }
1427 1427
1428 if (GET_TT_LONG(buffer) == kTableTTCF) { 1428 if (GET_TT_LONG(buffer) == kTableTTCF) {
1429 uint32_t nFaces = GET_TT_LONG(buffer + 8); 1429 uint32_t nFaces = GET_TT_LONG(buffer + 8);
1430 if (nFaces > std::numeric_limits<uint32_t>::max() / 4) { 1430 if (nFaces > std::numeric_limits<uint32_t>::max() / 4) {
1431 FXSYS_fclose(pFile); 1431 FXSYS_fclose(pFile);
(...skipping 16 matching lines...) Expand all
1448 ReportFace(path, pFile, filesize, 0); 1448 ReportFace(path, pFile, filesize, 0);
1449 } 1449 }
1450 FXSYS_fclose(pFile); 1450 FXSYS_fclose(pFile);
1451 } 1451 }
1452 void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, 1452 void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path,
1453 FXSYS_FILE* pFile, 1453 FXSYS_FILE* pFile,
1454 uint32_t filesize, 1454 uint32_t filesize,
1455 uint32_t offset) { 1455 uint32_t offset) {
1456 FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); 1456 FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
1457 char buffer[16]; 1457 char buffer[16];
1458 if (!FXSYS_fread(buffer, 12, 1, pFile)) { 1458 if (!FXSYS_fread(buffer, 12, 1, pFile))
1459 return; 1459 return;
1460 } 1460
1461 uint32_t nTables = GET_TT_SHORT(buffer + 4); 1461 uint32_t nTables = GET_TT_SHORT(buffer + 4);
1462 CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16); 1462 CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16);
1463 if (tables.IsEmpty()) { 1463 if (tables.IsEmpty())
1464 return; 1464 return;
1465 } 1465
1466 CFX_ByteString names = 1466 CFX_ByteString names =
1467 FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65); 1467 FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
1468 if (names.IsEmpty()) { 1468 if (names.IsEmpty())
1469 return; 1469 return;
1470 } 1470
1471 CFX_ByteString facename = GetNameFromTT(names, names.GetLength(), 1); 1471 CFX_ByteString facename = GetNameFromTT(names, names.GetLength(), 1);
1472 if (facename.IsEmpty()) { 1472 if (facename.IsEmpty())
1473 return; 1473 return;
1474 } 1474
1475 CFX_ByteString style = GetNameFromTT(names, names.GetLength(), 2); 1475 CFX_ByteString style = GetNameFromTT(names, names.GetLength(), 2);
1476 if (style != "Regular") { 1476 if (style != "Regular")
1477 facename += " " + style; 1477 facename += " " + style;
1478 } 1478
1479 if (pdfium::ContainsKey(m_FontList, facename)) 1479 if (pdfium::ContainsKey(m_FontList, facename))
1480 return; 1480 return;
1481 1481
1482 CFX_FontFaceInfo* pInfo = 1482 CFX_FontFaceInfo* pInfo =
1483 new CFX_FontFaceInfo(path, facename, tables, offset, filesize); 1483 new CFX_FontFaceInfo(path, facename, tables, offset, filesize);
1484 CFX_ByteString os2 = FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32); 1484 CFX_ByteString os2 = FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
1485 if (os2.GetLength() >= 86) { 1485 if (os2.GetLength() >= 86) {
1486 const uint8_t* p = (const uint8_t*)os2 + 78; 1486 const uint8_t* p = (const uint8_t*)os2 + 78;
1487 uint32_t codepages = GET_TT_LONG(p); 1487 uint32_t codepages = GET_TT_LONG(p);
1488 if (codepages & (1 << 17)) { 1488 if (codepages & (1 << 17)) {
(...skipping 13 matching lines...) Expand all
1502 pInfo->m_Charsets |= CHARSET_FLAG_KOREAN; 1502 pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;
1503 } 1503 }
1504 if (codepages & (1 << 31)) { 1504 if (codepages & (1 << 31)) {
1505 m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET); 1505 m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);
1506 pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL; 1506 pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;
1507 } 1507 }
1508 } 1508 }
1509 m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET); 1509 m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);
1510 pInfo->m_Charsets |= CHARSET_FLAG_ANSI; 1510 pInfo->m_Charsets |= CHARSET_FLAG_ANSI;
1511 pInfo->m_Styles = 0; 1511 pInfo->m_Styles = 0;
1512 if (style.Find("Bold") > -1) { 1512 if (style.Find("Bold") > -1)
1513 pInfo->m_Styles |= FXFONT_BOLD; 1513 pInfo->m_Styles |= FXFONT_BOLD;
1514 } 1514 if (style.Find("Italic") > -1 || style.Find("Oblique") > -1)
1515 if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) {
1516 pInfo->m_Styles |= FXFONT_ITALIC; 1515 pInfo->m_Styles |= FXFONT_ITALIC;
1517 } 1516 if (facename.Find("Serif") > -1)
1518 if (facename.Find("Serif") > -1) {
1519 pInfo->m_Styles |= FXFONT_SERIF; 1517 pInfo->m_Styles |= FXFONT_SERIF;
1520 } 1518
1521 m_FontList[facename] = pInfo; 1519 m_FontList[facename] = pInfo;
1522 } 1520 }
1523 1521
1524 void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) { 1522 void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) {
1525 for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs); 1523 for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs);
1526 iBaseFont++) { 1524 iBaseFont++) {
1527 if (face == Base14Substs[iBaseFont].m_pName) { 1525 if (face == Base14Substs[iBaseFont].m_pName)
1528 return GetFont(Base14Substs[iBaseFont].m_pSubstName); 1526 return GetFont(Base14Substs[iBaseFont].m_pSubstName);
1529 }
1530 } 1527 }
1531 return nullptr; 1528 return nullptr;
1532 } 1529 }
1533 1530
1534 void* CFX_FolderFontInfo::FindFont(int weight, 1531 void* CFX_FolderFontInfo::FindFont(int weight,
1535 FX_BOOL bItalic, 1532 FX_BOOL bItalic,
1536 int charset, 1533 int charset,
1537 int pitch_family, 1534 int pitch_family,
1538 const FX_CHAR* family, 1535 const FX_CHAR* family,
1539 FX_BOOL bMatchName) { 1536 FX_BOOL bMatchName) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 int PDF_GetStandardFontName(CFX_ByteString* name) { 1640 int PDF_GetStandardFontName(CFX_ByteString* name) {
1644 AltFontName* found = static_cast<AltFontName*>( 1641 AltFontName* found = static_cast<AltFontName*>(
1645 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), 1642 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames),
1646 sizeof(AltFontName), CompareString)); 1643 sizeof(AltFontName), CompareString));
1647 if (!found) 1644 if (!found)
1648 return -1; 1645 return -1;
1649 1646
1650 *name = g_Base14FontNames[found->m_Index]; 1647 *name = g_Base14FontNames[found->m_Index];
1651 return found->m_Index; 1648 return found->m_Index;
1652 } 1649 }
OLDNEW
« no previous file with comments | « no previous file | xfa/fgas/font/fgas_stdfontmgr.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698