OLD | NEW |
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_number.h" | 22 #include "core/fpdfapi/parser/cpdf_number.h" |
22 #include "core/fpdfapi/parser/cpdf_parser.h" | 23 #include "core/fpdfapi/parser/cpdf_parser.h" |
23 #include "core/fpdfapi/parser/cpdf_reference.h" | 24 #include "core/fpdfapi/parser/cpdf_reference.h" |
24 #include "core/fpdfapi/parser/cpdf_stream.h" | 25 #include "core/fpdfapi/parser/cpdf_stream.h" |
25 #include "core/fpdfapi/render/render_int.h" | 26 #include "core/fpdfapi/render/render_int.h" |
26 #include "core/fxcodec/JBig2_DocumentContext.h" | 27 #include "core/fxcodec/JBig2_DocumentContext.h" |
27 #include "core/fxge/cfx_unicodeencoding.h" | 28 #include "core/fxge/cfx_unicodeencoding.h" |
28 #include "core/fxge/fx_font.h" | 29 #include "core/fxge/fx_font.h" |
29 #include "third_party/base/ptr_util.h" | 30 #include "third_party/base/ptr_util.h" |
30 #include "third_party/base/stl_util.h" | 31 #include "third_party/base/stl_util.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 }; | 188 }; |
188 | 189 |
189 void InsertWidthArrayImpl(int* widths, int size, CPDF_Array* pWidthArray) { | 190 void InsertWidthArrayImpl(int* widths, int size, CPDF_Array* pWidthArray) { |
190 int i; | 191 int i; |
191 for (i = 1; i < size; i++) { | 192 for (i = 1; i < size; i++) { |
192 if (widths[i] != *widths) | 193 if (widths[i] != *widths) |
193 break; | 194 break; |
194 } | 195 } |
195 if (i == size) { | 196 if (i == size) { |
196 int first = pWidthArray->GetIntegerAt(pWidthArray->GetCount() - 1); | 197 int first = pWidthArray->GetIntegerAt(pWidthArray->GetCount() - 1); |
197 pWidthArray->AddInteger(first + size - 1); | 198 pWidthArray->AddNew<CPDF_Number>(first + size - 1); |
198 pWidthArray->AddInteger(*widths); | 199 pWidthArray->AddNew<CPDF_Number>(*widths); |
199 } else { | 200 } else { |
200 CPDF_Array* pWidthArray1 = new CPDF_Array; | 201 CPDF_Array* pWidthArray1 = pWidthArray->AddNew<CPDF_Array>(); |
201 pWidthArray->Add(pWidthArray1); | |
202 for (i = 0; i < size; i++) | 202 for (i = 0; i < size; i++) |
203 pWidthArray1->AddInteger(widths[i]); | 203 pWidthArray1->AddNew<CPDF_Number>(widths[i]); |
204 } | 204 } |
205 FX_Free(widths); | 205 FX_Free(widths); |
206 } | 206 } |
207 | 207 |
208 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 208 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
209 void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { | 209 void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { |
210 int size = end - start + 1; | 210 int size = end - start + 1; |
211 int* widths = FX_Alloc(int, size); | 211 int* widths = FX_Alloc(int, size); |
212 GetCharWidth(hDC, start, end, widths); | 212 GetCharWidth(hDC, start, end, widths); |
213 InsertWidthArrayImpl(widths, size, pWidthArray); | 213 InsertWidthArrayImpl(widths, size, pWidthArray); |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 return false; | 681 return false; |
682 | 682 |
683 for (size_t i = 0; i < pKidList->GetCount(); i++) { | 683 for (size_t i = 0; i < pKidList->GetCount(); i++) { |
684 CPDF_Dictionary* pKid = pKidList->GetDictAt(i); | 684 CPDF_Dictionary* pKid = pKidList->GetDictAt(i); |
685 if (pKid->GetStringFor("Type") == "Page") { | 685 if (pKid->GetStringFor("Type") == "Page") { |
686 if (nPagesToGo != 0) { | 686 if (nPagesToGo != 0) { |
687 nPagesToGo--; | 687 nPagesToGo--; |
688 continue; | 688 continue; |
689 } | 689 } |
690 if (bInsert) { | 690 if (bInsert) { |
691 pKidList->InsertAt(i, new CPDF_Reference(this, pPageDict->GetObjNum())); | 691 pKidList->InsertNewAt<CPDF_Reference>(i, this, pPageDict->GetObjNum()); |
692 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); | 692 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); |
693 } else { | 693 } else { |
694 pKidList->RemoveAt(i); | 694 pKidList->RemoveAt(i); |
695 } | 695 } |
696 pPages->SetIntegerFor( | 696 pPages->SetIntegerFor( |
697 "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); | 697 "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); |
698 ResetTraversal(); | 698 ResetTraversal(); |
699 break; | 699 break; |
700 } | 700 } |
701 int nPages = pKid->GetIntegerFor("Count"); | 701 int nPages = pKid->GetIntegerFor("Count"); |
(...skipping 24 matching lines...) Expand all Loading... |
726 int nPages = GetPageCount(); | 726 int nPages = GetPageCount(); |
727 if (iPage < 0 || iPage > nPages) | 727 if (iPage < 0 || iPage > nPages) |
728 return false; | 728 return false; |
729 | 729 |
730 if (iPage == nPages) { | 730 if (iPage == nPages) { |
731 CPDF_Array* pPagesList = pPages->GetArrayFor("Kids"); | 731 CPDF_Array* pPagesList = pPages->GetArrayFor("Kids"); |
732 if (!pPagesList) { | 732 if (!pPagesList) { |
733 pPagesList = new CPDF_Array; | 733 pPagesList = new CPDF_Array; |
734 pPages->SetFor("Kids", pPagesList); | 734 pPages->SetFor("Kids", pPagesList); |
735 } | 735 } |
736 pPagesList->Add(new CPDF_Reference(this, pPageDict->GetObjNum())); | 736 pPagesList->AddNew<CPDF_Reference>(this, pPageDict->GetObjNum()); |
737 pPages->SetIntegerFor("Count", nPages + 1); | 737 pPages->SetIntegerFor("Count", nPages + 1); |
738 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); | 738 pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); |
739 ResetTraversal(); | 739 ResetTraversal(); |
740 } else { | 740 } else { |
741 std::set<CPDF_Dictionary*> stack = {pPages}; | 741 std::set<CPDF_Dictionary*> stack = {pPages}; |
742 if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack)) | 742 if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack)) |
743 return false; | 743 return false; |
744 } | 744 } |
745 m_PageList.InsertAt(iPage, pPageDict->GetObjNum()); | 745 m_PageList.InsertAt(iPage, pPageDict->GetObjNum()); |
746 return true; | 746 return true; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 break; | 778 break; |
779 } | 779 } |
780 if (i == FX_ArraySize(g_FX_CharsetUnicodes)) | 780 if (i == FX_ArraySize(g_FX_CharsetUnicodes)) |
781 return i; | 781 return i; |
782 | 782 |
783 CPDF_Dictionary* pEncodingDict = | 783 CPDF_Dictionary* pEncodingDict = |
784 NewIndirect<CPDF_Dictionary>(m_pByteStringPool); | 784 NewIndirect<CPDF_Dictionary>(m_pByteStringPool); |
785 pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); | 785 pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); |
786 | 786 |
787 CPDF_Array* pArray = new CPDF_Array; | 787 CPDF_Array* pArray = new CPDF_Array; |
788 pArray->AddInteger(128); | 788 pArray->AddNew<CPDF_Number>(128); |
789 | 789 |
790 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; | 790 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
791 for (int j = 0; j < 128; j++) { | 791 for (int j = 0; j < 128; j++) { |
792 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); | 792 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); |
793 pArray->AddName(name.IsEmpty() ? ".notdef" : name); | 793 pArray->AddNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name); |
794 } | 794 } |
795 pEncodingDict->SetFor("Differences", pArray); | 795 pEncodingDict->SetFor("Differences", pArray); |
796 pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); | 796 pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); |
797 return i; | 797 return i; |
798 } | 798 } |
799 | 799 |
800 CPDF_Dictionary* CPDF_Document::ProcessbCJK( | 800 CPDF_Dictionary* CPDF_Document::ProcessbCJK( |
801 CPDF_Dictionary* pBaseDict, | 801 CPDF_Dictionary* pBaseDict, |
802 int charset, | 802 int charset, |
803 bool bVert, | 803 bool bVert, |
804 CFX_ByteString basefont, | 804 CFX_ByteString basefont, |
805 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { | 805 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { |
806 CPDF_Dictionary* pFontDict = NewIndirect<CPDF_Dictionary>(m_pByteStringPool); | 806 CPDF_Dictionary* pFontDict = NewIndirect<CPDF_Dictionary>(m_pByteStringPool); |
807 CFX_ByteString cmap; | 807 CFX_ByteString cmap; |
808 CFX_ByteString ordering; | 808 CFX_ByteString ordering; |
809 int supplement = 0; | 809 int supplement = 0; |
810 CPDF_Array* pWidthArray = new CPDF_Array; | 810 CPDF_Array* pWidthArray = new CPDF_Array; |
811 switch (charset) { | 811 switch (charset) { |
812 case FXFONT_CHINESEBIG5_CHARSET: | 812 case FXFONT_CHINESEBIG5_CHARSET: |
813 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; | 813 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
814 ordering = "CNS1"; | 814 ordering = "CNS1"; |
815 supplement = 4; | 815 supplement = 4; |
816 pWidthArray->AddInteger(1); | 816 pWidthArray->AddNew<CPDF_Number>(1); |
817 Insert(0x20, 0x7e, pWidthArray); | 817 Insert(0x20, 0x7e, pWidthArray); |
818 break; | 818 break; |
819 case FXFONT_GB2312_CHARSET: | 819 case FXFONT_GB2312_CHARSET: |
820 cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; | 820 cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; |
821 ordering = "GB1"; | 821 ordering = "GB1"; |
822 supplement = 2; | 822 supplement = 2; |
823 pWidthArray->AddInteger(7716); | 823 pWidthArray->AddNew<CPDF_Number>(7716); |
824 Insert(0x20, 0x20, pWidthArray); | 824 Insert(0x20, 0x20, pWidthArray); |
825 pWidthArray->AddInteger(814); | 825 pWidthArray->AddNew<CPDF_Number>(814); |
826 Insert(0x21, 0x7e, pWidthArray); | 826 Insert(0x21, 0x7e, pWidthArray); |
827 break; | 827 break; |
828 case FXFONT_HANGUL_CHARSET: | 828 case FXFONT_HANGUL_CHARSET: |
829 cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; | 829 cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; |
830 ordering = "Korea1"; | 830 ordering = "Korea1"; |
831 supplement = 2; | 831 supplement = 2; |
832 pWidthArray->AddInteger(1); | 832 pWidthArray->AddNew<CPDF_Number>(1); |
833 Insert(0x20, 0x7e, pWidthArray); | 833 Insert(0x20, 0x7e, pWidthArray); |
834 break; | 834 break; |
835 case FXFONT_SHIFTJIS_CHARSET: | 835 case FXFONT_SHIFTJIS_CHARSET: |
836 cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; | 836 cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; |
837 ordering = "Japan1"; | 837 ordering = "Japan1"; |
838 supplement = 5; | 838 supplement = 5; |
839 pWidthArray->AddInteger(231); | 839 pWidthArray->AddNew<CPDF_Number>(231); |
840 Insert(0x20, 0x7d, pWidthArray); | 840 Insert(0x20, 0x7d, pWidthArray); |
841 pWidthArray->AddInteger(326); | 841 pWidthArray->AddNew<CPDF_Number>(326); |
842 Insert(0xa0, 0xa0, pWidthArray); | 842 Insert(0xa0, 0xa0, pWidthArray); |
843 pWidthArray->AddInteger(327); | 843 pWidthArray->AddNew<CPDF_Number>(327); |
844 Insert(0xa1, 0xdf, pWidthArray); | 844 Insert(0xa1, 0xdf, pWidthArray); |
845 pWidthArray->AddInteger(631); | 845 pWidthArray->AddNew<CPDF_Number>(631); |
846 Insert(0x7e, 0x7e, pWidthArray); | 846 Insert(0x7e, 0x7e, pWidthArray); |
847 break; | 847 break; |
848 } | 848 } |
849 pBaseDict->SetNameFor("Subtype", "Type0"); | 849 pBaseDict->SetNameFor("Subtype", "Type0"); |
850 pBaseDict->SetNameFor("BaseFont", basefont); | 850 pBaseDict->SetNameFor("BaseFont", basefont); |
851 pBaseDict->SetNameFor("Encoding", cmap); | 851 pBaseDict->SetNameFor("Encoding", cmap); |
852 pFontDict->SetFor("W", pWidthArray); | 852 pFontDict->SetFor("W", pWidthArray); |
853 pFontDict->SetNameFor("Type", "Font"); | 853 pFontDict->SetNameFor("Type", "Font"); |
854 pFontDict->SetNameFor("Subtype", "CIDFontType2"); | 854 pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
855 pFontDict->SetNameFor("BaseFont", basefont); | 855 pFontDict->SetNameFor("BaseFont", basefont); |
856 CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary(m_pByteStringPool); | 856 CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary(m_pByteStringPool); |
857 pCIDSysInfo->SetStringFor("Registry", "Adobe"); | 857 pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
858 pCIDSysInfo->SetStringFor("Ordering", ordering); | 858 pCIDSysInfo->SetStringFor("Ordering", ordering); |
859 pCIDSysInfo->SetIntegerFor("Supplement", supplement); | 859 pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
860 pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); | 860 pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
861 CPDF_Array* pArray = new CPDF_Array; | 861 CPDF_Array* pArray = new CPDF_Array; |
862 pBaseDict->SetFor("DescendantFonts", pArray); | 862 pBaseDict->SetFor("DescendantFonts", pArray); |
863 pArray->AddReference(this, pFontDict->GetObjNum()); | 863 pArray->AddNew<CPDF_Reference>(this, pFontDict->GetObjNum()); |
864 return pFontDict; | 864 return pFontDict; |
865 } | 865 } |
866 | 866 |
867 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { | 867 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { |
868 if (!pFont) | 868 if (!pFont) |
869 return nullptr; | 869 return nullptr; |
870 | 870 |
871 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || | 871 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || |
872 charset == FXFONT_GB2312_CHARSET || | 872 charset == FXFONT_GB2312_CHARSET || |
873 charset == FXFONT_HANGUL_CHARSET || | 873 charset == FXFONT_HANGUL_CHARSET || |
874 charset == FXFONT_SHIFTJIS_CHARSET; | 874 charset == FXFONT_SHIFTJIS_CHARSET; |
875 CFX_ByteString basefont = pFont->GetFamilyName(); | 875 CFX_ByteString basefont = pFont->GetFamilyName(); |
876 basefont.Replace(" ", ""); | 876 basefont.Replace(" ", ""); |
877 int flags = | 877 int flags = |
878 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), | 878 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), |
879 false, false, charset == FXFONT_SYMBOL_CHARSET); | 879 false, false, charset == FXFONT_SYMBOL_CHARSET); |
880 | 880 |
881 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(m_pByteStringPool); | 881 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(m_pByteStringPool); |
882 pBaseDict->SetNameFor("Type", "Font"); | 882 pBaseDict->SetNameFor("Type", "Font"); |
883 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( | 883 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( |
884 new CFX_UnicodeEncoding(pFont)); | 884 new CFX_UnicodeEncoding(pFont)); |
885 CPDF_Dictionary* pFontDict = pBaseDict; | 885 CPDF_Dictionary* pFontDict = pBaseDict; |
886 if (!bCJK) { | 886 if (!bCJK) { |
887 CPDF_Array* pWidths = new CPDF_Array; | 887 CPDF_Array* pWidths = new CPDF_Array; |
888 for (int charcode = 32; charcode < 128; charcode++) { | 888 for (int charcode = 32; charcode < 128; charcode++) { |
889 int glyph_index = pEncoding->GlyphFromCharCode(charcode); | 889 int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
890 int char_width = pFont->GetGlyphWidth(glyph_index); | 890 int char_width = pFont->GetGlyphWidth(glyph_index); |
891 pWidths->AddInteger(char_width); | 891 pWidths->AddNew<CPDF_Number>(char_width); |
892 } | 892 } |
893 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || | 893 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || |
894 charset == FXFONT_SYMBOL_CHARSET) { | 894 charset == FXFONT_SYMBOL_CHARSET) { |
895 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); | 895 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
896 for (int charcode = 128; charcode <= 255; charcode++) { | 896 for (int charcode = 128; charcode <= 255; charcode++) { |
897 int glyph_index = pEncoding->GlyphFromCharCode(charcode); | 897 int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
898 int char_width = pFont->GetGlyphWidth(glyph_index); | 898 int char_width = pFont->GetGlyphWidth(glyph_index); |
899 pWidths->AddInteger(char_width); | 899 pWidths->AddNew<CPDF_Number>(char_width); |
900 } | 900 } |
901 } else { | 901 } else { |
902 size_t i = CalculateEncodingDict(charset, pBaseDict); | 902 size_t i = CalculateEncodingDict(charset, pBaseDict); |
903 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { | 903 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { |
904 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; | 904 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
905 for (int j = 0; j < 128; j++) { | 905 for (int j = 0; j < 128; j++) { |
906 int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]); | 906 int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]); |
907 int char_width = pFont->GetGlyphWidth(glyph_index); | 907 int char_width = pFont->GetGlyphWidth(glyph_index); |
908 pWidths->AddInteger(char_width); | 908 pWidths->AddNew<CPDF_Number>(char_width); |
909 } | 909 } |
910 } | 910 } |
911 } | 911 } |
912 ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, | 912 ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, |
913 pWidths); | 913 pWidths); |
914 } else { | 914 } else { |
915 pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, | 915 pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, |
916 [pFont, &pEncoding](FX_WCHAR start, FX_WCHAR end, | 916 [pFont, &pEncoding](FX_WCHAR start, FX_WCHAR end, |
917 CPDF_Array* widthArr) { | 917 CPDF_Array* widthArr) { |
918 InsertWidthArray1(pFont, pEncoding.get(), start, | 918 InsertWidthArray1(pFont, pEncoding.get(), start, |
919 end, widthArr); | 919 end, widthArr); |
920 }); | 920 }); |
921 } | 921 } |
922 int italicangle = | 922 int italicangle = |
923 pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; | 923 pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; |
924 FX_RECT bbox; | 924 FX_RECT bbox; |
925 pFont->GetBBox(bbox); | 925 pFont->GetBBox(bbox); |
926 CPDF_Array* pBBox = new CPDF_Array; | 926 CPDF_Array* pBBox = new CPDF_Array; |
927 pBBox->AddInteger(bbox.left); | 927 pBBox->AddNew<CPDF_Number>(bbox.left); |
928 pBBox->AddInteger(bbox.bottom); | 928 pBBox->AddNew<CPDF_Number>(bbox.bottom); |
929 pBBox->AddInteger(bbox.right); | 929 pBBox->AddNew<CPDF_Number>(bbox.right); |
930 pBBox->AddInteger(bbox.top); | 930 pBBox->AddNew<CPDF_Number>(bbox.top); |
931 int32_t nStemV = 0; | 931 int32_t nStemV = 0; |
932 if (pFont->GetSubstFont()) { | 932 if (pFont->GetSubstFont()) { |
933 nStemV = pFont->GetSubstFont()->m_Weight / 5; | 933 nStemV = pFont->GetSubstFont()->m_Weight / 5; |
934 } else { | 934 } else { |
935 static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; | 935 static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; |
936 const size_t count = FX_ArraySize(stem_chars); | 936 const size_t count = FX_ArraySize(stem_chars); |
937 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); | 937 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); |
938 nStemV = pFont->GetGlyphWidth(glyph); | 938 nStemV = pFont->GetGlyphWidth(glyph); |
939 for (size_t i = 1; i < count; i++) { | 939 for (size_t i = 1; i < count; i++) { |
940 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); | 940 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || | 1016 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || |
1017 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { | 1017 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { |
1018 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); | 1018 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
1019 } else { | 1019 } else { |
1020 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); | 1020 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); |
1021 } | 1021 } |
1022 int char_widths[224]; | 1022 int char_widths[224]; |
1023 GetCharWidth(hDC, 32, 255, char_widths); | 1023 GetCharWidth(hDC, 32, 255, char_widths); |
1024 CPDF_Array* pWidths = new CPDF_Array; | 1024 CPDF_Array* pWidths = new CPDF_Array; |
1025 for (size_t i = 0; i < 224; i++) | 1025 for (size_t i = 0; i < 224; i++) |
1026 pWidths->AddInteger(char_widths[i]); | 1026 pWidths->AddNew<CPDF_Number>(char_widths[i]); |
1027 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, | 1027 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, |
1028 pLogFont->lfItalic != 0, basefont, pWidths); | 1028 pLogFont->lfItalic != 0, basefont, pWidths); |
1029 } else { | 1029 } else { |
1030 pFontDict = | 1030 pFontDict = |
1031 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, | 1031 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, |
1032 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { | 1032 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { |
1033 InsertWidthArray(hDC, start, end, widthArr); | 1033 InsertWidthArray(hDC, start, end, widthArr); |
1034 }); | 1034 }); |
1035 } | 1035 } |
1036 CPDF_Array* pBBox = new CPDF_Array; | 1036 CPDF_Array* pBBox = new CPDF_Array; |
1037 for (int i = 0; i < 4; i++) | 1037 for (int i = 0; i < 4; i++) |
1038 pBBox->AddInteger(bbox[i]); | 1038 pBBox->AddNew<CPDF_Number>(bbox[i]); |
1039 std::unique_ptr<CPDF_Dictionary> pFontDesc = | 1039 std::unique_ptr<CPDF_Dictionary> pFontDesc = |
1040 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, | 1040 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, |
1041 pBBox, pLogFont->lfWeight / 5); | 1041 pBBox, pLogFont->lfWeight / 5); |
1042 pFontDesc->SetIntegerFor("CapHeight", capheight); | 1042 pFontDesc->SetIntegerFor("CapHeight", capheight); |
1043 pFontDict->SetReferenceFor("FontDescriptor", this, | 1043 pFontDict->SetReferenceFor("FontDescriptor", this, |
1044 AddIndirectObject(std::move(pFontDesc))); | 1044 AddIndirectObject(std::move(pFontDesc))); |
1045 hFont = SelectObject(hDC, hFont); | 1045 hFont = SelectObject(hDC, hFont); |
1046 DeleteObject(hFont); | 1046 DeleteObject(hFont); |
1047 DeleteDC(hDC); | 1047 DeleteDC(hDC); |
1048 return LoadFont(pBaseDict); | 1048 return LoadFont(pBaseDict); |
1049 } | 1049 } |
1050 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 1050 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
OLD | NEW |