Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cxfa_ffwidget.cpp
Go to the documentation of this file.
1// Copyright 2014 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "xfa/fxfa/cxfa_ffwidget.h"
8
9#include <algorithm>
10#include <memory>
11#include <utility>
12
13#include "core/fxcodec/fx_codec.h"
14#include "core/fxcodec/progressive_decoder.h"
15#include "core/fxcrt/maybe_owned.h"
16#include "core/fxge/cfx_fillrenderoptions.h"
17#include "core/fxge/cfx_path.h"
18#include "core/fxge/cfx_renderdevice.h"
19#include "core/fxge/dib/cfx_dibitmap.h"
20#include "third_party/base/check.h"
21#include "xfa/fgas/graphics/cfgas_gegraphics.h"
22#include "xfa/fwl/fwl_widgethit.h"
23#include "xfa/fxfa/cxfa_eventparam.h"
24#include "xfa/fxfa/cxfa_ffapp.h"
25#include "xfa/fxfa/cxfa_ffdoc.h"
26#include "xfa/fxfa/cxfa_ffdocview.h"
27#include "xfa/fxfa/cxfa_ffpageview.h"
28#include "xfa/fxfa/cxfa_ffwidgethandler.h"
29#include "xfa/fxfa/cxfa_imagerenderer.h"
30#include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
31#include "xfa/fxfa/parser/cxfa_border.h"
32#include "xfa/fxfa/parser/cxfa_box.h"
33#include "xfa/fxfa/parser/cxfa_edge.h"
34#include "xfa/fxfa/parser/cxfa_image.h"
35#include "xfa/fxfa/parser/cxfa_margin.h"
36#include "xfa/fxfa/parser/cxfa_node.h"
37
38namespace {
39
40FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type, int32_t bpp) {
41 switch (type) {
42 case FXCODEC_IMAGE_JPG:
43#ifdef PDF_ENABLE_XFA_BMP
44 case FXCODEC_IMAGE_BMP:
45#endif // PDF_ENABLE_XFA_BMP
46#ifdef PDF_ENABLE_XFA_TIFF
47 case FXCODEC_IMAGE_TIFF:
48#endif // PDF_ENABLE_XFA_TIFF
49 return bpp <= 24 ? FXDIB_Format::kRgb : FXDIB_Format::kRgb32;
50#ifdef PDF_ENABLE_XFA_PNG
51 case FXCODEC_IMAGE_PNG:
52#endif // PDF_ENABLE_XFA_PNG
53 default:
55 }
56}
57
58} // namespace
59
61 const CFX_RectF& rtImage,
62 const CFX_Matrix& matrix,
63 RetainPtr<CFX_DIBitmap> pDIBitmap,
64 XFA_AttributeValue iAspect,
65 const CFX_Size& dpi,
66 XFA_AttributeValue iHorzAlign,
67 XFA_AttributeValue iVertAlign) {
68 if (rtImage.IsEmpty())
69 return;
70
71 CHECK(pDIBitmap);
72 if (pDIBitmap->GetBuffer().empty()) {
73 return;
74 }
75
76 CFX_RectF rtFit(rtImage.TopLeft(),
77 XFA_UnitPx2Pt(pDIBitmap->GetWidth(), dpi.width),
78 XFA_UnitPx2Pt(pDIBitmap->GetHeight(), dpi.height));
79 switch (iAspect) {
80 case XFA_AttributeValue::Fit: {
81 float f1 = rtImage.height / rtFit.height;
82 float f2 = rtImage.width / rtFit.width;
83 f1 = std::min(f1, f2);
84 rtFit.height = rtFit.height * f1;
85 rtFit.width = rtFit.width * f1;
86 break;
87 }
88 case XFA_AttributeValue::Height: {
89 float f1 = rtImage.height / rtFit.height;
90 rtFit.height = rtImage.height;
91 rtFit.width = f1 * rtFit.width;
92 break;
93 }
94 case XFA_AttributeValue::None:
95 rtFit.height = rtImage.height;
96 rtFit.width = rtImage.width;
97 break;
98 case XFA_AttributeValue::Width: {
99 float f1 = rtImage.width / rtFit.width;
100 rtFit.width = rtImage.width;
101 rtFit.height = rtFit.height * f1;
102 break;
103 }
104 case XFA_AttributeValue::Actual:
105 default:
106 break;
107 }
108
109 if (iHorzAlign == XFA_AttributeValue::Center)
110 rtFit.left += (rtImage.width - rtFit.width) / 2;
111 else if (iHorzAlign == XFA_AttributeValue::Right)
112 rtFit.left = rtImage.right() - rtFit.width;
113
114 if (iVertAlign == XFA_AttributeValue::Middle)
115 rtFit.top += (rtImage.height - rtFit.height) / 2;
116 else if (iVertAlign == XFA_AttributeValue::Bottom)
117 rtFit.top = rtImage.bottom() - rtImage.height;
118
119 CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
120 CFX_RenderDevice::StateRestorer restorer(pRenderDevice);
121 CFX_Path path;
122 path.AppendRect(rtImage.left, rtImage.bottom(), rtImage.right(), rtImage.top);
123 pRenderDevice->SetClip_PathFill(path, &matrix,
125
126 CFX_Matrix mtImage(1, 0, 0, -1, 0, 1);
127 mtImage.Concat(
128 CFX_Matrix(rtFit.width, 0, 0, rtFit.height, rtFit.left, rtFit.top));
129 mtImage.Concat(matrix);
130
131 CXFA_ImageRenderer imageRender(pRenderDevice, std::move(pDIBitmap), mtImage);
132 if (!imageRender.Start())
133 return;
134
135 while (imageRender.Continue())
136 continue;
137}
138
140 RetainPtr<IFX_SeekableReadStream> pImageFileRead,
141 FXCODEC_IMAGE_TYPE type,
142 int32_t& iImageXDpi,
143 int32_t& iImageYDpi) {
144 auto pProgressiveDecoder = std::make_unique<ProgressiveDecoder>();
145
146 CFX_DIBAttribute dibAttr;
147 pProgressiveDecoder->LoadImageInfo(std::move(pImageFileRead), type, &dibAttr,
148 false);
149 switch (dibAttr.m_wDPIUnit) {
150 case CFX_DIBAttribute::kResUnitCentimeter:
151 dibAttr.m_nXDPI = static_cast<int32_t>(dibAttr.m_nXDPI * 2.54f);
152 dibAttr.m_nYDPI = static_cast<int32_t>(dibAttr.m_nYDPI * 2.54f);
153 break;
154 case CFX_DIBAttribute::kResUnitMeter:
155 dibAttr.m_nXDPI =
156 static_cast<int32_t>(dibAttr.m_nXDPI / (float)100 * 2.54f);
157 dibAttr.m_nYDPI =
158 static_cast<int32_t>(dibAttr.m_nYDPI / (float)100 * 2.54f);
159 break;
160 default:
161 break;
162 }
163 iImageXDpi = dibAttr.m_nXDPI > 1 ? dibAttr.m_nXDPI : (96);
164 iImageYDpi = dibAttr.m_nYDPI > 1 ? dibAttr.m_nYDPI : (96);
165 if (pProgressiveDecoder->GetWidth() <= 0 ||
166 pProgressiveDecoder->GetHeight() <= 0) {
167 return nullptr;
168 }
169
170 type = pProgressiveDecoder->GetType();
171 FXDIB_Format format =
172 XFA_GetDIBFormat(type, pProgressiveDecoder->GetBitsPerPixel());
173 RetainPtr<CFX_DIBitmap> pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
174 if (!pBitmap->Create(pProgressiveDecoder->GetWidth(),
175 pProgressiveDecoder->GetHeight(), format)) {
176 return nullptr;
177 }
178
179 pBitmap->Clear(0xffffffff);
180
181 size_t nFrames;
182 FXCODEC_STATUS status;
183 std::tie(status, nFrames) = pProgressiveDecoder->GetFrames();
184 if (status != FXCODEC_STATUS::kDecodeReady || nFrames == 0)
185 return nullptr;
186
187 status = pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(),
188 pBitmap->GetHeight());
189 if (status == FXCODEC_STATUS::kError)
190 return nullptr;
191
192 while (status == FXCODEC_STATUS::kDecodeToBeContinued) {
193 status = pProgressiveDecoder->ContinueDecode();
194 if (status == FXCODEC_STATUS::kError)
195 return nullptr;
196 }
197
198 return pBitmap;
199}
200
201void XFA_RectWithoutMargin(CFX_RectF* rt, const CXFA_Margin* margin) {
202 if (!margin)
203 return;
204
207}
208
209// static
211 if (!pLayoutItem->GetFormNode()->HasCreatedUIWidget())
212 return nullptr;
213
214 return GetFFWidget(ToContentLayoutItem(pLayoutItem));
215}
216
218
219CXFA_FFWidget::~CXFA_FFWidget() = default;
220
221void CXFA_FFWidget::Trace(cppgc::Visitor* visitor) const {
222 visitor->Trace(m_pLayoutItem);
223 visitor->Trace(m_pDocView);
224 visitor->Trace(m_pPageView);
225 visitor->Trace(m_pNode);
226}
227
231
235
241
247
249 CFX_RectF rtWidget = GetWidgetRect();
250 float fValue = 0;
251 switch (m_pNode->GetRotate()) {
252 case 90:
253 rtWidget.top = rtWidget.bottom();
254 fValue = rtWidget.width;
255 rtWidget.width = rtWidget.height;
256 rtWidget.height = fValue;
257 break;
258 case 180:
259 rtWidget.left = rtWidget.right();
260 rtWidget.top = rtWidget.bottom();
261 break;
262 case 270:
263 rtWidget.left = rtWidget.right();
264 fValue = rtWidget.width;
265 rtWidget.width = rtWidget.height;
266 rtWidget.height = fValue;
267 break;
268 }
269 return rtWidget;
270}
271
277
279 return nullptr;
280}
281
283 if (focus == kDrawFocus || !m_pPageView)
284 return CFX_RectF();
285 return m_pPageView->GetPageViewRect();
286}
287
289 const CFX_Matrix& matrix,
290 HighlightOption highlight) {
292 return;
293
294 CXFA_Border* border = m_pNode->GetBorderIfExists();
295 if (!border)
296 return;
297
299 CXFA_Margin* margin = border->GetMarginIfExists();
300 XFA_RectWithoutMargin(&rtBorder, margin);
301 rtBorder.Normalize();
302 DrawBorder(pGS, border, rtBorder, matrix);
303}
304
306 return !!m_pPageView;
307}
308
311 return true;
312}
313
316 return true;
317}
318
320 return false;
321}
322
324
326 CXFA_FFWidgetHandler* pHandler) {
327 CXFA_Node* pNode = GetNode();
328 return pNode->IsWidgetReady() && pHandler->HasEvent(pNode, eEventType);
329}
330
332 CXFA_FFWidgetHandler* pHandler) {
333 CXFA_Node* pNode = GetNode();
334 if (!pNode->IsWidgetReady())
335 return false;
336
337 return pHandler->ProcessEvent(pNode, params) == XFA_EventError::kSuccess;
338}
339
341 CXFA_Box* box,
342 const CFX_RectF& rtBorder,
343 const CFX_Matrix& matrix) {
344 if (box)
345 box->Draw(pGS, rtBorder, matrix, false);
346}
347
349 CXFA_Box* box,
350 const CFX_RectF& rtBorder,
351 const CFX_Matrix& matrix,
352 bool forceRound) {
353 if (box)
354 box->Draw(pGS, rtBorder, matrix, forceRound);
355}
356
359 rtWidget.Inflate(2, 2);
360 m_pDocView->InvalidateRect(m_pPageView.Get(), rtWidget);
361}
362
364 return false;
365}
366
368 return false;
369}
370
372 Mask<XFA_FWL_KeyFlag> dwFlags,
373 const CFX_PointF& point,
374 CFWL_MessageMouse::MouseCommand command) {
375 return false;
376}
377
379 const CFX_PointF& point) {
380 return false;
381}
382
384 const CFX_PointF& point) {
385 return false;
386}
387
389 const CFX_PointF& point) {
390 return false;
391}
392
394 const CFX_PointF& point) {
395 return false;
396}
397
399 const CFX_PointF& point,
400 const CFX_Vector& delta) {
401 return false;
402}
403
405 const CFX_PointF& point) {
406 return false;
407}
408
410 const CFX_PointF& point) {
411 return false;
412}
413
415 const CFX_PointF& point) {
416 return false;
417}
418
421 if (pParent && !pParent->IsAncestorOf(pOldWidget)) {
422 if (!pParent->OnSetFocus(pOldWidget))
423 return false;
424 }
426
428 m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Enter, &eParam);
429 return true;
430}
431
435 if (!pNewWidget)
436 return true;
437
439 if (pParent && !pParent->IsAncestorOf(pNewWidget)) {
440 if (!pParent->OnKillFocus(pNewWidget))
441 return false;
442 }
443 return true;
444}
445
447 Mask<XFA_FWL_KeyFlag> dwFlags) {
448 return false;
449}
450
451bool CXFA_FFWidget::OnChar(uint32_t dwChar, Mask<XFA_FWL_KeyFlag> dwFlags) {
452 return false;
453}
454
455FWL_WidgetHit CXFA_FFWidget::HitTest(const CFX_PointF& point) {
457}
458
460 return false;
461}
462
464 return false;
465}
466
468 return false;
469}
470
472 return false;
473}
474
476 return false;
477}
478
480 return false;
481}
482
484 return CanCut();
485}
486
488 return CanCopy();
489}
490
492 return false;
493}
494
496 return false;
497}
498
500 return absl::nullopt;
501}
502
504 return absl::nullopt;
505}
506
507bool CXFA_FFWidget::Paste(const WideString& wsPaste) {
508 return false;
509}
510
512
514
516
517WideString CXFA_FFWidget::GetText() {
518 return WideString();
519}
520
522 return FormFieldType::kXFA;
523}
524
525CFX_PointF CXFA_FFWidget::Rotate2Normal(const CFX_PointF& point) {
527 if (mt.IsIdentity())
528 return point;
529
530 return mt.GetInverse().Transform(point);
531}
532
534 int32_t iRotate = m_pNode->GetRotate();
535 if (!iRotate)
536 return CFX_Matrix();
537
539 CFX_Matrix mt;
540 switch (iRotate) {
541 case 90:
542 mt.a = 0;
543 mt.b = -1;
544 mt.c = 1;
545 mt.d = 0;
546 mt.e = rcWidget.left - rcWidget.top;
547 mt.f = rcWidget.left + rcWidget.top;
548 break;
549 case 180:
550 mt.a = -1;
551 mt.b = 0;
552 mt.c = 0;
553 mt.d = -1;
554 mt.e = rcWidget.left * 2;
555 mt.f = rcWidget.top * 2;
556 break;
557 case 270:
558 mt.a = 0;
559 mt.b = 1;
560 mt.c = -1;
561 mt.d = 0;
562 mt.e = rcWidget.left + rcWidget.top;
563 mt.f = rcWidget.top - rcWidget.left;
564 break;
565 }
566 return mt;
567}
568
569void CXFA_FFWidget::DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) {
570 GetDoc()->DisplayCaret(this, bVisible, pRtAnchor);
571}
572
573void CXFA_FFWidget::GetBorderColorAndThickness(FX_ARGB* cr, float* fWidth) {
574 DCHECK(GetNode()->IsWidgetReady());
575 CXFA_Border* borderUI = GetNode()->GetUIBorder();
576 if (!borderUI)
577 return;
578
579 CXFA_Edge* edge = borderUI->GetEdgeIfExists(0);
580 if (!edge)
581 return;
582
583 *cr = edge->GetColor();
584 *fWidth = edge->GetThickness();
585}
586
589 return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
590}
591
593 CXFA_Node* pParentNode = m_pNode->GetParent();
594 if (!pParentNode)
595 return nullptr;
596
597 CXFA_LayoutProcessor* layout = GetDocView()->GetLayoutProcessor();
598 return layout->GetLayoutItem(pParentNode);
599}
600
602 if (!pWidget)
603 return false;
604
605 CXFA_Node* pChildNode = pWidget->GetNode();
606 while (pChildNode) {
607 if (pChildNode == m_pNode)
608 return true;
609
610 pChildNode = pChildNode->GetParent();
611 }
612 return false;
613}
614
615bool CXFA_FFWidget::PtInActiveRect(const CFX_PointF& point) {
616 return GetWidgetRect().Contains(point);
617}
618
620 return m_pDocView->GetDoc();
621}
622
623CXFA_FFApp* CXFA_FFWidget::GetApp() {
624 return GetDoc()->GetApp();
625}
626
630
634
636 CXFA_ContentLayoutItem* pItem = GetLayoutItem();
639 return;
640 }
642 m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Exit, &eParam);
643}
644
648
649void CXFA_FFWidget::SetButtonDown(bool bSet) {
650 CXFA_ContentLayoutItem* pItem = GetLayoutItem();
651 if (bSet)
653 else
655}
CFX_RenderDevice * GetRenderDevice()
CFX_Matrix(float a1, float b1, float c1, float d1, float e1, float f1)
CFX_PointF Transform(const CFX_PointF &point) const
CFX_Matrix GetInverse() const
bool IsIdentity() const
void Concat(const CFX_Matrix &right)
CFX_Matrix()=default
void AppendRect(float left, float bottom, float right, float top)
Definition cfx_path.cpp:309
constexpr CFX_RectF()=default
bool IsEmpty() const
void Deflate(float off_left, float off_top, float off_right, float off_bottom)
void Inflate(float x, float y)
CFX_RectF & operator=(const CFX_RectF &other)=default
float bottom() const
void Normalize()
bool Contains(const PointType &p) const
float right() const
StateRestorer(CFX_RenderDevice *pDevice)
bool SetClip_PathFill(const CFX_Path &path, const CFX_Matrix *pObject2Device, const CFX_FillRenderOptions &fill_options)
void Draw(CFGAS_GEGraphics *pGS, const CFX_RectF &rtWidget, const CFX_Matrix &matrix, bool forceRound)
Definition cxfa_box.cpp:187
void SetStatusBits(Mask< XFA_WidgetStatus > val)
CXFA_ContentLayoutItem * GetNext() const
bool TestStatusBits(Mask< XFA_WidgetStatus > val) const
void ClearStatusBits(Mask< XFA_WidgetStatus > val)
CXFA_EventParam(XFA_EVENTTYPE type)
CallbackIface * GetAppProvider() const
Definition cxfa_ffapp.h:144
CFWL_App * GetFWLApp() const
Definition cxfa_ffapp.h:145
CXFA_FFDoc * GetDoc() const
CXFA_LayoutProcessor * GetLayoutProcessor() const
void DisplayCaret(CXFA_FFWidget *hWidget, bool bVisible, const CFX_RectF *pRtAnchor)
CXFA_FFApp * GetApp() const
Definition cxfa_ffdoc.h:168
CXFA_FFDocView * GetDocView() const
XFA_EventError ProcessEvent(CXFA_Node *pNode, CXFA_EventParam *pParam)
bool HasEvent(CXFA_Node *pNode, XFA_EVENTTYPE eEventType)
virtual bool PtInActiveRect(const CFX_PointF &point)
void DrawBorderWithFlag(CFGAS_GEGraphics *pGS, CXFA_Box *box, const CFX_RectF &rtBorder, const CFX_Matrix &matrix, bool forceRound)
static CXFA_FFWidget * FromLayoutItem(CXFA_LayoutItem *pLayoutItem)
CFX_Matrix GetRotateMatrix() override
virtual bool PerformLayout()
const CFX_RectF & RecacheWidgetRect() const
CXFA_FFWidget * GetNextFFWidget() const
virtual absl::optional< WideString > Copy()
virtual bool Paste(const WideString &wsPaste)
virtual bool OnSetFocus(CXFA_FFWidget *pOldWidget)
virtual bool OnLButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
const CFX_RectF & GetWidgetRect() const
virtual void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight)
virtual bool OnMouseExit()
CXFA_LayoutItem * GetParent()
void DisplayCaret(bool bVisible, const CFX_RectF *pRtAnchor) override
CXFA_FFWidget(CXFA_Node *pNode)
virtual bool OnRButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
virtual bool Undo()
virtual bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command)
virtual bool Redo()
virtual bool CanUndo()
bool HasEventUnderHandler(XFA_EVENTTYPE eEventType, CXFA_FFWidgetHandler *pHandler)
virtual absl::optional< WideString > Cut()
virtual bool UpdateFWLData()
virtual void UpdateWidgetProperty()
virtual bool CanCopy()
bool IsAncestorOf(CXFA_FFWidget *pWidget)
virtual bool CanDeSelect()
virtual bool OnRButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
bool HasVisibleStatus() const
virtual bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
virtual bool CanPaste()
virtual bool IsLoaded()
CFWL_App * GetFWLApp() const
CXFA_FFApp::CallbackIface * GetAppProvider()
CXFA_Node * GetNode() const
void DrawBorder(CFGAS_GEGraphics *pGS, CXFA_Box *box, const CFX_RectF &rtBorder, const CFX_Matrix &matrix)
virtual bool OnChar(uint32_t dwChar, Mask< XFA_FWL_KeyFlag > dwFlags)
virtual FormFieldType GetFormFieldType()
void GetBorderColorAndThickness(FX_ARGB *cr, float *fWidth) override
virtual void Delete()
virtual bool LoadWidget()
void SetButtonDown(bool bSet)
bool ProcessEventUnderHandler(CXFA_EventParam *params, CXFA_FFWidgetHandler *pHandler)
virtual bool OnMouseMove(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
virtual bool CanCut()
virtual CFX_RectF GetBBox(FocusOption focus)
CXFA_FFDoc * GetDoc()
CXFA_FFApp * GetApp()
virtual bool OnKeyDown(XFA_FWL_VKEYCODE dwKeyCode, Mask< XFA_FWL_KeyFlag > dwFlags)
void ModifyStatus(Mask< XFA_WidgetStatus > dwAdded, Mask< XFA_WidgetStatus > dwRemoved)
virtual bool OnLButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
virtual void DeSelect()
CFX_RectF GetRectWithoutRotate()
CXFA_ContentLayoutItem * GetLayoutItem() const
virtual bool OnKillFocus(CXFA_FFWidget *pNewWidget)
CFX_PointF Rotate2Normal(const CFX_PointF &point)
virtual void SelectAll()
virtual bool OnMouseWheel(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, const CFX_Vector &delta)
virtual bool CanDelete()
virtual FWL_WidgetHit HitTest(const CFX_PointF &point)
virtual bool CanSelectAll()
CFX_RectF m_WidgetRect
~CXFA_FFWidget() override
CXFA_FFPageView * GetPageView() const
CXFA_FFDocView * GetDocView() const
virtual CXFA_FFField * AsField()
virtual bool CanRedo()
virtual bool OnRButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point)
virtual bool OnMouseEnter()
virtual WideString GetText()
CXFA_Node * GetFormNode() const
CXFA_LayoutItem * GetLayoutItem(CXFA_Node *pFormItem)
float GetBottomInset() const
float GetLeftInset() const
float GetTopInset() const
float GetRightInset() const
bool IsWidgetReady() const
Definition cxfa_node.h:327
CXFA_Border * GetUIBorder()
CXFA_Margin * GetMarginIfExists() const
bool HasCreatedUIWidget() const
Definition cxfa_object.h:84
FX_ARGB GetColor() const
float GetThickness() const
FormFieldType
CXFA_FFWidget * GetFFWidget(CXFA_ContentLayoutItem *item)
XFA_EVENTTYPE
@ XFA_EVENT_Exit
@ XFA_EVENT_Enter
RetainPtr< CFX_DIBitmap > XFA_LoadImageFromBuffer(RetainPtr< IFX_SeekableReadStream > pImageFileRead, FXCODEC_IMAGE_TYPE type, int32_t &iImageXDpi, int32_t &iImageYDpi)
void XFA_RectWithoutMargin(CFX_RectF *rt, const CXFA_Margin *margin)
void XFA_DrawImage(CFGAS_GEGraphics *pGS, const CFX_RectF &rtImage, const CFX_Matrix &matrix, RetainPtr< CFX_DIBitmap > pDIBitmap, XFA_AttributeValue iAspect, const CFX_Size &dpi, XFA_AttributeValue iHorzAlign, XFA_AttributeValue iVertAlign)
CXFA_ContentLayoutItem * ToContentLayoutItem(CXFA_LayoutItem *item)
XFA_FWL_KeyFlag
XFA_FWL_VKEYCODE
FWL_WidgetHit
FXCODEC_STATUS
FXDIB_Format
Definition fx_dib.h:19
XFA_EventError
Definition fxfa.h:54
XFA_WidgetStatus
Definition fxfa.h:61
XFA_AttributeValue
Definition fxfa_basic.h:60
Definition heap.h:12
#define CHECK(cvref)
static constexpr CFX_FillRenderOptions WindingOptions()