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 89b41d5820d302d8937cfb915e0a46931a1a5661..8910fa12055f4bf1639d4d6d0bf6fa07f0ae4fd0 100644 |
--- a/core/fpdfapi/fpdf_parser/cpdf_document.cpp |
+++ b/core/fpdfapi/fpdf_parser/cpdf_document.cpp |
@@ -220,127 +220,6 @@ CFX_ByteString FPDF_GetPSNameFromTT(HDC hDC) { |
} |
#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
-struct FX_LANG2CS { |
- uint32_t uLang; |
- uint8_t uCharset; |
-}; |
-const FX_LANG2CS gs_FXLang2CharsetTable[] = { |
- {3109, 0}, {3121, 178}, {3129, 162}, {3139, 204}, {3141, 204}, |
- {3166, 0}, {3184, 238}, {3197, 0}, {3201, 0}, {3239, 161}, |
- {3241, 0}, {3246, 0}, {3247, 186}, {3248, 0}, {3259, 178}, |
- {3267, 0}, {3273, 0}, {3276, 0}, {3301, 0}, {3310, 1}, |
- {3325, 177}, {3329, 1}, {3338, 238}, {3341, 238}, {3345, 1}, |
- {3355, 0}, {3370, 0}, {3371, 0}, {3383, 128}, {3424, 204}, |
- {3427, 1}, {3428, 129}, {3436, 178}, {3464, 186}, {3466, 186}, |
- {3486, 204}, {3487, 0}, {3493, 1}, {3494, 0}, {3508, 0}, |
- {3518, 0}, {3520, 0}, {3569, 1}, {3580, 238}, {3588, 0}, |
- {3645, 238}, {3651, 204}, {3672, 238}, {3673, 238}, {3678, 238}, |
- {3679, 238}, {3683, 0}, {3684, 0}, {3693, 1}, {3697, 1}, |
- {3700, 222}, {3710, 162}, {3734, 204}, {3741, 178}, {3749, 162}, |
- {3763, 163}, {3886, 134}, {105943, 0}, {106375, 1}, {3923451837, 134}, |
- {3923451838, 136}, |
-}; |
- |
-uint32_t FX_GetLangHashCode(const FX_CHAR* pStr) { |
- ASSERT(pStr); |
- int32_t iLength = FXSYS_strlen(pStr); |
- const FX_CHAR* pStrEnd = pStr + iLength; |
- uint32_t uHashCode = 0; |
- while (pStr < pStrEnd) |
- uHashCode = 31 * uHashCode + tolower(*pStr++); |
- return uHashCode; |
-} |
- |
-uint8_t FX_GetCsFromLangCode(uint32_t uCode) { |
- int32_t iStart = 0; |
- int32_t iEnd = FX_ArraySize(gs_FXLang2CharsetTable) - 1; |
- while (iStart <= iEnd) { |
- int32_t iMid = (iStart + iEnd) / 2; |
- const FX_LANG2CS& charset = gs_FXLang2CharsetTable[iMid]; |
- if (uCode == charset.uLang) |
- return charset.uCharset; |
- |
- if (uCode < charset.uLang) |
- iEnd = iMid - 1; |
- else |
- iStart = iMid + 1; |
- } |
- return FXFONT_ANSI_CHARSET; |
-} |
- |
-uint8_t FX_GetCharsetFromLang(const FX_CHAR* pLang, int32_t iLength) { |
- ASSERT(pLang); |
- if (iLength < 0) |
- iLength = FXSYS_strlen(pLang); |
- |
- uint32_t uHash = FX_GetLangHashCode(pLang); |
- return FX_GetCsFromLangCode(uHash); |
-} |
- |
-void CFString2CFXByteString(CFStringRef src, CFX_ByteString& dest) { |
- SInt32 len = CFStringGetLength(src); |
- CFRange range = CFRangeMake(0, len); |
- CFIndex used = 0; |
- UInt8* pBuffer = (UInt8*)calloc(len + 1, sizeof(UInt8)); |
- CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, |
- &used); |
- dest = (FX_CHAR*)pBuffer; |
- free(pBuffer); |
-} |
- |
-bool HasCharSet(CFArrayRef languages, const std::vector<uint8_t>& charsets) { |
- for (int i = 0; i < CFArrayGetCount(languages); ++i) { |
- CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i); |
- uint8_t charset = FX_GetCharsetFromLang( |
- CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1); |
- if (pdfium::ContainsValue(charsets, charset)) |
- return true; |
- } |
- return false; |
-} |
- |
-void FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width) { |
- CGFloat size = CTFontGetSize(font); |
- for (; start <= end; ++start) { |
- CGGlyph pGlyph = 0; |
- CFIndex count = 1; |
- CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count); |
- CGSize advances; |
- CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, |
- &advances, 1); |
- *width = (int)(advances.width / size * 1000); |
- width++; |
- } |
-} |
- |
-void InsertWidthArray(CTFontRef font, |
- int start, |
- int end, |
- CPDF_Array* pWidthArray) { |
- int size = end - start + 1; |
- int* widths = FX_Alloc(int, size); |
- FX_GetCharWidth(font, start, end, widths); |
- int i; |
- 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); |
-} |
-#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
- |
void InsertWidthArray1(CFX_Font* pFont, |
CFX_UnicodeEncoding* pEncoding, |
FX_WCHAR start, |
@@ -520,10 +399,6 @@ void CPDF_Document::LoadDocInternal() { |
CPDF_Object* pInfoObj = GetOrParseIndirectObject(m_pParser->GetInfoObjNum()); |
if (pInfoObj) |
m_pInfoDict = pInfoObj->GetDict(); |
- if (CPDF_Array* pIDArray = m_pParser->GetIDArray()) { |
- m_ID1 = pIDArray->GetStringAt(0); |
- m_ID2 = pIDArray->GetStringAt(1); |
- } |
} |
void CPDF_Document::LoadDoc() { |
@@ -736,20 +611,6 @@ uint32_t CPDF_Document::GetUserPermissions() const { |
return m_pParser->GetPermissions(); |
} |
-FX_BOOL CPDF_Document::IsFormStream(uint32_t objnum, FX_BOOL& bForm) const { |
- CPDF_Object* pObj = GetIndirectObject(objnum); |
- if (pObj) { |
- CPDF_Stream* pStream = pObj->AsStream(); |
- bForm = pStream && pStream->GetDict()->GetStringBy("Subtype") == "Form"; |
- return TRUE; |
- } |
- if (!m_pParser) { |
- bForm = FALSE; |
- return TRUE; |
- } |
- return m_pParser->IsFormStream(objnum, bForm); |
-} |
- |
CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) { |
ASSERT(pFontDict); |
return m_pDocPage->GetFont(pFontDict, FALSE); |
@@ -782,24 +643,6 @@ CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) { |
return m_pDocPage->GetImage(pObj); |
} |
-void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) { |
- GetPageData()->ReleaseColorSpace(pCSObj); |
-} |
- |
-void CPDF_Document::ClearPageData() { |
- GetPageData()->Clear(FALSE); |
-} |
- |
-void CPDF_Document::ClearRenderData() { |
- m_pDocRender->Clear(FALSE); |
-} |
- |
-void CPDF_Document::ClearRenderFont() { |
- CFX_FontCache* pCache = m_pDocRender->GetFontCache(); |
- if (pCache) |
- pCache->FreeCache(FALSE); |
-} |
- |
void CPDF_Document::CreateNewDoc() { |
ASSERT(!m_pRootDict && !m_pInfoDict); |
m_pRootDict = new CPDF_Dictionary; |
@@ -1236,225 +1079,3 @@ CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, |
return LoadFont(pBaseDict); |
} |
#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
- |
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
-CPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, |
- FX_BOOL bVert, |
- FX_BOOL bTranslateName) { |
- CTFontRef font = (CTFontRef)pFont; |
- CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font); |
- if (!descriptor) |
- return nullptr; |
- |
- CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute( |
- descriptor, kCTFontLanguagesAttribute); |
- if (!languages) { |
- CFRelease(descriptor); |
- return nullptr; |
- } |
- |
- bool bCJK = |
- HasCharSet(languages, {FXFONT_CHINESEBIG5_CHARSET, FXFONT_GB2312_CHARSET, |
- FXFONT_HANGEUL_CHARSET, FXFONT_SHIFTJIS_CHARSET}); |
- CFRelease(descriptor); |
- CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font); |
- if (!traits) { |
- CFRelease(languages); |
- return nullptr; |
- } |
- |
- CFNumberRef sybolicTrait = |
- (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait); |
- CTFontSymbolicTraits trait = 0; |
- CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait); |
- int flags = 0; |
- if (trait & kCTFontItalicTrait) |
- flags |= PDFFONT_ITALIC; |
- if (trait & kCTFontMonoSpaceTrait) |
- flags |= PDFFONT_FIXEDPITCH; |
- if (trait & kCTFontModernSerifsClass) |
- flags |= PDFFONT_SERIF; |
- if (trait & kCTFontScriptsClass) |
- flags |= PDFFONT_SCRIPT; |
- |
- CFNumberRef weightTrait = |
- (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait); |
- Float32 weight = 0; |
- CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight); |
- int italicangle = CTFontGetSlantAngle(font); |
- int ascend = CTFontGetAscent(font); |
- int descend = CTFontGetDescent(font); |
- int capheight = CTFontGetCapHeight(font); |
- CGRect box = CTFontGetBoundingBox(font); |
- int bbox[4]; |
- bbox[0] = box.origin.x; |
- bbox[1] = box.origin.y; |
- bbox[2] = box.origin.x + box.size.width; |
- bbox[3] = box.origin.y + box.size.height; |
- CFX_ByteString basefont; |
- if (bTranslateName && bCJK) { |
- CFStringRef postName = CTFontCopyPostScriptName(font); |
- CFString2CFXByteString(postName, basefont); |
- CFRelease(postName); |
- } |
- if (basefont.IsEmpty()) { |
- CFStringRef fullName = CTFontCopyFullName(font); |
- CFString2CFXByteString(fullName, basefont); |
- CFRelease(fullName); |
- } |
- basefont.Replace(" ", ""); |
- CPDF_Dictionary* pBaseDict = new CPDF_Dictionary; |
- CPDF_Dictionary* pFontDict = pBaseDict; |
- if (!bCJK) { |
- if (HasCharSet(languages, {FXFONT_ANSI_CHARSET, FXFONT_DEFAULT_CHARSET, |
- FXFONT_SYMBOL_CHARSET})) { |
- if (HasCharSet(languages, {FXFONT_SYMBOL_CHARSET})) { |
- flags |= PDFFONT_SYMBOLIC; |
- } else { |
- flags |= PDFFONT_NONSYMBOLIC; |
- } |
- pBaseDict->SetAtName("Encoding", "WinAnsiEncoding"); |
- } else { |
- flags |= PDFFONT_NONSYMBOLIC; |
- size_t i; |
- for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) { |
- if (HasCharSet(languages, {g_FX_CharsetUnicodes[i].m_Charset})) |
- break; |
- } |
- if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { |
- CPDF_Dictionary* pEncoding = new CPDF_Dictionary; |
- pEncoding->SetAtName("BaseEncoding", "WinAnsiEncoding"); |
- CPDF_Array* pArray = new CPDF_Array; |
- pArray->AddInteger(128); |
- const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
- for (int j = 0; j < 128; j++) { |
- CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); |
- pArray->AddName(name.IsEmpty() ? ".notdef" : name); |
- } |
- pEncoding->SetAt("Differences", pArray); |
- AddIndirectObject(pEncoding); |
- pBaseDict->SetAtReference("Encoding", this, pEncoding); |
- } |
- } |
- if (weight > 0.0 && trait & kCTFontItalicTrait) |
- basefont += ",BoldItalic"; |
- else if (weight > 0.0) |
- basefont += ",Bold"; |
- else if (trait & kCTFontItalicTrait) |
- basefont += ",Italic"; |
- |
- pBaseDict->SetAtName("Subtype", "TrueType"); |
- pBaseDict->SetAtName("BaseFont", basefont); |
- pBaseDict->SetAtNumber("FirstChar", 32); |
- pBaseDict->SetAtNumber("LastChar", 255); |
- int char_widths[224]; |
- FX_GetCharWidth(font, 32, 255, char_widths); |
- CPDF_Array* pWidths = new CPDF_Array; |
- for (int i = 0; i < 224; i++) |
- pWidths->AddInteger(char_widths[i]); |
- pBaseDict->SetAt("Widths", pWidths); |
- } else { |
- flags |= PDFFONT_NONSYMBOLIC; |
- CFX_ByteString cmap; |
- CFX_ByteString ordering; |
- int supplement; |
- bool bFound = false; |
- CPDF_Array* pWidthArray = new CPDF_Array; |
- if (HasCharSet(languages, {FXFONT_CHINESEBIG5_CHARSET})) { |
- cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
- ordering = "CNS1"; |
- supplement = 4; |
- pWidthArray->AddInteger(1); |
- InsertWidthArray(font, 0x20, 0x7e, pWidthArray); |
- bFound = true; |
- } |
- if (!bFound && HasCharSet(languages, {FXFONT_GB2312_CHARSET})) { |
- cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; |
- ordering = "GB1", supplement = 2; |
- pWidthArray->AddInteger(7716); |
- InsertWidthArray(font, 0x20, 0x20, pWidthArray); |
- pWidthArray->AddInteger(814); |
- InsertWidthArray(font, 0x21, 0x7e, pWidthArray); |
- bFound = true; |
- } |
- if (!bFound && HasCharSet(languages, {FXFONT_HANGEUL_CHARSET})) { |
- cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; |
- ordering = "Korea1"; |
- supplement = 2; |
- pWidthArray->AddInteger(1); |
- InsertWidthArray(font, 0x20, 0x7e, pWidthArray); |
- bFound = true; |
- } |
- if (!bFound && HasCharSet(languages, {FXFONT_SHIFTJIS_CHARSET})) { |
- cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; |
- ordering = "Japan1"; |
- supplement = 5; |
- pWidthArray->AddInteger(231); |
- InsertWidthArray(font, 0x20, 0x7d, pWidthArray); |
- pWidthArray->AddInteger(326); |
- InsertWidthArray(font, 0xa0, 0xa0, pWidthArray); |
- pWidthArray->AddInteger(327); |
- InsertWidthArray(font, 0xa1, 0xdf, pWidthArray); |
- pWidthArray->AddInteger(631); |
- InsertWidthArray(font, 0x7e, 0x7e, pWidthArray); |
- } |
- pBaseDict->SetAtName("Subtype", "Type0"); |
- pBaseDict->SetAtName("BaseFont", basefont); |
- pBaseDict->SetAtName("Encoding", cmap); |
- |
- pFontDict = new CPDF_Dictionary; |
- pFontDict->SetAt("W", pWidthArray); |
- pFontDict->SetAtName("Type", "Font"); |
- pFontDict->SetAtName("Subtype", "CIDFontType2"); |
- pFontDict->SetAtName("BaseFont", basefont); |
- CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary; |
- pCIDSysInfo->SetAtString("Registry", "Adobe"); |
- pCIDSysInfo->SetAtString("Ordering", ordering); |
- pCIDSysInfo->SetAtInteger("Supplement", supplement); |
- pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo); |
- CPDF_Array* pArray = new CPDF_Array; |
- pBaseDict->SetAt("DescendantFonts", pArray); |
- AddIndirectObject(pFontDict); |
- pArray->AddReference(this, pFontDict); |
- } |
- AddIndirectObject(pBaseDict); |
- CPDF_Dictionary* pFontDesc = new CPDF_Dictionary; |
- pFontDesc->SetAtName("Type", "FontDescriptor"); |
- pFontDesc->SetAtName("FontName", basefont); |
- pFontDesc->SetAtInteger("Flags", flags); |
- CPDF_Array* pBBox = new CPDF_Array; |
- for (int i = 0; i < 4; i++) |
- pBBox->AddInteger(bbox[i]); |
- |
- pFontDesc->SetAt("FontBBox", pBBox); |
- pFontDesc->SetAtInteger("ItalicAngle", italicangle); |
- pFontDesc->SetAtInteger("Ascent", ascend); |
- pFontDesc->SetAtInteger("Descent", descend); |
- pFontDesc->SetAtInteger("CapHeight", capheight); |
- CGFloat fStemV = 0; |
- int16_t min_width = SHRT_MAX; |
- |
- static const UniChar stem_chars[] = {'i', 'I', '!', '1'}; |
- CGGlyph glyphs[FX_ArraySize(stem_chars)]; |
- CGRect boundingRects[FX_ArraySize(stem_chars)]; |
- |
- const size_t count = FX_ArraySize(stem_chars); |
- if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) { |
- CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation, glyphs, |
- boundingRects, count); |
- for (size_t i = 0; i < count; i++) { |
- int16_t width = boundingRects[i].size.width; |
- if (width > 0 && width < min_width) { |
- min_width = width; |
- fStemV = min_width; |
- } |
- } |
- } |
- pFontDesc->SetAtInteger("StemV", fStemV); |
- AddIndirectObject(pFontDesc); |
- pFontDict->SetAtReference("FontDescriptor", this, pFontDesc); |
- CFRelease(traits); |
- CFRelease(languages); |
- return LoadFont(pBaseDict); |
-} |
-#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |