Chromium Code Reviews| Index: core/fpdfapi/fpdf_parser/cpdf_document.cpp |
| diff --git a/core/fpdfapi/fpdf_parser/cpdf_document.cpp b/core/fpdfapi/fpdf_parser/cpdf_document.cpp |
| index 9f5a4299e9bba1a40d191eeb06e4e679f47729a2..f4d91e6b3f7bc0e840b0168fea0d82f1c255fe0b 100644 |
| --- a/core/fpdfapi/fpdf_parser/cpdf_document.cpp |
| +++ b/core/fpdfapi/fpdf_parser/cpdf_document.cpp |
| @@ -183,11 +183,7 @@ const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = { |
| {FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes}, |
| }; |
| -#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| -void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { |
| - int size = end - start + 1; |
| - int* widths = FX_Alloc(int, size); |
| - GetCharWidth(hDC, start, end, widths); |
| +void InsertWidthArrayImpl(int* widths, int size, CPDF_Array* pWidthArray) { |
| int i; |
| for (i = 1; i < size; i++) { |
| if (widths[i] != *widths) |
| @@ -206,6 +202,14 @@ void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { |
| FX_Free(widths); |
| } |
| +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| +void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { |
| + int size = end - start + 1; |
| + int* widths = FX_Alloc(int, size); |
| + GetCharWidth(hDC, start, end, widths); |
| + InsertWidthArrayImpl(widths, size, pWidthArray); |
| +} |
| + |
| CFX_ByteString FPDF_GetPSNameFromTT(HDC hDC) { |
| CFX_ByteString result; |
| DWORD size = ::GetFontData(hDC, 'eman', 0, nullptr, 0); |
| @@ -231,22 +235,7 @@ void InsertWidthArray1(CFX_Font* pFont, |
| int glyph_index = pEncoding->GlyphFromCharCode(start + i); |
| widths[i] = pFont->GetGlyphWidth(glyph_index); |
| } |
| - for (i = 1; i < size; i++) { |
| - if (widths[i] != *widths) |
| - break; |
| - } |
| - if (i == size) { |
| - int first = pWidthArray->GetIntegerAt(pWidthArray->GetCount() - 1); |
| - pWidthArray->AddInteger(first + size - 1); |
| - pWidthArray->AddInteger(*widths); |
| - } else { |
| - CPDF_Array* pWidthArray1 = new CPDF_Array; |
| - pWidthArray->Add(pWidthArray1); |
| - for (i = 0; i < size; i++) { |
| - pWidthArray1->AddInteger(widths[i]); |
| - } |
| - } |
| - FX_Free(widths); |
| + InsertWidthArrayImpl(widths, size, pWidthArray); |
| } |
| int InsertDeletePDFPage(CPDF_Document* pDoc, |
| @@ -395,6 +384,25 @@ void ProcessNonbCJK(CPDF_Dictionary* pBaseDict, |
| pBaseDict->SetFor("Widths", pWidths); |
| } |
| +CPDF_Dictionary* CalculateFontDesc(CFX_ByteString basefont, |
| + int flags, |
| + int italicangle, |
| + int ascend, |
| + int descend, |
| + CPDF_Array* bbox, |
| + int32_t stemV) { |
| + CPDF_Dictionary* pFontDesc = new CPDF_Dictionary; |
| + pFontDesc->SetNameFor("Type", "FontDescriptor"); |
| + pFontDesc->SetNameFor("FontName", basefont); |
| + pFontDesc->SetIntegerFor("Flags", flags); |
| + pFontDesc->SetFor("FontBBox", bbox); |
| + pFontDesc->SetIntegerFor("ItalicAngle", italicangle); |
| + pFontDesc->SetIntegerFor("Ascent", ascend); |
| + pFontDesc->SetIntegerFor("Descent", descend); |
| + pFontDesc->SetIntegerFor("StemV", stemV); |
| + return pFontDesc; |
| +} |
| + |
| } // namespace |
| CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser) |
| @@ -744,6 +752,74 @@ size_t CPDF_Document::CalculateEncodingDict(int charset, |
| return i; |
| } |
| +CPDF_Dictionary* CPDF_Document::ProcessbCJK( |
| + CPDF_Dictionary* pBaseDict, |
| + int charset, |
| + FX_BOOL bVert, |
| + CFX_ByteString basefont, |
| + std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { |
| + CPDF_Dictionary* pFontDict = new CPDF_Dictionary; |
| + CFX_ByteString cmap; |
| + CFX_ByteString ordering; |
| + int supplement = 0; |
| + CPDF_Array* pWidthArray = new CPDF_Array; |
| + switch (charset) { |
| + case FXFONT_CHINESEBIG5_CHARSET: |
| + cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
| + ordering = "CNS1"; |
| + supplement = 4; |
| + pWidthArray->AddInteger(1); |
| + Insert(0x20, 0x7e, pWidthArray); |
| + break; |
| + case FXFONT_GB2312_CHARSET: |
| + cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; |
| + ordering = "GB1"; |
| + supplement = 2; |
| + pWidthArray->AddInteger(7716); |
| + Insert(0x20, 0x20, pWidthArray); |
| + pWidthArray->AddInteger(814); |
| + Insert(0x21, 0x7e, pWidthArray); |
| + break; |
| + case FXFONT_HANGEUL_CHARSET: |
| + cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; |
| + ordering = "Korea1"; |
| + supplement = 2; |
| + pWidthArray->AddInteger(1); |
| + Insert(0x20, 0x7e, pWidthArray); |
| + break; |
| + case FXFONT_SHIFTJIS_CHARSET: |
| + cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; |
| + ordering = "Japan1"; |
| + supplement = 5; |
| + pWidthArray->AddInteger(231); |
| + Insert(0x20, 0x7d, pWidthArray); |
| + pWidthArray->AddInteger(326); |
| + Insert(0xa0, 0xa0, pWidthArray); |
| + pWidthArray->AddInteger(327); |
| + Insert(0xa1, 0xdf, pWidthArray); |
| + pWidthArray->AddInteger(631); |
| + Insert(0x7e, 0x7e, pWidthArray); |
| + break; |
| + } |
| + pBaseDict->SetNameFor("Subtype", "Type0"); |
| + pBaseDict->SetNameFor("BaseFont", basefont); |
| + pBaseDict->SetNameFor("Encoding", cmap); |
| + pFontDict->SetFor("W", pWidthArray); |
| + pFontDict->SetNameFor("Type", "Font"); |
| + pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
| + pFontDict->SetNameFor("BaseFont", basefont); |
| + CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary; |
| + pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
| + pCIDSysInfo->SetStringFor("Ordering", ordering); |
| + pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
| + pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
| + CPDF_Array* pArray = new CPDF_Array; |
| + pBaseDict->SetFor("DescendantFonts", pArray); |
| + AddIndirectObject(pFontDict); |
| + pArray->AddReference(this, pFontDict); |
| + return pFontDict; |
| +} |
| + |
| CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { |
| if (!pFont) |
| return nullptr; |
| @@ -792,77 +868,14 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { |
| ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, |
| pWidths); |
| } else { |
| - flags |= PDFFONT_NONSYMBOLIC; |
| - pFontDict = new CPDF_Dictionary; |
| - CFX_ByteString cmap; |
| - CFX_ByteString ordering; |
| - int supplement = 0; |
| - CPDF_Array* pWidthArray = new CPDF_Array; |
| - switch (charset) { |
| - case FXFONT_CHINESEBIG5_CHARSET: |
| - cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
| - ordering = "CNS1"; |
| - supplement = 4; |
| - pWidthArray->AddInteger(1); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x20, 0x7e, pWidthArray); |
| - break; |
| - case FXFONT_GB2312_CHARSET: |
| - cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; |
| - ordering = "GB1"; |
| - supplement = 2; |
| - pWidthArray->AddInteger(7716); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x20, 0x20, pWidthArray); |
| - pWidthArray->AddInteger(814); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x21, 0x7e, pWidthArray); |
| - break; |
| - case FXFONT_HANGEUL_CHARSET: |
| - cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; |
| - ordering = "Korea1"; |
| - supplement = 2; |
| - pWidthArray->AddInteger(1); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x20, 0x7e, pWidthArray); |
| - break; |
| - case FXFONT_SHIFTJIS_CHARSET: |
| - cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; |
| - ordering = "Japan1"; |
| - supplement = 5; |
| - pWidthArray->AddInteger(231); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x20, 0x7d, pWidthArray); |
| - pWidthArray->AddInteger(326); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0xa0, 0xa0, pWidthArray); |
| - pWidthArray->AddInteger(327); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0xa1, 0xdf, pWidthArray); |
| - pWidthArray->AddInteger(631); |
| - InsertWidthArray1(pFont, pEncoding.get(), 0x7e, 0x7e, pWidthArray); |
| - break; |
| - } |
| - pBaseDict->SetNameFor("Subtype", "Type0"); |
| - pBaseDict->SetNameFor("BaseFont", basefont); |
| - pBaseDict->SetNameFor("Encoding", cmap); |
| - pFontDict->SetFor("W", pWidthArray); |
| - pFontDict->SetNameFor("Type", "Font"); |
| - pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
| - pFontDict->SetNameFor("BaseFont", basefont); |
| - CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary; |
| - pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
| - pCIDSysInfo->SetStringFor("Ordering", ordering); |
| - pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
| - pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
| - CPDF_Array* pArray = new CPDF_Array; |
| - pBaseDict->SetFor("DescendantFonts", pArray); |
| - AddIndirectObject(pFontDict); |
| - pArray->AddReference(this, pFontDict); |
| + auto Insert = [&](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { |
|
Tom Sepez
2016/09/16 19:42:14
nit: local not needed, it's much more fun to have
|
| + InsertWidthArray1(pFont, pEncoding.get(), start, end, widthArr); |
| + }; |
| + pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, Insert); |
| } |
| AddIndirectObject(pBaseDict); |
| - CPDF_Dictionary* pFontDesc = new CPDF_Dictionary; |
| - pFontDesc->SetNameFor("Type", "FontDescriptor"); |
| - pFontDesc->SetNameFor("FontName", basefont); |
| - pFontDesc->SetIntegerFor("Flags", flags); |
| - pFontDesc->SetIntegerFor( |
| - "ItalicAngle", |
| - pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0); |
| - pFontDesc->SetIntegerFor("Ascent", pFont->GetAscent()); |
| - pFontDesc->SetIntegerFor("Descent", pFont->GetDescent()); |
| + int italicangle = |
| + pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; |
| FX_RECT bbox; |
| pFont->GetBBox(bbox); |
| CPDF_Array* pBBox = new CPDF_Array; |
| @@ -870,7 +883,6 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { |
| pBBox->AddInteger(bbox.bottom); |
| pBBox->AddInteger(bbox.right); |
| pBBox->AddInteger(bbox.top); |
| - pFontDesc->SetFor("FontBBox", pBBox); |
| int32_t nStemV = 0; |
| if (pFont->GetSubstFont()) { |
| nStemV = pFont->GetSubstFont()->m_Weight / 5; |
| @@ -886,7 +898,9 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { |
| nStemV = width; |
| } |
| } |
| - pFontDesc->SetIntegerFor("StemV", nStemV); |
| + CPDF_Dictionary* pFontDesc = |
| + CalculateFontDesc(basefont, flags, italicangle, pFont->GetAscent(), |
| + pFont->GetDescent(), pBBox, nStemV); |
| AddIndirectObject(pFontDesc); |
| pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); |
| return LoadFont(pBaseDict); |
| @@ -969,79 +983,20 @@ CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, |
| ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, |
| pLogFont->lfItalic != 0, basefont, pWidths); |
| } else { |
| - pFontDict = new CPDF_Dictionary; |
| - CFX_ByteString cmap; |
| - CFX_ByteString ordering; |
| - int supplement = 0; |
| - CPDF_Array* pWidthArray = new CPDF_Array; |
| - switch (pLogFont->lfCharSet) { |
| - case CHINESEBIG5_CHARSET: |
| - cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
| - ordering = "CNS1"; |
| - supplement = 4; |
| - pWidthArray->AddInteger(1); |
| - InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray); |
| - break; |
| - case GB2312_CHARSET: |
| - cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; |
| - ordering = "GB1", supplement = 2; |
| - pWidthArray->AddInteger(7716); |
| - InsertWidthArray(hDC, 0x20, 0x20, pWidthArray); |
| - pWidthArray->AddInteger(814); |
| - InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray); |
| - break; |
| - case HANGEUL_CHARSET: |
| - cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; |
| - ordering = "Korea1"; |
| - supplement = 2; |
| - pWidthArray->AddInteger(1); |
| - InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray); |
| - break; |
| - case SHIFTJIS_CHARSET: |
| - cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; |
| - ordering = "Japan1"; |
| - supplement = 5; |
| - pWidthArray->AddInteger(231); |
| - InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray); |
| - pWidthArray->AddInteger(326); |
| - InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray); |
| - pWidthArray->AddInteger(327); |
| - InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray); |
| - pWidthArray->AddInteger(631); |
| - InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray); |
| - break; |
| - } |
| - pBaseDict->SetNameFor("Subtype", "Type0"); |
| - pBaseDict->SetNameFor("BaseFont", basefont); |
| - pBaseDict->SetNameFor("Encoding", cmap); |
| - pFontDict->SetFor("W", pWidthArray); |
| - pFontDict->SetNameFor("Type", "Font"); |
| - pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
| - pFontDict->SetNameFor("BaseFont", basefont); |
| - CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary; |
| - pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
| - pCIDSysInfo->SetStringFor("Ordering", ordering); |
| - pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
| - pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
| - CPDF_Array* pArray = new CPDF_Array; |
| - pBaseDict->SetFor("DescendantFonts", pArray); |
| - AddIndirectObject(pFontDict); |
| - pArray->AddReference(this, pFontDict); |
| + auto Insert = [&](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { |
| + InsertWidthArray(hDC, start, end, widthArr); |
| + }; |
| + pFontDict = |
| + ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, Insert); |
| } |
| AddIndirectObject(pBaseDict); |
| - CPDF_Dictionary* pFontDesc = new CPDF_Dictionary; |
| - pFontDesc->SetNameFor("Type", "FontDescriptor"); |
| - pFontDesc->SetNameFor("FontName", basefont); |
| - pFontDesc->SetIntegerFor("Flags", flags); |
| CPDF_Array* pBBox = new CPDF_Array; |
| for (int i = 0; i < 4; i++) |
| pBBox->AddInteger(bbox[i]); |
| - pFontDesc->SetFor("FontBBox", pBBox); |
| - pFontDesc->SetIntegerFor("ItalicAngle", italicangle); |
| - pFontDesc->SetIntegerFor("Ascent", ascend); |
| - pFontDesc->SetIntegerFor("Descent", descend); |
| + CPDF_Dictionary* pFontDesc = |
| + CalculateFontDesc(basefont, flags, italicangle, ascend, descend, pBBox, |
| + pLogFont->lfWeight / 5); |
| pFontDesc->SetIntegerFor("CapHeight", capheight); |
| - pFontDesc->SetIntegerFor("StemV", pLogFont->lfWeight / 5); |
| AddIndirectObject(pFontDesc); |
| pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); |
| hFont = SelectObject(hDC, hFont); |