1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_edit.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
11*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
12*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
13*3ac0a46fSAndroid Build Coastguard Worker
14*3ac0a46fSAndroid Build Coastguard Worker #include "constants/page_object.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_colorspace.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_docpagedata.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_form.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_formobject.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_imageobject.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_page.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_pageimagecache.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_pageobject.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_pathobject.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_shadingobject.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_textobject.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_array.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_dictionary.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_name.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_number.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_string.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/render/cpdf_docrenderdata.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_annot.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_annotlist.h"
36*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_extension.h"
37*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_memcpy_wrappers.h"
38*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/stl_util.h"
39*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
40*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_formfill.h"
41*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/numerics/safe_conversions.h"
42*3ac0a46fSAndroid Build Coastguard Worker
43*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
44*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
45*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
46*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
47*3ac0a46fSAndroid Build Coastguard Worker
48*3ac0a46fSAndroid Build Coastguard Worker namespace {
49*3ac0a46fSAndroid Build Coastguard Worker
50*3ac0a46fSAndroid Build Coastguard Worker static_assert(FPDF_PAGEOBJ_TEXT ==
51*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(CPDF_PageObject::Type::kText),
52*3ac0a46fSAndroid Build Coastguard Worker "FPDF_PAGEOBJ_TEXT/CPDF_PageObject::TEXT mismatch");
53*3ac0a46fSAndroid Build Coastguard Worker static_assert(FPDF_PAGEOBJ_PATH ==
54*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(CPDF_PageObject::Type::kPath),
55*3ac0a46fSAndroid Build Coastguard Worker "FPDF_PAGEOBJ_PATH/CPDF_PageObject::PATH mismatch");
56*3ac0a46fSAndroid Build Coastguard Worker static_assert(FPDF_PAGEOBJ_IMAGE ==
57*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(CPDF_PageObject::Type::kImage),
58*3ac0a46fSAndroid Build Coastguard Worker "FPDF_PAGEOBJ_IMAGE/CPDF_PageObject::IMAGE mismatch");
59*3ac0a46fSAndroid Build Coastguard Worker static_assert(FPDF_PAGEOBJ_SHADING ==
60*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(CPDF_PageObject::Type::kShading),
61*3ac0a46fSAndroid Build Coastguard Worker "FPDF_PAGEOBJ_SHADING/CPDF_PageObject::SHADING mismatch");
62*3ac0a46fSAndroid Build Coastguard Worker static_assert(FPDF_PAGEOBJ_FORM ==
63*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(CPDF_PageObject::Type::kForm),
64*3ac0a46fSAndroid Build Coastguard Worker "FPDF_PAGEOBJ_FORM/CPDF_PageObject::FORM mismatch");
65*3ac0a46fSAndroid Build Coastguard Worker
IsPageObject(CPDF_Page * pPage)66*3ac0a46fSAndroid Build Coastguard Worker bool IsPageObject(CPDF_Page* pPage) {
67*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
68*3ac0a46fSAndroid Build Coastguard Worker return false;
69*3ac0a46fSAndroid Build Coastguard Worker
70*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pFormDict = pPage->GetDict();
71*3ac0a46fSAndroid Build Coastguard Worker if (!pFormDict->KeyExist(pdfium::page_object::kType))
72*3ac0a46fSAndroid Build Coastguard Worker return false;
73*3ac0a46fSAndroid Build Coastguard Worker
74*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Name> pName =
75*3ac0a46fSAndroid Build Coastguard Worker ToName(pFormDict->GetObjectFor(pdfium::page_object::kType)->GetDirect());
76*3ac0a46fSAndroid Build Coastguard Worker return pName && pName->GetString() == "Page";
77*3ac0a46fSAndroid Build Coastguard Worker }
78*3ac0a46fSAndroid Build Coastguard Worker
CalcBoundingBox(CPDF_PageObject * pPageObj)79*3ac0a46fSAndroid Build Coastguard Worker void CalcBoundingBox(CPDF_PageObject* pPageObj) {
80*3ac0a46fSAndroid Build Coastguard Worker switch (pPageObj->GetType()) {
81*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kText: {
82*3ac0a46fSAndroid Build Coastguard Worker break;
83*3ac0a46fSAndroid Build Coastguard Worker }
84*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kPath: {
85*3ac0a46fSAndroid Build Coastguard Worker CPDF_PathObject* pPathObj = pPageObj->AsPath();
86*3ac0a46fSAndroid Build Coastguard Worker pPathObj->CalcBoundingBox();
87*3ac0a46fSAndroid Build Coastguard Worker break;
88*3ac0a46fSAndroid Build Coastguard Worker }
89*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kImage: {
90*3ac0a46fSAndroid Build Coastguard Worker CPDF_ImageObject* pImageObj = pPageObj->AsImage();
91*3ac0a46fSAndroid Build Coastguard Worker pImageObj->CalcBoundingBox();
92*3ac0a46fSAndroid Build Coastguard Worker break;
93*3ac0a46fSAndroid Build Coastguard Worker }
94*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kShading: {
95*3ac0a46fSAndroid Build Coastguard Worker CPDF_ShadingObject* pShadingObj = pPageObj->AsShading();
96*3ac0a46fSAndroid Build Coastguard Worker pShadingObj->CalcBoundingBox();
97*3ac0a46fSAndroid Build Coastguard Worker break;
98*3ac0a46fSAndroid Build Coastguard Worker }
99*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kForm: {
100*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormObject* pFormObj = pPageObj->AsForm();
101*3ac0a46fSAndroid Build Coastguard Worker pFormObj->CalcBoundingBox();
102*3ac0a46fSAndroid Build Coastguard Worker break;
103*3ac0a46fSAndroid Build Coastguard Worker }
104*3ac0a46fSAndroid Build Coastguard Worker }
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker
GetMarkParamDict(FPDF_PAGEOBJECTMARK mark)107*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> GetMarkParamDict(FPDF_PAGEOBJECTMARK mark) {
108*3ac0a46fSAndroid Build Coastguard Worker CPDF_ContentMarkItem* pMarkItem =
109*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
110*3ac0a46fSAndroid Build Coastguard Worker return pMarkItem ? pMarkItem->GetParam() : nullptr;
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
GetOrCreateMarkParamsDict(FPDF_DOCUMENT document,FPDF_PAGEOBJECTMARK mark)113*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> GetOrCreateMarkParamsDict(FPDF_DOCUMENT document,
114*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark) {
115*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
116*3ac0a46fSAndroid Build Coastguard Worker if (!pDoc)
117*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
118*3ac0a46fSAndroid Build Coastguard Worker
119*3ac0a46fSAndroid Build Coastguard Worker CPDF_ContentMarkItem* pMarkItem =
120*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
121*3ac0a46fSAndroid Build Coastguard Worker if (!pMarkItem)
122*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
123*3ac0a46fSAndroid Build Coastguard Worker
124*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pParams = pMarkItem->GetParam();
125*3ac0a46fSAndroid Build Coastguard Worker if (!pParams) {
126*3ac0a46fSAndroid Build Coastguard Worker pParams = pDoc->New<CPDF_Dictionary>();
127*3ac0a46fSAndroid Build Coastguard Worker pMarkItem->SetDirectDict(pParams);
128*3ac0a46fSAndroid Build Coastguard Worker }
129*3ac0a46fSAndroid Build Coastguard Worker return pParams;
130*3ac0a46fSAndroid Build Coastguard Worker }
131*3ac0a46fSAndroid Build Coastguard Worker
PageObjectContainsMark(CPDF_PageObject * pPageObj,FPDF_PAGEOBJECTMARK mark)132*3ac0a46fSAndroid Build Coastguard Worker bool PageObjectContainsMark(CPDF_PageObject* pPageObj,
133*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark) {
134*3ac0a46fSAndroid Build Coastguard Worker const CPDF_ContentMarkItem* pMarkItem =
135*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
136*3ac0a46fSAndroid Build Coastguard Worker return pMarkItem && pPageObj->GetContentMarks()->ContainsItem(pMarkItem);
137*3ac0a46fSAndroid Build Coastguard Worker }
138*3ac0a46fSAndroid Build Coastguard Worker
CPDFFormObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object)139*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormObject* CPDFFormObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) {
140*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
141*3ac0a46fSAndroid Build Coastguard Worker return pPageObj ? pPageObj->AsForm() : nullptr;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker
CPDFPageObjHolderFromFPDFFormObject(FPDF_PAGEOBJECT page_object)144*3ac0a46fSAndroid Build Coastguard Worker const CPDF_PageObjectHolder* CPDFPageObjHolderFromFPDFFormObject(
145*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT page_object) {
146*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormObject* pFormObject = CPDFFormObjectFromFPDFPageObject(page_object);
147*3ac0a46fSAndroid Build Coastguard Worker return pFormObject ? pFormObject->form() : nullptr;
148*3ac0a46fSAndroid Build Coastguard Worker }
149*3ac0a46fSAndroid Build Coastguard Worker
150*3ac0a46fSAndroid Build Coastguard Worker } // namespace
151*3ac0a46fSAndroid Build Coastguard Worker
FPDF_CreateNewDocument()152*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument() {
153*3ac0a46fSAndroid Build Coastguard Worker auto pDoc =
154*3ac0a46fSAndroid Build Coastguard Worker std::make_unique<CPDF_Document>(std::make_unique<CPDF_DocRenderData>(),
155*3ac0a46fSAndroid Build Coastguard Worker std::make_unique<CPDF_DocPageData>());
156*3ac0a46fSAndroid Build Coastguard Worker pDoc->CreateNewDoc();
157*3ac0a46fSAndroid Build Coastguard Worker
158*3ac0a46fSAndroid Build Coastguard Worker time_t currentTime;
159*3ac0a46fSAndroid Build Coastguard Worker ByteString DateStr;
160*3ac0a46fSAndroid Build Coastguard Worker if (IsPDFSandboxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) {
161*3ac0a46fSAndroid Build Coastguard Worker if (FXSYS_time(¤tTime) != -1) {
162*3ac0a46fSAndroid Build Coastguard Worker tm* pTM = FXSYS_localtime(¤tTime);
163*3ac0a46fSAndroid Build Coastguard Worker if (pTM) {
164*3ac0a46fSAndroid Build Coastguard Worker DateStr = ByteString::Format(
165*3ac0a46fSAndroid Build Coastguard Worker "D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, pTM->tm_mon + 1,
166*3ac0a46fSAndroid Build Coastguard Worker pTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec);
167*3ac0a46fSAndroid Build Coastguard Worker }
168*3ac0a46fSAndroid Build Coastguard Worker }
169*3ac0a46fSAndroid Build Coastguard Worker }
170*3ac0a46fSAndroid Build Coastguard Worker
171*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pInfoDict = pDoc->GetInfo();
172*3ac0a46fSAndroid Build Coastguard Worker if (pInfoDict) {
173*3ac0a46fSAndroid Build Coastguard Worker if (IsPDFSandboxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
174*3ac0a46fSAndroid Build Coastguard Worker pInfoDict->SetNewFor<CPDF_String>("CreationDate", DateStr, false);
175*3ac0a46fSAndroid Build Coastguard Worker pInfoDict->SetNewFor<CPDF_String>("Creator", L"PDFium");
176*3ac0a46fSAndroid Build Coastguard Worker }
177*3ac0a46fSAndroid Build Coastguard Worker
178*3ac0a46fSAndroid Build Coastguard Worker // Caller takes ownership of pDoc.
179*3ac0a46fSAndroid Build Coastguard Worker return FPDFDocumentFromCPDFDocument(pDoc.release());
180*3ac0a46fSAndroid Build Coastguard Worker }
181*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_Delete(FPDF_DOCUMENT document,int page_index)182*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDFPage_Delete(FPDF_DOCUMENT document,
183*3ac0a46fSAndroid Build Coastguard Worker int page_index) {
184*3ac0a46fSAndroid Build Coastguard Worker auto* pDoc = CPDFDocumentFromFPDFDocument(document);
185*3ac0a46fSAndroid Build Coastguard Worker if (!pDoc)
186*3ac0a46fSAndroid Build Coastguard Worker return;
187*3ac0a46fSAndroid Build Coastguard Worker
188*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document::Extension* pExtension = pDoc->GetExtension();
189*3ac0a46fSAndroid Build Coastguard Worker if (pExtension) {
190*3ac0a46fSAndroid Build Coastguard Worker pExtension->DeletePage(page_index);
191*3ac0a46fSAndroid Build Coastguard Worker return;
192*3ac0a46fSAndroid Build Coastguard Worker }
193*3ac0a46fSAndroid Build Coastguard Worker
194*3ac0a46fSAndroid Build Coastguard Worker pDoc->DeletePage(page_index);
195*3ac0a46fSAndroid Build Coastguard Worker }
196*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_New(FPDF_DOCUMENT document,int page_index,double width,double height)197*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV FPDFPage_New(FPDF_DOCUMENT document,
198*3ac0a46fSAndroid Build Coastguard Worker int page_index,
199*3ac0a46fSAndroid Build Coastguard Worker double width,
200*3ac0a46fSAndroid Build Coastguard Worker double height) {
201*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
202*3ac0a46fSAndroid Build Coastguard Worker if (!pDoc)
203*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
204*3ac0a46fSAndroid Build Coastguard Worker
205*3ac0a46fSAndroid Build Coastguard Worker page_index = std::clamp(page_index, 0, pDoc->GetPageCount());
206*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pPageDict(pDoc->CreateNewPage(page_index));
207*3ac0a46fSAndroid Build Coastguard Worker if (!pPageDict)
208*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
209*3ac0a46fSAndroid Build Coastguard Worker
210*3ac0a46fSAndroid Build Coastguard Worker pPageDict->SetRectFor(pdfium::page_object::kMediaBox,
211*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect(0, 0, width, height));
212*3ac0a46fSAndroid Build Coastguard Worker pPageDict->SetNewFor<CPDF_Number>(pdfium::page_object::kRotate, 0);
213*3ac0a46fSAndroid Build Coastguard Worker pPageDict->SetNewFor<CPDF_Dictionary>(pdfium::page_object::kResources);
214*3ac0a46fSAndroid Build Coastguard Worker
215*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
216*3ac0a46fSAndroid Build Coastguard Worker if (pDoc->GetExtension()) {
217*3ac0a46fSAndroid Build Coastguard Worker auto pXFAPage = pdfium::MakeRetain<CPDFXFA_Page>(pDoc, page_index);
218*3ac0a46fSAndroid Build Coastguard Worker pXFAPage->LoadPDFPageFromDict(pPageDict);
219*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageFromIPDFPage(pXFAPage.Leak()); // Caller takes ownership.
220*3ac0a46fSAndroid Build Coastguard Worker }
221*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
222*3ac0a46fSAndroid Build Coastguard Worker
223*3ac0a46fSAndroid Build Coastguard Worker auto pPage = pdfium::MakeRetain<CPDF_Page>(pDoc, pPageDict);
224*3ac0a46fSAndroid Build Coastguard Worker pPage->AddPageImageCache();
225*3ac0a46fSAndroid Build Coastguard Worker pPage->ParseContent();
226*3ac0a46fSAndroid Build Coastguard Worker
227*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageFromIPDFPage(pPage.Leak()); // Caller takes ownership.
228*3ac0a46fSAndroid Build Coastguard Worker }
229*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_GetRotation(FPDF_PAGE page)230*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetRotation(FPDF_PAGE page) {
231*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
232*3ac0a46fSAndroid Build Coastguard Worker return IsPageObject(pPage) ? pPage->GetPageRotation() : -1;
233*3ac0a46fSAndroid Build Coastguard Worker }
234*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_InsertObject(FPDF_PAGE page,FPDF_PAGEOBJECT page_obj)235*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDFPage_InsertObject(FPDF_PAGE page,
236*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT page_obj) {
237*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_obj);
238*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
239*3ac0a46fSAndroid Build Coastguard Worker return;
240*3ac0a46fSAndroid Build Coastguard Worker
241*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CPDF_PageObject> pPageObjHolder(pPageObj);
242*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
243*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
244*3ac0a46fSAndroid Build Coastguard Worker return;
245*3ac0a46fSAndroid Build Coastguard Worker
246*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
247*3ac0a46fSAndroid Build Coastguard Worker pPage->AppendPageObject(std::move(pPageObjHolder));
248*3ac0a46fSAndroid Build Coastguard Worker CalcBoundingBox(pPageObj);
249*3ac0a46fSAndroid Build Coastguard Worker }
250*3ac0a46fSAndroid Build Coastguard Worker
251*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPage_RemoveObject(FPDF_PAGE page,FPDF_PAGEOBJECT page_obj)252*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_RemoveObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj) {
253*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_obj);
254*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
255*3ac0a46fSAndroid Build Coastguard Worker return false;
256*3ac0a46fSAndroid Build Coastguard Worker
257*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
258*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
259*3ac0a46fSAndroid Build Coastguard Worker return false;
260*3ac0a46fSAndroid Build Coastguard Worker
261*3ac0a46fSAndroid Build Coastguard Worker // Caller takes ownership.
262*3ac0a46fSAndroid Build Coastguard Worker return !!pPage->RemovePageObject(pPageObj).release();
263*3ac0a46fSAndroid Build Coastguard Worker }
264*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_CountObjects(FPDF_PAGE page)265*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV FPDFPage_CountObjects(FPDF_PAGE page) {
266*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
267*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
268*3ac0a46fSAndroid Build Coastguard Worker return -1;
269*3ac0a46fSAndroid Build Coastguard Worker
270*3ac0a46fSAndroid Build Coastguard Worker return pdfium::base::checked_cast<int>(pPage->GetPageObjectCount());
271*3ac0a46fSAndroid Build Coastguard Worker }
272*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_GetObject(FPDF_PAGE page,int index)273*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPage_GetObject(FPDF_PAGE page,
274*3ac0a46fSAndroid Build Coastguard Worker int index) {
275*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
276*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
277*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
278*3ac0a46fSAndroid Build Coastguard Worker
279*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageObjectFromCPDFPageObject(pPage->GetPageObjectByIndex(index));
280*3ac0a46fSAndroid Build Coastguard Worker }
281*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_HasTransparency(FPDF_PAGE page)282*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_HasTransparency(FPDF_PAGE page) {
283*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
284*3ac0a46fSAndroid Build Coastguard Worker return pPage && pPage->BackgroundAlphaNeeded();
285*3ac0a46fSAndroid Build Coastguard Worker }
286*3ac0a46fSAndroid Build Coastguard Worker
FPDFPageObj_Destroy(FPDF_PAGEOBJECT page_obj)287*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDFPageObj_Destroy(FPDF_PAGEOBJECT page_obj) {
288*3ac0a46fSAndroid Build Coastguard Worker delete CPDFPageObjectFromFPDFPageObject(page_obj);
289*3ac0a46fSAndroid Build Coastguard Worker }
290*3ac0a46fSAndroid Build Coastguard Worker
291*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPageObj_CountMarks(FPDF_PAGEOBJECT page_object)292*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_CountMarks(FPDF_PAGEOBJECT page_object) {
293*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
294*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
295*3ac0a46fSAndroid Build Coastguard Worker return -1;
296*3ac0a46fSAndroid Build Coastguard Worker
297*3ac0a46fSAndroid Build Coastguard Worker return pdfium::base::checked_cast<int>(
298*3ac0a46fSAndroid Build Coastguard Worker pPageObj->GetContentMarks()->CountItems());
299*3ac0a46fSAndroid Build Coastguard Worker }
300*3ac0a46fSAndroid Build Coastguard Worker
301*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV
FPDFPageObj_GetMark(FPDF_PAGEOBJECT page_object,unsigned long index)302*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetMark(FPDF_PAGEOBJECT page_object, unsigned long index) {
303*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
304*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
305*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
306*3ac0a46fSAndroid Build Coastguard Worker
307*3ac0a46fSAndroid Build Coastguard Worker CPDF_ContentMarks* pMarks = pPageObj->GetContentMarks();
308*3ac0a46fSAndroid Build Coastguard Worker if (index >= pMarks->CountItems())
309*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
310*3ac0a46fSAndroid Build Coastguard Worker
311*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageObjectMarkFromCPDFContentMarkItem(pMarks->GetItem(index));
312*3ac0a46fSAndroid Build Coastguard Worker }
313*3ac0a46fSAndroid Build Coastguard Worker
314*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV
FPDFPageObj_AddMark(FPDF_PAGEOBJECT page_object,FPDF_BYTESTRING name)315*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_AddMark(FPDF_PAGEOBJECT page_object, FPDF_BYTESTRING name) {
316*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
317*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
318*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
319*3ac0a46fSAndroid Build Coastguard Worker
320*3ac0a46fSAndroid Build Coastguard Worker CPDF_ContentMarks* pMarks = pPageObj->GetContentMarks();
321*3ac0a46fSAndroid Build Coastguard Worker pMarks->AddMark(name);
322*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
323*3ac0a46fSAndroid Build Coastguard Worker
324*3ac0a46fSAndroid Build Coastguard Worker const size_t index = pMarks->CountItems() - 1;
325*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageObjectMarkFromCPDFContentMarkItem(pMarks->GetItem(index));
326*3ac0a46fSAndroid Build Coastguard Worker }
327*3ac0a46fSAndroid Build Coastguard Worker
328*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_RemoveMark(FPDF_PAGEOBJECT page_object,FPDF_PAGEOBJECTMARK mark)329*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_RemoveMark(FPDF_PAGEOBJECT page_object, FPDF_PAGEOBJECTMARK mark) {
330*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
331*3ac0a46fSAndroid Build Coastguard Worker CPDF_ContentMarkItem* pMarkItem =
332*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
333*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !pMarkItem)
334*3ac0a46fSAndroid Build Coastguard Worker return false;
335*3ac0a46fSAndroid Build Coastguard Worker
336*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj->GetContentMarks()->RemoveMark(pMarkItem))
337*3ac0a46fSAndroid Build Coastguard Worker return false;
338*3ac0a46fSAndroid Build Coastguard Worker
339*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
340*3ac0a46fSAndroid Build Coastguard Worker return true;
341*3ac0a46fSAndroid Build Coastguard Worker }
342*3ac0a46fSAndroid Build Coastguard Worker
343*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_GetName(FPDF_PAGEOBJECTMARK mark,void * buffer,unsigned long buflen,unsigned long * out_buflen)344*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetName(FPDF_PAGEOBJECTMARK mark,
345*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
346*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen,
347*3ac0a46fSAndroid Build Coastguard Worker unsigned long* out_buflen) {
348*3ac0a46fSAndroid Build Coastguard Worker const CPDF_ContentMarkItem* pMarkItem =
349*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
350*3ac0a46fSAndroid Build Coastguard Worker if (!pMarkItem || !out_buflen)
351*3ac0a46fSAndroid Build Coastguard Worker return false;
352*3ac0a46fSAndroid Build Coastguard Worker
353*3ac0a46fSAndroid Build Coastguard Worker *out_buflen = Utf16EncodeMaybeCopyAndReturnLength(
354*3ac0a46fSAndroid Build Coastguard Worker WideString::FromUTF8(pMarkItem->GetName().AsStringView()), buffer,
355*3ac0a46fSAndroid Build Coastguard Worker buflen);
356*3ac0a46fSAndroid Build Coastguard Worker return true;
357*3ac0a46fSAndroid Build Coastguard Worker }
358*3ac0a46fSAndroid Build Coastguard Worker
359*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPageObjMark_CountParams(FPDF_PAGEOBJECTMARK mark)360*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_CountParams(FPDF_PAGEOBJECTMARK mark) {
361*3ac0a46fSAndroid Build Coastguard Worker const CPDF_ContentMarkItem* pMarkItem =
362*3ac0a46fSAndroid Build Coastguard Worker CPDFContentMarkItemFromFPDFPageObjectMark(mark);
363*3ac0a46fSAndroid Build Coastguard Worker if (!pMarkItem)
364*3ac0a46fSAndroid Build Coastguard Worker return -1;
365*3ac0a46fSAndroid Build Coastguard Worker
366*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = pMarkItem->GetParam();
367*3ac0a46fSAndroid Build Coastguard Worker return pParams ? fxcrt::CollectionSize<int>(*pParams) : 0;
368*3ac0a46fSAndroid Build Coastguard Worker }
369*3ac0a46fSAndroid Build Coastguard Worker
370*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_GetParamKey(FPDF_PAGEOBJECTMARK mark,unsigned long index,void * buffer,unsigned long buflen,unsigned long * out_buflen)371*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetParamKey(FPDF_PAGEOBJECTMARK mark,
372*3ac0a46fSAndroid Build Coastguard Worker unsigned long index,
373*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
374*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen,
375*3ac0a46fSAndroid Build Coastguard Worker unsigned long* out_buflen) {
376*3ac0a46fSAndroid Build Coastguard Worker if (!out_buflen)
377*3ac0a46fSAndroid Build Coastguard Worker return false;
378*3ac0a46fSAndroid Build Coastguard Worker
379*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = GetMarkParamDict(mark);
380*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
381*3ac0a46fSAndroid Build Coastguard Worker return false;
382*3ac0a46fSAndroid Build Coastguard Worker
383*3ac0a46fSAndroid Build Coastguard Worker CPDF_DictionaryLocker locker(pParams);
384*3ac0a46fSAndroid Build Coastguard Worker for (auto& it : locker) {
385*3ac0a46fSAndroid Build Coastguard Worker if (index == 0) {
386*3ac0a46fSAndroid Build Coastguard Worker *out_buflen = Utf16EncodeMaybeCopyAndReturnLength(
387*3ac0a46fSAndroid Build Coastguard Worker WideString::FromUTF8(it.first.AsStringView()), buffer, buflen);
388*3ac0a46fSAndroid Build Coastguard Worker return true;
389*3ac0a46fSAndroid Build Coastguard Worker }
390*3ac0a46fSAndroid Build Coastguard Worker --index;
391*3ac0a46fSAndroid Build Coastguard Worker }
392*3ac0a46fSAndroid Build Coastguard Worker
393*3ac0a46fSAndroid Build Coastguard Worker return false;
394*3ac0a46fSAndroid Build Coastguard Worker }
395*3ac0a46fSAndroid Build Coastguard Worker
396*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV
FPDFPageObjMark_GetParamValueType(FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key)397*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetParamValueType(FPDF_PAGEOBJECTMARK mark,
398*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key) {
399*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = GetMarkParamDict(mark);
400*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
401*3ac0a46fSAndroid Build Coastguard Worker return FPDF_OBJECT_UNKNOWN;
402*3ac0a46fSAndroid Build Coastguard Worker
403*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Object> pObject = pParams->GetObjectFor(key);
404*3ac0a46fSAndroid Build Coastguard Worker return pObject ? pObject->GetType() : FPDF_OBJECT_UNKNOWN;
405*3ac0a46fSAndroid Build Coastguard Worker }
406*3ac0a46fSAndroid Build Coastguard Worker
407*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_GetParamIntValue(FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,int * out_value)408*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetParamIntValue(FPDF_PAGEOBJECTMARK mark,
409*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
410*3ac0a46fSAndroid Build Coastguard Worker int* out_value) {
411*3ac0a46fSAndroid Build Coastguard Worker if (!out_value)
412*3ac0a46fSAndroid Build Coastguard Worker return false;
413*3ac0a46fSAndroid Build Coastguard Worker
414*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = GetMarkParamDict(mark);
415*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
416*3ac0a46fSAndroid Build Coastguard Worker return false;
417*3ac0a46fSAndroid Build Coastguard Worker
418*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Object> pObj = pParams->GetObjectFor(key);
419*3ac0a46fSAndroid Build Coastguard Worker if (!pObj || !pObj->IsNumber())
420*3ac0a46fSAndroid Build Coastguard Worker return false;
421*3ac0a46fSAndroid Build Coastguard Worker
422*3ac0a46fSAndroid Build Coastguard Worker *out_value = pObj->GetInteger();
423*3ac0a46fSAndroid Build Coastguard Worker return true;
424*3ac0a46fSAndroid Build Coastguard Worker }
425*3ac0a46fSAndroid Build Coastguard Worker
426*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_GetParamStringValue(FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,void * buffer,unsigned long buflen,unsigned long * out_buflen)427*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetParamStringValue(FPDF_PAGEOBJECTMARK mark,
428*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
429*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
430*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen,
431*3ac0a46fSAndroid Build Coastguard Worker unsigned long* out_buflen) {
432*3ac0a46fSAndroid Build Coastguard Worker if (!out_buflen)
433*3ac0a46fSAndroid Build Coastguard Worker return false;
434*3ac0a46fSAndroid Build Coastguard Worker
435*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = GetMarkParamDict(mark);
436*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
437*3ac0a46fSAndroid Build Coastguard Worker return false;
438*3ac0a46fSAndroid Build Coastguard Worker
439*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Object> pObj = pParams->GetObjectFor(key);
440*3ac0a46fSAndroid Build Coastguard Worker if (!pObj || !pObj->IsString())
441*3ac0a46fSAndroid Build Coastguard Worker return false;
442*3ac0a46fSAndroid Build Coastguard Worker
443*3ac0a46fSAndroid Build Coastguard Worker *out_buflen = Utf16EncodeMaybeCopyAndReturnLength(
444*3ac0a46fSAndroid Build Coastguard Worker WideString::FromUTF8(pObj->GetString().AsStringView()), buffer, buflen);
445*3ac0a46fSAndroid Build Coastguard Worker return true;
446*3ac0a46fSAndroid Build Coastguard Worker }
447*3ac0a46fSAndroid Build Coastguard Worker
448*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_GetParamBlobValue(FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,void * buffer,unsigned long buflen,unsigned long * out_buflen)449*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_GetParamBlobValue(FPDF_PAGEOBJECTMARK mark,
450*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
451*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
452*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen,
453*3ac0a46fSAndroid Build Coastguard Worker unsigned long* out_buflen) {
454*3ac0a46fSAndroid Build Coastguard Worker if (!out_buflen)
455*3ac0a46fSAndroid Build Coastguard Worker return false;
456*3ac0a46fSAndroid Build Coastguard Worker
457*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Dictionary> pParams = GetMarkParamDict(mark);
458*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
459*3ac0a46fSAndroid Build Coastguard Worker return false;
460*3ac0a46fSAndroid Build Coastguard Worker
461*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CPDF_Object> pObj = pParams->GetObjectFor(key);
462*3ac0a46fSAndroid Build Coastguard Worker if (!pObj || !pObj->IsString())
463*3ac0a46fSAndroid Build Coastguard Worker return false;
464*3ac0a46fSAndroid Build Coastguard Worker
465*3ac0a46fSAndroid Build Coastguard Worker ByteString result = pObj->GetString();
466*3ac0a46fSAndroid Build Coastguard Worker const unsigned long len =
467*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<unsigned long>(result.GetLength());
468*3ac0a46fSAndroid Build Coastguard Worker
469*3ac0a46fSAndroid Build Coastguard Worker if (buffer && len <= buflen)
470*3ac0a46fSAndroid Build Coastguard Worker memcpy(buffer, result.c_str(), len);
471*3ac0a46fSAndroid Build Coastguard Worker
472*3ac0a46fSAndroid Build Coastguard Worker *out_buflen = len;
473*3ac0a46fSAndroid Build Coastguard Worker return true;
474*3ac0a46fSAndroid Build Coastguard Worker }
475*3ac0a46fSAndroid Build Coastguard Worker
476*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT page_object)477*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT page_object) {
478*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
479*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
480*3ac0a46fSAndroid Build Coastguard Worker return false;
481*3ac0a46fSAndroid Build Coastguard Worker
482*3ac0a46fSAndroid Build Coastguard Worker if (pPageObj->m_GeneralState.GetBlendType() != BlendMode::kNormal)
483*3ac0a46fSAndroid Build Coastguard Worker return true;
484*3ac0a46fSAndroid Build Coastguard Worker
485*3ac0a46fSAndroid Build Coastguard Worker if (pPageObj->m_GeneralState.GetSoftMask())
486*3ac0a46fSAndroid Build Coastguard Worker return true;
487*3ac0a46fSAndroid Build Coastguard Worker
488*3ac0a46fSAndroid Build Coastguard Worker if (pPageObj->m_GeneralState.GetFillAlpha() != 1.0f)
489*3ac0a46fSAndroid Build Coastguard Worker return true;
490*3ac0a46fSAndroid Build Coastguard Worker
491*3ac0a46fSAndroid Build Coastguard Worker if (pPageObj->IsPath() && pPageObj->m_GeneralState.GetStrokeAlpha() != 1.0f)
492*3ac0a46fSAndroid Build Coastguard Worker return true;
493*3ac0a46fSAndroid Build Coastguard Worker
494*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj->IsForm())
495*3ac0a46fSAndroid Build Coastguard Worker return false;
496*3ac0a46fSAndroid Build Coastguard Worker
497*3ac0a46fSAndroid Build Coastguard Worker const CPDF_Form* pForm = pPageObj->AsForm()->form();
498*3ac0a46fSAndroid Build Coastguard Worker if (!pForm)
499*3ac0a46fSAndroid Build Coastguard Worker return false;
500*3ac0a46fSAndroid Build Coastguard Worker
501*3ac0a46fSAndroid Build Coastguard Worker const CPDF_Transparency& trans = pForm->GetTransparency();
502*3ac0a46fSAndroid Build Coastguard Worker return trans.IsGroup() || trans.IsIsolated();
503*3ac0a46fSAndroid Build Coastguard Worker }
504*3ac0a46fSAndroid Build Coastguard Worker
505*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_SetIntParam(FPDF_DOCUMENT document,FPDF_PAGEOBJECT page_object,FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,int value)506*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_SetIntParam(FPDF_DOCUMENT document,
507*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT page_object,
508*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark,
509*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
510*3ac0a46fSAndroid Build Coastguard Worker int value) {
511*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
512*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !PageObjectContainsMark(pPageObj, mark))
513*3ac0a46fSAndroid Build Coastguard Worker return false;
514*3ac0a46fSAndroid Build Coastguard Worker
515*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pParams =
516*3ac0a46fSAndroid Build Coastguard Worker GetOrCreateMarkParamsDict(document, mark);
517*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
518*3ac0a46fSAndroid Build Coastguard Worker return false;
519*3ac0a46fSAndroid Build Coastguard Worker
520*3ac0a46fSAndroid Build Coastguard Worker pParams->SetNewFor<CPDF_Number>(key, value);
521*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
522*3ac0a46fSAndroid Build Coastguard Worker return true;
523*3ac0a46fSAndroid Build Coastguard Worker }
524*3ac0a46fSAndroid Build Coastguard Worker
525*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_SetStringParam(FPDF_DOCUMENT document,FPDF_PAGEOBJECT page_object,FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,FPDF_BYTESTRING value)526*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_SetStringParam(FPDF_DOCUMENT document,
527*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT page_object,
528*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark,
529*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
530*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING value) {
531*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
532*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !PageObjectContainsMark(pPageObj, mark))
533*3ac0a46fSAndroid Build Coastguard Worker return false;
534*3ac0a46fSAndroid Build Coastguard Worker
535*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pParams =
536*3ac0a46fSAndroid Build Coastguard Worker GetOrCreateMarkParamsDict(document, mark);
537*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
538*3ac0a46fSAndroid Build Coastguard Worker return false;
539*3ac0a46fSAndroid Build Coastguard Worker
540*3ac0a46fSAndroid Build Coastguard Worker pParams->SetNewFor<CPDF_String>(key, value, false);
541*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
542*3ac0a46fSAndroid Build Coastguard Worker return true;
543*3ac0a46fSAndroid Build Coastguard Worker }
544*3ac0a46fSAndroid Build Coastguard Worker
545*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_SetBlobParam(FPDF_DOCUMENT document,FPDF_PAGEOBJECT page_object,FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key,void * value,unsigned long value_len)546*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_SetBlobParam(FPDF_DOCUMENT document,
547*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECT page_object,
548*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark,
549*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key,
550*3ac0a46fSAndroid Build Coastguard Worker void* value,
551*3ac0a46fSAndroid Build Coastguard Worker unsigned long value_len) {
552*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
553*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !PageObjectContainsMark(pPageObj, mark))
554*3ac0a46fSAndroid Build Coastguard Worker return false;
555*3ac0a46fSAndroid Build Coastguard Worker
556*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pParams =
557*3ac0a46fSAndroid Build Coastguard Worker GetOrCreateMarkParamsDict(document, mark);
558*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
559*3ac0a46fSAndroid Build Coastguard Worker return false;
560*3ac0a46fSAndroid Build Coastguard Worker
561*3ac0a46fSAndroid Build Coastguard Worker if (!value && value_len > 0)
562*3ac0a46fSAndroid Build Coastguard Worker return false;
563*3ac0a46fSAndroid Build Coastguard Worker
564*3ac0a46fSAndroid Build Coastguard Worker pParams->SetNewFor<CPDF_String>(
565*3ac0a46fSAndroid Build Coastguard Worker key, ByteString(static_cast<const char*>(value), value_len), true);
566*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
567*3ac0a46fSAndroid Build Coastguard Worker return true;
568*3ac0a46fSAndroid Build Coastguard Worker }
569*3ac0a46fSAndroid Build Coastguard Worker
570*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObjMark_RemoveParam(FPDF_PAGEOBJECT page_object,FPDF_PAGEOBJECTMARK mark,FPDF_BYTESTRING key)571*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObjMark_RemoveParam(FPDF_PAGEOBJECT page_object,
572*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGEOBJECTMARK mark,
573*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING key) {
574*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
575*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
576*3ac0a46fSAndroid Build Coastguard Worker return false;
577*3ac0a46fSAndroid Build Coastguard Worker
578*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pParams = GetMarkParamDict(mark);
579*3ac0a46fSAndroid Build Coastguard Worker if (!pParams)
580*3ac0a46fSAndroid Build Coastguard Worker return false;
581*3ac0a46fSAndroid Build Coastguard Worker
582*3ac0a46fSAndroid Build Coastguard Worker auto removed = pParams->RemoveFor(key);
583*3ac0a46fSAndroid Build Coastguard Worker if (!removed)
584*3ac0a46fSAndroid Build Coastguard Worker return false;
585*3ac0a46fSAndroid Build Coastguard Worker
586*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
587*3ac0a46fSAndroid Build Coastguard Worker return true;
588*3ac0a46fSAndroid Build Coastguard Worker }
589*3ac0a46fSAndroid Build Coastguard Worker
FPDFPageObj_GetType(FPDF_PAGEOBJECT page_object)590*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_GetType(FPDF_PAGEOBJECT page_object) {
591*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
592*3ac0a46fSAndroid Build Coastguard Worker return pPageObj ? static_cast<int>(pPageObj->GetType())
593*3ac0a46fSAndroid Build Coastguard Worker : FPDF_PAGEOBJ_UNKNOWN;
594*3ac0a46fSAndroid Build Coastguard Worker }
595*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_GenerateContent(FPDF_PAGE page)596*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_GenerateContent(FPDF_PAGE page) {
597*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
598*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
599*3ac0a46fSAndroid Build Coastguard Worker return false;
600*3ac0a46fSAndroid Build Coastguard Worker
601*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageContentGenerator CG(pPage);
602*3ac0a46fSAndroid Build Coastguard Worker CG.GenerateContent();
603*3ac0a46fSAndroid Build Coastguard Worker return true;
604*3ac0a46fSAndroid Build Coastguard Worker }
605*3ac0a46fSAndroid Build Coastguard Worker
606*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,double a,double b,double c,double d,double e,double f)607*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
608*3ac0a46fSAndroid Build Coastguard Worker double a,
609*3ac0a46fSAndroid Build Coastguard Worker double b,
610*3ac0a46fSAndroid Build Coastguard Worker double c,
611*3ac0a46fSAndroid Build Coastguard Worker double d,
612*3ac0a46fSAndroid Build Coastguard Worker double e,
613*3ac0a46fSAndroid Build Coastguard Worker double f) {
614*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
615*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
616*3ac0a46fSAndroid Build Coastguard Worker return;
617*3ac0a46fSAndroid Build Coastguard Worker
618*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix matrix((float)a, (float)b, (float)c, (float)d, (float)e, (float)f);
619*3ac0a46fSAndroid Build Coastguard Worker pPageObj->Transform(matrix);
620*3ac0a46fSAndroid Build Coastguard Worker }
621*3ac0a46fSAndroid Build Coastguard Worker
622*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object,FS_MATRIX * matrix)623*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object, FS_MATRIX* matrix) {
624*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
625*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !matrix)
626*3ac0a46fSAndroid Build Coastguard Worker return false;
627*3ac0a46fSAndroid Build Coastguard Worker
628*3ac0a46fSAndroid Build Coastguard Worker switch (pPageObj->GetType()) {
629*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kText:
630*3ac0a46fSAndroid Build Coastguard Worker *matrix = FSMatrixFromCFXMatrix(pPageObj->AsText()->GetTextMatrix());
631*3ac0a46fSAndroid Build Coastguard Worker return true;
632*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kPath:
633*3ac0a46fSAndroid Build Coastguard Worker *matrix = FSMatrixFromCFXMatrix(pPageObj->AsPath()->matrix());
634*3ac0a46fSAndroid Build Coastguard Worker return true;
635*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kImage:
636*3ac0a46fSAndroid Build Coastguard Worker *matrix = FSMatrixFromCFXMatrix(pPageObj->AsImage()->matrix());
637*3ac0a46fSAndroid Build Coastguard Worker return true;
638*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kShading:
639*3ac0a46fSAndroid Build Coastguard Worker return false;
640*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kForm:
641*3ac0a46fSAndroid Build Coastguard Worker *matrix = FSMatrixFromCFXMatrix(pPageObj->AsForm()->form_matrix());
642*3ac0a46fSAndroid Build Coastguard Worker return true;
643*3ac0a46fSAndroid Build Coastguard Worker }
644*3ac0a46fSAndroid Build Coastguard Worker }
645*3ac0a46fSAndroid Build Coastguard Worker
646*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT page_object,const FS_MATRIX * matrix)647*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT page_object, const FS_MATRIX* matrix) {
648*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
649*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !matrix)
650*3ac0a46fSAndroid Build Coastguard Worker return false;
651*3ac0a46fSAndroid Build Coastguard Worker
652*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix cmatrix = CFXMatrixFromFSMatrix(*matrix);
653*3ac0a46fSAndroid Build Coastguard Worker switch (pPageObj->GetType()) {
654*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kText:
655*3ac0a46fSAndroid Build Coastguard Worker pPageObj->AsText()->SetTextMatrix(cmatrix);
656*3ac0a46fSAndroid Build Coastguard Worker break;
657*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kPath:
658*3ac0a46fSAndroid Build Coastguard Worker pPageObj->AsPath()->SetPathMatrix(cmatrix);
659*3ac0a46fSAndroid Build Coastguard Worker break;
660*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kImage:
661*3ac0a46fSAndroid Build Coastguard Worker pPageObj->AsImage()->SetImageMatrix(cmatrix);
662*3ac0a46fSAndroid Build Coastguard Worker break;
663*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kShading:
664*3ac0a46fSAndroid Build Coastguard Worker return false;
665*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kForm:
666*3ac0a46fSAndroid Build Coastguard Worker pPageObj->AsForm()->SetFormMatrix(cmatrix);
667*3ac0a46fSAndroid Build Coastguard Worker break;
668*3ac0a46fSAndroid Build Coastguard Worker }
669*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
670*3ac0a46fSAndroid Build Coastguard Worker return true;
671*3ac0a46fSAndroid Build Coastguard Worker }
672*3ac0a46fSAndroid Build Coastguard Worker
673*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDFPageObj_SetBlendMode(FPDF_PAGEOBJECT page_object,FPDF_BYTESTRING blend_mode)674*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetBlendMode(FPDF_PAGEOBJECT page_object,
675*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING blend_mode) {
676*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
677*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
678*3ac0a46fSAndroid Build Coastguard Worker return;
679*3ac0a46fSAndroid Build Coastguard Worker
680*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GeneralState.SetBlendMode(blend_mode);
681*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
682*3ac0a46fSAndroid Build Coastguard Worker }
683*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_TransformAnnots(FPDF_PAGE page,double a,double b,double c,double d,double e,double f)684*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDFPage_TransformAnnots(FPDF_PAGE page,
685*3ac0a46fSAndroid Build Coastguard Worker double a,
686*3ac0a46fSAndroid Build Coastguard Worker double b,
687*3ac0a46fSAndroid Build Coastguard Worker double c,
688*3ac0a46fSAndroid Build Coastguard Worker double d,
689*3ac0a46fSAndroid Build Coastguard Worker double e,
690*3ac0a46fSAndroid Build Coastguard Worker double f) {
691*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
692*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
693*3ac0a46fSAndroid Build Coastguard Worker return;
694*3ac0a46fSAndroid Build Coastguard Worker
695*3ac0a46fSAndroid Build Coastguard Worker CPDF_AnnotList AnnotList(pPage);
696*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < AnnotList.Count(); ++i) {
697*3ac0a46fSAndroid Build Coastguard Worker CPDF_Annot* pAnnot = AnnotList.GetAt(i);
698*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix matrix((float)a, (float)b, (float)c, (float)d, (float)e,
699*3ac0a46fSAndroid Build Coastguard Worker (float)f);
700*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rect = matrix.TransformRect(pAnnot->GetRect());
701*3ac0a46fSAndroid Build Coastguard Worker
702*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> pAnnotDict = pAnnot->GetMutableAnnotDict();
703*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Array> pRectArray = pAnnotDict->GetMutableArrayFor("Rect");
704*3ac0a46fSAndroid Build Coastguard Worker if (pRectArray)
705*3ac0a46fSAndroid Build Coastguard Worker pRectArray->Clear();
706*3ac0a46fSAndroid Build Coastguard Worker else
707*3ac0a46fSAndroid Build Coastguard Worker pRectArray = pAnnotDict->SetNewFor<CPDF_Array>("Rect");
708*3ac0a46fSAndroid Build Coastguard Worker
709*3ac0a46fSAndroid Build Coastguard Worker pRectArray->AppendNew<CPDF_Number>(rect.left);
710*3ac0a46fSAndroid Build Coastguard Worker pRectArray->AppendNew<CPDF_Number>(rect.bottom);
711*3ac0a46fSAndroid Build Coastguard Worker pRectArray->AppendNew<CPDF_Number>(rect.right);
712*3ac0a46fSAndroid Build Coastguard Worker pRectArray->AppendNew<CPDF_Number>(rect.top);
713*3ac0a46fSAndroid Build Coastguard Worker
714*3ac0a46fSAndroid Build Coastguard Worker // TODO(unknown): Transform AP's rectangle
715*3ac0a46fSAndroid Build Coastguard Worker }
716*3ac0a46fSAndroid Build Coastguard Worker }
717*3ac0a46fSAndroid Build Coastguard Worker
FPDFPage_SetRotation(FPDF_PAGE page,int rotate)718*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDFPage_SetRotation(FPDF_PAGE page,
719*3ac0a46fSAndroid Build Coastguard Worker int rotate) {
720*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
721*3ac0a46fSAndroid Build Coastguard Worker if (!IsPageObject(pPage))
722*3ac0a46fSAndroid Build Coastguard Worker return;
723*3ac0a46fSAndroid Build Coastguard Worker
724*3ac0a46fSAndroid Build Coastguard Worker rotate %= 4;
725*3ac0a46fSAndroid Build Coastguard Worker pPage->GetMutableDict()->SetNewFor<CPDF_Number>(pdfium::page_object::kRotate,
726*3ac0a46fSAndroid Build Coastguard Worker rotate * 90);
727*3ac0a46fSAndroid Build Coastguard Worker pPage->UpdateDimensions();
728*3ac0a46fSAndroid Build Coastguard Worker }
729*3ac0a46fSAndroid Build Coastguard Worker
FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object,unsigned int R,unsigned int G,unsigned int B,unsigned int A)730*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object,
731*3ac0a46fSAndroid Build Coastguard Worker unsigned int R,
732*3ac0a46fSAndroid Build Coastguard Worker unsigned int G,
733*3ac0a46fSAndroid Build Coastguard Worker unsigned int B,
734*3ac0a46fSAndroid Build Coastguard Worker unsigned int A) {
735*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
736*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || R > 255 || G > 255 || B > 255 || A > 255)
737*3ac0a46fSAndroid Build Coastguard Worker return false;
738*3ac0a46fSAndroid Build Coastguard Worker
739*3ac0a46fSAndroid Build Coastguard Worker std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
740*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GeneralState.SetFillAlpha(A / 255.f);
741*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_ColorState.SetFillColor(
742*3ac0a46fSAndroid Build Coastguard Worker CPDF_ColorSpace::GetStockCS(CPDF_ColorSpace::Family::kDeviceRGB),
743*3ac0a46fSAndroid Build Coastguard Worker std::move(rgb));
744*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
745*3ac0a46fSAndroid Build Coastguard Worker return true;
746*3ac0a46fSAndroid Build Coastguard Worker }
747*3ac0a46fSAndroid Build Coastguard Worker
748*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetFillColor(FPDF_PAGEOBJECT page_object,unsigned int * R,unsigned int * G,unsigned int * B,unsigned int * A)749*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetFillColor(FPDF_PAGEOBJECT page_object,
750*3ac0a46fSAndroid Build Coastguard Worker unsigned int* R,
751*3ac0a46fSAndroid Build Coastguard Worker unsigned int* G,
752*3ac0a46fSAndroid Build Coastguard Worker unsigned int* B,
753*3ac0a46fSAndroid Build Coastguard Worker unsigned int* A) {
754*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
755*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !R || !G || !B || !A)
756*3ac0a46fSAndroid Build Coastguard Worker return false;
757*3ac0a46fSAndroid Build Coastguard Worker
758*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj->m_ColorState.HasRef())
759*3ac0a46fSAndroid Build Coastguard Worker return false;
760*3ac0a46fSAndroid Build Coastguard Worker
761*3ac0a46fSAndroid Build Coastguard Worker FX_COLORREF fill_color = pPageObj->m_ColorState.GetFillColorRef();
762*3ac0a46fSAndroid Build Coastguard Worker *R = FXSYS_GetRValue(fill_color);
763*3ac0a46fSAndroid Build Coastguard Worker *G = FXSYS_GetGValue(fill_color);
764*3ac0a46fSAndroid Build Coastguard Worker *B = FXSYS_GetBValue(fill_color);
765*3ac0a46fSAndroid Build Coastguard Worker *A = FXSYS_GetUnsignedAlpha(pPageObj->m_GeneralState.GetFillAlpha());
766*3ac0a46fSAndroid Build Coastguard Worker return true;
767*3ac0a46fSAndroid Build Coastguard Worker }
768*3ac0a46fSAndroid Build Coastguard Worker
769*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetBounds(FPDF_PAGEOBJECT page_object,float * left,float * bottom,float * right,float * top)770*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetBounds(FPDF_PAGEOBJECT page_object,
771*3ac0a46fSAndroid Build Coastguard Worker float* left,
772*3ac0a46fSAndroid Build Coastguard Worker float* bottom,
773*3ac0a46fSAndroid Build Coastguard Worker float* right,
774*3ac0a46fSAndroid Build Coastguard Worker float* top) {
775*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
776*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
777*3ac0a46fSAndroid Build Coastguard Worker return false;
778*3ac0a46fSAndroid Build Coastguard Worker
779*3ac0a46fSAndroid Build Coastguard Worker const CFX_FloatRect& bbox = pPageObj->GetRect();
780*3ac0a46fSAndroid Build Coastguard Worker *left = bbox.left;
781*3ac0a46fSAndroid Build Coastguard Worker *bottom = bbox.bottom;
782*3ac0a46fSAndroid Build Coastguard Worker *right = bbox.right;
783*3ac0a46fSAndroid Build Coastguard Worker *top = bbox.top;
784*3ac0a46fSAndroid Build Coastguard Worker return true;
785*3ac0a46fSAndroid Build Coastguard Worker }
786*3ac0a46fSAndroid Build Coastguard Worker
787*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetRotatedBounds(FPDF_PAGEOBJECT page_object,FS_QUADPOINTSF * quad_points)788*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetRotatedBounds(FPDF_PAGEOBJECT page_object,
789*3ac0a46fSAndroid Build Coastguard Worker FS_QUADPOINTSF* quad_points) {
790*3ac0a46fSAndroid Build Coastguard Worker CPDF_PageObject* cpage_object = CPDFPageObjectFromFPDFPageObject(page_object);
791*3ac0a46fSAndroid Build Coastguard Worker if (!cpage_object || !quad_points)
792*3ac0a46fSAndroid Build Coastguard Worker return false;
793*3ac0a46fSAndroid Build Coastguard Worker
794*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix matrix;
795*3ac0a46fSAndroid Build Coastguard Worker switch (cpage_object->GetType()) {
796*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kText:
797*3ac0a46fSAndroid Build Coastguard Worker matrix = cpage_object->AsText()->GetTextMatrix();
798*3ac0a46fSAndroid Build Coastguard Worker break;
799*3ac0a46fSAndroid Build Coastguard Worker case CPDF_PageObject::Type::kImage:
800*3ac0a46fSAndroid Build Coastguard Worker matrix = cpage_object->AsImage()->matrix();
801*3ac0a46fSAndroid Build Coastguard Worker break;
802*3ac0a46fSAndroid Build Coastguard Worker default:
803*3ac0a46fSAndroid Build Coastguard Worker // TODO(crbug.com/pdfium/1840): Support more object types.
804*3ac0a46fSAndroid Build Coastguard Worker return false;
805*3ac0a46fSAndroid Build Coastguard Worker }
806*3ac0a46fSAndroid Build Coastguard Worker
807*3ac0a46fSAndroid Build Coastguard Worker const CFX_FloatRect& bbox = cpage_object->GetOriginalRect();
808*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF bottom_left = matrix.Transform({bbox.left, bbox.bottom});
809*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF bottom_right = matrix.Transform({bbox.right, bbox.bottom});
810*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF top_right = matrix.Transform({bbox.right, bbox.top});
811*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF top_left = matrix.Transform({bbox.left, bbox.top});
812*3ac0a46fSAndroid Build Coastguard Worker
813*3ac0a46fSAndroid Build Coastguard Worker // See PDF 32000-1:2008, figure 64 for the QuadPoints ordering.
814*3ac0a46fSAndroid Build Coastguard Worker quad_points->x1 = bottom_left.x;
815*3ac0a46fSAndroid Build Coastguard Worker quad_points->y1 = bottom_left.y;
816*3ac0a46fSAndroid Build Coastguard Worker quad_points->x2 = bottom_right.x;
817*3ac0a46fSAndroid Build Coastguard Worker quad_points->y2 = bottom_right.y;
818*3ac0a46fSAndroid Build Coastguard Worker quad_points->x3 = top_right.x;
819*3ac0a46fSAndroid Build Coastguard Worker quad_points->y3 = top_right.y;
820*3ac0a46fSAndroid Build Coastguard Worker quad_points->x4 = top_left.x;
821*3ac0a46fSAndroid Build Coastguard Worker quad_points->y4 = top_left.y;
822*3ac0a46fSAndroid Build Coastguard Worker return true;
823*3ac0a46fSAndroid Build Coastguard Worker }
824*3ac0a46fSAndroid Build Coastguard Worker
825*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetStrokeColor(FPDF_PAGEOBJECT page_object,unsigned int R,unsigned int G,unsigned int B,unsigned int A)826*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetStrokeColor(FPDF_PAGEOBJECT page_object,
827*3ac0a46fSAndroid Build Coastguard Worker unsigned int R,
828*3ac0a46fSAndroid Build Coastguard Worker unsigned int G,
829*3ac0a46fSAndroid Build Coastguard Worker unsigned int B,
830*3ac0a46fSAndroid Build Coastguard Worker unsigned int A) {
831*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
832*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || R > 255 || G > 255 || B > 255 || A > 255)
833*3ac0a46fSAndroid Build Coastguard Worker return false;
834*3ac0a46fSAndroid Build Coastguard Worker
835*3ac0a46fSAndroid Build Coastguard Worker std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
836*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GeneralState.SetStrokeAlpha(A / 255.f);
837*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_ColorState.SetStrokeColor(
838*3ac0a46fSAndroid Build Coastguard Worker CPDF_ColorSpace::GetStockCS(CPDF_ColorSpace::Family::kDeviceRGB),
839*3ac0a46fSAndroid Build Coastguard Worker std::move(rgb));
840*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
841*3ac0a46fSAndroid Build Coastguard Worker return true;
842*3ac0a46fSAndroid Build Coastguard Worker }
843*3ac0a46fSAndroid Build Coastguard Worker
844*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetStrokeColor(FPDF_PAGEOBJECT page_object,unsigned int * R,unsigned int * G,unsigned int * B,unsigned int * A)845*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetStrokeColor(FPDF_PAGEOBJECT page_object,
846*3ac0a46fSAndroid Build Coastguard Worker unsigned int* R,
847*3ac0a46fSAndroid Build Coastguard Worker unsigned int* G,
848*3ac0a46fSAndroid Build Coastguard Worker unsigned int* B,
849*3ac0a46fSAndroid Build Coastguard Worker unsigned int* A) {
850*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
851*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !R || !G || !B || !A)
852*3ac0a46fSAndroid Build Coastguard Worker return false;
853*3ac0a46fSAndroid Build Coastguard Worker
854*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj->m_ColorState.HasRef())
855*3ac0a46fSAndroid Build Coastguard Worker return false;
856*3ac0a46fSAndroid Build Coastguard Worker
857*3ac0a46fSAndroid Build Coastguard Worker FX_COLORREF stroke_color = pPageObj->m_ColorState.GetStrokeColorRef();
858*3ac0a46fSAndroid Build Coastguard Worker *R = FXSYS_GetRValue(stroke_color);
859*3ac0a46fSAndroid Build Coastguard Worker *G = FXSYS_GetGValue(stroke_color);
860*3ac0a46fSAndroid Build Coastguard Worker *B = FXSYS_GetBValue(stroke_color);
861*3ac0a46fSAndroid Build Coastguard Worker *A = FXSYS_GetUnsignedAlpha(pPageObj->m_GeneralState.GetStrokeAlpha());
862*3ac0a46fSAndroid Build Coastguard Worker return true;
863*3ac0a46fSAndroid Build Coastguard Worker }
864*3ac0a46fSAndroid Build Coastguard Worker
865*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetStrokeWidth(FPDF_PAGEOBJECT page_object,float width)866*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetStrokeWidth(FPDF_PAGEOBJECT page_object, float width) {
867*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
868*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || width < 0.0f)
869*3ac0a46fSAndroid Build Coastguard Worker return false;
870*3ac0a46fSAndroid Build Coastguard Worker
871*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.SetLineWidth(width);
872*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
873*3ac0a46fSAndroid Build Coastguard Worker return true;
874*3ac0a46fSAndroid Build Coastguard Worker }
875*3ac0a46fSAndroid Build Coastguard Worker
876*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetStrokeWidth(FPDF_PAGEOBJECT page_object,float * width)877*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetStrokeWidth(FPDF_PAGEOBJECT page_object, float* width) {
878*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
879*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !width)
880*3ac0a46fSAndroid Build Coastguard Worker return false;
881*3ac0a46fSAndroid Build Coastguard Worker
882*3ac0a46fSAndroid Build Coastguard Worker *width = pPageObj->m_GraphState.GetLineWidth();
883*3ac0a46fSAndroid Build Coastguard Worker return true;
884*3ac0a46fSAndroid Build Coastguard Worker }
885*3ac0a46fSAndroid Build Coastguard Worker
886*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPageObj_GetLineJoin(FPDF_PAGEOBJECT page_object)887*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetLineJoin(FPDF_PAGEOBJECT page_object) {
888*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
889*3ac0a46fSAndroid Build Coastguard Worker return pPageObj ? static_cast<int>(pPageObj->m_GraphState.GetLineJoin()) : -1;
890*3ac0a46fSAndroid Build Coastguard Worker }
891*3ac0a46fSAndroid Build Coastguard Worker
892*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetLineJoin(FPDF_PAGEOBJECT page_object,int line_join)893*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetLineJoin(FPDF_PAGEOBJECT page_object, int line_join) {
894*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
895*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
896*3ac0a46fSAndroid Build Coastguard Worker return false;
897*3ac0a46fSAndroid Build Coastguard Worker
898*3ac0a46fSAndroid Build Coastguard Worker if (line_join < FPDF_LINEJOIN_MITER || line_join > FPDF_LINEJOIN_BEVEL)
899*3ac0a46fSAndroid Build Coastguard Worker return false;
900*3ac0a46fSAndroid Build Coastguard Worker
901*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.SetLineJoin(
902*3ac0a46fSAndroid Build Coastguard Worker static_cast<CFX_GraphStateData::LineJoin>(line_join));
903*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
904*3ac0a46fSAndroid Build Coastguard Worker return true;
905*3ac0a46fSAndroid Build Coastguard Worker }
906*3ac0a46fSAndroid Build Coastguard Worker
907*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPageObj_GetLineCap(FPDF_PAGEOBJECT page_object)908*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetLineCap(FPDF_PAGEOBJECT page_object) {
909*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
910*3ac0a46fSAndroid Build Coastguard Worker return pPageObj ? static_cast<int>(pPageObj->m_GraphState.GetLineCap()) : -1;
911*3ac0a46fSAndroid Build Coastguard Worker }
912*3ac0a46fSAndroid Build Coastguard Worker
913*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetLineCap(FPDF_PAGEOBJECT page_object,int line_cap)914*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetLineCap(FPDF_PAGEOBJECT page_object, int line_cap) {
915*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
916*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
917*3ac0a46fSAndroid Build Coastguard Worker return false;
918*3ac0a46fSAndroid Build Coastguard Worker
919*3ac0a46fSAndroid Build Coastguard Worker if (line_cap < FPDF_LINECAP_BUTT ||
920*3ac0a46fSAndroid Build Coastguard Worker line_cap > FPDF_LINECAP_PROJECTING_SQUARE) {
921*3ac0a46fSAndroid Build Coastguard Worker return false;
922*3ac0a46fSAndroid Build Coastguard Worker }
923*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.SetLineCap(
924*3ac0a46fSAndroid Build Coastguard Worker static_cast<CFX_GraphStateData::LineCap>(line_cap));
925*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
926*3ac0a46fSAndroid Build Coastguard Worker return true;
927*3ac0a46fSAndroid Build Coastguard Worker }
928*3ac0a46fSAndroid Build Coastguard Worker
929*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetDashPhase(FPDF_PAGEOBJECT page_object,float * phase)930*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetDashPhase(FPDF_PAGEOBJECT page_object, float* phase) {
931*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
932*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !phase)
933*3ac0a46fSAndroid Build Coastguard Worker return false;
934*3ac0a46fSAndroid Build Coastguard Worker
935*3ac0a46fSAndroid Build Coastguard Worker *phase = pPageObj->m_GraphState.GetLineDashPhase();
936*3ac0a46fSAndroid Build Coastguard Worker return true;
937*3ac0a46fSAndroid Build Coastguard Worker }
938*3ac0a46fSAndroid Build Coastguard Worker
939*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetDashPhase(FPDF_PAGEOBJECT page_object,float phase)940*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetDashPhase(FPDF_PAGEOBJECT page_object, float phase) {
941*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
942*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
943*3ac0a46fSAndroid Build Coastguard Worker return false;
944*3ac0a46fSAndroid Build Coastguard Worker
945*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.SetLineDashPhase(phase);
946*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
947*3ac0a46fSAndroid Build Coastguard Worker return true;
948*3ac0a46fSAndroid Build Coastguard Worker }
949*3ac0a46fSAndroid Build Coastguard Worker
950*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPageObj_GetDashCount(FPDF_PAGEOBJECT page_object)951*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetDashCount(FPDF_PAGEOBJECT page_object) {
952*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
953*3ac0a46fSAndroid Build Coastguard Worker return pPageObj ? pdfium::base::checked_cast<int>(
954*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.GetLineDashSize())
955*3ac0a46fSAndroid Build Coastguard Worker : -1;
956*3ac0a46fSAndroid Build Coastguard Worker }
957*3ac0a46fSAndroid Build Coastguard Worker
958*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetDashArray(FPDF_PAGEOBJECT page_object,float * dash_array,size_t dash_count)959*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_GetDashArray(FPDF_PAGEOBJECT page_object,
960*3ac0a46fSAndroid Build Coastguard Worker float* dash_array,
961*3ac0a46fSAndroid Build Coastguard Worker size_t dash_count) {
962*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
963*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj || !dash_array)
964*3ac0a46fSAndroid Build Coastguard Worker return false;
965*3ac0a46fSAndroid Build Coastguard Worker
966*3ac0a46fSAndroid Build Coastguard Worker auto dash_vector = pPageObj->m_GraphState.GetLineDashArray();
967*3ac0a46fSAndroid Build Coastguard Worker if (dash_vector.size() > dash_count)
968*3ac0a46fSAndroid Build Coastguard Worker return false;
969*3ac0a46fSAndroid Build Coastguard Worker
970*3ac0a46fSAndroid Build Coastguard Worker FXSYS_memcpy(dash_array, dash_vector.data(),
971*3ac0a46fSAndroid Build Coastguard Worker dash_vector.size() * sizeof(float));
972*3ac0a46fSAndroid Build Coastguard Worker return true;
973*3ac0a46fSAndroid Build Coastguard Worker }
974*3ac0a46fSAndroid Build Coastguard Worker
975*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_SetDashArray(FPDF_PAGEOBJECT page_object,const float * dash_array,size_t dash_count,float phase)976*3ac0a46fSAndroid Build Coastguard Worker FPDFPageObj_SetDashArray(FPDF_PAGEOBJECT page_object,
977*3ac0a46fSAndroid Build Coastguard Worker const float* dash_array,
978*3ac0a46fSAndroid Build Coastguard Worker size_t dash_count,
979*3ac0a46fSAndroid Build Coastguard Worker float phase) {
980*3ac0a46fSAndroid Build Coastguard Worker if (dash_count > 0 && !dash_array)
981*3ac0a46fSAndroid Build Coastguard Worker return false;
982*3ac0a46fSAndroid Build Coastguard Worker
983*3ac0a46fSAndroid Build Coastguard Worker auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
984*3ac0a46fSAndroid Build Coastguard Worker if (!pPageObj)
985*3ac0a46fSAndroid Build Coastguard Worker return false;
986*3ac0a46fSAndroid Build Coastguard Worker
987*3ac0a46fSAndroid Build Coastguard Worker std::vector<float> dashes;
988*3ac0a46fSAndroid Build Coastguard Worker if (dash_count > 0) {
989*3ac0a46fSAndroid Build Coastguard Worker dashes.reserve(dash_count);
990*3ac0a46fSAndroid Build Coastguard Worker dashes.assign(dash_array, dash_array + dash_count);
991*3ac0a46fSAndroid Build Coastguard Worker }
992*3ac0a46fSAndroid Build Coastguard Worker
993*3ac0a46fSAndroid Build Coastguard Worker pPageObj->m_GraphState.SetLineDash(dashes, phase, 1.0f);
994*3ac0a46fSAndroid Build Coastguard Worker
995*3ac0a46fSAndroid Build Coastguard Worker pPageObj->SetDirty(true);
996*3ac0a46fSAndroid Build Coastguard Worker return true;
997*3ac0a46fSAndroid Build Coastguard Worker }
998*3ac0a46fSAndroid Build Coastguard Worker
999*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFFormObj_CountObjects(FPDF_PAGEOBJECT form_object)1000*3ac0a46fSAndroid Build Coastguard Worker FPDFFormObj_CountObjects(FPDF_PAGEOBJECT form_object) {
1001*3ac0a46fSAndroid Build Coastguard Worker const auto* pObjectList = CPDFPageObjHolderFromFPDFFormObject(form_object);
1002*3ac0a46fSAndroid Build Coastguard Worker return pObjectList ? pdfium::base::checked_cast<int>(
1003*3ac0a46fSAndroid Build Coastguard Worker pObjectList->GetPageObjectCount())
1004*3ac0a46fSAndroid Build Coastguard Worker : -1;
1005*3ac0a46fSAndroid Build Coastguard Worker }
1006*3ac0a46fSAndroid Build Coastguard Worker
1007*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object,unsigned long index)1008*3ac0a46fSAndroid Build Coastguard Worker FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object, unsigned long index) {
1009*3ac0a46fSAndroid Build Coastguard Worker const auto* pObjectList = CPDFPageObjHolderFromFPDFFormObject(form_object);
1010*3ac0a46fSAndroid Build Coastguard Worker if (!pObjectList)
1011*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
1012*3ac0a46fSAndroid Build Coastguard Worker
1013*3ac0a46fSAndroid Build Coastguard Worker return FPDFPageObjectFromCPDFPageObject(
1014*3ac0a46fSAndroid Build Coastguard Worker pObjectList->GetPageObjectByIndex(index));
1015*3ac0a46fSAndroid Build Coastguard Worker }
1016