Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2228)

Unified Diff: core/fpdfdoc/cpvt_generateap.cpp

Issue 1840413002: Split core/include/fpdfdoc/fpdf_ap.h (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « core/fpdfdoc/cpvt_generateap.h ('k') | core/fpdfdoc/cpvt_provider.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: core/fpdfdoc/cpvt_generateap.cpp
diff --git a/core/fpdfdoc/doc_ap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
similarity index 74%
copy from core/fpdfdoc/doc_ap.cpp
copy to core/fpdfdoc/cpvt_generateap.cpp
index e87b21b8ecbb279c5f91673d1985e789438984a5..f9d6e9630b6f95da771572094e79e92fe8746ef1 100644
--- a/core/fpdfdoc/doc_ap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -1,305 +1,52 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 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 "core/fpdfdoc/cpvt_generateap.h"
+
#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_dictionary.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/cpdf_stream.h"
-#include "core/fpdfdoc/doc_utils.h"
+#include "core/fpdfdoc/cpvt_color.h"
+#include "core/fpdfdoc/cpvt_fontmap.h"
+#include "core/fpdfdoc/cpvt_provider.h"
#include "core/fpdfdoc/pdf_vt.h"
-#include "core/include/fpdfdoc/fpdf_ap.h"
#include "core/include/fpdfdoc/fpdf_doc.h"
-#include "core/include/fpdfdoc/fpdf_vt.h"
-
-#define PBS_SOLID 0
-#define PBS_DASH 1
-#define PBS_BEVELED 2
-#define PBS_INSET 3
-#define PBS_UNDERLINED 4
-FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
- if (!pAnnotDict || pAnnotDict->GetConstStringBy("Subtype") != "Widget") {
- return FALSE;
- }
- CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
- uint32_t flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
- ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
- : 0;
- if (field_type == "Tx") {
- return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
- }
- if (field_type == "Ch") {
- return (flags & (1 << 17))
- ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
- : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
- }
- if (field_type == "Btn") {
- if (!(flags & (1 << 16))) {
- if (!pAnnotDict->KeyExist("AS")) {
- if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictBy("Parent")) {
- if (pParentDict->KeyExist("AS")) {
- pAnnotDict->SetAtString("AS", pParentDict->GetStringBy("AS"));
- }
- }
- }
- }
- }
- return FALSE;
-}
+namespace {
-class CPVT_FontMap : public IPVT_FontMap {
- public:
- CPVT_FontMap(CPDF_Document* pDoc,
- CPDF_Dictionary* pResDict,
- CPDF_Font* pDefFont,
- const CFX_ByteString& sDefFontAlias);
- ~CPVT_FontMap() override;
-
- // IPVT_FontMap
- CPDF_Font* GetPDFFont(int32_t nFontIndex) override;
- CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) override;
-
- static void GetAnnotSysPDFFont(CPDF_Document* pDoc,
- CPDF_Dictionary* pResDict,
- CPDF_Font*& pSysFont,
- CFX_ByteString& sSysFontAlias);
-
- private:
- CPDF_Document* m_pDocument;
- CPDF_Dictionary* m_pResDict;
- CPDF_Font* m_pDefFont;
- CFX_ByteString m_sDefFontAlias;
- CPDF_Font* m_pSysFont;
- CFX_ByteString m_sSysFontAlias;
-};
-
-CPVT_FontMap::CPVT_FontMap(CPDF_Document* pDoc,
- CPDF_Dictionary* pResDict,
- CPDF_Font* pDefFont,
- const CFX_ByteString& sDefFontAlias)
- : m_pDocument(pDoc),
- m_pResDict(pResDict),
- m_pDefFont(pDefFont),
- m_sDefFontAlias(sDefFontAlias),
- m_pSysFont(NULL),
- m_sSysFontAlias() {}
-CPVT_FontMap::~CPVT_FontMap() {}
-void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document* pDoc,
- CPDF_Dictionary* pResDict,
- CPDF_Font*& pSysFont,
- CFX_ByteString& sSysFontAlias) {
- if (pDoc && pResDict) {
- CFX_ByteString sFontAlias;
- CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDictBy("AcroForm");
- if (CPDF_Font* pPDFFont =
- AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {
- if (CPDF_Dictionary* pFontList = pResDict->GetDictBy("Font")) {
- if (!pFontList->KeyExist(sSysFontAlias)) {
- pFontList->SetAtReference(sSysFontAlias, pDoc,
- pPDFFont->GetFontDict());
- }
- }
- pSysFont = pPDFFont;
- }
- }
-}
-CPDF_Font* CPVT_FontMap::GetPDFFont(int32_t nFontIndex) {
- switch (nFontIndex) {
- case 0:
- return m_pDefFont;
- case 1:
- if (!m_pSysFont) {
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont,
- m_sSysFontAlias);
- }
- return m_pSysFont;
- }
- return NULL;
-}
-CFX_ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) {
- switch (nFontIndex) {
- case 0:
- return m_sDefFontAlias;
- case 1:
- if (!m_pSysFont) {
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont,
- m_sSysFontAlias);
- }
- return m_sSysFontAlias;
- }
- return "";
-}
-CPVT_Provider::CPVT_Provider(IPVT_FontMap* pFontMap) : m_pFontMap(pFontMap) {
- ASSERT(m_pFontMap);
-}
-CPVT_Provider::~CPVT_Provider() {}
-int32_t CPVT_Provider::GetCharWidth(int32_t nFontIndex,
- uint16_t word,
- int32_t nWordStyle) {
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- uint32_t charcode = pPDFFont->CharCodeFromUnicode(word);
- if (charcode != CPDF_Font::kInvalidCharCode) {
- return pPDFFont->GetCharWidthF(charcode);
- }
- }
- return 0;
-}
-int32_t CPVT_Provider::GetTypeAscent(int32_t nFontIndex) {
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- return pPDFFont->GetTypeAscent();
- }
- return 0;
-}
-int32_t CPVT_Provider::GetTypeDescent(int32_t nFontIndex) {
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- return pPDFFont->GetTypeDescent();
- }
- return 0;
-}
-int32_t CPVT_Provider::GetWordFontIndex(uint16_t word,
- int32_t charset,
- int32_t nFontIndex) {
- if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {
- if (pDefFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) {
- return 0;
- }
- }
- if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1)) {
- if (pSysFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) {
- return 1;
- }
- }
- return -1;
-}
-FX_BOOL CPVT_Provider::IsLatinWord(uint16_t word) {
- if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) ||
- word == 0x2D || word == 0x27) {
- return TRUE;
- }
- return FALSE;
-}
-int32_t CPVT_Provider::GetDefaultFontIndex() {
- return 0;
-}
-
-static CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap,
- int32_t nFontIndex,
- uint16_t Word,
- uint16_t SubWord) {
- CFX_ByteString sWord;
- if (SubWord > 0) {
- sWord.Format("%c", SubWord);
- return sWord;
- }
-
- if (!pFontMap)
- return sWord;
-
- if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
- if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 ||
- pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
- sWord.Format("%c", Word);
- } else {
- uint32_t dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
- if (dwCharCode != CPDF_Font::kInvalidCharCode) {
- pPDFFont->AppendChar(sWord, dwCharCode);
- }
- }
- }
- return sWord;
-}
-
-static CFX_ByteString GetWordRenderString(const CFX_ByteString& strWords) {
- if (strWords.GetLength() > 0) {
- return PDF_EncodeString(strWords) + " Tj\n";
- }
- return "";
-}
-static CFX_ByteString GetFontSetString(IPVT_FontMap* pFontMap,
- int32_t nFontIndex,
- FX_FLOAT fFontSize) {
- CFX_ByteTextBuf sRet;
- if (pFontMap) {
- CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
- if (sFontAlias.GetLength() > 0 && fFontSize > 0) {
- sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
- }
- }
- return sRet.GetByteString();
-}
-static CPVT_Color ParseColor(const CFX_ByteString& str) {
- CPDF_SimpleParser syntax(str);
- if (syntax.FindTagParamFromStart("g", 1)) {
- return CPVT_Color(CPVT_Color::kGray, FX_atof(syntax.GetWord()));
- }
- if (syntax.FindTagParamFromStart("rg", 3)) {
- FX_FLOAT f1 = FX_atof(syntax.GetWord());
- FX_FLOAT f2 = FX_atof(syntax.GetWord());
- FX_FLOAT f3 = FX_atof(syntax.GetWord());
- return CPVT_Color(CPVT_Color::kRGB, f1, f2, f3);
- }
- if (syntax.FindTagParamFromStart("k", 4)) {
- FX_FLOAT f1 = FX_atof(syntax.GetWord());
- FX_FLOAT f2 = FX_atof(syntax.GetWord());
- FX_FLOAT f3 = FX_atof(syntax.GetWord());
- FX_FLOAT f4 = FX_atof(syntax.GetWord());
- return CPVT_Color(CPVT_Color::kCMYK, f1, f2, f3, f4);
- }
- return CPVT_Color(CPVT_Color::kTransparent);
-}
-static CPVT_Color ParseColor(const CPDF_Array& array) {
- CPVT_Color rt;
- switch (array.GetCount()) {
- case 1:
- rt = CPVT_Color(CPVT_Color::kGray, array.GetFloatAt(0));
- break;
- case 3:
- rt = CPVT_Color(CPVT_Color::kRGB, array.GetFloatAt(0),
- array.GetFloatAt(1), array.GetFloatAt(2));
- break;
- case 4:
- rt = CPVT_Color(CPVT_Color::kCMYK, array.GetFloatAt(0),
- array.GetFloatAt(1), array.GetFloatAt(2),
- array.GetFloatAt(3));
- break;
- }
- return rt;
-}
-static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
- CPDF_Dictionary* pAnnotDict,
- const int32_t& nWidgetType) {
- CPDF_Dictionary* pFormDict = NULL;
- if (CPDF_Dictionary* pRootDict = pDoc->GetRoot()) {
+FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
+ CPDF_Dictionary* pAnnotDict,
+ const int32_t& nWidgetType) {
+ CPDF_Dictionary* pFormDict = nullptr;
+ if (CPDF_Dictionary* pRootDict = pDoc->GetRoot())
pFormDict = pRootDict->GetDictBy("AcroForm");
- }
- if (!pFormDict) {
+ if (!pFormDict)
return FALSE;
- }
+
CFX_ByteString DA;
- if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA")) {
+ if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA"))
DA = pDAObj->GetString();
- }
- if (DA.IsEmpty()) {
+ if (DA.IsEmpty())
DA = pFormDict->GetStringBy("DA");
- }
- if (DA.IsEmpty()) {
+ if (DA.IsEmpty())
return FALSE;
- }
+
CPDF_SimpleParser syntax(DA);
syntax.FindTagParamFromStart("Tf", 2);
CFX_ByteString sFontName = syntax.GetWord();
sFontName = PDF_NameDecode(sFontName);
- if (sFontName.IsEmpty()) {
+ if (sFontName.IsEmpty())
return FALSE;
- }
+
FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
- CPVT_Color crText = ParseColor(DA);
+ CPVT_Color crText = CPVT_Color::ParseColor(DA);
FX_BOOL bUseFormRes = FALSE;
- CPDF_Dictionary* pFontDict = NULL;
+ CPDF_Dictionary* pFontDict = nullptr;
CPDF_Dictionary* pDRDict = pAnnotDict->GetDictBy("DR");
if (!pDRDict) {
pDRDict = pFormDict->GetDictBy("DR");
@@ -311,14 +58,13 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
if (!pFontDict && !bUseFormRes) {
pDRDict = pFormDict->GetDictBy("DR");
pDRFontDict = pDRDict->GetDictBy("Font");
- if (pDRFontDict) {
+ if (pDRFontDict)
pFontDict = pDRFontDict->GetDictBy(sFontName.Mid(1));
- }
}
}
- if (!pDRFontDict) {
+ if (!pDRFontDict)
return FALSE;
- }
+
if (!pFontDict) {
pFontDict = new CPDF_Dictionary;
pFontDict->SetAtName("Type", "Font");
@@ -329,14 +75,14 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);
}
CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
- if (!pDefFont) {
+ if (!pDefFont)
return FALSE;
- }
+
CFX_FloatRect rcAnnot = pAnnotDict->GetRectBy("Rect");
int32_t nRotate = 0;
- if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictBy("MK")) {
+ if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictBy("MK"))
nRotate = pMKDict->GetIntegerBy("R");
- }
+
CFX_FloatRect rcBBox;
CFX_Matrix matrix;
switch (nRotate % 360) {
@@ -366,9 +112,9 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
CPVT_Dash dsBorder(3, 0, 0);
CPVT_Color crLeftTop, crRightBottom;
if (CPDF_Dictionary* pBSDict = pAnnotDict->GetDictBy("BS")) {
- if (pBSDict->KeyExist("W")) {
+ if (pBSDict->KeyExist("W"))
fBorderWidth = pBSDict->GetNumberBy("W");
- }
+
if (CPDF_Array* pArray = pBSDict->GetArrayBy("D")) {
dsBorder = CPVT_Dash(pArray->GetIntegerAt(0), pArray->GetIntegerAt(1),
pArray->GetIntegerAt(2));
@@ -399,12 +145,10 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
}
CPVT_Color crBorder, crBG;
if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictBy("MK")) {
- if (CPDF_Array* pArray = pMKDict->GetArrayBy("BC")) {
- crBorder = ParseColor(*pArray);
- }
- if (CPDF_Array* pArray = pMKDict->GetArrayBy("BG")) {
- crBG = ParseColor(*pArray);
- }
+ if (CPDF_Array* pArray = pMKDict->GetArrayBy("BC"))
+ crBorder = CPVT_Color::ParseColor(*pArray);
+ if (CPDF_Array* pArray = pMKDict->GetArrayBy("BG"))
+ crBG = CPVT_Color::ParseColor(*pArray);
}
CFX_ByteTextBuf sAppStream;
CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);
@@ -416,9 +160,9 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(
rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle,
dsBorder);
- if (sBorderStream.GetLength() > 0) {
+ if (sBorderStream.GetLength() > 0)
sAppStream << "q\n" << sBorderStream << "Q\n";
- }
+
CFX_FloatRect rcBody =
CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
@@ -445,9 +189,8 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
pStreamResFontList = new CPDF_Dictionary;
pStreamResList->SetAt("Font", pStreamResFontList);
}
- if (!pStreamResFontList->KeyExist(sFontName)) {
+ if (!pStreamResFontList->KeyExist(sFontName))
pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
- }
} else {
pStreamDict->SetAt("Resources", pFormDict->GetDictBy("DR")->Clone());
pStreamResList = pStreamDict->GetDictBy("Resources");
@@ -469,19 +212,19 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
FPDF_GetFieldAttr(pAnnotDict, "MaxLen")
? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger()
: 0;
- CPVT_FontMap map(pDoc,
- pStreamDict ? pStreamDict->GetDictBy("Resources") : NULL,
- pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_FontMap map(
+ pDoc, pStreamDict ? pStreamDict->GetDictBy("Resources") : nullptr,
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1));
CPVT_Provider prd(&map);
CPDF_VariableText vt;
vt.SetProvider(&prd);
vt.SetPlateRect(rcBody);
vt.SetAlignment(nAlign);
- if (IsFloatZero(fFontSize)) {
+ if (IsFloatZero(fFontSize))
vt.SetAutoFontSize(TRUE);
- } else {
+ else
vt.SetFontSize(fFontSize);
- }
+
FX_BOOL bMultiLine = (dwFlags >> 12) & 1;
if (bMultiLine) {
vt.SetMultiLine(TRUE);
@@ -493,11 +236,11 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
vt.SetPasswordChar(subWord);
}
FX_BOOL bCharArray = (dwFlags >> 24) & 1;
- if (bCharArray) {
+ if (bCharArray)
vt.SetCharArray(dwMaxLen);
- } else {
+ else
vt.SetLimitChar(dwMaxLen);
- }
+
vt.Initialize();
vt.SetText(swValue.c_str());
vt.RearrangeAll();
@@ -528,9 +271,9 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
FPDF_GetFieldAttr(pAnnotDict, "V")
? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
: CFX_WideString();
- CPVT_FontMap map(pDoc,
- pStreamDict ? pStreamDict->GetDictBy("Resources") : NULL,
- pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_FontMap map(
+ pDoc, pStreamDict ? pStreamDict->GetDictBy("Resources") : nullptr,
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1));
CPVT_Provider prd(&map);
CPDF_VariableText vt;
vt.SetProvider(&prd);
@@ -541,11 +284,11 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
rcEdit.right = rcButton.left;
rcEdit.Normalize();
vt.SetPlateRect(rcEdit);
- if (IsFloatZero(fFontSize)) {
+ if (IsFloatZero(fFontSize))
vt.SetAutoFontSize(TRUE);
- } else {
+ else
vt.SetFontSize(fFontSize);
- }
+
vt.Initialize();
vt.SetText(swValue.c_str());
vt.RearrangeAll();
@@ -577,9 +320,9 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
CPVT_Color(CPVT_Color::kGray, 1),
CPVT_Color(CPVT_Color::kGray, 0.5), PBS_BEVELED,
CPVT_Dash(3, 0, 0));
- if (sButtonBorder.GetLength() > 0) {
+ if (sButtonBorder.GetLength() > 0)
sAppStream << "q\n" << sButtonBorder << "Q\n";
- }
+
CFX_FloatPoint ptCenter =
CFX_FloatPoint((rcButton.left + rcButton.right) / 2,
(rcButton.top + rcButton.bottom) / 2);
@@ -596,16 +339,16 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
}
} break;
case 2: {
- CPVT_FontMap map(pDoc,
- pStreamDict ? pStreamDict->GetDictBy("Resources") : NULL,
- pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_FontMap map(
+ pDoc, pStreamDict ? pStreamDict->GetDictBy("Resources") : nullptr,
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1));
CPVT_Provider prd(&map);
CPDF_Array* pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")
? FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray()
- : NULL;
+ : nullptr;
CPDF_Array* pSels = FPDF_GetFieldAttr(pAnnotDict, "I")
? FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray()
- : NULL;
+ : nullptr;
int32_t nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")
? FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger()
: 0;
@@ -613,9 +356,9 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
if (pOpts) {
FX_FLOAT fy = rcBody.top;
for (int32_t i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
- if (IsFloatSmaller(fy, rcBody.bottom)) {
+ if (IsFloatSmaller(fy, rcBody.bottom))
break;
- }
+
if (CPDF_Object* pOpt = pOpts->GetDirectObjectAt(i)) {
CFX_WideString swItem;
if (pOpt->IsString())
@@ -636,11 +379,8 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
vt.SetProvider(&prd);
vt.SetPlateRect(
CFX_FloatRect(rcBody.left, 0.0f, rcBody.right, 0.0f));
- if (IsFloatZero(fFontSize)) {
- vt.SetFontSize(12.0f);
- } else {
- vt.SetFontSize(fFontSize);
- }
+ vt.SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize);
+
vt.Initialize();
vt.SetText(swItem.c_str());
vt.RearrangeAll();
@@ -695,9 +435,8 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
pStreamResFontList = new CPDF_Dictionary;
pStreamResList->SetAt("Font", pStreamResFontList);
}
- if (!pStreamResFontList->KeyExist(sFontName)) {
+ if (!pStreamResFontList->KeyExist(sFontName))
pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
- }
} else {
pStreamDict->SetAt("Resources", pFormDict->GetDictBy("DR")->Clone());
pStreamResList = pStreamDict->GetDictBy("Resources");
@@ -706,18 +445,58 @@ static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc,
}
return TRUE;
}
+
+} // namespace
+
+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
+ if (!pAnnotDict || pAnnotDict->GetConstStringBy("Subtype") != "Widget") {
+ return FALSE;
+ }
+ CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
+ uint32_t flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
+ ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
+ : 0;
+ if (field_type == "Tx") {
+ return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
+ }
+ if (field_type == "Ch") {
+ return (flags & (1 << 17))
+ ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
+ : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
+ }
+ if (field_type == "Btn") {
+ if (!(flags & (1 << 16))) {
+ if (!pAnnotDict->KeyExist("AS")) {
+ if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictBy("Parent")) {
+ if (pParentDict->KeyExist("AS")) {
+ pAnnotDict->SetAtString("AS", pParentDict->GetStringBy("AS"));
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+// Static.
FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc,
CPDF_Dictionary* pAnnotDict) {
return GenerateWidgetAP(pDoc, pAnnotDict, 0);
}
+
+// Static.
FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc,
CPDF_Dictionary* pAnnotDict) {
return GenerateWidgetAP(pDoc, pAnnotDict, 1);
}
+
+// Static.
FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc,
CPDF_Dictionary* pAnnotDict) {
return GenerateWidgetAP(pDoc, pAnnotDict, 2);
}
+
+// Static.
CFX_ByteString CPVT_GenerateAP::GenerateEditAP(
IPVT_FontMap* pFontMap,
IPDF_VariableText_Iterator* pIterator,
@@ -729,17 +508,17 @@ CFX_ByteString CPVT_GenerateAP::GenerateEditAP(
CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
int32_t nCurFontIndex = -1;
if (pIterator) {
- if (pVisible) {
+ if (pVisible)
pIterator->SetAt(pVisible->BeginPos);
- } else {
+ else
pIterator->SetAt(0);
- }
+
CPVT_WordPlace oldplace;
while (pIterator->NextWord()) {
CPVT_WordPlace place = pIterator->GetAt();
- if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {
+ if (pVisible && place.WordCmp(pVisible->EndPos) > 0)
break;
- }
+
if (bContinuous) {
if (place.LineCmp(oldplace) != 0) {
if (sWords.GetSize() > 0) {
@@ -807,6 +586,8 @@ CFX_ByteString CPVT_GenerateAP::GenerateEditAP(
}
return sEditStream.GetByteString();
}
+
+// Static.
CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(
const CFX_FloatRect& rect,
FX_FLOAT fWidth,
@@ -913,6 +694,8 @@ CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(
}
return sAppStream.GetByteString();
}
+
+// Static.
CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color,
const FX_BOOL& bFillOrStroke) {
CFX_ByteTextBuf sColorStream;
@@ -936,3 +719,51 @@ CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color,
}
return sColorStream.GetByteString();
}
+
+// Static.
+CFX_ByteString CPVT_GenerateAP::GetPDFWordString(IPVT_FontMap* pFontMap,
+ int32_t nFontIndex,
+ uint16_t Word,
+ uint16_t SubWord) {
+ CFX_ByteString sWord;
+ if (SubWord > 0) {
+ sWord.Format("%c", SubWord);
+ return sWord;
+ }
+
+ if (!pFontMap)
+ return sWord;
+
+ if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
+ if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 ||
+ pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
+ sWord.Format("%c", Word);
+ } else {
+ uint32_t dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
+ if (dwCharCode != CPDF_Font::kInvalidCharCode)
+ pPDFFont->AppendChar(sWord, dwCharCode);
+ }
+ }
+ return sWord;
+}
+
+// Static.
+CFX_ByteString CPVT_GenerateAP::GetWordRenderString(
+ const CFX_ByteString& strWords) {
+ if (strWords.GetLength() > 0)
+ return PDF_EncodeString(strWords) + " Tj\n";
+ return "";
+}
+
+// Static.
+CFX_ByteString CPVT_GenerateAP::GetFontSetString(IPVT_FontMap* pFontMap,
+ int32_t nFontIndex,
+ FX_FLOAT fFontSize) {
+ CFX_ByteTextBuf sRet;
+ if (pFontMap) {
+ CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
+ if (sFontAlias.GetLength() > 0 && fFontSize > 0)
+ sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
+ }
+ return sRet.GetByteString();
+}
« no previous file with comments | « core/fpdfdoc/cpvt_generateap.h ('k') | core/fpdfdoc/cpvt_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698