kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 1 | // Copyright 2014 The PDFium Authors |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | |
| 7 | #include "xfa/fxfa/cxfa_ffimage.h" |
| 8 | |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 9 | #include <utility> |
| 10 | |
Haibo Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 11 | #include "core/fxge/dib/cfx_dibitmap.h" |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 12 | #include "xfa/fxfa/cxfa_ffapp.h" |
| 13 | #include "xfa/fxfa/cxfa_ffdoc.h" |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 14 | #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 Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 20 | CXFA_FFImage::CXFA_FFImage(CXFA_Node* pNode) : CXFA_FFWidget(pNode) {} |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 21 | |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 22 | CXFA_FFImage::~CXFA_FFImage() = default; |
| 23 | |
| 24 | void CXFA_FFImage::PreFinalize() { |
| 25 | GetNode()->SetLayoutImage(nullptr); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 26 | } |
| 27 | |
| 28 | bool CXFA_FFImage::IsLoaded() { |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 29 | return !!GetNode()->GetLayoutImage(); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 30 | } |
| 31 | |
| 32 | bool CXFA_FFImage::LoadWidget() { |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 33 | if (GetNode()->GetLayoutImage()) |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 34 | return true; |
| 35 | |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 36 | return GetNode()->LoadLayoutImage(GetDoc()) && CXFA_FFWidget::LoadWidget(); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 37 | } |
| 38 | |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 39 | void CXFA_FFImage::RenderWidget(CFGAS_GEGraphics* pGS, |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 40 | const CFX_Matrix& matrix, |
Haibo Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 41 | HighlightOption highlight) { |
| 42 | if (!HasVisibleStatus()) |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 43 | return; |
| 44 | |
| 45 | CFX_Matrix mtRotate = GetRotateMatrix(); |
| 46 | mtRotate.Concat(matrix); |
| 47 | |
Haibo Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 48 | CXFA_FFWidget::RenderWidget(pGS, mtRotate, highlight); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 49 | |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 50 | RetainPtr<CFX_DIBitmap> pDIBitmap = GetNode()->GetLayoutImage(); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 51 | if (!pDIBitmap) |
| 52 | return; |
| 53 | |
| 54 | CFX_RectF rtImage = GetRectWithoutRotate(); |
| 55 | CXFA_Margin* margin = m_pNode->GetMarginIfExists(); |
Haibo Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 56 | XFA_RectWithoutMargin(&rtImage, margin); |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 57 | |
Haibo Huang | 49cc930 | 2020-04-27 16:14:24 -0700 | [diff] [blame] | 58 | XFA_AttributeValue iHorzAlign = XFA_AttributeValue::Left; |
| 59 | XFA_AttributeValue iVertAlign = XFA_AttributeValue::Top; |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 60 | CXFA_Para* para = m_pNode->GetParaIfExists(); |
| 61 | if (para) { |
| 62 | iHorzAlign = para->GetHorizontalAlign(); |
| 63 | iVertAlign = para->GetVerticalAlign(); |
| 64 | } |
| 65 | |
Philip P. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 66 | auto* value = m_pNode->GetFormValueIfExists(); |
kumarashishg | 826308d | 2023-06-23 13:21:22 +0000 | [diff] [blame] | 67 | 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. Moltmann | d904c1e | 2018-03-19 09:26:45 -0700 | [diff] [blame] | 77 | } |