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