1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_formfill.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
10*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
11*3ac0a46fSAndroid Build Coastguard Worker
12*3ac0a46fSAndroid Build Coastguard Worker #include "constants/form_fields.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_annotcontext.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_occontext.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_page.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_dictionary.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_stream.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/render/cpdf_renderoptions.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formcontrol.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formfield.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_interactiveform.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_defaultrenderdevice.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_annot.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_interactiveform.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_pageview.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdfview.h"
31*3ac0a46fSAndroid Build Coastguard Worker
32*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
33*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
35*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker #if defined(_SKIA_SUPPORT_)
38*3ac0a46fSAndroid Build Coastguard Worker class SkCanvas;
39*3ac0a46fSAndroid Build Coastguard Worker #endif // defined(_SKIA_SUPPORT_)
40*3ac0a46fSAndroid Build Coastguard Worker
41*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
42*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertButton::kDefault) ==
43*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_BUTTON_DEFAULT,
44*3ac0a46fSAndroid Build Coastguard Worker "Default alert button types must match");
45*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertButton::kOK) == JSPLATFORM_ALERT_BUTTON_OK,
46*3ac0a46fSAndroid Build Coastguard Worker "OK alert button types must match");
47*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertButton::kOKCancel) ==
48*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_BUTTON_OKCANCEL,
49*3ac0a46fSAndroid Build Coastguard Worker "OKCancel alert button types must match");
50*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertButton::kYesNo) ==
51*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_BUTTON_YESNO,
52*3ac0a46fSAndroid Build Coastguard Worker "YesNo alert button types must match");
53*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertButton::kYesNoCancel) ==
54*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_BUTTON_YESNOCANCEL,
55*3ac0a46fSAndroid Build Coastguard Worker "YesNoCancel alert button types must match");
56*3ac0a46fSAndroid Build Coastguard Worker
57*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kDefault) ==
58*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_DEFAULT,
59*3ac0a46fSAndroid Build Coastguard Worker "Default alert icon types must match");
60*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kError) ==
61*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_ERROR,
62*3ac0a46fSAndroid Build Coastguard Worker "Error alert icon types must match");
63*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kWarning) ==
64*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_WARNING,
65*3ac0a46fSAndroid Build Coastguard Worker "Warning alert icon types must match");
66*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kQuestion) ==
67*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_QUESTION,
68*3ac0a46fSAndroid Build Coastguard Worker "Question alert icon types must match");
69*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kStatus) ==
70*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_STATUS,
71*3ac0a46fSAndroid Build Coastguard Worker "Status alert icon types must match");
72*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertIcon::kAsterisk) ==
73*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_ICON_ASTERISK,
74*3ac0a46fSAndroid Build Coastguard Worker "Asterisk alert icon types must match");
75*3ac0a46fSAndroid Build Coastguard Worker
76*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertReturn::kOK) == JSPLATFORM_ALERT_RETURN_OK,
77*3ac0a46fSAndroid Build Coastguard Worker "OK alert return types must match");
78*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertReturn::kCancel) ==
79*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_RETURN_CANCEL,
80*3ac0a46fSAndroid Build Coastguard Worker "Cancel alert return types must match");
81*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertReturn::kNo) == JSPLATFORM_ALERT_RETURN_NO,
82*3ac0a46fSAndroid Build Coastguard Worker "No alert return types must match");
83*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(AlertReturn::kYes) ==
84*3ac0a46fSAndroid Build Coastguard Worker JSPLATFORM_ALERT_RETURN_YES,
85*3ac0a46fSAndroid Build Coastguard Worker "Yes alert return types must match");
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormType::kNone) == FORMTYPE_NONE,
88*3ac0a46fSAndroid Build Coastguard Worker "None form types must match");
89*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormType::kAcroForm) == FORMTYPE_ACRO_FORM,
90*3ac0a46fSAndroid Build Coastguard Worker "AcroForm form types must match");
91*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormType::kXFAFull) == FORMTYPE_XFA_FULL,
92*3ac0a46fSAndroid Build Coastguard Worker "XFA full form types must match");
93*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormType::kXFAForeground) ==
94*3ac0a46fSAndroid Build Coastguard Worker FORMTYPE_XFA_FOREGROUND,
95*3ac0a46fSAndroid Build Coastguard Worker "XFA foreground form types must match");
96*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kUnknown) ==
99*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_UNKNOWN,
100*3ac0a46fSAndroid Build Coastguard Worker "Unknown form field types must match");
101*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kPushButton) ==
102*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_PUSHBUTTON,
103*3ac0a46fSAndroid Build Coastguard Worker "PushButton form field types must match");
104*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kCheckBox) ==
105*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_CHECKBOX,
106*3ac0a46fSAndroid Build Coastguard Worker "CheckBox form field types must match");
107*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kRadioButton) ==
108*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_RADIOBUTTON,
109*3ac0a46fSAndroid Build Coastguard Worker "RadioButton form field types must match");
110*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kComboBox) ==
111*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_COMBOBOX,
112*3ac0a46fSAndroid Build Coastguard Worker "ComboBox form field types must match");
113*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kListBox) ==
114*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_LISTBOX,
115*3ac0a46fSAndroid Build Coastguard Worker "ListBox form field types must match");
116*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kTextField) ==
117*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_TEXTFIELD,
118*3ac0a46fSAndroid Build Coastguard Worker "TextField form field types must match");
119*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kSignature) ==
120*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_SIGNATURE,
121*3ac0a46fSAndroid Build Coastguard Worker "Signature form field types must match");
122*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
123*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA) == FPDF_FORMFIELD_XFA,
124*3ac0a46fSAndroid Build Coastguard Worker "XFA form field types must match");
125*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_CheckBox) ==
126*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_CHECKBOX,
127*3ac0a46fSAndroid Build Coastguard Worker "XFA CheckBox form field types must match");
128*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_ComboBox) ==
129*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_COMBOBOX,
130*3ac0a46fSAndroid Build Coastguard Worker "XFA ComboBox form field types must match");
131*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_ImageField) ==
132*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_IMAGEFIELD,
133*3ac0a46fSAndroid Build Coastguard Worker "XFA ImageField form field types must match");
134*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_ListBox) ==
135*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_LISTBOX,
136*3ac0a46fSAndroid Build Coastguard Worker "XFA ListBox form field types must match");
137*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_PushButton) ==
138*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_PUSHBUTTON,
139*3ac0a46fSAndroid Build Coastguard Worker "XFA PushButton form field types must match");
140*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_Signature) ==
141*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_SIGNATURE,
142*3ac0a46fSAndroid Build Coastguard Worker "XFA Signature form field types must match");
143*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(FormFieldType::kXFA_TextField) ==
144*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFIELD_XFA_TEXTFIELD,
145*3ac0a46fSAndroid Build Coastguard Worker "XFA TextField form field types must match");
146*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
147*3ac0a46fSAndroid Build Coastguard Worker static_assert(kFormFieldTypeCount == FPDF_FORMFIELD_COUNT,
148*3ac0a46fSAndroid Build Coastguard Worker "Number of form field types must match");
149*3ac0a46fSAndroid Build Coastguard Worker
150*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(CPDF_AAction::kCloseDocument) ==
151*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_AACTION_WC,
152*3ac0a46fSAndroid Build Coastguard Worker "CloseDocument action must match");
153*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(CPDF_AAction::kSaveDocument) ==
154*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_AACTION_WS,
155*3ac0a46fSAndroid Build Coastguard Worker "SaveDocument action must match");
156*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(CPDF_AAction::kDocumentSaved) ==
157*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_AACTION_DS,
158*3ac0a46fSAndroid Build Coastguard Worker "DocumentSaved action must match");
159*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(CPDF_AAction::kPrintDocument) ==
160*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_AACTION_WP,
161*3ac0a46fSAndroid Build Coastguard Worker "PrintDocument action must match");
162*3ac0a46fSAndroid Build Coastguard Worker static_assert(static_cast<int>(CPDF_AAction::kDocumentPrinted) ==
163*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_AACTION_DP,
164*3ac0a46fSAndroid Build Coastguard Worker "DocumentPrinted action must match");
165*3ac0a46fSAndroid Build Coastguard Worker
166*3ac0a46fSAndroid Build Coastguard Worker namespace {
167*3ac0a46fSAndroid Build Coastguard Worker
FormHandleToPageView(FPDF_FORMHANDLE hHandle,FPDF_PAGE fpdf_page)168*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle,
169*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE fpdf_page) {
170*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* pPage = IPDFPageFromFPDFPage(fpdf_page);
171*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
172*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
173*3ac0a46fSAndroid Build Coastguard Worker
174*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
175*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
176*3ac0a46fSAndroid Build Coastguard Worker return pFormFillEnv ? pFormFillEnv->GetOrCreatePageView(pPage) : nullptr;
177*3ac0a46fSAndroid Build Coastguard Worker }
178*3ac0a46fSAndroid Build Coastguard Worker
179*3ac0a46fSAndroid Build Coastguard Worker // Returns true if formfill version is correctly set. See |version| in
180*3ac0a46fSAndroid Build Coastguard Worker // FPDF_FORMFILLINFO for details regarding correct version.
CheckFormfillVersion(FPDF_FORMFILLINFO * formInfo)181*3ac0a46fSAndroid Build Coastguard Worker bool CheckFormfillVersion(FPDF_FORMFILLINFO* formInfo) {
182*3ac0a46fSAndroid Build Coastguard Worker if (!formInfo || formInfo->version < 1 || formInfo->version > 2)
183*3ac0a46fSAndroid Build Coastguard Worker return false;
184*3ac0a46fSAndroid Build Coastguard Worker
185*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
186*3ac0a46fSAndroid Build Coastguard Worker if (formInfo->version != 2)
187*3ac0a46fSAndroid Build Coastguard Worker return false;
188*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
189*3ac0a46fSAndroid Build Coastguard Worker
190*3ac0a46fSAndroid Build Coastguard Worker return true;
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker
193*3ac0a46fSAndroid Build Coastguard Worker } // namespace
194*3ac0a46fSAndroid Build Coastguard Worker
195*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x,double page_y)196*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
197*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
198*3ac0a46fSAndroid Build Coastguard Worker double page_x,
199*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
200*3ac0a46fSAndroid Build Coastguard Worker const CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
201*3ac0a46fSAndroid Build Coastguard Worker if (pPage) {
202*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle);
203*3ac0a46fSAndroid Build Coastguard Worker if (!pForm)
204*3ac0a46fSAndroid Build Coastguard Worker return -1;
205*3ac0a46fSAndroid Build Coastguard Worker
206*3ac0a46fSAndroid Build Coastguard Worker const CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
207*3ac0a46fSAndroid Build Coastguard Worker const CPDF_FormControl* pFormCtrl = pPDFForm->GetControlAtPoint(
208*3ac0a46fSAndroid Build Coastguard Worker pPage,
209*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)),
210*3ac0a46fSAndroid Build Coastguard Worker nullptr);
211*3ac0a46fSAndroid Build Coastguard Worker if (!pFormCtrl)
212*3ac0a46fSAndroid Build Coastguard Worker return -1;
213*3ac0a46fSAndroid Build Coastguard Worker const CPDF_FormField* pFormField = pFormCtrl->GetField();
214*3ac0a46fSAndroid Build Coastguard Worker return pFormField ? static_cast<int>(pFormField->GetFieldType()) : -1;
215*3ac0a46fSAndroid Build Coastguard Worker }
216*3ac0a46fSAndroid Build Coastguard Worker
217*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
218*3ac0a46fSAndroid Build Coastguard Worker const CPDFXFA_Page* pXFAPage = ToXFAPage(IPDFPageFromFPDFPage(page));
219*3ac0a46fSAndroid Build Coastguard Worker if (pXFAPage) {
220*3ac0a46fSAndroid Build Coastguard Worker return pXFAPage->HasFormFieldAtPoint(
221*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)));
222*3ac0a46fSAndroid Build Coastguard Worker }
223*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
224*3ac0a46fSAndroid Build Coastguard Worker
225*3ac0a46fSAndroid Build Coastguard Worker return -1;
226*3ac0a46fSAndroid Build Coastguard Worker }
227*3ac0a46fSAndroid Build Coastguard Worker
228*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x,double page_y)229*3ac0a46fSAndroid Build Coastguard Worker FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle,
230*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
231*3ac0a46fSAndroid Build Coastguard Worker double page_x,
232*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
233*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle);
234*3ac0a46fSAndroid Build Coastguard Worker if (!pForm)
235*3ac0a46fSAndroid Build Coastguard Worker return -1;
236*3ac0a46fSAndroid Build Coastguard Worker
237*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
238*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
239*3ac0a46fSAndroid Build Coastguard Worker return -1;
240*3ac0a46fSAndroid Build Coastguard Worker
241*3ac0a46fSAndroid Build Coastguard Worker CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
242*3ac0a46fSAndroid Build Coastguard Worker int z_order = -1;
243*3ac0a46fSAndroid Build Coastguard Worker pPDFForm->GetControlAtPoint(
244*3ac0a46fSAndroid Build Coastguard Worker pPage, CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)),
245*3ac0a46fSAndroid Build Coastguard Worker &z_order);
246*3ac0a46fSAndroid Build Coastguard Worker return z_order;
247*3ac0a46fSAndroid Build Coastguard Worker }
248*3ac0a46fSAndroid Build Coastguard Worker
249*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_FORMHANDLE FPDF_CALLCONV
FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document,FPDF_FORMFILLINFO * formInfo)250*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document,
251*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMFILLINFO* formInfo) {
252*3ac0a46fSAndroid Build Coastguard Worker if (!CheckFormfillVersion(formInfo))
253*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
254*3ac0a46fSAndroid Build Coastguard Worker
255*3ac0a46fSAndroid Build Coastguard Worker auto* pDocument = CPDFDocumentFromFPDFDocument(document);
256*3ac0a46fSAndroid Build Coastguard Worker if (!pDocument)
257*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
258*3ac0a46fSAndroid Build Coastguard Worker
259*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
260*3ac0a46fSAndroid Build Coastguard Worker CPDFXFA_Context* pContext = nullptr;
261*3ac0a46fSAndroid Build Coastguard Worker if (!formInfo->xfa_disabled) {
262*3ac0a46fSAndroid Build Coastguard Worker if (!pDocument->GetExtension()) {
263*3ac0a46fSAndroid Build Coastguard Worker pDocument->SetExtension(std::make_unique<CPDFXFA_Context>(pDocument));
264*3ac0a46fSAndroid Build Coastguard Worker }
265*3ac0a46fSAndroid Build Coastguard Worker
266*3ac0a46fSAndroid Build Coastguard Worker // If the CPDFXFA_Context has a FormFillEnvironment already then we've done
267*3ac0a46fSAndroid Build Coastguard Worker // this and can just return the old Env. Otherwise, we'll end up setting a
268*3ac0a46fSAndroid Build Coastguard Worker // new environment into the XFADocument and, that could get weird.
269*3ac0a46fSAndroid Build Coastguard Worker pContext = static_cast<CPDFXFA_Context*>(pDocument->GetExtension());
270*3ac0a46fSAndroid Build Coastguard Worker if (pContext->GetFormFillEnv()) {
271*3ac0a46fSAndroid Build Coastguard Worker return FPDFFormHandleFromCPDFSDKFormFillEnvironment(
272*3ac0a46fSAndroid Build Coastguard Worker pContext->GetFormFillEnv());
273*3ac0a46fSAndroid Build Coastguard Worker }
274*3ac0a46fSAndroid Build Coastguard Worker }
275*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
276*3ac0a46fSAndroid Build Coastguard Worker
277*3ac0a46fSAndroid Build Coastguard Worker auto pFormFillEnv =
278*3ac0a46fSAndroid Build Coastguard Worker std::make_unique<CPDFSDK_FormFillEnvironment>(pDocument, formInfo);
279*3ac0a46fSAndroid Build Coastguard Worker
280*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
281*3ac0a46fSAndroid Build Coastguard Worker if (pContext)
282*3ac0a46fSAndroid Build Coastguard Worker pContext->SetFormFillEnv(pFormFillEnv.get());
283*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
284*3ac0a46fSAndroid Build Coastguard Worker
285*3ac0a46fSAndroid Build Coastguard Worker ReportUnsupportedXFA(pDocument);
286*3ac0a46fSAndroid Build Coastguard Worker
287*3ac0a46fSAndroid Build Coastguard Worker return FPDFFormHandleFromCPDFSDKFormFillEnvironment(
288*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv.release()); // Caller takes ownership.
289*3ac0a46fSAndroid Build Coastguard Worker }
290*3ac0a46fSAndroid Build Coastguard Worker
291*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle)292*3ac0a46fSAndroid Build Coastguard Worker FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) {
293*3ac0a46fSAndroid Build Coastguard Worker if (!hHandle)
294*3ac0a46fSAndroid Build Coastguard Worker return;
295*3ac0a46fSAndroid Build Coastguard Worker
296*3ac0a46fSAndroid Build Coastguard Worker // Take back ownership of the form fill environment. This is the inverse of
297*3ac0a46fSAndroid Build Coastguard Worker // FPDFDOC_InitFormFillEnvironment() above.
298*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CPDFSDK_FormFillEnvironment> pFormFillEnv(
299*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle));
300*3ac0a46fSAndroid Build Coastguard Worker
301*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
302*3ac0a46fSAndroid Build Coastguard Worker // Reset the focused annotations and remove the SDK document from the
303*3ac0a46fSAndroid Build Coastguard Worker // XFA document.
304*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->ClearAllFocusedAnnots();
305*3ac0a46fSAndroid Build Coastguard Worker // If the document was closed first, it's possible the XFA document
306*3ac0a46fSAndroid Build Coastguard Worker // is now a nullptr.
307*3ac0a46fSAndroid Build Coastguard Worker auto* pContext =
308*3ac0a46fSAndroid Build Coastguard Worker static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
309*3ac0a46fSAndroid Build Coastguard Worker if (pContext)
310*3ac0a46fSAndroid Build Coastguard Worker pContext->SetFormFillEnv(nullptr);
311*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA
312*3ac0a46fSAndroid Build Coastguard Worker }
313*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)314*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,
315*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
316*3ac0a46fSAndroid Build Coastguard Worker int modifier,
317*3ac0a46fSAndroid Build Coastguard Worker double page_x,
318*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
319*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
320*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
321*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnMouseMove(
322*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
323*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
324*3ac0a46fSAndroid Build Coastguard Worker }
325*3ac0a46fSAndroid Build Coastguard Worker
326*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_OnMouseWheel(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,const FS_POINTF * page_coord,int delta_x,int delta_y)327*3ac0a46fSAndroid Build Coastguard Worker FORM_OnMouseWheel(FPDF_FORMHANDLE hHandle,
328*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
329*3ac0a46fSAndroid Build Coastguard Worker int modifier,
330*3ac0a46fSAndroid Build Coastguard Worker const FS_POINTF* page_coord,
331*3ac0a46fSAndroid Build Coastguard Worker int delta_x,
332*3ac0a46fSAndroid Build Coastguard Worker int delta_y) {
333*3ac0a46fSAndroid Build Coastguard Worker if (!page_coord)
334*3ac0a46fSAndroid Build Coastguard Worker return false;
335*3ac0a46fSAndroid Build Coastguard Worker
336*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
337*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
338*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnMouseWheel(
339*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
340*3ac0a46fSAndroid Build Coastguard Worker CFXPointFFromFSPointF(*page_coord), CFX_Vector(delta_x, delta_y));
341*3ac0a46fSAndroid Build Coastguard Worker }
342*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnFocus(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)343*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnFocus(FPDF_FORMHANDLE hHandle,
344*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
345*3ac0a46fSAndroid Build Coastguard Worker int modifier,
346*3ac0a46fSAndroid Build Coastguard Worker double page_x,
347*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
348*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
349*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
350*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnFocus(
351*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
352*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
353*3ac0a46fSAndroid Build Coastguard Worker }
354*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)355*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,
356*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
357*3ac0a46fSAndroid Build Coastguard Worker int modifier,
358*3ac0a46fSAndroid Build Coastguard Worker double page_x,
359*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
360*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_CLICK_LOGGING
361*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "mousedown,left,%d,%d\n", static_cast<int>(round(page_x)),
362*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(round(page_y)));
363*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_CLICK_LOGGING
364*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
365*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
366*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnLButtonDown(
367*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
368*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
369*3ac0a46fSAndroid Build Coastguard Worker }
370*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)371*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,
372*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
373*3ac0a46fSAndroid Build Coastguard Worker int modifier,
374*3ac0a46fSAndroid Build Coastguard Worker double page_x,
375*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
376*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_CLICK_LOGGING
377*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "mouseup,left,%d,%d\n", static_cast<int>(round(page_x)),
378*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(round(page_y)));
379*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_CLICK_LOGGING
380*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
381*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
382*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnLButtonUp(
383*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
384*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
385*3ac0a46fSAndroid Build Coastguard Worker }
386*3ac0a46fSAndroid Build Coastguard Worker
387*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_OnLButtonDoubleClick(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)388*3ac0a46fSAndroid Build Coastguard Worker FORM_OnLButtonDoubleClick(FPDF_FORMHANDLE hHandle,
389*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
390*3ac0a46fSAndroid Build Coastguard Worker int modifier,
391*3ac0a46fSAndroid Build Coastguard Worker double page_x,
392*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
393*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_CLICK_LOGGING
394*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "mousedown,doubleleft,%d,%d\n",
395*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(round(page_x)), static_cast<int>(round(page_y)));
396*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_CLICK_LOGGING
397*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
398*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
399*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnLButtonDblClk(
400*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
401*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
402*3ac0a46fSAndroid Build Coastguard Worker }
403*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)404*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle,
405*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
406*3ac0a46fSAndroid Build Coastguard Worker int modifier,
407*3ac0a46fSAndroid Build Coastguard Worker double page_x,
408*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
409*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_CLICK_LOGGING
410*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "mousedown,right,%d,%d\n", static_cast<int>(round(page_x)),
411*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(round(page_y)));
412*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_CLICK_LOGGING
413*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
414*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
415*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnRButtonDown(
416*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
417*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
418*3ac0a46fSAndroid Build Coastguard Worker }
419*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int modifier,double page_x,double page_y)420*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle,
421*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
422*3ac0a46fSAndroid Build Coastguard Worker int modifier,
423*3ac0a46fSAndroid Build Coastguard Worker double page_x,
424*3ac0a46fSAndroid Build Coastguard Worker double page_y) {
425*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_CLICK_LOGGING
426*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "mouseup,right,%d,%d\n", static_cast<int>(round(page_x)),
427*3ac0a46fSAndroid Build Coastguard Worker static_cast<int>(round(page_y)));
428*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_CLICK_LOGGING
429*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
430*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
431*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnRButtonUp(
432*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier),
433*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF(page_x, page_y));
434*3ac0a46fSAndroid Build Coastguard Worker }
435*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int nKeyCode,int modifier)436*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,
437*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
438*3ac0a46fSAndroid Build Coastguard Worker int nKeyCode,
439*3ac0a46fSAndroid Build Coastguard Worker int modifier) {
440*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
441*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
442*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnKeyDown(
443*3ac0a46fSAndroid Build Coastguard Worker static_cast<FWL_VKEYCODE>(nKeyCode),
444*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier));
445*3ac0a46fSAndroid Build Coastguard Worker }
446*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int nKeyCode,int modifier)447*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,
448*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
449*3ac0a46fSAndroid Build Coastguard Worker int nKeyCode,
450*3ac0a46fSAndroid Build Coastguard Worker int modifier) {
451*3ac0a46fSAndroid Build Coastguard Worker return false;
452*3ac0a46fSAndroid Build Coastguard Worker }
453*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnChar(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int nChar,int modifier)454*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnChar(FPDF_FORMHANDLE hHandle,
455*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
456*3ac0a46fSAndroid Build Coastguard Worker int nChar,
457*3ac0a46fSAndroid Build Coastguard Worker int modifier) {
458*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
459*3ac0a46fSAndroid Build Coastguard Worker return pPageView &&
460*3ac0a46fSAndroid Build Coastguard Worker pPageView->OnChar(
461*3ac0a46fSAndroid Build Coastguard Worker nChar, Mask<FWL_EVENTFLAG>::FromUnderlyingUnchecked(modifier));
462*3ac0a46fSAndroid Build Coastguard Worker }
463*3ac0a46fSAndroid Build Coastguard Worker
464*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetFocusedText(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,void * buffer,unsigned long buflen)465*3ac0a46fSAndroid Build Coastguard Worker FORM_GetFocusedText(FPDF_FORMHANDLE hHandle,
466*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
467*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
468*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen) {
469*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
470*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
471*3ac0a46fSAndroid Build Coastguard Worker return 0;
472*3ac0a46fSAndroid Build Coastguard Worker
473*3ac0a46fSAndroid Build Coastguard Worker return Utf16EncodeMaybeCopyAndReturnLength(pPageView->GetFocusedFormText(),
474*3ac0a46fSAndroid Build Coastguard Worker buffer, buflen);
475*3ac0a46fSAndroid Build Coastguard Worker }
476*3ac0a46fSAndroid Build Coastguard Worker
477*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetSelectedText(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,void * buffer,unsigned long buflen)478*3ac0a46fSAndroid Build Coastguard Worker FORM_GetSelectedText(FPDF_FORMHANDLE hHandle,
479*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
480*3ac0a46fSAndroid Build Coastguard Worker void* buffer,
481*3ac0a46fSAndroid Build Coastguard Worker unsigned long buflen) {
482*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
483*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
484*3ac0a46fSAndroid Build Coastguard Worker return 0;
485*3ac0a46fSAndroid Build Coastguard Worker
486*3ac0a46fSAndroid Build Coastguard Worker return Utf16EncodeMaybeCopyAndReturnLength(pPageView->GetSelectedText(),
487*3ac0a46fSAndroid Build Coastguard Worker buffer, buflen);
488*3ac0a46fSAndroid Build Coastguard Worker }
489*3ac0a46fSAndroid Build Coastguard Worker
490*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FORM_ReplaceAndKeepSelection(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,FPDF_WIDESTRING wsText)491*3ac0a46fSAndroid Build Coastguard Worker FORM_ReplaceAndKeepSelection(FPDF_FORMHANDLE hHandle,
492*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
493*3ac0a46fSAndroid Build Coastguard Worker FPDF_WIDESTRING wsText) {
494*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
495*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
496*3ac0a46fSAndroid Build Coastguard Worker return;
497*3ac0a46fSAndroid Build Coastguard Worker
498*3ac0a46fSAndroid Build Coastguard Worker pPageView->ReplaceAndKeepSelection(WideStringFromFPDFWideString(wsText));
499*3ac0a46fSAndroid Build Coastguard Worker }
500*3ac0a46fSAndroid Build Coastguard Worker
FORM_ReplaceSelection(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,FPDF_WIDESTRING wsText)501*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FORM_ReplaceSelection(FPDF_FORMHANDLE hHandle,
502*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
503*3ac0a46fSAndroid Build Coastguard Worker FPDF_WIDESTRING wsText) {
504*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
505*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
506*3ac0a46fSAndroid Build Coastguard Worker return;
507*3ac0a46fSAndroid Build Coastguard Worker
508*3ac0a46fSAndroid Build Coastguard Worker pPageView->ReplaceSelection(WideStringFromFPDFWideString(wsText));
509*3ac0a46fSAndroid Build Coastguard Worker }
510*3ac0a46fSAndroid Build Coastguard Worker
FORM_SelectAllText(FPDF_FORMHANDLE hHandle,FPDF_PAGE page)511*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_SelectAllText(FPDF_FORMHANDLE hHandle,
512*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page) {
513*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
514*3ac0a46fSAndroid Build Coastguard Worker return pPageView && pPageView->SelectAllText();
515*3ac0a46fSAndroid Build Coastguard Worker }
516*3ac0a46fSAndroid Build Coastguard Worker
FORM_CanUndo(FPDF_FORMHANDLE hHandle,FPDF_PAGE page)517*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanUndo(FPDF_FORMHANDLE hHandle,
518*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page) {
519*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
520*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
521*3ac0a46fSAndroid Build Coastguard Worker return false;
522*3ac0a46fSAndroid Build Coastguard Worker return pPageView->CanUndo();
523*3ac0a46fSAndroid Build Coastguard Worker }
524*3ac0a46fSAndroid Build Coastguard Worker
FORM_CanRedo(FPDF_FORMHANDLE hHandle,FPDF_PAGE page)525*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanRedo(FPDF_FORMHANDLE hHandle,
526*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page) {
527*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
528*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
529*3ac0a46fSAndroid Build Coastguard Worker return false;
530*3ac0a46fSAndroid Build Coastguard Worker return pPageView->CanRedo();
531*3ac0a46fSAndroid Build Coastguard Worker }
532*3ac0a46fSAndroid Build Coastguard Worker
FORM_Undo(FPDF_FORMHANDLE hHandle,FPDF_PAGE page)533*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Undo(FPDF_FORMHANDLE hHandle,
534*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page) {
535*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
536*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
537*3ac0a46fSAndroid Build Coastguard Worker return false;
538*3ac0a46fSAndroid Build Coastguard Worker return pPageView->Undo();
539*3ac0a46fSAndroid Build Coastguard Worker }
540*3ac0a46fSAndroid Build Coastguard Worker
FORM_Redo(FPDF_FORMHANDLE hHandle,FPDF_PAGE page)541*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Redo(FPDF_FORMHANDLE hHandle,
542*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page) {
543*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
544*3ac0a46fSAndroid Build Coastguard Worker if (!pPageView)
545*3ac0a46fSAndroid Build Coastguard Worker return false;
546*3ac0a46fSAndroid Build Coastguard Worker return pPageView->Redo();
547*3ac0a46fSAndroid Build Coastguard Worker }
548*3ac0a46fSAndroid Build Coastguard Worker
549*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle)550*3ac0a46fSAndroid Build Coastguard Worker FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) {
551*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
552*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
553*3ac0a46fSAndroid Build Coastguard Worker if (!pFormFillEnv)
554*3ac0a46fSAndroid Build Coastguard Worker return false;
555*3ac0a46fSAndroid Build Coastguard Worker return pFormFillEnv->KillFocusAnnot({});
556*3ac0a46fSAndroid Build Coastguard Worker }
557*3ac0a46fSAndroid Build Coastguard Worker
558*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_GetFocusedAnnot(FPDF_FORMHANDLE handle,int * page_index,FPDF_ANNOTATION * annot)559*3ac0a46fSAndroid Build Coastguard Worker FORM_GetFocusedAnnot(FPDF_FORMHANDLE handle,
560*3ac0a46fSAndroid Build Coastguard Worker int* page_index,
561*3ac0a46fSAndroid Build Coastguard Worker FPDF_ANNOTATION* annot) {
562*3ac0a46fSAndroid Build Coastguard Worker if (!page_index || !annot)
563*3ac0a46fSAndroid Build Coastguard Worker return false;
564*3ac0a46fSAndroid Build Coastguard Worker
565*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* form_fill_env =
566*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(handle);
567*3ac0a46fSAndroid Build Coastguard Worker if (!form_fill_env)
568*3ac0a46fSAndroid Build Coastguard Worker return false;
569*3ac0a46fSAndroid Build Coastguard Worker
570*3ac0a46fSAndroid Build Coastguard Worker // Set |page_index| and |annot| to default values. This is returned when there
571*3ac0a46fSAndroid Build Coastguard Worker // is no focused annotation.
572*3ac0a46fSAndroid Build Coastguard Worker *page_index = -1;
573*3ac0a46fSAndroid Build Coastguard Worker *annot = nullptr;
574*3ac0a46fSAndroid Build Coastguard Worker
575*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_Annot* cpdfsdk_annot = form_fill_env->GetFocusAnnot();
576*3ac0a46fSAndroid Build Coastguard Worker if (!cpdfsdk_annot)
577*3ac0a46fSAndroid Build Coastguard Worker return true;
578*3ac0a46fSAndroid Build Coastguard Worker
579*3ac0a46fSAndroid Build Coastguard Worker // TODO(crbug.com/pdfium/1482): Handle XFA case.
580*3ac0a46fSAndroid Build Coastguard Worker if (cpdfsdk_annot->AsXFAWidget())
581*3ac0a46fSAndroid Build Coastguard Worker return true;
582*3ac0a46fSAndroid Build Coastguard Worker
583*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* page_view = cpdfsdk_annot->GetPageView();
584*3ac0a46fSAndroid Build Coastguard Worker if (!page_view->IsValid())
585*3ac0a46fSAndroid Build Coastguard Worker return true;
586*3ac0a46fSAndroid Build Coastguard Worker
587*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* page = cpdfsdk_annot->GetPage();
588*3ac0a46fSAndroid Build Coastguard Worker if (!page)
589*3ac0a46fSAndroid Build Coastguard Worker return true;
590*3ac0a46fSAndroid Build Coastguard Worker
591*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> annot_dict =
592*3ac0a46fSAndroid Build Coastguard Worker cpdfsdk_annot->GetPDFAnnot()->GetMutableAnnotDict();
593*3ac0a46fSAndroid Build Coastguard Worker auto annot_context =
594*3ac0a46fSAndroid Build Coastguard Worker std::make_unique<CPDF_AnnotContext>(std::move(annot_dict), page);
595*3ac0a46fSAndroid Build Coastguard Worker
596*3ac0a46fSAndroid Build Coastguard Worker *page_index = page_view->GetPageIndex();
597*3ac0a46fSAndroid Build Coastguard Worker // Caller takes ownership.
598*3ac0a46fSAndroid Build Coastguard Worker *annot = FPDFAnnotationFromCPDFAnnotContext(annot_context.release());
599*3ac0a46fSAndroid Build Coastguard Worker return true;
600*3ac0a46fSAndroid Build Coastguard Worker }
601*3ac0a46fSAndroid Build Coastguard Worker
602*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SetFocusedAnnot(FPDF_FORMHANDLE handle,FPDF_ANNOTATION annot)603*3ac0a46fSAndroid Build Coastguard Worker FORM_SetFocusedAnnot(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot) {
604*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* form_fill_env =
605*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(handle);
606*3ac0a46fSAndroid Build Coastguard Worker if (!form_fill_env)
607*3ac0a46fSAndroid Build Coastguard Worker return false;
608*3ac0a46fSAndroid Build Coastguard Worker
609*3ac0a46fSAndroid Build Coastguard Worker CPDF_AnnotContext* annot_context = CPDFAnnotContextFromFPDFAnnotation(annot);
610*3ac0a46fSAndroid Build Coastguard Worker if (!annot_context)
611*3ac0a46fSAndroid Build Coastguard Worker return false;
612*3ac0a46fSAndroid Build Coastguard Worker
613*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* page_view =
614*3ac0a46fSAndroid Build Coastguard Worker form_fill_env->GetOrCreatePageView(annot_context->GetPage());
615*3ac0a46fSAndroid Build Coastguard Worker if (!page_view->IsValid())
616*3ac0a46fSAndroid Build Coastguard Worker return false;
617*3ac0a46fSAndroid Build Coastguard Worker
618*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDF_Dictionary> annot_dict = annot_context->GetMutableAnnotDict();
619*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPDFSDK_Annot> cpdfsdk_annot(
620*3ac0a46fSAndroid Build Coastguard Worker page_view->GetAnnotByDict(annot_dict.Get()));
621*3ac0a46fSAndroid Build Coastguard Worker if (!cpdfsdk_annot)
622*3ac0a46fSAndroid Build Coastguard Worker return false;
623*3ac0a46fSAndroid Build Coastguard Worker
624*3ac0a46fSAndroid Build Coastguard Worker return form_fill_env->SetFocusAnnot(cpdfsdk_annot);
625*3ac0a46fSAndroid Build Coastguard Worker }
626*3ac0a46fSAndroid Build Coastguard Worker
FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,FPDF_BITMAP bitmap,FPDF_PAGE page,int start_x,int start_y,int size_x,int size_y,int rotate,int flags)627*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,
628*3ac0a46fSAndroid Build Coastguard Worker FPDF_BITMAP bitmap,
629*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
630*3ac0a46fSAndroid Build Coastguard Worker int start_x,
631*3ac0a46fSAndroid Build Coastguard Worker int start_y,
632*3ac0a46fSAndroid Build Coastguard Worker int size_x,
633*3ac0a46fSAndroid Build Coastguard Worker int size_y,
634*3ac0a46fSAndroid Build Coastguard Worker int rotate,
635*3ac0a46fSAndroid Build Coastguard Worker int flags) {
636*3ac0a46fSAndroid Build Coastguard Worker if (!hHandle)
637*3ac0a46fSAndroid Build Coastguard Worker return;
638*3ac0a46fSAndroid Build Coastguard Worker
639*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* pPage = IPDFPageFromFPDFPage(page);
640*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
641*3ac0a46fSAndroid Build Coastguard Worker return;
642*3ac0a46fSAndroid Build Coastguard Worker
643*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pPDFDoc = pPage->GetDocument();
644*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
645*3ac0a46fSAndroid Build Coastguard Worker
646*3ac0a46fSAndroid Build Coastguard Worker const FX_RECT rect(start_x, start_y, start_x + size_x, start_y + size_y);
647*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix matrix = pPage->GetDisplayMatrix(rect, rotate);
648*3ac0a46fSAndroid Build Coastguard Worker
649*3ac0a46fSAndroid Build Coastguard Worker auto pDevice = std::make_unique<CFX_DefaultRenderDevice>();
650*3ac0a46fSAndroid Build Coastguard Worker #if defined(_SKIA_SUPPORT_)
651*3ac0a46fSAndroid Build Coastguard Worker if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() && canvas) {
652*3ac0a46fSAndroid Build Coastguard Worker pDevice->AttachCanvas(reinterpret_cast<SkCanvas*>(canvas));
653*3ac0a46fSAndroid Build Coastguard Worker }
654*3ac0a46fSAndroid Build Coastguard Worker #endif
655*3ac0a46fSAndroid Build Coastguard Worker
656*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> holder(CFXDIBitmapFromFPDFBitmap(bitmap));
657*3ac0a46fSAndroid Build Coastguard Worker pDevice->AttachWithRgbByteOrder(holder, !!(flags & FPDF_REVERSE_BYTE_ORDER));
658*3ac0a46fSAndroid Build Coastguard Worker {
659*3ac0a46fSAndroid Build Coastguard Worker CFX_RenderDevice::StateRestorer restorer(pDevice.get());
660*3ac0a46fSAndroid Build Coastguard Worker pDevice->SetClip_Rect(rect);
661*3ac0a46fSAndroid Build Coastguard Worker
662*3ac0a46fSAndroid Build Coastguard Worker CPDF_RenderOptions options;
663*3ac0a46fSAndroid Build Coastguard Worker options.GetOptions().bClearType = !!(flags & FPDF_LCD_TEXT);
664*3ac0a46fSAndroid Build Coastguard Worker
665*3ac0a46fSAndroid Build Coastguard Worker // Grayscale output
666*3ac0a46fSAndroid Build Coastguard Worker if (flags & FPDF_GRAYSCALE)
667*3ac0a46fSAndroid Build Coastguard Worker options.SetColorMode(CPDF_RenderOptions::kGray);
668*3ac0a46fSAndroid Build Coastguard Worker
669*3ac0a46fSAndroid Build Coastguard Worker options.SetDrawAnnots(flags & FPDF_ANNOT);
670*3ac0a46fSAndroid Build Coastguard Worker options.SetOCContext(
671*3ac0a46fSAndroid Build Coastguard Worker pdfium::MakeRetain<CPDF_OCContext>(pPDFDoc, CPDF_OCContext::kView));
672*3ac0a46fSAndroid Build Coastguard Worker
673*3ac0a46fSAndroid Build Coastguard Worker if (pPageView)
674*3ac0a46fSAndroid Build Coastguard Worker pPageView->PageView_OnDraw(pDevice.get(), matrix, &options, rect);
675*3ac0a46fSAndroid Build Coastguard Worker }
676*3ac0a46fSAndroid Build Coastguard Worker }
677*3ac0a46fSAndroid Build Coastguard Worker
FPDF_FFLDrawWithMatrix(FPDF_FORMHANDLE hHandle,FPDF_BITMAP bitmap,FPDF_PAGE page,const FS_MATRIX * matrix,const FS_RECTF * clipping,int flags)678*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLDrawWithMatrix(FPDF_FORMHANDLE hHandle,
679*3ac0a46fSAndroid Build Coastguard Worker FPDF_BITMAP bitmap,
680*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
681*3ac0a46fSAndroid Build Coastguard Worker const FS_MATRIX* matrix,
682*3ac0a46fSAndroid Build Coastguard Worker const FS_RECTF* clipping,
683*3ac0a46fSAndroid Build Coastguard Worker int flags) {
684*3ac0a46fSAndroid Build Coastguard Worker if (!hHandle)
685*3ac0a46fSAndroid Build Coastguard Worker return;
686*3ac0a46fSAndroid Build Coastguard Worker
687*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* pPage = IPDFPageFromFPDFPage(page);
688*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
689*3ac0a46fSAndroid Build Coastguard Worker return;
690*3ac0a46fSAndroid Build Coastguard Worker
691*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pPDFDoc = pPage->GetDocument();
692*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
693*3ac0a46fSAndroid Build Coastguard Worker
694*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect clipping_rect;
695*3ac0a46fSAndroid Build Coastguard Worker if (clipping)
696*3ac0a46fSAndroid Build Coastguard Worker clipping_rect = CFXFloatRectFromFSRectF(*clipping);
697*3ac0a46fSAndroid Build Coastguard Worker FX_RECT clip_rect = clipping_rect.ToFxRect();
698*3ac0a46fSAndroid Build Coastguard Worker
699*3ac0a46fSAndroid Build Coastguard Worker const FX_RECT rect(0, 0, pPage->GetPageWidth(), pPage->GetPageHeight());
700*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix transform_matrix = pPage->GetDisplayMatrix(rect, 0);
701*3ac0a46fSAndroid Build Coastguard Worker if (matrix)
702*3ac0a46fSAndroid Build Coastguard Worker transform_matrix *= CFXMatrixFromFSMatrix(*matrix);
703*3ac0a46fSAndroid Build Coastguard Worker
704*3ac0a46fSAndroid Build Coastguard Worker auto pDevice = std::make_unique<CFX_DefaultRenderDevice>();
705*3ac0a46fSAndroid Build Coastguard Worker #if defined(_SKIA_SUPPORT_)
706*3ac0a46fSAndroid Build Coastguard Worker if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() && canvas) {
707*3ac0a46fSAndroid Build Coastguard Worker pDevice->AttachCanvas(reinterpret_cast<SkCanvas*>(canvas));
708*3ac0a46fSAndroid Build Coastguard Worker }
709*3ac0a46fSAndroid Build Coastguard Worker #endif
710*3ac0a46fSAndroid Build Coastguard Worker
711*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> holder(CFXDIBitmapFromFPDFBitmap(bitmap));
712*3ac0a46fSAndroid Build Coastguard Worker pDevice->AttachWithRgbByteOrder(holder, !!(flags & FPDF_REVERSE_BYTE_ORDER));
713*3ac0a46fSAndroid Build Coastguard Worker {
714*3ac0a46fSAndroid Build Coastguard Worker CFX_RenderDevice::StateRestorer restorer(pDevice.get());
715*3ac0a46fSAndroid Build Coastguard Worker pDevice->SetClip_Rect(clip_rect);
716*3ac0a46fSAndroid Build Coastguard Worker
717*3ac0a46fSAndroid Build Coastguard Worker CPDF_RenderOptions options;
718*3ac0a46fSAndroid Build Coastguard Worker options.GetOptions().bClearType = !!(flags & FPDF_LCD_TEXT);
719*3ac0a46fSAndroid Build Coastguard Worker
720*3ac0a46fSAndroid Build Coastguard Worker // Grayscale output
721*3ac0a46fSAndroid Build Coastguard Worker if (flags & FPDF_GRAYSCALE)
722*3ac0a46fSAndroid Build Coastguard Worker options.SetColorMode(CPDF_RenderOptions::kGray);
723*3ac0a46fSAndroid Build Coastguard Worker
724*3ac0a46fSAndroid Build Coastguard Worker options.SetDrawAnnots(flags & FPDF_ANNOT);
725*3ac0a46fSAndroid Build Coastguard Worker options.SetOCContext(
726*3ac0a46fSAndroid Build Coastguard Worker pdfium::MakeRetain<CPDF_OCContext>(pPDFDoc, CPDF_OCContext::kView));
727*3ac0a46fSAndroid Build Coastguard Worker
728*3ac0a46fSAndroid Build Coastguard Worker if (pPageView)
729*3ac0a46fSAndroid Build Coastguard Worker pPageView->PageView_OnDraw(pDevice.get(), transform_matrix, &options, clip_rect);
730*3ac0a46fSAndroid Build Coastguard Worker }
731*3ac0a46fSAndroid Build Coastguard Worker }
732*3ac0a46fSAndroid Build Coastguard Worker
733*3ac0a46fSAndroid Build Coastguard Worker #if defined(_SKIA_SUPPORT_)
FPDF_FFLDrawSkia(FPDF_FORMHANDLE hHandle,FPDF_SKIA_CANVAS canvas,FPDF_PAGE page,int start_x,int start_y,int size_x,int size_y,int rotate,int flags)734*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLDrawSkia(FPDF_FORMHANDLE hHandle,
735*3ac0a46fSAndroid Build Coastguard Worker FPDF_SKIA_CANVAS canvas,
736*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
737*3ac0a46fSAndroid Build Coastguard Worker int start_x,
738*3ac0a46fSAndroid Build Coastguard Worker int start_y,
739*3ac0a46fSAndroid Build Coastguard Worker int size_x,
740*3ac0a46fSAndroid Build Coastguard Worker int size_y,
741*3ac0a46fSAndroid Build Coastguard Worker int rotate,
742*3ac0a46fSAndroid Build Coastguard Worker int flags) {
743*3ac0a46fSAndroid Build Coastguard Worker FFLCommon(hHandle, nullptr, canvas, page, start_x, start_y, size_x, size_y,
744*3ac0a46fSAndroid Build Coastguard Worker rotate, flags);
745*3ac0a46fSAndroid Build Coastguard Worker }
746*3ac0a46fSAndroid Build Coastguard Worker #endif
747*3ac0a46fSAndroid Build Coastguard Worker
748*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,int fieldType,unsigned long color)749*3ac0a46fSAndroid Build Coastguard Worker FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,
750*3ac0a46fSAndroid Build Coastguard Worker int fieldType,
751*3ac0a46fSAndroid Build Coastguard Worker unsigned long color) {
752*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle);
753*3ac0a46fSAndroid Build Coastguard Worker if (!pForm)
754*3ac0a46fSAndroid Build Coastguard Worker return;
755*3ac0a46fSAndroid Build Coastguard Worker
756*3ac0a46fSAndroid Build Coastguard Worker absl::optional<FormFieldType> cast_input =
757*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormField::IntToFormFieldType(fieldType);
758*3ac0a46fSAndroid Build Coastguard Worker if (!cast_input.has_value())
759*3ac0a46fSAndroid Build Coastguard Worker return;
760*3ac0a46fSAndroid Build Coastguard Worker
761*3ac0a46fSAndroid Build Coastguard Worker if (cast_input.value() == FormFieldType::kUnknown) {
762*3ac0a46fSAndroid Build Coastguard Worker pForm->SetAllHighlightColors(static_cast<FX_COLORREF>(color));
763*3ac0a46fSAndroid Build Coastguard Worker } else {
764*3ac0a46fSAndroid Build Coastguard Worker pForm->SetHighlightColor(static_cast<FX_COLORREF>(color),
765*3ac0a46fSAndroid Build Coastguard Worker cast_input.value());
766*3ac0a46fSAndroid Build Coastguard Worker }
767*3ac0a46fSAndroid Build Coastguard Worker }
768*3ac0a46fSAndroid Build Coastguard Worker
769*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle,unsigned char alpha)770*3ac0a46fSAndroid Build Coastguard Worker FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha) {
771*3ac0a46fSAndroid Build Coastguard Worker if (CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle))
772*3ac0a46fSAndroid Build Coastguard Worker pForm->SetHighlightAlpha(alpha);
773*3ac0a46fSAndroid Build Coastguard Worker }
774*3ac0a46fSAndroid Build Coastguard Worker
775*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle)776*3ac0a46fSAndroid Build Coastguard Worker FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) {
777*3ac0a46fSAndroid Build Coastguard Worker if (CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle))
778*3ac0a46fSAndroid Build Coastguard Worker pForm->RemoveAllHighLights();
779*3ac0a46fSAndroid Build Coastguard Worker }
780*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnAfterLoadPage(FPDF_PAGE page,FPDF_FORMHANDLE hHandle)781*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FORM_OnAfterLoadPage(FPDF_PAGE page,
782*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE hHandle) {
783*3ac0a46fSAndroid Build Coastguard Worker if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page))
784*3ac0a46fSAndroid Build Coastguard Worker pPageView->SetValid(true);
785*3ac0a46fSAndroid Build Coastguard Worker }
786*3ac0a46fSAndroid Build Coastguard Worker
FORM_OnBeforeClosePage(FPDF_PAGE page,FPDF_FORMHANDLE hHandle)787*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FORM_OnBeforeClosePage(FPDF_PAGE page,
788*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE hHandle) {
789*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
790*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
791*3ac0a46fSAndroid Build Coastguard Worker if (!pFormFillEnv)
792*3ac0a46fSAndroid Build Coastguard Worker return;
793*3ac0a46fSAndroid Build Coastguard Worker
794*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* pPage = IPDFPageFromFPDFPage(page);
795*3ac0a46fSAndroid Build Coastguard Worker if (!pPage)
796*3ac0a46fSAndroid Build Coastguard Worker return;
797*3ac0a46fSAndroid Build Coastguard Worker
798*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = pFormFillEnv->GetPageView(pPage);
799*3ac0a46fSAndroid Build Coastguard Worker if (pPageView) {
800*3ac0a46fSAndroid Build Coastguard Worker pPageView->SetValid(false);
801*3ac0a46fSAndroid Build Coastguard Worker // RemovePageView() takes care of the delete for us.
802*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->RemovePageView(pPage);
803*3ac0a46fSAndroid Build Coastguard Worker }
804*3ac0a46fSAndroid Build Coastguard Worker }
805*3ac0a46fSAndroid Build Coastguard Worker
806*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle)807*3ac0a46fSAndroid Build Coastguard Worker FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) {
808*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
809*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
810*3ac0a46fSAndroid Build Coastguard Worker if (pFormFillEnv && pFormFillEnv->IsJSPlatformPresent())
811*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->ProcJavascriptAction();
812*3ac0a46fSAndroid Build Coastguard Worker }
813*3ac0a46fSAndroid Build Coastguard Worker
814*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle)815*3ac0a46fSAndroid Build Coastguard Worker FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) {
816*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
817*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
818*3ac0a46fSAndroid Build Coastguard Worker if (pFormFillEnv)
819*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->ProcOpenAction();
820*3ac0a46fSAndroid Build Coastguard Worker }
821*3ac0a46fSAndroid Build Coastguard Worker
FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle,int aaType)822*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle,
823*3ac0a46fSAndroid Build Coastguard Worker int aaType) {
824*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
825*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
826*3ac0a46fSAndroid Build Coastguard Worker if (!pFormFillEnv)
827*3ac0a46fSAndroid Build Coastguard Worker return;
828*3ac0a46fSAndroid Build Coastguard Worker
829*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* pDoc = pFormFillEnv->GetPDFDocument();
830*3ac0a46fSAndroid Build Coastguard Worker const CPDF_Dictionary* pDict = pDoc->GetRoot();
831*3ac0a46fSAndroid Build Coastguard Worker if (!pDict)
832*3ac0a46fSAndroid Build Coastguard Worker return;
833*3ac0a46fSAndroid Build Coastguard Worker
834*3ac0a46fSAndroid Build Coastguard Worker CPDF_AAction aa(pDict->GetDictFor(pdfium::form_fields::kAA));
835*3ac0a46fSAndroid Build Coastguard Worker auto type = static_cast<CPDF_AAction::AActionType>(aaType);
836*3ac0a46fSAndroid Build Coastguard Worker if (aa.ActionExist(type))
837*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->DoActionDocument(aa.GetAction(type), type);
838*3ac0a46fSAndroid Build Coastguard Worker }
839*3ac0a46fSAndroid Build Coastguard Worker
FORM_DoPageAAction(FPDF_PAGE page,FPDF_FORMHANDLE hHandle,int aaType)840*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT void FPDF_CALLCONV FORM_DoPageAAction(FPDF_PAGE page,
841*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE hHandle,
842*3ac0a46fSAndroid Build Coastguard Worker int aaType) {
843*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* pFormFillEnv =
844*3ac0a46fSAndroid Build Coastguard Worker CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle);
845*3ac0a46fSAndroid Build Coastguard Worker if (!pFormFillEnv)
846*3ac0a46fSAndroid Build Coastguard Worker return;
847*3ac0a46fSAndroid Build Coastguard Worker
848*3ac0a46fSAndroid Build Coastguard Worker IPDF_Page* pPage = IPDFPageFromFPDFPage(page);
849*3ac0a46fSAndroid Build Coastguard Worker CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page);
850*3ac0a46fSAndroid Build Coastguard Worker if (!pPDFPage)
851*3ac0a46fSAndroid Build Coastguard Worker return;
852*3ac0a46fSAndroid Build Coastguard Worker
853*3ac0a46fSAndroid Build Coastguard Worker if (!pFormFillEnv->GetPageView(pPage))
854*3ac0a46fSAndroid Build Coastguard Worker return;
855*3ac0a46fSAndroid Build Coastguard Worker
856*3ac0a46fSAndroid Build Coastguard Worker CPDF_AAction aa(pPDFPage->GetDict()->GetDictFor(pdfium::form_fields::kAA));
857*3ac0a46fSAndroid Build Coastguard Worker CPDF_AAction::AActionType type = aaType == FPDFPAGE_AACTION_OPEN
858*3ac0a46fSAndroid Build Coastguard Worker ? CPDF_AAction::kOpenPage
859*3ac0a46fSAndroid Build Coastguard Worker : CPDF_AAction::kClosePage;
860*3ac0a46fSAndroid Build Coastguard Worker if (aa.ActionExist(type))
861*3ac0a46fSAndroid Build Coastguard Worker pFormFillEnv->DoActionPage(aa.GetAction(type), type);
862*3ac0a46fSAndroid Build Coastguard Worker }
863*3ac0a46fSAndroid Build Coastguard Worker
864*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SetIndexSelected(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int index,FPDF_BOOL selected)865*3ac0a46fSAndroid Build Coastguard Worker FORM_SetIndexSelected(FPDF_FORMHANDLE hHandle,
866*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page,
867*3ac0a46fSAndroid Build Coastguard Worker int index,
868*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL selected) {
869*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
870*3ac0a46fSAndroid Build Coastguard Worker return pPageView && pPageView->SetIndexSelected(index, selected);
871*3ac0a46fSAndroid Build Coastguard Worker }
872*3ac0a46fSAndroid Build Coastguard Worker
873*3ac0a46fSAndroid Build Coastguard Worker FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_IsIndexSelected(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,int index)874*3ac0a46fSAndroid Build Coastguard Worker FORM_IsIndexSelected(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int index) {
875*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
876*3ac0a46fSAndroid Build Coastguard Worker return pPageView && pPageView->IsIndexSelected(index);
877*3ac0a46fSAndroid Build Coastguard Worker }
878