1 // Copyright 2014 PDFium Authors. All rights reserved.
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 "fpdfsdk/include/pdfwindow/PWL_Icon.h"
8 #include "fpdfsdk/include/pdfwindow/PWL_Label.h"
9 #include "fpdfsdk/include/pdfwindow/PWL_Signature.h"
10 #include "fpdfsdk/include/pdfwindow/PWL_Utils.h"
11 #include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
12 
CPWL_Signature_Image()13 CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL) {}
14 
~CPWL_Signature_Image()15 CPWL_Signature_Image::~CPWL_Signature_Image() {}
16 
SetImage(CFX_DIBSource * pImage)17 void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage) {
18   m_pImage = pImage;
19 }
20 
GetImage()21 CFX_DIBSource* CPWL_Signature_Image::GetImage() {
22   return m_pImage;
23 }
24 
DrawThisAppearance(CFX_RenderDevice * pDevice,CFX_Matrix * pUser2Device)25 void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice,
26                                               CFX_Matrix* pUser2Device) {
27   CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
28 
29   if (m_pImage) {
30     CPDF_Rect rcClient = GetClientRect();
31 
32     FX_FLOAT x, y;
33     pUser2Device->Transform(rcClient.left, rcClient.top, x, y);
34 
35     pDevice->StretchDIBits(m_pImage, (int32_t)x, (int32_t)y,
36                            (int32_t)rcClient.Width(),
37                            (int32_t)rcClient.Height());
38   }
39 }
40 
GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)41 void CPWL_Signature_Image::GetThisAppearanceStream(
42     CFX_ByteTextBuf& sAppStream) {
43   sAppStream << CPWL_Image::GetImageAppStream();
44 }
45 
GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)46 void CPWL_Signature_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) {
47   FX_FLOAT fImageW, fImageH;
48 
49   GetImageSize(fImageW, fImageH);
50 
51   CPDF_Rect rcClient = GetClientRect();
52 
53   fHScale = rcClient.Width() / fImageW;
54   fVScale = rcClient.Height() / fImageH;
55 }
56 
CPWL_Signature()57 CPWL_Signature::CPWL_Signature()
58     : m_pText(NULL),
59       m_pDescription(NULL),
60       m_pImage(NULL),
61       m_bTextExist(TRUE),
62       m_bImageExist(FALSE),
63       m_bFlagExist(TRUE) {}
64 
~CPWL_Signature()65 CPWL_Signature::~CPWL_Signature() {}
66 
SetTextFlag(FX_BOOL bTextExist)67 void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist) {
68   m_bTextExist = bTextExist;
69 
70   RePosChildWnd();
71 }
72 
SetImageFlag(FX_BOOL bImageExist)73 void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist) {
74   m_bImageExist = bImageExist;
75 
76   RePosChildWnd();
77 }
78 
SetFoxitFlag(FX_BOOL bFlagExist)79 void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist) {
80   m_bFlagExist = bFlagExist;
81 }
82 
SetText(const FX_WCHAR * sText)83 void CPWL_Signature::SetText(const FX_WCHAR* sText) {
84   m_pText->SetText(sText);
85 
86   RePosChildWnd();
87 }
88 
SetDescription(const FX_WCHAR * string)89 void CPWL_Signature::SetDescription(const FX_WCHAR* string) {
90   m_pDescription->SetText(string);
91 
92   RePosChildWnd();
93 }
94 
SetImage(CFX_DIBSource * pImage)95 void CPWL_Signature::SetImage(CFX_DIBSource* pImage) {
96   m_pImage->SetImage(pImage);
97 
98   RePosChildWnd();
99 }
100 
SetImageStream(CPDF_Stream * pStream,const FX_CHAR * sImageAlias)101 void CPWL_Signature::SetImageStream(CPDF_Stream* pStream,
102                                     const FX_CHAR* sImageAlias) {
103   m_pImage->SetPDFStream(pStream);
104   m_pImage->SetImageAlias(sImageAlias);
105 
106   RePosChildWnd();
107 }
108 
RePosChildWnd()109 void CPWL_Signature::RePosChildWnd() {
110   CPDF_Rect rcClient = GetClientRect();
111 
112   CPDF_Rect rcText = rcClient;
113   CPDF_Rect rcDescription = rcClient;
114 
115   FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0;
116 
117   if ((bTextVisible || m_bImageExist) &&
118       m_pDescription->GetText().GetLength() > 0) {
119     if (rcClient.Width() >= rcClient.Height()) {
120       rcText.right = rcText.left + rcClient.Width() / 2.0f;
121       rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f;
122     } else {
123       rcText.bottom = rcText.top - rcClient.Height() / 2.0f;
124       rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f;
125     }
126   }
127 
128   m_pText->SetVisible(bTextVisible);
129   m_pImage->SetVisible(m_bImageExist);
130 
131   m_pText->Move(rcText, TRUE, FALSE);
132   m_pImage->Move(rcText, TRUE, FALSE);
133   m_pDescription->Move(rcDescription, TRUE, FALSE);
134 }
135 
CreateChildWnd(const PWL_CREATEPARAM & cp)136 void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM& cp) {
137   m_pImage = new CPWL_Signature_Image;
138   PWL_CREATEPARAM icp = cp;
139   icp.pParentWnd = this;
140   icp.dwFlags = PWS_CHILD | PWS_VISIBLE;
141   icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
142   m_pImage->Create(icp);
143 
144   m_pText = new CPWL_Label;
145   PWL_CREATEPARAM acp = cp;
146   acp.pParentWnd = this;
147   acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE |
148                 PES_AUTORETURN | PES_MIDDLE | PES_CENTER;
149   acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
150   m_pText->Create(acp);
151 
152   m_pDescription = new CPWL_Label;
153   PWL_CREATEPARAM dcp = cp;
154   dcp.pParentWnd = this;
155   dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE |
156                 PES_AUTORETURN | PES_LEFT | PES_CENTER;
157   dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
158   m_pDescription->Create(dcp);
159 }
160 
DrawThisAppearance(CFX_RenderDevice * pDevice,CFX_Matrix * pUser2Device)161 void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice,
162                                         CFX_Matrix* pUser2Device) {
163   CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
164 
165   if (m_bFlagExist) {
166     CPWL_Utils::DrawIconAppStream(
167         pDevice, pUser2Device, PWL_ICONTYPE_FOXIT,
168         CPWL_Utils::GetCenterSquare(GetClientRect()),
169         CPWL_Color(COLORTYPE_RGB, 0.91f, 0.855f, 0.92f),
170         CPWL_Color(COLORTYPE_TRANSPARENT), 255);
171   }
172 }
173 
GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)174 void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
175   CPWL_Wnd::GetThisAppearanceStream(sAppStream);
176 }
177