Use override in more classes in core/
[pdfium.git] / fpdfsdk / src / pdfwindow / PWL_Icon.cpp
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 "../../include/pdfwindow/PDFWindow.h"
8 #include "../../include/pdfwindow/PWL_Wnd.h"
9 #include "../../include/pdfwindow/PWL_Icon.h"
10 #include "../../include/pdfwindow/PWL_Utils.h"
11
12 /* ------------------------------- CPWL_Image ----------------------------------
13  */
14
15 CPWL_Image::CPWL_Image() : m_pPDFStream(NULL) {}
16
17 CPWL_Image::~CPWL_Image() {}
18
19 CFX_ByteString CPWL_Image::GetImageAppStream() {
20   CFX_ByteTextBuf sAppStream;
21
22   CFX_ByteString sAlias = GetImageAlias();
23   CPDF_Rect rcPlate = GetClientRect();
24   CPDF_Matrix mt;
25   mt.SetReverse(GetImageMatrix());
26
27   FX_FLOAT fHScale = 1.0f;
28   FX_FLOAT fVScale = 1.0f;
29   GetScale(fHScale, fVScale);
30
31   FX_FLOAT fx = 0.0f;
32   FX_FLOAT fy = 0.0f;
33   GetImageOffset(fx, fy);
34
35   if (m_pPDFStream && sAlias.GetLength() > 0) {
36     sAppStream << "q\n";
37     sAppStream << rcPlate.left << " " << rcPlate.bottom << " "
38                << rcPlate.right - rcPlate.left << " "
39                << rcPlate.top - rcPlate.bottom << " re W n\n";
40
41     sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx
42                << " " << rcPlate.bottom + fy << " cm\n";
43     sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " "
44                << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n";
45
46     sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n"
47                << "Q\n";
48   }
49
50   return sAppStream.GetByteString();
51 }
52
53 void CPWL_Image::SetPDFStream(CPDF_Stream* pStream) {
54   m_pPDFStream = pStream;
55 }
56
57 CPDF_Stream* CPWL_Image::GetPDFStream() {
58   return m_pPDFStream;
59 }
60
61 void CPWL_Image::GetImageSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
62   fWidth = 0.0f;
63   fHeight = 0.0f;
64
65   if (m_pPDFStream) {
66     if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) {
67       CPDF_Rect rect = pDict->GetRect("BBox");
68
69       fWidth = rect.right - rect.left;
70       fHeight = rect.top - rect.bottom;
71     }
72   }
73 }
74
75 CPDF_Matrix CPWL_Image::GetImageMatrix() {
76   if (m_pPDFStream) {
77     if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) {
78       return pDict->GetMatrix("Matrix");
79     }
80   }
81
82   return CPDF_Matrix();
83 }
84
85 CFX_ByteString CPWL_Image::GetImageAlias() {
86   if (m_sImageAlias.IsEmpty()) {
87     if (m_pPDFStream) {
88       if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) {
89         return pDict->GetString("Name");
90       }
91     }
92   } else
93     return m_sImageAlias;
94
95   return CFX_ByteString();
96 }
97
98 void CPWL_Image::SetImageAlias(const FX_CHAR* sImageAlias) {
99   m_sImageAlias = sImageAlias;
100 }
101
102 void CPWL_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) {
103   fHScale = 1.0f;
104   fVScale = 1.0f;
105 }
106
107 void CPWL_Image::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) {
108   x = 0.0f;
109   y = 0.0f;
110 }
111
112 /* ------------------------------- CPWL_Icon ----------------------------------
113  */
114
115 CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL) {}
116
117 CPWL_Icon::~CPWL_Icon() {}
118
119 int32_t CPWL_Icon::GetScaleMethod() {
120   if (m_pIconFit)
121     return m_pIconFit->GetScaleMethod();
122
123   return 0;
124 }
125
126 FX_BOOL CPWL_Icon::IsProportionalScale() {
127   if (m_pIconFit)
128     return m_pIconFit->IsProportionalScale();
129
130   return FALSE;
131 }
132
133 void CPWL_Icon::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom) {
134   if (m_pIconFit) {
135     // m_pIconFit->GetIconPosition(fLeft,fBottom);
136     fLeft = 0.0f;
137     fBottom = 0.0f;
138     CPDF_Array* pA =
139         m_pIconFit->m_pDict ? m_pIconFit->m_pDict->GetArray("A") : NULL;
140     if (pA != NULL) {
141       FX_DWORD dwCount = pA->GetCount();
142       if (dwCount > 0)
143         fLeft = pA->GetNumber(0);
144       if (dwCount > 1)
145         fBottom = pA->GetNumber(1);
146     }
147   } else {
148     fLeft = 0.0f;
149     fBottom = 0.0f;
150   }
151 }
152
153 FX_BOOL CPWL_Icon::GetFittingBounds() {
154   if (m_pIconFit)
155     return m_pIconFit->GetFittingBounds();
156
157   return FALSE;
158 }
159
160 void CPWL_Icon::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) {
161   fHScale = 1.0f;
162   fVScale = 1.0f;
163
164   if (m_pPDFStream) {
165     FX_FLOAT fImageWidth, fImageHeight;
166     FX_FLOAT fPlateWidth, fPlateHeight;
167
168     CPDF_Rect rcPlate = GetClientRect();
169     fPlateWidth = rcPlate.right - rcPlate.left;
170     fPlateHeight = rcPlate.top - rcPlate.bottom;
171
172     GetImageSize(fImageWidth, fImageHeight);
173
174     int32_t nScaleMethod = GetScaleMethod();
175
176     switch (nScaleMethod) {
177       default:
178       case 0:
179         fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f);
180         fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f);
181         break;
182       case 1:
183         if (fPlateWidth < fImageWidth)
184           fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f);
185         if (fPlateHeight < fImageHeight)
186           fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f);
187         break;
188       case 2:
189         if (fPlateWidth > fImageWidth)
190           fHScale = fPlateWidth / PWL_MAX(fImageWidth, 1.0f);
191         if (fPlateHeight > fImageHeight)
192           fVScale = fPlateHeight / PWL_MAX(fImageHeight, 1.0f);
193         break;
194       case 3:
195         break;
196     }
197
198     FX_FLOAT fMinScale;
199     if (IsProportionalScale()) {
200       fMinScale = PWL_MIN(fHScale, fVScale);
201       fHScale = fMinScale;
202       fVScale = fMinScale;
203     }
204   }
205 }
206
207 void CPWL_Icon::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) {
208   FX_FLOAT fLeft, fBottom;
209
210   GetIconPosition(fLeft, fBottom);
211   x = 0.0f;
212   y = 0.0f;
213
214   FX_FLOAT fImageWidth, fImageHeight;
215   GetImageSize(fImageWidth, fImageHeight);
216
217   FX_FLOAT fHScale, fVScale;
218   GetScale(fHScale, fVScale);
219
220   FX_FLOAT fImageFactWidth = fImageWidth * fHScale;
221   FX_FLOAT fImageFactHeight = fImageHeight * fVScale;
222
223   FX_FLOAT fPlateWidth, fPlateHeight;
224   CPDF_Rect rcPlate = GetClientRect();
225   fPlateWidth = rcPlate.right - rcPlate.left;
226   fPlateHeight = rcPlate.top - rcPlate.bottom;
227
228   x = (fPlateWidth - fImageFactWidth) * fLeft;
229   y = (fPlateHeight - fImageFactHeight) * fBottom;
230 }