| Index: core/fpdfdoc/doc_utils.cpp
|
| diff --git a/core/fpdfdoc/doc_utils.cpp b/core/fpdfdoc/doc_utils.cpp
|
| deleted file mode 100644
|
| index 284520d15008e7a22eefc7f6deb7ba7fa1439dec..0000000000000000000000000000000000000000
|
| --- a/core/fpdfdoc/doc_utils.cpp
|
| +++ /dev/null
|
| @@ -1,758 +0,0 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include <algorithm>
|
| -#include <vector>
|
| -
|
| -#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
|
| -#include "core/fpdfdoc/doc_utils.h"
|
| -#include "core/fpdfdoc/include/cpdf_defaultappearance.h"
|
| -#include "core/fpdfdoc/include/cpdf_formcontrol.h"
|
| -#include "core/fpdfdoc/include/cpdf_interform.h"
|
| -#include "core/fxge/include/fx_font.h"
|
| -
|
| -namespace {
|
| -
|
| -const int FPDFDOC_UTILS_MAXRECURSION = 32;
|
| -
|
| -CPDF_Object* SearchNumberNode(const CPDF_Dictionary* pNode, int num) {
|
| - CPDF_Array* pLimits = pNode->GetArrayBy("Limits");
|
| - if (pLimits &&
|
| - (num < pLimits->GetIntegerAt(0) || num > pLimits->GetIntegerAt(1))) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Array* pNumbers = pNode->GetArrayBy("Nums");
|
| - if (pNumbers) {
|
| - for (size_t i = 0; i < pNumbers->GetCount() / 2; i++) {
|
| - int index = pNumbers->GetIntegerAt(i * 2);
|
| - if (num == index) {
|
| - return pNumbers->GetDirectObjectAt(i * 2 + 1);
|
| - }
|
| - if (index > num) {
|
| - break;
|
| - }
|
| - }
|
| - return nullptr;
|
| - }
|
| - CPDF_Array* pKids = pNode->GetArrayBy("Kids");
|
| - if (!pKids) {
|
| - return nullptr;
|
| - }
|
| - for (size_t i = 0; i < pKids->GetCount(); i++) {
|
| - CPDF_Dictionary* pKid = pKids->GetDictAt(i);
|
| - if (!pKid) {
|
| - continue;
|
| - }
|
| - CPDF_Object* pFound = SearchNumberNode(pKid, num);
|
| - if (pFound) {
|
| - return pFound;
|
| - }
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CPDF_Object* CPDF_NumberTree::LookupValue(int num) const {
|
| - return SearchNumberNode(m_pRoot, num);
|
| -}
|
| -
|
| -CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict) {
|
| - CFX_WideString full_name;
|
| - CPDF_Dictionary* pLevel = pFieldDict;
|
| - while (pLevel) {
|
| - CFX_WideString short_name = pLevel->GetUnicodeTextBy("T");
|
| - if (short_name != L"") {
|
| - if (full_name == L"") {
|
| - full_name = short_name;
|
| - } else {
|
| - full_name = short_name + L"." + full_name;
|
| - }
|
| - }
|
| - pLevel = pLevel->GetDictBy("Parent");
|
| - }
|
| - return full_name;
|
| -}
|
| -FX_BOOL CPDF_DefaultAppearance::HasFont() {
|
| - if (m_csDA.IsEmpty()) {
|
| - return FALSE;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - return syntax.FindTagParamFromStart("Tf", 2);
|
| -}
|
| -CFX_ByteString CPDF_DefaultAppearance::GetFontString() {
|
| - CFX_ByteString csFont;
|
| - if (m_csDA.IsEmpty()) {
|
| - return csFont;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart("Tf", 2)) {
|
| - csFont += syntax.GetWord();
|
| - csFont += " ";
|
| - csFont += syntax.GetWord();
|
| - csFont += " ";
|
| - csFont += syntax.GetWord();
|
| - }
|
| - return csFont;
|
| -}
|
| -void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag,
|
| - FX_FLOAT& fFontSize) {
|
| - csFontNameTag = "";
|
| - fFontSize = 0;
|
| - if (m_csDA.IsEmpty()) {
|
| - return;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart("Tf", 2)) {
|
| - csFontNameTag = CFX_ByteString(syntax.GetWord());
|
| - csFontNameTag.Delete(0, 1);
|
| - fFontSize = FX_atof(syntax.GetWord());
|
| - }
|
| - csFontNameTag = PDF_NameDecode(csFontNameTag);
|
| -}
|
| -FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation) {
|
| - if (m_csDA.IsEmpty()) {
|
| - return FALSE;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "G" : "g", 1)) {
|
| - return TRUE;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "RG" : "rg", 3)) {
|
| - return TRUE;
|
| - }
|
| - return syntax.FindTagParamFromStart(bStrokingOperation ? "K" : "k", 4);
|
| -}
|
| -CFX_ByteString CPDF_DefaultAppearance::GetColorString(
|
| - FX_BOOL bStrokingOperation) {
|
| - CFX_ByteString csColor;
|
| - if (m_csDA.IsEmpty()) {
|
| - return csColor;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "G" : "g", 1)) {
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - return csColor;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "RG" : "rg", 3)) {
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - return csColor;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "K" : "k", 4)) {
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - csColor += " ";
|
| - csColor += syntax.GetWord();
|
| - }
|
| - return csColor;
|
| -}
|
| -void CPDF_DefaultAppearance::GetColor(int& iColorType,
|
| - FX_FLOAT fc[4],
|
| - FX_BOOL bStrokingOperation) {
|
| - iColorType = COLORTYPE_TRANSPARENT;
|
| - for (int c = 0; c < 4; c++) {
|
| - fc[c] = 0;
|
| - }
|
| - if (m_csDA.IsEmpty()) {
|
| - return;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "G" : "g", 1)) {
|
| - iColorType = COLORTYPE_GRAY;
|
| - fc[0] = FX_atof(syntax.GetWord());
|
| - return;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "RG" : "rg", 3)) {
|
| - iColorType = COLORTYPE_RGB;
|
| - fc[0] = FX_atof(syntax.GetWord());
|
| - fc[1] = FX_atof(syntax.GetWord());
|
| - fc[2] = FX_atof(syntax.GetWord());
|
| - return;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "K" : "k", 4)) {
|
| - iColorType = COLORTYPE_CMYK;
|
| - fc[0] = FX_atof(syntax.GetWord());
|
| - fc[1] = FX_atof(syntax.GetWord());
|
| - fc[2] = FX_atof(syntax.GetWord());
|
| - fc[3] = FX_atof(syntax.GetWord());
|
| - }
|
| -}
|
| -void CPDF_DefaultAppearance::GetColor(FX_ARGB& color,
|
| - int& iColorType,
|
| - FX_BOOL bStrokingOperation) {
|
| - color = 0;
|
| - iColorType = COLORTYPE_TRANSPARENT;
|
| - if (m_csDA.IsEmpty()) {
|
| - return;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "G" : "g", 1)) {
|
| - iColorType = COLORTYPE_GRAY;
|
| - FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| - color = ArgbEncode(255, (int)g, (int)g, (int)g);
|
| - return;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "RG" : "rg", 3)) {
|
| - iColorType = COLORTYPE_RGB;
|
| - FX_FLOAT r = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| - FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| - FX_FLOAT b = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| - color = ArgbEncode(255, (int)r, (int)g, (int)b);
|
| - return;
|
| - }
|
| - if (syntax.FindTagParamFromStart(bStrokingOperation ? "K" : "k", 4)) {
|
| - iColorType = COLORTYPE_CMYK;
|
| - FX_FLOAT c = FX_atof(syntax.GetWord());
|
| - FX_FLOAT m = FX_atof(syntax.GetWord());
|
| - FX_FLOAT y = FX_atof(syntax.GetWord());
|
| - FX_FLOAT k = FX_atof(syntax.GetWord());
|
| - FX_FLOAT r = 1.0f - std::min(1.0f, c + k);
|
| - FX_FLOAT g = 1.0f - std::min(1.0f, m + k);
|
| - FX_FLOAT b = 1.0f - std::min(1.0f, y + k);
|
| - color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f),
|
| - (int)(b * 255 + 0.5f));
|
| - }
|
| -}
|
| -FX_BOOL CPDF_DefaultAppearance::HasTextMatrix() {
|
| - if (m_csDA.IsEmpty()) {
|
| - return FALSE;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - return syntax.FindTagParamFromStart("Tm", 6);
|
| -}
|
| -CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString() {
|
| - CFX_ByteString csTM;
|
| - if (m_csDA.IsEmpty()) {
|
| - return csTM;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart("Tm", 6)) {
|
| - for (int i = 0; i < 6; i++) {
|
| - csTM += syntax.GetWord();
|
| - csTM += " ";
|
| - }
|
| - csTM += syntax.GetWord();
|
| - }
|
| - return csTM;
|
| -}
|
| -CFX_Matrix CPDF_DefaultAppearance::GetTextMatrix() {
|
| - CFX_Matrix tm;
|
| - if (m_csDA.IsEmpty()) {
|
| - return tm;
|
| - }
|
| - CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| - if (syntax.FindTagParamFromStart("Tm", 6)) {
|
| - FX_FLOAT f[6];
|
| - for (int i = 0; i < 6; i++) {
|
| - f[i] = FX_atof(syntax.GetWord());
|
| - }
|
| - tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
|
| - }
|
| - return tm;
|
| -}
|
| -
|
| -void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument) {
|
| - if (!pDocument)
|
| - return;
|
| -
|
| - if (!pFormDict) {
|
| - pFormDict = new CPDF_Dictionary;
|
| - uint32_t dwObjNum = pDocument->AddIndirectObject(pFormDict);
|
| - CPDF_Dictionary* pRoot = pDocument->GetRoot();
|
| - pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
|
| - }
|
| - CFX_ByteString csDA;
|
| - if (!pFormDict->KeyExist("DR")) {
|
| - CFX_ByteString csBaseName;
|
| - CFX_ByteString csDefault;
|
| - uint8_t charSet = CPDF_InterForm::GetNativeCharSet();
|
| - CPDF_Font* pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
|
| - if (pFont) {
|
| - AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
|
| - csDefault = csBaseName;
|
| - }
|
| - if (charSet != FXFONT_ANSI_CHARSET) {
|
| - CFX_ByteString csFontName =
|
| - CPDF_InterForm::GetNativeFont(charSet, nullptr);
|
| - if (!pFont || csFontName != "Helvetica") {
|
| - pFont = CPDF_InterForm::AddNativeFont(pDocument);
|
| - if (pFont) {
|
| - csBaseName = "";
|
| - AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
|
| - csDefault = csBaseName;
|
| - }
|
| - }
|
| - }
|
| - if (pFont) {
|
| - csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
|
| - }
|
| - }
|
| - if (!csDA.IsEmpty()) {
|
| - csDA += " ";
|
| - }
|
| - csDA += "0 g";
|
| - if (!pFormDict->KeyExist("DA")) {
|
| - pFormDict->SetAtString("DA", csDA);
|
| - }
|
| -}
|
| -uint32_t CountInterFormFonts(CPDF_Dictionary* pFormDict) {
|
| - if (!pFormDict) {
|
| - return 0;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return 0;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return 0;
|
| - }
|
| - uint32_t dwCount = 0;
|
| - for (const auto& it : *pFonts) {
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - if (CPDF_Dictionary* pDirect = ToDictionary(pObj->GetDirect())) {
|
| - if (pDirect->GetStringBy("Type") == "Font") {
|
| - dwCount++;
|
| - }
|
| - }
|
| - }
|
| - return dwCount;
|
| -}
|
| -CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - uint32_t index,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return nullptr;
|
| - }
|
| - uint32_t dwCount = 0;
|
| - for (const auto& it : *pFonts) {
|
| - const CFX_ByteString& csKey = it.first;
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
|
| - if (!pElement)
|
| - continue;
|
| - if (pElement->GetStringBy("Type") != "Font")
|
| - continue;
|
| - if (dwCount == index) {
|
| - csNameTag = csKey;
|
| - return pDocument->LoadFont(pElement);
|
| - }
|
| - dwCount++;
|
| - }
|
| - return nullptr;
|
| -}
|
| -CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - CFX_ByteString csNameTag) {
|
| - CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
|
| - if (!pFormDict || csAlias.IsEmpty()) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pElement = pFonts->GetDictBy(csAlias);
|
| - if (!pElement) {
|
| - return nullptr;
|
| - }
|
| - if (pElement->GetStringBy("Type") == "Font") {
|
| - return pDocument->LoadFont(pElement);
|
| - }
|
| - return nullptr;
|
| -}
|
| -CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - CFX_ByteString csFontName,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict || csFontName.IsEmpty()) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return nullptr;
|
| - }
|
| - for (const auto& it : *pFonts) {
|
| - const CFX_ByteString& csKey = it.first;
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
|
| - if (!pElement)
|
| - continue;
|
| - if (pElement->GetStringBy("Type") != "Font")
|
| - continue;
|
| -
|
| - CPDF_Font* pFind = pDocument->LoadFont(pElement);
|
| - if (!pFind)
|
| - continue;
|
| -
|
| - CFX_ByteString csBaseFont;
|
| - csBaseFont = pFind->GetBaseFont();
|
| - csBaseFont.Remove(' ');
|
| - if (csBaseFont == csFontName) {
|
| - csNameTag = csKey;
|
| - return pFind;
|
| - }
|
| - }
|
| - return nullptr;
|
| -}
|
| -CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - uint8_t charSet,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return nullptr;
|
| - }
|
| - for (const auto& it : *pFonts) {
|
| - const CFX_ByteString& csKey = it.first;
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
|
| - if (!pElement)
|
| - continue;
|
| - if (pElement->GetStringBy("Type") != "Font")
|
| - continue;
|
| - CPDF_Font* pFind = pDocument->LoadFont(pElement);
|
| - if (!pFind) {
|
| - continue;
|
| - }
|
| - CFX_SubstFont* pSubst = pFind->GetSubstFont();
|
| - if (!pSubst) {
|
| - continue;
|
| - }
|
| - if (pSubst->m_Charset == (int)charSet) {
|
| - csNameTag = csKey;
|
| - return pFind;
|
| - }
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - CFX_ByteString& csNameTag) {
|
| - csNameTag.clear();
|
| - uint8_t charSet = CPDF_InterForm::GetNativeCharSet();
|
| - CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
|
| - if (pFont) {
|
| - CFX_SubstFont* pSubst = pFont->GetSubstFont();
|
| - if (pSubst && pSubst->m_Charset == (int)charSet) {
|
| - FindInterFormFont(pFormDict, pFont, csNameTag);
|
| - return pFont;
|
| - }
|
| - }
|
| - return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
|
| -}
|
| -
|
| -FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict,
|
| - const CPDF_Font* pFont,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict || !pFont) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return FALSE;
|
| - }
|
| - for (const auto& it : *pFonts) {
|
| - const CFX_ByteString& csKey = it.first;
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
|
| - if (!pElement)
|
| - continue;
|
| - if (pElement->GetStringBy("Type") != "Font") {
|
| - continue;
|
| - }
|
| - if (pFont->GetFontDict() == pElement) {
|
| - csNameTag = csKey;
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument,
|
| - CFX_ByteString csFontName,
|
| - CPDF_Font*& pFont,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return FALSE;
|
| - }
|
| - if (csFontName.GetLength() > 0) {
|
| - csFontName.Remove(' ');
|
| - }
|
| - for (const auto& it : *pFonts) {
|
| - const CFX_ByteString& csKey = it.first;
|
| - CPDF_Object* pObj = it.second;
|
| - if (!pObj) {
|
| - continue;
|
| - }
|
| - CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
|
| - if (!pElement)
|
| - continue;
|
| - if (pElement->GetStringBy("Type") != "Font") {
|
| - continue;
|
| - }
|
| - pFont = pDocument->LoadFont(pElement);
|
| - if (!pFont) {
|
| - continue;
|
| - }
|
| - CFX_ByteString csBaseFont;
|
| - csBaseFont = pFont->GetBaseFont();
|
| - csBaseFont.Remove(' ');
|
| - if (csBaseFont == csFontName) {
|
| - csNameTag = csKey;
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| -}
|
| -void AddInterFormFont(CPDF_Dictionary*& pFormDict,
|
| - CPDF_Document* pDocument,
|
| - const CPDF_Font* pFont,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFont) {
|
| - return;
|
| - }
|
| - if (!pFormDict) {
|
| - InitInterFormDict(pFormDict, pDocument);
|
| - }
|
| - CFX_ByteString csTag;
|
| - if (FindInterFormFont(pFormDict, pFont, csTag)) {
|
| - csNameTag = csTag;
|
| - return;
|
| - }
|
| - if (!pFormDict) {
|
| - InitInterFormDict(pFormDict, pDocument);
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - pDR = new CPDF_Dictionary;
|
| - pFormDict->SetAt("DR", pDR);
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - pFonts = new CPDF_Dictionary;
|
| - pDR->SetAt("Font", pFonts);
|
| - }
|
| - if (csNameTag.IsEmpty()) {
|
| - csNameTag = pFont->GetBaseFont();
|
| - }
|
| - csNameTag.Remove(' ');
|
| - csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4,
|
| - csNameTag.c_str());
|
| - pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
|
| -}
|
| -CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict,
|
| - CPDF_Document* pDocument,
|
| - uint8_t charSet,
|
| - CFX_ByteString& csNameTag) {
|
| - if (!pFormDict) {
|
| - InitInterFormDict(pFormDict, pDocument);
|
| - }
|
| - CFX_ByteString csTemp;
|
| - CPDF_Font* pFont =
|
| - GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
|
| - if (pFont) {
|
| - csNameTag = csTemp;
|
| - return pFont;
|
| - }
|
| - CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
|
| - if (!csFontName.IsEmpty() &&
|
| - FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
|
| - return pFont;
|
| - }
|
| - pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
|
| - if (pFont) {
|
| - AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
|
| - }
|
| - return pFont;
|
| -}
|
| -CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict,
|
| - CPDF_Document* pDocument,
|
| - CFX_ByteString& csNameTag) {
|
| - uint8_t charSet = CPDF_InterForm::GetNativeCharSet();
|
| - return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
|
| -}
|
| -void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont) {
|
| - if (!pFormDict || !pFont) {
|
| - return;
|
| - }
|
| - CFX_ByteString csTag;
|
| - if (!FindInterFormFont(pFormDict, pFont, csTag)) {
|
| - return;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - pFonts->RemoveAt(csTag);
|
| -}
|
| -
|
| -void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag) {
|
| - if (!pFormDict || csNameTag.IsEmpty()) {
|
| - return;
|
| - }
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR) {
|
| - return;
|
| - }
|
| - CPDF_Dictionary* pFonts = pDR->GetDictBy("Font");
|
| - if (!pFonts) {
|
| - return;
|
| - }
|
| - pFonts->RemoveAt(csNameTag);
|
| -}
|
| -
|
| -CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict,
|
| - CPDF_Document* pDocument) {
|
| - if (!pFormDict) {
|
| - return nullptr;
|
| - }
|
| - CPDF_DefaultAppearance cDA(pFormDict->GetStringBy("DA"));
|
| - CFX_ByteString csFontNameTag;
|
| - FX_FLOAT fFontSize;
|
| - cDA.GetFont(csFontNameTag, fFontSize);
|
| - return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
|
| -}
|
| -
|
| -CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod() {
|
| - if (!m_pDict) {
|
| - return Always;
|
| - }
|
| - CFX_ByteString csSW = m_pDict->GetStringBy("SW", "A");
|
| - if (csSW == "B") {
|
| - return Bigger;
|
| - }
|
| - if (csSW == "S") {
|
| - return Smaller;
|
| - }
|
| - if (csSW == "N") {
|
| - return Never;
|
| - }
|
| - return Always;
|
| -}
|
| -FX_BOOL CPDF_IconFit::IsProportionalScale() {
|
| - if (!m_pDict) {
|
| - return TRUE;
|
| - }
|
| - return m_pDict->GetStringBy("S", "P") != "A";
|
| -}
|
| -void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom) {
|
| - fLeft = fBottom = 0.5;
|
| - if (!m_pDict) {
|
| - return;
|
| - }
|
| - CPDF_Array* pA = m_pDict->GetArrayBy("A");
|
| - if (pA) {
|
| - uint32_t dwCount = pA->GetCount();
|
| - if (dwCount > 0) {
|
| - fLeft = pA->GetNumberAt(0);
|
| - }
|
| - if (dwCount > 1) {
|
| - fBottom = pA->GetNumberAt(1);
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool CPDF_IconFit::GetFittingBounds() {
|
| - return m_pDict ? m_pDict->GetBooleanBy("FB") : false;
|
| -}
|
| -
|
| -std::vector<bool> SaveCheckedFieldStatus(CPDF_FormField* pField) {
|
| - std::vector<bool> result;
|
| - int iCount = pField->CountControls();
|
| - for (int i = 0; i < iCount; ++i) {
|
| - if (CPDF_FormControl* pControl = pField->GetControl(i))
|
| - result.push_back(pControl->IsChecked());
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
|
| - const FX_CHAR* name,
|
| - int nLevel) {
|
| - if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
|
| - return nullptr;
|
| - }
|
| - if (!pFieldDict) {
|
| - return nullptr;
|
| - }
|
| - CPDF_Object* pAttr = pFieldDict->GetDirectObjectBy(name);
|
| - if (pAttr) {
|
| - return pAttr;
|
| - }
|
| - CPDF_Dictionary* pParent = pFieldDict->GetDictBy("Parent");
|
| - if (!pParent) {
|
| - return nullptr;
|
| - }
|
| - return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
|
| -}
|
|
|