7#include "xfa/fxfa/cxfa_ffwidget.h"
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"
40FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type, int32_t bpp) {
42 case FXCODEC_IMAGE_JPG:
43#ifdef PDF_ENABLE_XFA_BMP
44 case FXCODEC_IMAGE_BMP:
46#ifdef PDF_ENABLE_XFA_TIFF
47 case FXCODEC_IMAGE_TIFF:
50#ifdef PDF_ENABLE_XFA_PNG
51 case FXCODEC_IMAGE_PNG:
72 if (pDIBitmap->GetBuffer().empty()) {
77 XFA_UnitPx2Pt(pDIBitmap->GetWidth(), dpi.width),
78 XFA_UnitPx2Pt(pDIBitmap->GetHeight(), dpi.height));
83 f1 =
std::min(f1, f2);
141 FXCODEC_IMAGE_TYPE type,
143 int32_t& iImageYDpi) {
144 auto pProgressiveDecoder =
std::make_unique<ProgressiveDecoder>();
146 CFX_DIBAttribute dibAttr;
147 pProgressiveDecoder->LoadImageInfo(
std::move(pImageFileRead), type, &dibAttr,
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);
154 case CFX_DIBAttribute::kResUnitMeter:
156 static_cast<int32_t>(dibAttr.m_nXDPI / (
float)100 * 2.54f);
158 static_cast<int32_t>(dibAttr.m_nYDPI / (
float)100 * 2.54f);
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) {
170 type = pProgressiveDecoder->GetType();
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)) {
179 pBitmap->Clear(0xffffffff);
183 std::tie(status, nFrames) = pProgressiveDecoder->GetFrames();
187 status = pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(),
188 pBitmap->GetHeight());
193 status = pProgressiveDecoder->ContinueDecode();
222 visitor->Trace(m_pLayoutItem);
223 visitor->Trace(m_pDocView);
224 visitor->Trace(m_pPageView);
225 visitor->Trace(m_pNode);
251 switch (m_pNode->GetRotate()) {
283 if (focus == kDrawFocus || !m_pPageView)
285 return m_pPageView->GetPageViewRect();
294 CXFA_Border* border = m_pNode->GetBorderIfExists();
306 return !!m_pPageView;
326 CXFA_FFWidgetHandler* pHandler) {
332 CXFA_FFWidgetHandler* pHandler) {
360 m_pDocView->InvalidateRect(m_pPageView.Get(), rtWidget);
373 const CFX_PointF& point,
379 const CFX_PointF& point) {
384 const CFX_PointF& point) {
389 const CFX_PointF& point) {
394 const CFX_PointF& point) {
399 const CFX_PointF& point,
400 const CFX_Vector& delta) {
405 const CFX_PointF& point) {
410 const CFX_PointF& point) {
415 const CFX_PointF& point) {
428 m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Enter, &eParam);
500 return absl::nullopt;
504 return absl::nullopt;
522 return FormFieldType::kXFA;
534 int32_t iRotate = m_pNode->GetRotate();
574 DCHECK(GetNode()->IsWidgetReady());
579 CXFA_Edge* edge = borderUI->GetEdgeIfExists(0);
593 CXFA_Node* pParentNode = m_pNode->GetParent();
607 if (pChildNode == m_pNode)
610 pChildNode = pChildNode->GetParent();
620 return m_pDocView->GetDoc();
642 m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Exit, &eParam);
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
void Concat(const CFX_Matrix &right)
void AppendRect(float left, float bottom, float right, float top)
constexpr CFX_RectF()=default
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
bool Contains(const PointType &p) 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)
void SetStatusBits(Mask< XFA_WidgetStatus > val)
CXFA_ContentLayoutItem * GetNext() const
CFX_RectF GetAbsoluteRect() const
bool TestStatusBits(Mask< XFA_WidgetStatus > val) const
void ClearStatusBits(Mask< XFA_WidgetStatus > val)
CXFA_EventParam(XFA_EVENTTYPE type)
CallbackIface * GetAppProvider() const
CFWL_App * GetFWLApp() const
CXFA_FFDoc * GetDoc() const
CXFA_LayoutProcessor * GetLayoutProcessor() const
void DisplayCaret(CXFA_FFWidget *hWidget, bool bVisible, const CFX_RectF *pRtAnchor)
CXFA_FFApp * GetApp() const
CXFA_FFDocView * GetDocView() const
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
CXFA_Border * GetUIBorder()
CXFA_Margin * GetMarginIfExists() const
bool HasCreatedUIWidget() const
float GetThickness() const
CXFA_FFWidget * GetFFWidget(CXFA_ContentLayoutItem *item)
CXFA_ContentLayoutItem * ToContentLayoutItem(CXFA_LayoutItem *item)
static constexpr CFX_FillRenderOptions WindingOptions()