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

Side by Side Diff: core/fpdfapi/parser/cpdf_document.cpp

Issue 2510223002: Make CPDF_Dictionary use unique pointers. (Closed)
Patch Set: Plug leaks Created 4 years, 1 month 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
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 "core/fpdfapi/parser/cpdf_document.h" 7 #include "core/fpdfapi/parser/cpdf_document.h"
8 8
9 #include <memory> 9 #include <memory>
10 #include <set> 10 #include <set>
11 #include <vector> 11 #include <vector>
12 12
13 #include "core/fpdfapi/cpdf_modulemgr.h" 13 #include "core/fpdfapi/cpdf_modulemgr.h"
14 #include "core/fpdfapi/font/cpdf_fontencoding.h" 14 #include "core/fpdfapi/font/cpdf_fontencoding.h"
15 #include "core/fpdfapi/page/cpdf_docpagedata.h" 15 #include "core/fpdfapi/page/cpdf_docpagedata.h"
16 #include "core/fpdfapi/page/cpdf_pagemodule.h" 16 #include "core/fpdfapi/page/cpdf_pagemodule.h"
17 #include "core/fpdfapi/page/pageint.h" 17 #include "core/fpdfapi/page/pageint.h"
18 #include "core/fpdfapi/parser/cpdf_array.h" 18 #include "core/fpdfapi/parser/cpdf_array.h"
19 #include "core/fpdfapi/parser/cpdf_dictionary.h" 19 #include "core/fpdfapi/parser/cpdf_dictionary.h"
20 #include "core/fpdfapi/parser/cpdf_linearized_header.h" 20 #include "core/fpdfapi/parser/cpdf_linearized_header.h"
21 #include "core/fpdfapi/parser/cpdf_name.h" 21 #include "core/fpdfapi/parser/cpdf_name.h"
22 #include "core/fpdfapi/parser/cpdf_number.h" 22 #include "core/fpdfapi/parser/cpdf_number.h"
23 #include "core/fpdfapi/parser/cpdf_parser.h" 23 #include "core/fpdfapi/parser/cpdf_parser.h"
24 #include "core/fpdfapi/parser/cpdf_reference.h" 24 #include "core/fpdfapi/parser/cpdf_reference.h"
25 #include "core/fpdfapi/parser/cpdf_string.h"
25 #include "core/fpdfapi/parser/cpdf_stream.h" 26 #include "core/fpdfapi/parser/cpdf_stream.h"
26 #include "core/fpdfapi/render/render_int.h" 27 #include "core/fpdfapi/render/render_int.h"
27 #include "core/fxcodec/JBig2_DocumentContext.h" 28 #include "core/fxcodec/JBig2_DocumentContext.h"
28 #include "core/fxge/cfx_unicodeencoding.h" 29 #include "core/fxge/cfx_unicodeencoding.h"
29 #include "core/fxge/fx_font.h" 30 #include "core/fxge/fx_font.h"
30 #include "third_party/base/ptr_util.h" 31 #include "third_party/base/ptr_util.h"
31 #include "third_party/base/stl_util.h" 32 #include "third_party/base/stl_util.h"
32 33
33 namespace { 34 namespace {
34 35
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 if (pKid->KeyExist("Kids")) { 258 if (pKid->KeyExist("Kids")) {
258 // Use |visited_pages| to help detect circular references of pages. 259 // Use |visited_pages| to help detect circular references of pages.
259 pdfium::ScopedSetInsertion<CPDF_Dictionary*> local_add(visited_pages, 260 pdfium::ScopedSetInsertion<CPDF_Dictionary*> local_add(visited_pages,
260 pKid); 261 pKid);
261 count += CountPages(pKid, visited_pages); 262 count += CountPages(pKid, visited_pages);
262 } else { 263 } else {
263 // This page is a leaf node. 264 // This page is a leaf node.
264 count++; 265 count++;
265 } 266 }
266 } 267 }
267 pPages->SetIntegerFor("Count", count); 268 pPages->SetNewFor<CPDF_Number>("Count", count);
268 return count; 269 return count;
269 } 270 }
270 271
271 int CalculateFlags(bool bold, 272 int CalculateFlags(bool bold,
272 bool italic, 273 bool italic,
273 bool fixedPitch, 274 bool fixedPitch,
274 bool serif, 275 bool serif,
275 bool script, 276 bool script,
276 bool symbolic) { 277 bool symbolic) {
277 int flags = 0; 278 int flags = 0;
(...skipping 18 matching lines...) Expand all
296 bool bold, 297 bool bold,
297 bool italic, 298 bool italic,
298 CFX_ByteString basefont, 299 CFX_ByteString basefont,
299 CPDF_Array* pWidths) { 300 CPDF_Array* pWidths) {
300 if (bold && italic) 301 if (bold && italic)
301 basefont += ",BoldItalic"; 302 basefont += ",BoldItalic";
302 else if (bold) 303 else if (bold)
303 basefont += ",Bold"; 304 basefont += ",Bold";
304 else if (italic) 305 else if (italic)
305 basefont += ",Italic"; 306 basefont += ",Italic";
306 pBaseDict->SetNameFor("Subtype", "TrueType"); 307 pBaseDict->SetNewFor<CPDF_Name>("Subtype", "TrueType");
307 pBaseDict->SetNameFor("BaseFont", basefont); 308 pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont);
308 pBaseDict->SetNumberFor("FirstChar", 32); 309 pBaseDict->SetNewFor<CPDF_Number>("FirstChar", 32);
309 pBaseDict->SetNumberFor("LastChar", 255); 310 pBaseDict->SetNewFor<CPDF_Number>("LastChar", 255);
310 pBaseDict->SetFor("Widths", pWidths); 311 pBaseDict->SetFor("Widths", pdfium::WrapUnique(pWidths));
311 } 312 }
312 313
313 std::unique_ptr<CPDF_Dictionary> CalculateFontDesc(CPDF_Document* pDoc, 314 std::unique_ptr<CPDF_Dictionary> CalculateFontDesc(CPDF_Document* pDoc,
314 CFX_ByteString basefont, 315 CFX_ByteString basefont,
315 int flags, 316 int flags,
316 int italicangle, 317 int italicangle,
317 int ascend, 318 int ascend,
318 int descend, 319 int descend,
319 CPDF_Array* bbox, 320 CPDF_Array* bbox,
320 int32_t stemV) { 321 int32_t stemV) {
321 auto pFontDesc = 322 auto pFontDesc =
322 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 323 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
323 pFontDesc->SetNameFor("Type", "FontDescriptor"); 324 pFontDesc->SetNewFor<CPDF_Name>("Type", "FontDescriptor");
324 pFontDesc->SetNameFor("FontName", basefont); 325 pFontDesc->SetNewFor<CPDF_Name>("FontName", basefont);
325 pFontDesc->SetIntegerFor("Flags", flags); 326 pFontDesc->SetNewFor<CPDF_Number>("Flags", flags);
326 pFontDesc->SetFor("FontBBox", bbox); 327 pFontDesc->SetFor("FontBBox", pdfium::WrapUnique(bbox));
327 pFontDesc->SetIntegerFor("ItalicAngle", italicangle); 328 pFontDesc->SetNewFor<CPDF_Number>("ItalicAngle", italicangle);
328 pFontDesc->SetIntegerFor("Ascent", ascend); 329 pFontDesc->SetNewFor<CPDF_Number>("Ascent", ascend);
329 pFontDesc->SetIntegerFor("Descent", descend); 330 pFontDesc->SetNewFor<CPDF_Number>("Descent", descend);
330 pFontDesc->SetIntegerFor("StemV", stemV); 331 pFontDesc->SetNewFor<CPDF_Number>("StemV", stemV);
331 return pFontDesc; 332 return pFontDesc;
332 } 333 }
333 334
334 } // namespace 335 } // namespace
335 336
336 CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser) 337 CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser)
337 : CPDF_IndirectObjectHolder(), 338 : CPDF_IndirectObjectHolder(),
338 m_pParser(std::move(pParser)), 339 m_pParser(std::move(pParser)),
339 m_pRootDict(nullptr), 340 m_pRootDict(nullptr),
340 m_pInfoDict(nullptr), 341 m_pInfoDict(nullptr),
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 } 642 }
642 643
643 CPDF_Image* CPDF_Document::LoadImageFromPageData(uint32_t dwStreamObjNum) { 644 CPDF_Image* CPDF_Document::LoadImageFromPageData(uint32_t dwStreamObjNum) {
644 ASSERT(dwStreamObjNum); 645 ASSERT(dwStreamObjNum);
645 return m_pDocPage->GetImage(dwStreamObjNum); 646 return m_pDocPage->GetImage(dwStreamObjNum);
646 } 647 }
647 648
648 void CPDF_Document::CreateNewDoc() { 649 void CPDF_Document::CreateNewDoc() {
649 ASSERT(!m_pRootDict && !m_pInfoDict); 650 ASSERT(!m_pRootDict && !m_pInfoDict);
650 m_pRootDict = NewIndirect<CPDF_Dictionary>(); 651 m_pRootDict = NewIndirect<CPDF_Dictionary>();
651 m_pRootDict->SetNameFor("Type", "Catalog"); 652 m_pRootDict->SetNewFor<CPDF_Name>("Type", "Catalog");
652 653
653 CPDF_Dictionary* pPages = NewIndirect<CPDF_Dictionary>(); 654 CPDF_Dictionary* pPages = NewIndirect<CPDF_Dictionary>();
654 pPages->SetNameFor("Type", "Pages"); 655 pPages->SetNewFor<CPDF_Name>("Type", "Pages");
655 pPages->SetNumberFor("Count", 0); 656 pPages->SetNewFor<CPDF_Number>("Count", 0);
656 pPages->SetFor("Kids", new CPDF_Array); 657 pPages->SetNewFor<CPDF_Array>("Kids");
657 m_pRootDict->SetReferenceFor("Pages", this, pPages); 658 m_pRootDict->SetNewFor<CPDF_Reference>("Pages", this, pPages->GetObjNum());
658 m_pInfoDict = NewIndirect<CPDF_Dictionary>(); 659 m_pInfoDict = NewIndirect<CPDF_Dictionary>();
659 } 660 }
660 661
661 CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) { 662 CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) {
662 CPDF_Dictionary* pDict = NewIndirect<CPDF_Dictionary>(); 663 CPDF_Dictionary* pDict = NewIndirect<CPDF_Dictionary>();
663 pDict->SetNameFor("Type", "Page"); 664 pDict->SetNewFor<CPDF_Name>("Type", "Page");
664 uint32_t dwObjNum = pDict->GetObjNum(); 665 uint32_t dwObjNum = pDict->GetObjNum();
665 if (!InsertNewPage(iPage, pDict)) { 666 if (!InsertNewPage(iPage, pDict)) {
666 DeleteIndirectObject(dwObjNum); 667 DeleteIndirectObject(dwObjNum);
667 return nullptr; 668 return nullptr;
668 } 669 }
669 return pDict; 670 return pDict;
670 } 671 }
671 672
672 bool CPDF_Document::InsertDeletePDFPage(CPDF_Dictionary* pPages, 673 bool CPDF_Document::InsertDeletePDFPage(CPDF_Dictionary* pPages,
673 int nPagesToGo, 674 int nPagesToGo,
674 CPDF_Dictionary* pPageDict, 675 CPDF_Dictionary* pPageDict,
675 bool bInsert, 676 bool bInsert,
676 std::set<CPDF_Dictionary*>* pVisited) { 677 std::set<CPDF_Dictionary*>* pVisited) {
677 CPDF_Array* pKidList = pPages->GetArrayFor("Kids"); 678 CPDF_Array* pKidList = pPages->GetArrayFor("Kids");
678 if (!pKidList) 679 if (!pKidList)
679 return false; 680 return false;
680 681
681 for (size_t i = 0; i < pKidList->GetCount(); i++) { 682 for (size_t i = 0; i < pKidList->GetCount(); i++) {
682 CPDF_Dictionary* pKid = pKidList->GetDictAt(i); 683 CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
683 if (pKid->GetStringFor("Type") == "Page") { 684 if (pKid->GetStringFor("Type") == "Page") {
684 if (nPagesToGo != 0) { 685 if (nPagesToGo != 0) {
685 nPagesToGo--; 686 nPagesToGo--;
686 continue; 687 continue;
687 } 688 }
688 if (bInsert) { 689 if (bInsert) {
689 pKidList->InsertNewAt<CPDF_Reference>(i, this, pPageDict->GetObjNum()); 690 pKidList->InsertNewAt<CPDF_Reference>(i, this, pPageDict->GetObjNum());
690 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); 691 pPageDict->SetNewFor<CPDF_Reference>("Parent", this,
692 pPages->GetObjNum());
691 } else { 693 } else {
692 pKidList->RemoveAt(i); 694 pKidList->RemoveAt(i);
693 } 695 }
694 pPages->SetIntegerFor( 696 pPages->SetNewFor<CPDF_Number>(
695 "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); 697 "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1));
696 ResetTraversal(); 698 ResetTraversal();
697 break; 699 break;
698 } 700 }
699 int nPages = pKid->GetIntegerFor("Count"); 701 int nPages = pKid->GetIntegerFor("Count");
700 if (nPagesToGo >= nPages) { 702 if (nPagesToGo >= nPages) {
701 nPagesToGo -= nPages; 703 nPagesToGo -= nPages;
702 continue; 704 continue;
703 } 705 }
704 if (pdfium::ContainsKey(*pVisited, pKid)) 706 if (pdfium::ContainsKey(*pVisited, pKid))
705 return false; 707 return false;
706 708
707 pdfium::ScopedSetInsertion<CPDF_Dictionary*> insertion(pVisited, pKid); 709 pdfium::ScopedSetInsertion<CPDF_Dictionary*> insertion(pVisited, pKid);
708 if (!InsertDeletePDFPage(pKid, nPagesToGo, pPageDict, bInsert, pVisited)) 710 if (!InsertDeletePDFPage(pKid, nPagesToGo, pPageDict, bInsert, pVisited))
709 return false; 711 return false;
710 712
711 pPages->SetIntegerFor("Count", 713 pPages->SetNewFor<CPDF_Number>(
712 pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); 714 "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1));
713 break; 715 break;
714 } 716 }
715 return true; 717 return true;
716 } 718 }
717 719
718 bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) { 720 bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) {
719 CPDF_Dictionary* pRoot = GetRoot(); 721 CPDF_Dictionary* pRoot = GetRoot();
720 CPDF_Dictionary* pPages = pRoot ? pRoot->GetDictFor("Pages") : nullptr; 722 CPDF_Dictionary* pPages = pRoot ? pRoot->GetDictFor("Pages") : nullptr;
721 if (!pPages) 723 if (!pPages)
722 return false; 724 return false;
723 725
724 int nPages = GetPageCount(); 726 int nPages = GetPageCount();
725 if (iPage < 0 || iPage > nPages) 727 if (iPage < 0 || iPage > nPages)
726 return false; 728 return false;
727 729
728 if (iPage == nPages) { 730 if (iPage == nPages) {
729 CPDF_Array* pPagesList = pPages->GetArrayFor("Kids"); 731 CPDF_Array* pPagesList = pPages->GetArrayFor("Kids");
730 if (!pPagesList) { 732 if (!pPagesList)
731 pPagesList = new CPDF_Array; 733 pPagesList = pPages->SetNewFor<CPDF_Array>("Kids");
732 pPages->SetFor("Kids", pPagesList);
733 }
734 pPagesList->AddNew<CPDF_Reference>(this, pPageDict->GetObjNum()); 734 pPagesList->AddNew<CPDF_Reference>(this, pPageDict->GetObjNum());
735 pPages->SetIntegerFor("Count", nPages + 1); 735 pPages->SetNewFor<CPDF_Number>("Count", nPages + 1);
736 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); 736 pPageDict->SetNewFor<CPDF_Reference>("Parent", this, pPages->GetObjNum());
737 ResetTraversal(); 737 ResetTraversal();
738 } else { 738 } else {
739 std::set<CPDF_Dictionary*> stack = {pPages}; 739 std::set<CPDF_Dictionary*> stack = {pPages};
740 if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack)) 740 if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack))
741 return false; 741 return false;
742 } 742 }
743 m_PageList.InsertAt(iPage, pPageDict->GetObjNum()); 743 m_PageList.InsertAt(iPage, pPageDict->GetObjNum());
744 return true; 744 return true;
745 } 745 }
746 746
(...skipping 25 matching lines...) Expand all
772 CPDF_Dictionary* pBaseDict) { 772 CPDF_Dictionary* pBaseDict) {
773 size_t i; 773 size_t i;
774 for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) { 774 for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) {
775 if (g_FX_CharsetUnicodes[i].m_Charset == charset) 775 if (g_FX_CharsetUnicodes[i].m_Charset == charset)
776 break; 776 break;
777 } 777 }
778 if (i == FX_ArraySize(g_FX_CharsetUnicodes)) 778 if (i == FX_ArraySize(g_FX_CharsetUnicodes))
779 return i; 779 return i;
780 780
781 CPDF_Dictionary* pEncodingDict = NewIndirect<CPDF_Dictionary>(); 781 CPDF_Dictionary* pEncodingDict = NewIndirect<CPDF_Dictionary>();
782 pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); 782 pEncodingDict->SetNewFor<CPDF_Name>("BaseEncoding", "WinAnsiEncoding");
783 783
784 CPDF_Array* pArray = new CPDF_Array; 784 CPDF_Array* pArray = pEncodingDict->SetNewFor<CPDF_Array>("Differences");
785 pArray->AddNew<CPDF_Number>(128); 785 pArray->AddNew<CPDF_Number>(128);
786 786
787 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; 787 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
788 for (int j = 0; j < 128; j++) { 788 for (int j = 0; j < 128; j++) {
789 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); 789 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
790 pArray->AddNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name); 790 pArray->AddNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name);
791 } 791 }
792 pEncodingDict->SetFor("Differences", pArray); 792 pBaseDict->SetNewFor<CPDF_Reference>("Encoding", this,
793 pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); 793 pEncodingDict->GetObjNum());
794 return i; 794 return i;
795 } 795 }
796 796
797 CPDF_Dictionary* CPDF_Document::ProcessbCJK( 797 CPDF_Dictionary* CPDF_Document::ProcessbCJK(
798 CPDF_Dictionary* pBaseDict, 798 CPDF_Dictionary* pBaseDict,
799 int charset, 799 int charset,
800 bool bVert, 800 bool bVert,
801 CFX_ByteString basefont, 801 CFX_ByteString basefont,
802 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { 802 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) {
803 CPDF_Dictionary* pFontDict = NewIndirect<CPDF_Dictionary>(); 803 CPDF_Dictionary* pFontDict = NewIndirect<CPDF_Dictionary>();
804 CFX_ByteString cmap; 804 CFX_ByteString cmap;
805 CFX_ByteString ordering; 805 CFX_ByteString ordering;
806 int supplement = 0; 806 int supplement = 0;
807 CPDF_Array* pWidthArray = new CPDF_Array; 807 CPDF_Array* pWidthArray = pFontDict->SetNewFor<CPDF_Array>("W");
808 switch (charset) { 808 switch (charset) {
809 case FXFONT_CHINESEBIG5_CHARSET: 809 case FXFONT_CHINESEBIG5_CHARSET:
810 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; 810 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
811 ordering = "CNS1"; 811 ordering = "CNS1";
812 supplement = 4; 812 supplement = 4;
813 pWidthArray->AddNew<CPDF_Number>(1); 813 pWidthArray->AddNew<CPDF_Number>(1);
814 Insert(0x20, 0x7e, pWidthArray); 814 Insert(0x20, 0x7e, pWidthArray);
815 break; 815 break;
816 case FXFONT_GB2312_CHARSET: 816 case FXFONT_GB2312_CHARSET:
817 cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; 817 cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
(...skipping 18 matching lines...) Expand all
836 pWidthArray->AddNew<CPDF_Number>(231); 836 pWidthArray->AddNew<CPDF_Number>(231);
837 Insert(0x20, 0x7d, pWidthArray); 837 Insert(0x20, 0x7d, pWidthArray);
838 pWidthArray->AddNew<CPDF_Number>(326); 838 pWidthArray->AddNew<CPDF_Number>(326);
839 Insert(0xa0, 0xa0, pWidthArray); 839 Insert(0xa0, 0xa0, pWidthArray);
840 pWidthArray->AddNew<CPDF_Number>(327); 840 pWidthArray->AddNew<CPDF_Number>(327);
841 Insert(0xa1, 0xdf, pWidthArray); 841 Insert(0xa1, 0xdf, pWidthArray);
842 pWidthArray->AddNew<CPDF_Number>(631); 842 pWidthArray->AddNew<CPDF_Number>(631);
843 Insert(0x7e, 0x7e, pWidthArray); 843 Insert(0x7e, 0x7e, pWidthArray);
844 break; 844 break;
845 } 845 }
846 pBaseDict->SetNameFor("Subtype", "Type0"); 846 pBaseDict->SetNewFor<CPDF_Name>("Subtype", "Type0");
847 pBaseDict->SetNameFor("BaseFont", basefont); 847 pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont);
848 pBaseDict->SetNameFor("Encoding", cmap); 848 pBaseDict->SetNewFor<CPDF_Name>("Encoding", cmap);
849 pFontDict->SetFor("W", pWidthArray); 849 pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
850 pFontDict->SetNameFor("Type", "Font"); 850 pFontDict->SetNewFor<CPDF_Name>("Subtype", "CIDFontType2");
851 pFontDict->SetNameFor("Subtype", "CIDFontType2"); 851 pFontDict->SetNewFor<CPDF_Name>("BaseFont", basefont);
852 pFontDict->SetNameFor("BaseFont", basefont); 852
853 CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary(GetByteStringPool()); 853 CPDF_Dictionary* pCIDSysInfo =
854 pCIDSysInfo->SetStringFor("Registry", "Adobe"); 854 pFontDict->SetNewFor<CPDF_Dictionary>("CIDSystemInfo");
855 pCIDSysInfo->SetStringFor("Ordering", ordering); 855 pCIDSysInfo->SetNewFor<CPDF_String>("Registry", "Adobe", false);
856 pCIDSysInfo->SetIntegerFor("Supplement", supplement); 856 pCIDSysInfo->SetNewFor<CPDF_String>("Ordering", ordering, false);
857 pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); 857 pCIDSysInfo->SetNewFor<CPDF_Number>("Supplement", supplement);
858 CPDF_Array* pArray = new CPDF_Array; 858
859 pBaseDict->SetFor("DescendantFonts", pArray); 859 CPDF_Array* pArray = pBaseDict->SetNewFor<CPDF_Array>("DescendantFonts");
860 pArray->AddNew<CPDF_Reference>(this, pFontDict->GetObjNum()); 860 pArray->AddNew<CPDF_Reference>(this, pFontDict->GetObjNum());
861 return pFontDict; 861 return pFontDict;
862 } 862 }
863 863
864 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { 864 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) {
865 if (!pFont) 865 if (!pFont)
866 return nullptr; 866 return nullptr;
867 867
868 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || 868 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET ||
869 charset == FXFONT_GB2312_CHARSET || 869 charset == FXFONT_GB2312_CHARSET ||
870 charset == FXFONT_HANGUL_CHARSET || 870 charset == FXFONT_HANGUL_CHARSET ||
871 charset == FXFONT_SHIFTJIS_CHARSET; 871 charset == FXFONT_SHIFTJIS_CHARSET;
872 CFX_ByteString basefont = pFont->GetFamilyName(); 872 CFX_ByteString basefont = pFont->GetFamilyName();
873 basefont.Replace(" ", ""); 873 basefont.Replace(" ", "");
874 int flags = 874 int flags =
875 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), 875 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(),
876 false, false, charset == FXFONT_SYMBOL_CHARSET); 876 false, false, charset == FXFONT_SYMBOL_CHARSET);
877 877
878 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); 878 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>();
879 pBaseDict->SetNameFor("Type", "Font"); 879 pBaseDict->SetNewFor<CPDF_Name>("Type", "Font");
880 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( 880 std::unique_ptr<CFX_UnicodeEncoding> pEncoding(
881 new CFX_UnicodeEncoding(pFont)); 881 new CFX_UnicodeEncoding(pFont));
882 CPDF_Dictionary* pFontDict = pBaseDict; 882 CPDF_Dictionary* pFontDict = pBaseDict;
883 if (!bCJK) { 883 if (!bCJK) {
884 CPDF_Array* pWidths = new CPDF_Array; 884 CPDF_Array* pWidths = new CPDF_Array;
885 for (int charcode = 32; charcode < 128; charcode++) { 885 for (int charcode = 32; charcode < 128; charcode++) {
886 int glyph_index = pEncoding->GlyphFromCharCode(charcode); 886 int glyph_index = pEncoding->GlyphFromCharCode(charcode);
887 int char_width = pFont->GetGlyphWidth(glyph_index); 887 int char_width = pFont->GetGlyphWidth(glyph_index);
888 pWidths->AddNew<CPDF_Number>(char_width); 888 pWidths->AddNew<CPDF_Number>(char_width);
889 } 889 }
890 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || 890 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||
891 charset == FXFONT_SYMBOL_CHARSET) { 891 charset == FXFONT_SYMBOL_CHARSET) {
892 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); 892 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
893 for (int charcode = 128; charcode <= 255; charcode++) { 893 for (int charcode = 128; charcode <= 255; charcode++) {
894 int glyph_index = pEncoding->GlyphFromCharCode(charcode); 894 int glyph_index = pEncoding->GlyphFromCharCode(charcode);
895 int char_width = pFont->GetGlyphWidth(glyph_index); 895 int char_width = pFont->GetGlyphWidth(glyph_index);
896 pWidths->AddNew<CPDF_Number>(char_width); 896 pWidths->AddNew<CPDF_Number>(char_width);
897 } 897 }
898 } else { 898 } else {
899 size_t i = CalculateEncodingDict(charset, pBaseDict); 899 size_t i = CalculateEncodingDict(charset, pBaseDict);
900 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { 900 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) {
901 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; 901 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
902 for (int j = 0; j < 128; j++) { 902 for (int j = 0; j < 128; j++) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 for (size_t i = 1; i < count; i++) { 936 for (size_t i = 1; i < count; i++) {
937 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); 937 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);
938 int width = pFont->GetGlyphWidth(glyph); 938 int width = pFont->GetGlyphWidth(glyph);
939 if (width > 0 && width < nStemV) 939 if (width > 0 && width < nStemV)
940 nStemV = width; 940 nStemV = width;
941 } 941 }
942 } 942 }
943 CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject( 943 CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject(
944 CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), 944 CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(),
945 pFont->GetDescent(), pBBox, nStemV))); 945 pFont->GetDescent(), pBBox, nStemV)));
946 pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); 946 pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", this,
947 pFontDesc->GetObjNum());
947 return LoadFont(pBaseDict); 948 return LoadFont(pBaseDict);
948 } 949 }
949 950
950 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 951 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
951 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, 952 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont,
952 bool bVert, 953 bool bVert,
953 bool bTranslateName) { 954 bool bTranslateName) {
954 LOGFONTA lfa; 955 LOGFONTA lfa;
955 FXSYS_memcpy(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa); 956 FXSYS_memcpy(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);
956 CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName); 957 CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 1000
1000 int italicangle = ptm->otmItalicAngle / 10; 1001 int italicangle = ptm->otmItalicAngle / 10;
1001 int ascend = ptm->otmrcFontBox.top; 1002 int ascend = ptm->otmrcFontBox.top;
1002 int descend = ptm->otmrcFontBox.bottom; 1003 int descend = ptm->otmrcFontBox.bottom;
1003 int capheight = ptm->otmsCapEmHeight; 1004 int capheight = ptm->otmsCapEmHeight;
1004 int bbox[4] = {ptm->otmrcFontBox.left, ptm->otmrcFontBox.bottom, 1005 int bbox[4] = {ptm->otmrcFontBox.left, ptm->otmrcFontBox.bottom,
1005 ptm->otmrcFontBox.right, ptm->otmrcFontBox.top}; 1006 ptm->otmrcFontBox.right, ptm->otmrcFontBox.top};
1006 FX_Free(tm_buf); 1007 FX_Free(tm_buf);
1007 basefont.Replace(" ", ""); 1008 basefont.Replace(" ", "");
1008 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); 1009 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>();
1009 pBaseDict->SetNameFor("Type", "Font"); 1010 pBaseDict->SetNewFor<CPDF_Name>("Type", "Font");
1010 CPDF_Dictionary* pFontDict = pBaseDict; 1011 CPDF_Dictionary* pFontDict = pBaseDict;
1011 if (!bCJK) { 1012 if (!bCJK) {
1012 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || 1013 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET ||
1013 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || 1014 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET ||
1014 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { 1015 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) {
1015 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); 1016 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
1016 } else { 1017 } else {
1017 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); 1018 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict);
1018 } 1019 }
1019 int char_widths[224]; 1020 int char_widths[224];
1020 GetCharWidth(hDC, 32, 255, char_widths); 1021 GetCharWidth(hDC, 32, 255, char_widths);
1021 CPDF_Array* pWidths = new CPDF_Array; 1022 CPDF_Array* pWidths = new CPDF_Array;
1022 for (size_t i = 0; i < 224; i++) 1023 for (size_t i = 0; i < 224; i++)
1023 pWidths->AddNew<CPDF_Number>(char_widths[i]); 1024 pWidths->AddNew<CPDF_Number>(char_widths[i]);
1024 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, 1025 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM,
1025 pLogFont->lfItalic != 0, basefont, pWidths); 1026 pLogFont->lfItalic != 0, basefont, pWidths);
1026 } else { 1027 } else {
1027 pFontDict = 1028 pFontDict =
1028 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, 1029 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont,
1029 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { 1030 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) {
1030 InsertWidthArray(hDC, start, end, widthArr); 1031 InsertWidthArray(hDC, start, end, widthArr);
1031 }); 1032 });
1032 } 1033 }
1033 CPDF_Array* pBBox = new CPDF_Array; 1034 CPDF_Array* pBBox = new CPDF_Array;
1034 for (int i = 0; i < 4; i++) 1035 for (int i = 0; i < 4; i++)
1035 pBBox->AddNew<CPDF_Number>(bbox[i]); 1036 pBBox->AddNew<CPDF_Number>(bbox[i]);
1036 std::unique_ptr<CPDF_Dictionary> pFontDesc = 1037 std::unique_ptr<CPDF_Dictionary> pFontDesc =
1037 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, 1038 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend,
1038 pBBox, pLogFont->lfWeight / 5); 1039 pBBox, pLogFont->lfWeight / 5);
1039 pFontDesc->SetIntegerFor("CapHeight", capheight); 1040 pFontDesc->SetNewFor<CPDF_Number>("CapHeight", capheight);
1040 pFontDict->SetReferenceFor("FontDescriptor", this, 1041 pFontDict->SetNewFor<CPDF_Reference>(
1041 AddIndirectObject(std::move(pFontDesc))); 1042 "FontDescriptor", this,
1043 AddIndirectObject(std::move(pFontDesc))->GetObjNum());
1042 hFont = SelectObject(hDC, hFont); 1044 hFont = SelectObject(hDC, hFont);
1043 DeleteObject(hFont); 1045 DeleteObject(hFont);
1044 DeleteDC(hDC); 1046 DeleteDC(hDC);
1045 return LoadFont(pBaseDict); 1047 return LoadFont(pBaseDict);
1046 } 1048 }
1047 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 1049 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698