blob: bc1a67f936ba7b6ff286802be5a2cdb929918afb [file] [log] [blame]
kumarashishg826308d2023-06-23 13:21:22 +00001// Copyright 2014 The PDFium Authors
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -07002// 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_ffimage.h"
8
kumarashishg826308d2023-06-23 13:21:22 +00009#include <utility>
10
Haibo Huang49cc9302020-04-27 16:14:24 -070011#include "core/fxge/dib/cfx_dibitmap.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070012#include "xfa/fxfa/cxfa_ffapp.h"
13#include "xfa/fxfa/cxfa_ffdoc.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070014#include "xfa/fxfa/cxfa_ffpageview.h"
15#include "xfa/fxfa/cxfa_ffwidget.h"
16#include "xfa/fxfa/parser/cxfa_image.h"
17#include "xfa/fxfa/parser/cxfa_para.h"
18#include "xfa/fxfa/parser/cxfa_value.h"
19
Haibo Huang49cc9302020-04-27 16:14:24 -070020CXFA_FFImage::CXFA_FFImage(CXFA_Node* pNode) : CXFA_FFWidget(pNode) {}
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070021
kumarashishg826308d2023-06-23 13:21:22 +000022CXFA_FFImage::~CXFA_FFImage() = default;
23
24void CXFA_FFImage::PreFinalize() {
25 GetNode()->SetLayoutImage(nullptr);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070026}
27
28bool CXFA_FFImage::IsLoaded() {
kumarashishg826308d2023-06-23 13:21:22 +000029 return !!GetNode()->GetLayoutImage();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070030}
31
32bool CXFA_FFImage::LoadWidget() {
kumarashishg826308d2023-06-23 13:21:22 +000033 if (GetNode()->GetLayoutImage())
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070034 return true;
35
kumarashishg826308d2023-06-23 13:21:22 +000036 return GetNode()->LoadLayoutImage(GetDoc()) && CXFA_FFWidget::LoadWidget();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070037}
38
kumarashishg826308d2023-06-23 13:21:22 +000039void CXFA_FFImage::RenderWidget(CFGAS_GEGraphics* pGS,
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070040 const CFX_Matrix& matrix,
Haibo Huang49cc9302020-04-27 16:14:24 -070041 HighlightOption highlight) {
42 if (!HasVisibleStatus())
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070043 return;
44
45 CFX_Matrix mtRotate = GetRotateMatrix();
46 mtRotate.Concat(matrix);
47
Haibo Huang49cc9302020-04-27 16:14:24 -070048 CXFA_FFWidget::RenderWidget(pGS, mtRotate, highlight);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070049
kumarashishg826308d2023-06-23 13:21:22 +000050 RetainPtr<CFX_DIBitmap> pDIBitmap = GetNode()->GetLayoutImage();
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070051 if (!pDIBitmap)
52 return;
53
54 CFX_RectF rtImage = GetRectWithoutRotate();
55 CXFA_Margin* margin = m_pNode->GetMarginIfExists();
Haibo Huang49cc9302020-04-27 16:14:24 -070056 XFA_RectWithoutMargin(&rtImage, margin);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070057
Haibo Huang49cc9302020-04-27 16:14:24 -070058 XFA_AttributeValue iHorzAlign = XFA_AttributeValue::Left;
59 XFA_AttributeValue iVertAlign = XFA_AttributeValue::Top;
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070060 CXFA_Para* para = m_pNode->GetParaIfExists();
61 if (para) {
62 iHorzAlign = para->GetHorizontalAlign();
63 iVertAlign = para->GetVerticalAlign();
64 }
65
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070066 auto* value = m_pNode->GetFormValueIfExists();
kumarashishg826308d2023-06-23 13:21:22 +000067 if (!value)
68 return;
69
70 CXFA_Image* image = value->GetImageIfExists();
71 if (!image)
72 return;
73
74 XFA_DrawImage(pGS, rtImage, mtRotate, std::move(pDIBitmap),
75 image->GetAspect(), m_pNode->GetLayoutImageDpi(), iHorzAlign,
76 iVertAlign);
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070077}