| 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> |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 flags |= PDFFONT_SYMBOLIC; | 292 flags |= PDFFONT_SYMBOLIC; |
| 293 else | 293 else |
| 294 flags |= PDFFONT_NONSYMBOLIC; | 294 flags |= PDFFONT_NONSYMBOLIC; |
| 295 return flags; | 295 return flags; |
| 296 } | 296 } |
| 297 | 297 |
| 298 void ProcessNonbCJK(CPDF_Dictionary* pBaseDict, | 298 void ProcessNonbCJK(CPDF_Dictionary* pBaseDict, |
| 299 bool bold, | 299 bool bold, |
| 300 bool italic, | 300 bool italic, |
| 301 CFX_ByteString basefont, | 301 CFX_ByteString basefont, |
| 302 CPDF_Array* pWidths) { | 302 std::unique_ptr<CPDF_Array> pWidths) { |
| 303 if (bold && italic) | 303 if (bold && italic) |
| 304 basefont += ",BoldItalic"; | 304 basefont += ",BoldItalic"; |
| 305 else if (bold) | 305 else if (bold) |
| 306 basefont += ",Bold"; | 306 basefont += ",Bold"; |
| 307 else if (italic) | 307 else if (italic) |
| 308 basefont += ",Italic"; | 308 basefont += ",Italic"; |
| 309 pBaseDict->SetNewFor<CPDF_Name>("Subtype", "TrueType"); | 309 pBaseDict->SetNewFor<CPDF_Name>("Subtype", "TrueType"); |
| 310 pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont); | 310 pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont); |
| 311 pBaseDict->SetNewFor<CPDF_Number>("FirstChar", 32); | 311 pBaseDict->SetNewFor<CPDF_Number>("FirstChar", 32); |
| 312 pBaseDict->SetNewFor<CPDF_Number>("LastChar", 255); | 312 pBaseDict->SetNewFor<CPDF_Number>("LastChar", 255); |
| 313 pBaseDict->SetFor("Widths", pdfium::WrapUnique(pWidths)); | 313 pBaseDict->SetFor("Widths", std::move(pWidths)); |
| 314 } | 314 } |
| 315 | 315 |
| 316 std::unique_ptr<CPDF_Dictionary> CalculateFontDesc(CPDF_Document* pDoc, | 316 std::unique_ptr<CPDF_Dictionary> CalculateFontDesc( |
| 317 CFX_ByteString basefont, | 317 CPDF_Document* pDoc, |
| 318 int flags, | 318 CFX_ByteString basefont, |
| 319 int italicangle, | 319 int flags, |
| 320 int ascend, | 320 int italicangle, |
| 321 int descend, | 321 int ascend, |
| 322 CPDF_Array* bbox, | 322 int descend, |
| 323 int32_t stemV) { | 323 std::unique_ptr<CPDF_Array> bbox, |
| 324 int32_t stemV) { |
| 324 auto pFontDesc = | 325 auto pFontDesc = |
| 325 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); | 326 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); |
| 326 pFontDesc->SetNewFor<CPDF_Name>("Type", "FontDescriptor"); | 327 pFontDesc->SetNewFor<CPDF_Name>("Type", "FontDescriptor"); |
| 327 pFontDesc->SetNewFor<CPDF_Name>("FontName", basefont); | 328 pFontDesc->SetNewFor<CPDF_Name>("FontName", basefont); |
| 328 pFontDesc->SetNewFor<CPDF_Number>("Flags", flags); | 329 pFontDesc->SetNewFor<CPDF_Number>("Flags", flags); |
| 329 pFontDesc->SetFor("FontBBox", pdfium::WrapUnique(bbox)); | 330 pFontDesc->SetFor("FontBBox", std::move(bbox)); |
| 330 pFontDesc->SetNewFor<CPDF_Number>("ItalicAngle", italicangle); | 331 pFontDesc->SetNewFor<CPDF_Number>("ItalicAngle", italicangle); |
| 331 pFontDesc->SetNewFor<CPDF_Number>("Ascent", ascend); | 332 pFontDesc->SetNewFor<CPDF_Number>("Ascent", ascend); |
| 332 pFontDesc->SetNewFor<CPDF_Number>("Descent", descend); | 333 pFontDesc->SetNewFor<CPDF_Number>("Descent", descend); |
| 333 pFontDesc->SetNewFor<CPDF_Number>("StemV", stemV); | 334 pFontDesc->SetNewFor<CPDF_Number>("StemV", stemV); |
| 334 return pFontDesc; | 335 return pFontDesc; |
| 335 } | 336 } |
| 336 | 337 |
| 337 } // namespace | 338 } // namespace |
| 338 | 339 |
| 339 CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser) | 340 CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser) |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 int flags = | 877 int flags = |
| 877 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), | 878 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), |
| 878 false, false, charset == FXFONT_SYMBOL_CHARSET); | 879 false, false, charset == FXFONT_SYMBOL_CHARSET); |
| 879 | 880 |
| 880 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); | 881 CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); |
| 881 pBaseDict->SetNewFor<CPDF_Name>("Type", "Font"); | 882 pBaseDict->SetNewFor<CPDF_Name>("Type", "Font"); |
| 882 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( | 883 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( |
| 883 new CFX_UnicodeEncoding(pFont)); | 884 new CFX_UnicodeEncoding(pFont)); |
| 884 CPDF_Dictionary* pFontDict = pBaseDict; | 885 CPDF_Dictionary* pFontDict = pBaseDict; |
| 885 if (!bCJK) { | 886 if (!bCJK) { |
| 886 CPDF_Array* pWidths = new CPDF_Array; | 887 auto pWidths = pdfium::MakeUnique<CPDF_Array>(); |
| 887 for (int charcode = 32; charcode < 128; charcode++) { | 888 for (int charcode = 32; charcode < 128; charcode++) { |
| 888 int glyph_index = pEncoding->GlyphFromCharCode(charcode); | 889 int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
| 889 int char_width = pFont->GetGlyphWidth(glyph_index); | 890 int char_width = pFont->GetGlyphWidth(glyph_index); |
| 890 pWidths->AddNew<CPDF_Number>(char_width); | 891 pWidths->AddNew<CPDF_Number>(char_width); |
| 891 } | 892 } |
| 892 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || | 893 if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || |
| 893 charset == FXFONT_SYMBOL_CHARSET) { | 894 charset == FXFONT_SYMBOL_CHARSET) { |
| 894 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); | 895 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); |
| 895 for (int charcode = 128; charcode <= 255; charcode++) { | 896 for (int charcode = 128; charcode <= 255; charcode++) { |
| 896 int glyph_index = pEncoding->GlyphFromCharCode(charcode); | 897 int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
| 897 int char_width = pFont->GetGlyphWidth(glyph_index); | 898 int char_width = pFont->GetGlyphWidth(glyph_index); |
| 898 pWidths->AddNew<CPDF_Number>(char_width); | 899 pWidths->AddNew<CPDF_Number>(char_width); |
| 899 } | 900 } |
| 900 } else { | 901 } else { |
| 901 size_t i = CalculateEncodingDict(charset, pBaseDict); | 902 size_t i = CalculateEncodingDict(charset, pBaseDict); |
| 902 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { | 903 if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { |
| 903 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; | 904 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
| 904 for (int j = 0; j < 128; j++) { | 905 for (int j = 0; j < 128; j++) { |
| 905 int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]); | 906 int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]); |
| 906 int char_width = pFont->GetGlyphWidth(glyph_index); | 907 int char_width = pFont->GetGlyphWidth(glyph_index); |
| 907 pWidths->AddNew<CPDF_Number>(char_width); | 908 pWidths->AddNew<CPDF_Number>(char_width); |
| 908 } | 909 } |
| 909 } | 910 } |
| 910 } | 911 } |
| 911 ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, | 912 ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, |
| 912 pWidths); | 913 std::move(pWidths)); |
| 913 } else { | 914 } else { |
| 914 pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, | 915 pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, |
| 915 [pFont, &pEncoding](FX_WCHAR start, FX_WCHAR end, | 916 [pFont, &pEncoding](FX_WCHAR start, FX_WCHAR end, |
| 916 CPDF_Array* widthArr) { | 917 CPDF_Array* widthArr) { |
| 917 InsertWidthArray1(pFont, pEncoding.get(), start, | 918 InsertWidthArray1(pFont, pEncoding.get(), start, |
| 918 end, widthArr); | 919 end, widthArr); |
| 919 }); | 920 }); |
| 920 } | 921 } |
| 921 int italicangle = | 922 int italicangle = |
| 922 pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; | 923 pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; |
| 923 FX_RECT bbox; | 924 FX_RECT bbox; |
| 924 pFont->GetBBox(bbox); | 925 pFont->GetBBox(bbox); |
| 925 CPDF_Array* pBBox = new CPDF_Array; | 926 auto pBBox = pdfium::MakeUnique<CPDF_Array>(); |
| 926 pBBox->AddNew<CPDF_Number>(bbox.left); | 927 pBBox->AddNew<CPDF_Number>(bbox.left); |
| 927 pBBox->AddNew<CPDF_Number>(bbox.bottom); | 928 pBBox->AddNew<CPDF_Number>(bbox.bottom); |
| 928 pBBox->AddNew<CPDF_Number>(bbox.right); | 929 pBBox->AddNew<CPDF_Number>(bbox.right); |
| 929 pBBox->AddNew<CPDF_Number>(bbox.top); | 930 pBBox->AddNew<CPDF_Number>(bbox.top); |
| 930 int32_t nStemV = 0; | 931 int32_t nStemV = 0; |
| 931 if (pFont->GetSubstFont()) { | 932 if (pFont->GetSubstFont()) { |
| 932 nStemV = pFont->GetSubstFont()->m_Weight / 5; | 933 nStemV = pFont->GetSubstFont()->m_Weight / 5; |
| 933 } else { | 934 } else { |
| 934 static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; | 935 static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; |
| 935 const size_t count = FX_ArraySize(stem_chars); | 936 const size_t count = FX_ArraySize(stem_chars); |
| 936 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); | 937 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); |
| 937 nStemV = pFont->GetGlyphWidth(glyph); | 938 nStemV = pFont->GetGlyphWidth(glyph); |
| 938 for (size_t i = 1; i < count; i++) { | 939 for (size_t i = 1; i < count; i++) { |
| 939 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); | 940 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); |
| 940 int width = pFont->GetGlyphWidth(glyph); | 941 int width = pFont->GetGlyphWidth(glyph); |
| 941 if (width > 0 && width < nStemV) | 942 if (width > 0 && width < nStemV) |
| 942 nStemV = width; | 943 nStemV = width; |
| 943 } | 944 } |
| 944 } | 945 } |
| 945 CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject( | 946 CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject( |
| 946 CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), | 947 CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), |
| 947 pFont->GetDescent(), pBBox, nStemV))); | 948 pFont->GetDescent(), std::move(pBBox), nStemV))); |
| 948 pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", this, | 949 pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", this, |
| 949 pFontDesc->GetObjNum()); | 950 pFontDesc->GetObjNum()); |
| 950 return LoadFont(pBaseDict); | 951 return LoadFont(pBaseDict); |
| 951 } | 952 } |
| 952 | 953 |
| 953 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 954 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| 954 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, | 955 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, |
| 955 bool bVert, | 956 bool bVert, |
| 956 bool bTranslateName) { | 957 bool bTranslateName) { |
| 957 LOGFONTA lfa; | 958 LOGFONTA lfa; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 if (!bCJK) { | 1015 if (!bCJK) { |
| 1015 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || | 1016 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || |
| 1016 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || | 1017 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || |
| 1017 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { | 1018 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { |
| 1018 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); | 1019 pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); |
| 1019 } else { | 1020 } else { |
| 1020 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); | 1021 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); |
| 1021 } | 1022 } |
| 1022 int char_widths[224]; | 1023 int char_widths[224]; |
| 1023 GetCharWidth(hDC, 32, 255, char_widths); | 1024 GetCharWidth(hDC, 32, 255, char_widths); |
| 1024 CPDF_Array* pWidths = new CPDF_Array; | 1025 auto pWidths = pdfium::MakeUnique<CPDF_Array>(); |
| 1025 for (size_t i = 0; i < 224; i++) | 1026 for (size_t i = 0; i < 224; i++) |
| 1026 pWidths->AddNew<CPDF_Number>(char_widths[i]); | 1027 pWidths->AddNew<CPDF_Number>(char_widths[i]); |
| 1027 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, | 1028 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, |
| 1028 pLogFont->lfItalic != 0, basefont, pWidths); | 1029 pLogFont->lfItalic != 0, basefont, std::move(pWidths)); |
| 1029 } else { | 1030 } else { |
| 1030 pFontDict = | 1031 pFontDict = |
| 1031 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, | 1032 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, |
| 1032 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { | 1033 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { |
| 1033 InsertWidthArray(hDC, start, end, widthArr); | 1034 InsertWidthArray(hDC, start, end, widthArr); |
| 1034 }); | 1035 }); |
| 1035 } | 1036 } |
| 1036 CPDF_Array* pBBox = new CPDF_Array; | 1037 auto pBBox = pdfium::MakeUnique<CPDF_Array>(); |
| 1037 for (int i = 0; i < 4; i++) | 1038 for (int i = 0; i < 4; i++) |
| 1038 pBBox->AddNew<CPDF_Number>(bbox[i]); | 1039 pBBox->AddNew<CPDF_Number>(bbox[i]); |
| 1039 std::unique_ptr<CPDF_Dictionary> pFontDesc = | 1040 std::unique_ptr<CPDF_Dictionary> pFontDesc = |
| 1040 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, | 1041 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, |
| 1041 pBBox, pLogFont->lfWeight / 5); | 1042 std::move(pBBox), pLogFont->lfWeight / 5); |
| 1042 pFontDesc->SetNewFor<CPDF_Number>("CapHeight", capheight); | 1043 pFontDesc->SetNewFor<CPDF_Number>("CapHeight", capheight); |
| 1043 pFontDict->SetNewFor<CPDF_Reference>( | 1044 pFontDict->SetNewFor<CPDF_Reference>( |
| 1044 "FontDescriptor", this, | 1045 "FontDescriptor", this, |
| 1045 AddIndirectObject(std::move(pFontDesc))->GetObjNum()); | 1046 AddIndirectObject(std::move(pFontDesc))->GetObjNum()); |
| 1046 hFont = SelectObject(hDC, hFont); | 1047 hFont = SelectObject(hDC, hFont); |
| 1047 DeleteObject(hFont); | 1048 DeleteObject(hFont); |
| 1048 DeleteDC(hDC); | 1049 DeleteDC(hDC); |
| 1049 return LoadFont(pBaseDict); | 1050 return LoadFont(pBaseDict); |
| 1050 } | 1051 } |
| 1051 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 1052 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| OLD | NEW |