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 #ifndef FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
8 #define FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
9
10 #include "PWL_Wnd.h"
11 #include "core/include/fpdfapi/fpdf_parser.h" // For CPDF_Point.
12 #include "core/include/fpdfdoc/fpdf_vt.h" // For CPVT_WordRange.
13 #include "fpdfsdk/include/fxedit/fx_edit.h"
14
15 class CFX_PathData;
16 struct CPWL_Color;
17
18 template <class T>
PWL_MIN(const T & i,const T & j)19 T PWL_MIN(const T& i, const T& j) {
20 return ((i < j) ? i : j);
21 }
22 template <class T>
PWL_MAX(const T & i,const T & j)23 T PWL_MAX(const T& i, const T& j) {
24 return ((i > j) ? i : j);
25 }
26
27 #define PWL_PDF2WIN(color) (uint8_t(color * 255))
28 #define PWL_WIN2PDF(color) ((FX_FLOAT)((FX_FLOAT)color / 255.0f))
29
30 #define PWL_MAKEDWORD(low, high) \
31 ((FX_DWORD)((FX_WORD)(low) | (FX_DWORD)(((FX_WORD)(high)) << 16)))
32 #define PWL_GETLOWWORD(dword) ((FX_WORD)(dword))
33 #define PWL_GETHIGHWORD(dword) ((FX_WORD)(dword >> 16))
34
35 #define PWL_ICONTYPE_CHECKMARK 0
36 #define PWL_ICONTYPE_CIRCLE 1
37 #define PWL_ICONTYPE_COMMENT 2
38 #define PWL_ICONTYPE_CROSS 3
39 #define PWL_ICONTYPE_HELP 4
40 #define PWL_ICONTYPE_INSERTTEXT 5
41 #define PWL_ICONTYPE_KEY 6
42 #define PWL_ICONTYPE_NEWPARAGRAPH 7
43 #define PWL_ICONTYPE_TEXTNOTE 8
44 #define PWL_ICONTYPE_PARAGRAPH 9
45 #define PWL_ICONTYPE_RIGHTARROW 10
46 #define PWL_ICONTYPE_RIGHTPOINTER 11
47 #define PWL_ICONTYPE_STAR 12
48 #define PWL_ICONTYPE_UPARROW 13
49 #define PWL_ICONTYPE_UPLEFTARROW 14
50
51 #define PWL_ICONTYPE_GRAPH 15
52 #define PWL_ICONTYPE_PAPERCLIP 16
53 #define PWL_ICONTYPE_ATTACHMENT 17
54 #define PWL_ICONTYPE_TAG 18
55
56 #define PWL_ICONTYPE_FOXIT 19
57
58 #define PWL_ICONTYPE_UNKNOWN -1
59
60 // checkbox & radiobutton style
61 #define PCS_CHECK 0
62 #define PCS_CIRCLE 1
63 #define PCS_CROSS 2
64 #define PCS_DIAMOND 3
65 #define PCS_SQUARE 4
66 #define PCS_STAR 5
67
68 #define PWL_PI 3.14159265358979f
69 #define PWL_BEZIER 0.5522847498308f
70
71 // pushbutton layout style
72 #define PPBL_LABEL 0
73 #define PPBL_ICON 1
74 #define PPBL_ICONTOPLABELBOTTOM 2
75 #define PPBL_LABELTOPICONBOTTOM 3
76 #define PPBL_ICONLEFTLABELRIGHT 4
77 #define PPBL_LABELLEFTICONRIGHT 5
78 #define PPBL_LABELOVERICON 6
79
80 class CPWL_Point : public CPDF_Point {
81 public:
CPWL_Point()82 CPWL_Point() : CPDF_Point(0.0f, 0.0f) {}
CPWL_Point(FX_FLOAT fx,FX_FLOAT fy)83 CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx, fy) {}
CPWL_Point(const CPWL_Point & point)84 CPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}
85 };
86
87 enum PWL_PATHDATA_TYPE {
88 PWLPT_MOVETO,
89 PWLPT_LINETO,
90 PWLPT_BEZIERTO,
91 PWLPT_UNKNOWN
92 };
93
94 enum PWL_PATH_TYPE { PWLPT_PATHDATA, PWLPT_STREAM };
95
96 class CPWL_PathData {
97 public:
CPWL_PathData()98 CPWL_PathData() : point(), type(PWLPT_UNKNOWN) {}
CPWL_PathData(const CPWL_Point & pt,PWL_PATHDATA_TYPE tp)99 CPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp)
100 : point(pt), type(tp) {}
101
102 CPWL_Point point;
103 PWL_PATHDATA_TYPE type;
104 };
105
106 class IPWL_SpellCheck;
107
108 class CPWL_Utils {
109 public:
110 static CPDF_Rect InflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
111 static CPDF_Rect DeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
112 static FX_BOOL IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
113 static FX_BOOL ContainsRect(const CPDF_Rect& rcParent,
114 const CPDF_Rect& rcChild);
115 static CPDF_Rect ScaleRect(const CPDF_Rect& rcRect, FX_FLOAT fScale);
116 static CPVT_WordRange OverlapWordRange(const CPVT_WordRange& wr1,
117 const CPVT_WordRange& wr2);
118 static CPDF_Rect GetCenterSquare(const CPDF_Rect& rect);
119 static CPWL_Color SubstractColor(const CPWL_Color& sColor,
120 FX_FLOAT fColorSub);
121 static CPWL_Color DevideColor(const CPWL_Color& sColor,
122 FX_FLOAT fColorDevide);
123 static CPDF_Rect MaxRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
124 static CPDF_Rect OffsetRect(const CPDF_Rect& rect, FX_FLOAT x, FX_FLOAT y);
125 static CPDF_Point OffsetPoint(const CPDF_Point& point,
126 FX_FLOAT x,
127 FX_FLOAT y);
128 static FX_COLORREF PWLColorToFXColor(const CPWL_Color& color,
129 int32_t nTransparancy = 255);
130 static FX_BOOL IsBlackOrWhite(const CPWL_Color& color);
131 static CPWL_Color GetReverseColor(const CPWL_Color& color);
132
133 static CFX_ByteString GetColorAppStream(const CPWL_Color& color,
134 const FX_BOOL& bFillOrStroke = TRUE);
135 static CFX_ByteString GetBorderAppStream(const CPDF_Rect& rect,
136 FX_FLOAT fWidth,
137 const CPWL_Color& color,
138 const CPWL_Color& crLeftTop,
139 const CPWL_Color& crRightBottom,
140 int32_t nStyle,
141 const CPWL_Dash& dash);
142 static CFX_ByteString GetCircleBorderAppStream(
143 const CPDF_Rect& rect,
144 FX_FLOAT fWidth,
145 const CPWL_Color& color,
146 const CPWL_Color& crLeftTop,
147 const CPWL_Color& crRightBottom,
148 int32_t nStyle,
149 const CPWL_Dash& dash);
150 static CFX_ByteString GetRectFillAppStream(const CPDF_Rect& rect,
151 const CPWL_Color& color);
152 static CFX_ByteString GetCircleFillAppStream(const CPDF_Rect& rect,
153 const CPWL_Color& color);
154
155 static CFX_ByteString GetPushButtonAppStream(const CPDF_Rect& rcBBox,
156 IFX_Edit_FontMap* pFontMap,
157 CPDF_Stream* pIconStream,
158 CPDF_IconFit& IconFit,
159 const CFX_WideString& sLabel,
160 const CPWL_Color& crText,
161 FX_FLOAT fFontSize,
162 int32_t nLayOut);
163 static CFX_ByteString GetCheckBoxAppStream(const CPDF_Rect& rcBBox,
164 int32_t nStyle,
165 const CPWL_Color& crText);
166 static CFX_ByteString GetRadioButtonAppStream(const CPDF_Rect& rcBBox,
167 int32_t nStyle,
168 const CPWL_Color& crText);
169
170 static CFX_ByteString GetEditAppStream(IFX_Edit* pEdit,
171 const CPDF_Point& ptOffset,
172 const CPVT_WordRange* pRange = NULL,
173 FX_BOOL bContinuous = TRUE,
174 FX_WORD SubWord = 0);
175 static CFX_ByteString GetEditSelAppStream(
176 IFX_Edit* pEdit,
177 const CPDF_Point& ptOffset,
178 const CPVT_WordRange* pRange = NULL);
179 static CFX_ByteString GetSpellCheckAppStream(
180 IFX_Edit* pEdit,
181 IPWL_SpellCheck* pSpellCheck,
182 const CPDF_Point& ptOffset,
183 const CPVT_WordRange* pRange = NULL);
184 static CFX_ByteString GetTextAppStream(const CPDF_Rect& rcBBox,
185 IFX_Edit_FontMap* pFontMap,
186 const CFX_WideString& sText,
187 int32_t nAlignmentH,
188 int32_t nAlignmentV,
189 FX_FLOAT fFontSize,
190 FX_BOOL bMultiLine,
191 FX_BOOL bAutoReturn,
192 const CPWL_Color& crText);
193 static CFX_ByteString GetDropButtonAppStream(const CPDF_Rect& rcBBox);
194
195 static void DrawFillRect(CFX_RenderDevice* pDevice,
196 CFX_Matrix* pUser2Device,
197 const CPDF_Rect& rect,
198 const CPWL_Color& color,
199 int32_t nTransparancy);
200 static void DrawFillRect(CFX_RenderDevice* pDevice,
201 CFX_Matrix* pUser2Device,
202 const CPDF_Rect& rect,
203 const FX_COLORREF& color);
204 static void DrawStrokeRect(CFX_RenderDevice* pDevice,
205 CFX_Matrix* pUser2Device,
206 const CPDF_Rect& rect,
207 const FX_COLORREF& color,
208 FX_FLOAT fWidth);
209 static void DrawStrokeLine(CFX_RenderDevice* pDevice,
210 CFX_Matrix* pUser2Device,
211 const CPDF_Point& ptMoveTo,
212 const CPDF_Point& ptLineTo,
213 const FX_COLORREF& color,
214 FX_FLOAT fWidth);
215 static void DrawBorder(CFX_RenderDevice* pDevice,
216 CFX_Matrix* pUser2Device,
217 const CPDF_Rect& rect,
218 FX_FLOAT fWidth,
219 const CPWL_Color& color,
220 const CPWL_Color& crLeftTop,
221 const CPWL_Color& crRightBottom,
222 int32_t nStyle,
223 int32_t nTransparancy);
224 static void DrawFillArea(CFX_RenderDevice* pDevice,
225 CFX_Matrix* pUser2Device,
226 const CPDF_Point* pPts,
227 int32_t nCount,
228 const FX_COLORREF& color);
229 static void DrawShadow(CFX_RenderDevice* pDevice,
230 CFX_Matrix* pUser2Device,
231 FX_BOOL bVertical,
232 FX_BOOL bHorizontal,
233 CPDF_Rect rect,
234 int32_t nTransparancy,
235 int32_t nStartGray,
236 int32_t nEndGray);
237 static void DrawEditSpellCheck(CFX_RenderDevice* pDevice,
238 CFX_Matrix* pUser2Device,
239 IFX_Edit* pEdit,
240 const CPDF_Rect& rcClip,
241 const CPDF_Point& ptOffset,
242 const CPVT_WordRange* pRange,
243 IPWL_SpellCheck* pSpellCheck);
244
245 public:
246 static void ConvertCMYK2RGB(FX_FLOAT dC,
247 FX_FLOAT dM,
248 FX_FLOAT dY,
249 FX_FLOAT dK,
250 FX_FLOAT& dR,
251 FX_FLOAT& dG,
252 FX_FLOAT& dB);
253 static void ConvertRGB2CMYK(FX_FLOAT dR,
254 FX_FLOAT dG,
255 FX_FLOAT dB,
256 FX_FLOAT& dC,
257 FX_FLOAT& dM,
258 FX_FLOAT& dY,
259 FX_FLOAT& dK);
260
261 static void ConvertRGB2GRAY(FX_FLOAT dR,
262 FX_FLOAT dG,
263 FX_FLOAT dB,
264 FX_FLOAT& dGray);
265 static void ConvertGRAY2RGB(FX_FLOAT dGray,
266 FX_FLOAT& dR,
267 FX_FLOAT& dG,
268 FX_FLOAT& dB);
269
270 static void ConvertCMYK2GRAY(FX_FLOAT dC,
271 FX_FLOAT dM,
272 FX_FLOAT dY,
273 FX_FLOAT dK,
274 FX_FLOAT& dGray);
275 static void ConvertGRAY2CMYK(FX_FLOAT dGray,
276 FX_FLOAT& dC,
277 FX_FLOAT& dM,
278 FX_FLOAT& dY,
279 FX_FLOAT& dK);
280
281 static void PWLColorToARGB(const CPWL_Color& color,
282 int32_t& alpha,
283 FX_FLOAT& red,
284 FX_FLOAT& green,
285 FX_FLOAT& blue);
286
287 public:
288 static CFX_ByteString GetIconAppStream(
289 int32_t nType,
290 const CPDF_Rect& rect,
291 const CPWL_Color& crFill,
292 const CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);
293 static void DrawIconAppStream(CFX_RenderDevice* pDevice,
294 CFX_Matrix* pUser2Device,
295 int32_t nType,
296 const CPDF_Rect& rect,
297 const CPWL_Color& crFill,
298 const CPWL_Color& crStroke,
299 const int32_t nTransparancy);
300
301 private:
302 static CFX_ByteString GetAppStreamFromArray(const CPWL_PathData* pPathData,
303 int32_t nCount);
304 static void GetPathDataFromArray(CFX_PathData& path,
305 const CPWL_PathData* pPathData,
306 int32_t nCount);
307
308 static CFX_ByteString GetAppStream_Check(const CPDF_Rect& rcBBox,
309 const CPWL_Color& crText);
310 static CFX_ByteString GetAppStream_Circle(const CPDF_Rect& rcBBox,
311 const CPWL_Color& crText);
312 static CFX_ByteString GetAppStream_Cross(const CPDF_Rect& rcBBox,
313 const CPWL_Color& crText);
314 static CFX_ByteString GetAppStream_Diamond(const CPDF_Rect& rcBBox,
315 const CPWL_Color& crText);
316 static CFX_ByteString GetAppStream_Square(const CPDF_Rect& rcBBox,
317 const CPWL_Color& crText);
318 static CFX_ByteString GetAppStream_Star(const CPDF_Rect& rcBBox,
319 const CPWL_Color& crText);
320
321 static CFX_ByteString GetAP_Check(const CPDF_Rect& crBBox);
322 static CFX_ByteString GetAP_Circle(const CPDF_Rect& crBBox);
323 static CFX_ByteString GetAP_Cross(const CPDF_Rect& crBBox);
324 static CFX_ByteString GetAP_Diamond(const CPDF_Rect& crBBox);
325 static CFX_ByteString GetAP_Square(const CPDF_Rect& crBBox);
326 static CFX_ByteString GetAP_Star(const CPDF_Rect& crBBox);
327 static CFX_ByteString GetAP_HalfCircle(const CPDF_Rect& crBBox,
328 FX_FLOAT fRotate);
329
330 static void GetGraphics_Checkmark(CFX_ByteString& sPathData,
331 CFX_PathData& path,
332 const CPDF_Rect& crBBox,
333 const PWL_PATH_TYPE type);
334 static void GetGraphics_Circle(CFX_ByteString& sPathData,
335 CFX_PathData& path,
336 const CPDF_Rect& crBBox,
337 const PWL_PATH_TYPE type);
338 static void GetGraphics_Comment(CFX_ByteString& sPathData,
339 CFX_PathData& path,
340 const CPDF_Rect& crBBox,
341 const PWL_PATH_TYPE type);
342 static void GetGraphics_Cross(CFX_ByteString& sPathData,
343 CFX_PathData& path,
344 const CPDF_Rect& crBBox,
345 const PWL_PATH_TYPE type);
346 static void GetGraphics_Help(CFX_ByteString& sPathData,
347 CFX_PathData& path,
348 const CPDF_Rect& crBBox,
349 const PWL_PATH_TYPE type);
350 static void GetGraphics_InsertText(CFX_ByteString& sPathData,
351 CFX_PathData& path,
352 const CPDF_Rect& crBBox,
353 const PWL_PATH_TYPE type);
354 static void GetGraphics_Key(CFX_ByteString& sPathData,
355 CFX_PathData& path,
356 const CPDF_Rect& crBBox,
357 const PWL_PATH_TYPE type);
358 static void GetGraphics_NewParagraph(CFX_ByteString& sPathData,
359 CFX_PathData& path,
360 const CPDF_Rect& crBBox,
361 const PWL_PATH_TYPE type);
362 static void GetGraphics_TextNote(CFX_ByteString& sPathData,
363 CFX_PathData& path,
364 const CPDF_Rect& crBBox,
365 const PWL_PATH_TYPE type);
366 static void GetGraphics_Paragraph(CFX_ByteString& sPathData,
367 CFX_PathData& path,
368 const CPDF_Rect& crBBox,
369 const PWL_PATH_TYPE type);
370 static void GetGraphics_RightArrow(CFX_ByteString& sPathData,
371 CFX_PathData& path,
372 const CPDF_Rect& crBBox,
373 const PWL_PATH_TYPE type);
374 static void GetGraphics_RightPointer(CFX_ByteString& sPathData,
375 CFX_PathData& path,
376 const CPDF_Rect& crBBox,
377 const PWL_PATH_TYPE type);
378 static void GetGraphics_Star(CFX_ByteString& sPathData,
379 CFX_PathData& path,
380 const CPDF_Rect& crBBox,
381 const PWL_PATH_TYPE type);
382 static void GetGraphics_UpArrow(CFX_ByteString& sPathData,
383 CFX_PathData& path,
384 const CPDF_Rect& crBBox,
385 const PWL_PATH_TYPE type);
386 static void GetGraphics_UpLeftArrow(CFX_ByteString& sPathData,
387 CFX_PathData& path,
388 const CPDF_Rect& crBBox,
389 const PWL_PATH_TYPE type);
390 static void GetGraphics_Graph(CFX_ByteString& sPathData,
391 CFX_PathData& path,
392 const CPDF_Rect& crBBox,
393 const PWL_PATH_TYPE type);
394 static void GetGraphics_Paperclip(CFX_ByteString& sPathData,
395 CFX_PathData& path,
396 const CPDF_Rect& crBBox,
397 const PWL_PATH_TYPE type);
398 static void GetGraphics_Attachment(CFX_ByteString& sPathData,
399 CFX_PathData& path,
400 const CPDF_Rect& crBBox,
401 const PWL_PATH_TYPE type);
402 static void GetGraphics_Tag(CFX_ByteString& sPathData,
403 CFX_PathData& path,
404 const CPDF_Rect& crBBox,
405 const PWL_PATH_TYPE type);
406 static void GetGraphics_Foxit(CFX_ByteString& sPathData,
407 CFX_PathData& path,
408 const CPDF_Rect& crBBox,
409 const PWL_PATH_TYPE type);
410 };
411
412 #endif // FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
413