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