xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffimageedit.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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 "xfa/fxfa/cxfa_ffimageedit.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
10*3ac0a46fSAndroid Build Coastguard Worker 
11*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/visitor.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_app.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagemouse.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_picturebox.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fffield.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpageview.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_border.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_image.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_para.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_value.h"
27*3ac0a46fSAndroid Build Coastguard Worker 
CXFA_FFImageEdit(CXFA_Node * pNode)28*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_Node* pNode) : CXFA_FFField(pNode) {}
29*3ac0a46fSAndroid Build Coastguard Worker 
30*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFImageEdit::~CXFA_FFImageEdit() = default;
31*3ac0a46fSAndroid Build Coastguard Worker 
PreFinalize()32*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::PreFinalize() {
33*3ac0a46fSAndroid Build Coastguard Worker   m_pNode->SetEditImage(nullptr);
34*3ac0a46fSAndroid Build Coastguard Worker }
35*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const36*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::Trace(cppgc::Visitor* visitor) const {
37*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFField::Trace(visitor);
38*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pOldDelegate);
39*3ac0a46fSAndroid Build Coastguard Worker }
40*3ac0a46fSAndroid Build Coastguard Worker 
LoadWidget()41*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::LoadWidget() {
42*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(!IsLoaded());
43*3ac0a46fSAndroid Build Coastguard Worker 
44*3ac0a46fSAndroid Build Coastguard Worker   CFWL_PictureBox* pPictureBox = cppgc::MakeGarbageCollected<CFWL_PictureBox>(
45*3ac0a46fSAndroid Build Coastguard Worker       GetFWLApp()->GetHeap()->GetAllocationHandle(), GetFWLApp());
46*3ac0a46fSAndroid Build Coastguard Worker   SetNormalWidget(pPictureBox);
47*3ac0a46fSAndroid Build Coastguard Worker   pPictureBox->SetAdapterIface(this);
48*3ac0a46fSAndroid Build Coastguard Worker 
49*3ac0a46fSAndroid Build Coastguard Worker   CFWL_NoteDriver* pNoteDriver = pPictureBox->GetFWLApp()->GetNoteDriver();
50*3ac0a46fSAndroid Build Coastguard Worker   pNoteDriver->RegisterEventTarget(pPictureBox, pPictureBox);
51*3ac0a46fSAndroid Build Coastguard Worker   m_pOldDelegate = pPictureBox->GetDelegate();
52*3ac0a46fSAndroid Build Coastguard Worker   pPictureBox->SetDelegate(this);
53*3ac0a46fSAndroid Build Coastguard Worker 
54*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFField::LoadWidget();
55*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pNode->GetEditImage())
56*3ac0a46fSAndroid Build Coastguard Worker     UpdateFWLData();
57*3ac0a46fSAndroid Build Coastguard Worker 
58*3ac0a46fSAndroid Build Coastguard Worker   return true;
59*3ac0a46fSAndroid Build Coastguard Worker }
60*3ac0a46fSAndroid Build Coastguard Worker 
RenderWidget(CFGAS_GEGraphics * pGS,const CFX_Matrix & matrix,HighlightOption highlight)61*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::RenderWidget(CFGAS_GEGraphics* pGS,
62*3ac0a46fSAndroid Build Coastguard Worker                                     const CFX_Matrix& matrix,
63*3ac0a46fSAndroid Build Coastguard Worker                                     HighlightOption highlight) {
64*3ac0a46fSAndroid Build Coastguard Worker   if (!HasVisibleStatus())
65*3ac0a46fSAndroid Build Coastguard Worker     return;
66*3ac0a46fSAndroid Build Coastguard Worker 
67*3ac0a46fSAndroid Build Coastguard Worker   CFX_Matrix mtRotate = GetRotateMatrix();
68*3ac0a46fSAndroid Build Coastguard Worker   mtRotate.Concat(matrix);
69*3ac0a46fSAndroid Build Coastguard Worker 
70*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFWidget::RenderWidget(pGS, mtRotate, highlight);
71*3ac0a46fSAndroid Build Coastguard Worker   DrawBorder(pGS, m_pNode->GetUIBorder(), m_UIRect, mtRotate);
72*3ac0a46fSAndroid Build Coastguard Worker   RenderCaption(pGS, mtRotate);
73*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CFX_DIBitmap> pDIBitmap = m_pNode->GetEditImage();
74*3ac0a46fSAndroid Build Coastguard Worker   if (!pDIBitmap)
75*3ac0a46fSAndroid Build Coastguard Worker     return;
76*3ac0a46fSAndroid Build Coastguard Worker 
77*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtImage = GetNormalWidget()->GetWidgetRect();
78*3ac0a46fSAndroid Build Coastguard Worker   XFA_AttributeValue iHorzAlign = XFA_AttributeValue::Left;
79*3ac0a46fSAndroid Build Coastguard Worker   XFA_AttributeValue iVertAlign = XFA_AttributeValue::Top;
80*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Para* para = m_pNode->GetParaIfExists();
81*3ac0a46fSAndroid Build Coastguard Worker   if (para) {
82*3ac0a46fSAndroid Build Coastguard Worker     iHorzAlign = para->GetHorizontalAlign();
83*3ac0a46fSAndroid Build Coastguard Worker     iVertAlign = para->GetVerticalAlign();
84*3ac0a46fSAndroid Build Coastguard Worker   }
85*3ac0a46fSAndroid Build Coastguard Worker 
86*3ac0a46fSAndroid Build Coastguard Worker   XFA_AttributeValue iAspect = XFA_AttributeValue::Fit;
87*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Value* value = m_pNode->GetFormValueIfExists();
88*3ac0a46fSAndroid Build Coastguard Worker   if (value) {
89*3ac0a46fSAndroid Build Coastguard Worker     CXFA_Image* image = value->GetImageIfExists();
90*3ac0a46fSAndroid Build Coastguard Worker     if (image)
91*3ac0a46fSAndroid Build Coastguard Worker       iAspect = image->GetAspect();
92*3ac0a46fSAndroid Build Coastguard Worker   }
93*3ac0a46fSAndroid Build Coastguard Worker 
94*3ac0a46fSAndroid Build Coastguard Worker   XFA_DrawImage(pGS, rtImage, mtRotate, std::move(pDIBitmap), iAspect,
95*3ac0a46fSAndroid Build Coastguard Worker                 m_pNode->GetEditImageDpi(), iHorzAlign, iVertAlign);
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker 
AcceptsFocusOnButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point,CFWL_MessageMouse::MouseCommand command)98*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::AcceptsFocusOnButtonDown(
99*3ac0a46fSAndroid Build Coastguard Worker     Mask<XFA_FWL_KeyFlag> dwFlags,
100*3ac0a46fSAndroid Build Coastguard Worker     const CFX_PointF& point,
101*3ac0a46fSAndroid Build Coastguard Worker     CFWL_MessageMouse::MouseCommand command) {
102*3ac0a46fSAndroid Build Coastguard Worker   if (command != CFWL_MessageMouse::MouseCommand::kLeftButtonDown)
103*3ac0a46fSAndroid Build Coastguard Worker     return CXFA_FFField::AcceptsFocusOnButtonDown(dwFlags, point, command);
104*3ac0a46fSAndroid Build Coastguard Worker 
105*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pNode->IsOpenAccess())
106*3ac0a46fSAndroid Build Coastguard Worker     return false;
107*3ac0a46fSAndroid Build Coastguard Worker   if (!PtInActiveRect(point))
108*3ac0a46fSAndroid Build Coastguard Worker     return false;
109*3ac0a46fSAndroid Build Coastguard Worker 
110*3ac0a46fSAndroid Build Coastguard Worker   return true;
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)113*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,
114*3ac0a46fSAndroid Build Coastguard Worker                                      const CFX_PointF& point) {
115*3ac0a46fSAndroid Build Coastguard Worker   SetButtonDown(true);
116*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouse msg(GetNormalWidget(),
117*3ac0a46fSAndroid Build Coastguard Worker                         CFWL_MessageMouse::MouseCommand::kLeftButtonDown,
118*3ac0a46fSAndroid Build Coastguard Worker                         dwFlags, FWLToClient(point));
119*3ac0a46fSAndroid Build Coastguard Worker   SendMessageToFWLWidget(&msg);
120*3ac0a46fSAndroid Build Coastguard Worker   return true;
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker 
SetFWLRect()123*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::SetFWLRect() {
124*3ac0a46fSAndroid Build Coastguard Worker   if (!GetNormalWidget())
125*3ac0a46fSAndroid Build Coastguard Worker     return;
126*3ac0a46fSAndroid Build Coastguard Worker 
127*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtUIMargin = m_pNode->GetUIMargin();
128*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtImage(m_UIRect);
129*3ac0a46fSAndroid Build Coastguard Worker   rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width,
130*3ac0a46fSAndroid Build Coastguard Worker                   rtUIMargin.height);
131*3ac0a46fSAndroid Build Coastguard Worker   GetNormalWidget()->SetWidgetRect(rtImage);
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker 
CommitData()134*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::CommitData() {
135*3ac0a46fSAndroid Build Coastguard Worker   return true;
136*3ac0a46fSAndroid Build Coastguard Worker }
137*3ac0a46fSAndroid Build Coastguard Worker 
UpdateFWLData()138*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::UpdateFWLData() {
139*3ac0a46fSAndroid Build Coastguard Worker   m_pNode->SetEditImage(nullptr);
140*3ac0a46fSAndroid Build Coastguard Worker   m_pNode->LoadEditImage(GetDoc());
141*3ac0a46fSAndroid Build Coastguard Worker   return true;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker 
OnProcessMessage(CFWL_Message * pMessage)144*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnProcessMessage(CFWL_Message* pMessage) {
145*3ac0a46fSAndroid Build Coastguard Worker   m_pOldDelegate->OnProcessMessage(pMessage);
146*3ac0a46fSAndroid Build Coastguard Worker }
147*3ac0a46fSAndroid Build Coastguard Worker 
OnProcessEvent(CFWL_Event * pEvent)148*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnProcessEvent(CFWL_Event* pEvent) {
149*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFField::OnProcessEvent(pEvent);
150*3ac0a46fSAndroid Build Coastguard Worker   m_pOldDelegate->OnProcessEvent(pEvent);
151*3ac0a46fSAndroid Build Coastguard Worker }
152*3ac0a46fSAndroid Build Coastguard Worker 
OnDrawWidget(CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)153*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnDrawWidget(CFGAS_GEGraphics* pGraphics,
154*3ac0a46fSAndroid Build Coastguard Worker                                     const CFX_Matrix& matrix) {
155*3ac0a46fSAndroid Build Coastguard Worker   m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
156*3ac0a46fSAndroid Build Coastguard Worker }
157*3ac0a46fSAndroid Build Coastguard Worker 
GetFormFieldType()158*3ac0a46fSAndroid Build Coastguard Worker FormFieldType CXFA_FFImageEdit::GetFormFieldType() {
159*3ac0a46fSAndroid Build Coastguard Worker   return FormFieldType::kXFA_ImageField;
160*3ac0a46fSAndroid Build Coastguard Worker }
161