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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
8 #define FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
10 #include "../../../core/include/fpdfapi/fpdf_parser.h" // For CPDF_Point.
11 #include "../../../core/include/fpdfdoc/fpdf_vt.h" // For CPVT_WordRange.
12 #include "../fxedit/fx_edit.h"
19 T PWL_MIN(const T& i, const T& j) {
20 return ((i < j) ? i : j);
23 T PWL_MAX(const T& i, const T& j) {
24 return ((i > j) ? i : j);
27 #define PWL_PDF2WIN(color) (uint8_t(color * 255))
28 #define PWL_WIN2PDF(color) ((FX_FLOAT)((FX_FLOAT)color / 255.0f))
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))
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
51 #define PWL_ICONTYPE_GRAPH 15
52 #define PWL_ICONTYPE_PAPERCLIP 16
53 #define PWL_ICONTYPE_ATTACHMENT 17
54 #define PWL_ICONTYPE_TAG 18
56 #define PWL_ICONTYPE_FOXIT 19
58 #define PWL_ICONTYPE_UNKNOWN -1
60 // checkbox & radiobutton style
68 #define PWL_PI 3.14159265358979f
69 #define PWL_BEZIER 0.5522847498308f
71 // pushbutton layout style
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
80 class CPWL_Point : public CPDF_Point {
82 CPWL_Point() : CPDF_Point(0.0f, 0.0f) {}
83 CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx, fy) {}
84 CPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}
87 enum PWL_PATHDATA_TYPE {
94 enum PWL_PATH_TYPE { PWLPT_PATHDATA, PWLPT_STREAM };
98 CPWL_PathData() : point(), type(PWLPT_UNKNOWN) {}
99 CPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp)
100 : point(pt), type(tp) {}
103 PWL_PATHDATA_TYPE type;
106 class IPWL_SpellCheck;
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,
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,
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);
133 static CFX_ByteString GetColorAppStream(const CPWL_Color& color,
134 const FX_BOOL& bFillOrStroke = TRUE);
135 static CFX_ByteString GetBorderAppStream(const CPDF_Rect& rect,
137 const CPWL_Color& color,
138 const CPWL_Color& crLeftTop,
139 const CPWL_Color& crRightBottom,
141 const CPWL_Dash& dash);
142 static CFX_ByteString GetCircleBorderAppStream(
143 const CPDF_Rect& rect,
145 const CPWL_Color& color,
146 const CPWL_Color& crLeftTop,
147 const CPWL_Color& crRightBottom,
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);
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,
163 static CFX_ByteString GetCheckBoxAppStream(const CPDF_Rect& rcBBox,
165 const CPWL_Color& crText);
166 static CFX_ByteString GetRadioButtonAppStream(const CPDF_Rect& rcBBox,
168 const CPWL_Color& crText);
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(
177 const CPDF_Point& ptOffset,
178 const CPVT_WordRange* pRange = NULL);
179 static CFX_ByteString GetSpellCheckAppStream(
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,
192 const CPWL_Color& crText);
193 static CFX_ByteString GetDropButtonAppStream(const CPDF_Rect& rcBBox);
195 static void DrawFillRect(CFX_RenderDevice* pDevice,
196 CPDF_Matrix* pUser2Device,
197 const CPDF_Rect& rect,
198 const CPWL_Color& color,
199 int32_t nTransparancy);
200 static void DrawFillRect(CFX_RenderDevice* pDevice,
201 CPDF_Matrix* pUser2Device,
202 const CPDF_Rect& rect,
203 const FX_COLORREF& color);
204 static void DrawStrokeRect(CFX_RenderDevice* pDevice,
205 CPDF_Matrix* pUser2Device,
206 const CPDF_Rect& rect,
207 const FX_COLORREF& color,
209 static void DrawStrokeLine(CFX_RenderDevice* pDevice,
210 CPDF_Matrix* pUser2Device,
211 const CPDF_Point& ptMoveTo,
212 const CPDF_Point& ptLineTo,
213 const FX_COLORREF& color,
215 static void DrawBorder(CFX_RenderDevice* pDevice,
216 CPDF_Matrix* pUser2Device,
217 const CPDF_Rect& rect,
219 const CPWL_Color& color,
220 const CPWL_Color& crLeftTop,
221 const CPWL_Color& crRightBottom,
223 const CPWL_Dash& dash,
224 int32_t nTransparancy);
225 static void DrawFillArea(CFX_RenderDevice* pDevice,
226 CPDF_Matrix* pUser2Device,
227 const CPDF_Point* pPts,
229 const FX_COLORREF& color);
230 static void DrawShadow(CFX_RenderDevice* pDevice,
231 CPDF_Matrix* pUser2Device,
235 int32_t nTransparancy,
238 static void DrawEditSpellCheck(CFX_RenderDevice* pDevice,
239 CPDF_Matrix* pUser2Device,
241 const CPDF_Rect& rcClip,
242 const CPDF_Point& ptOffset,
243 const CPVT_WordRange* pRange,
244 IPWL_SpellCheck* pSpellCheck);
247 static void ConvertCMYK2RGB(FX_FLOAT dC,
254 static void ConvertRGB2CMYK(FX_FLOAT dR,
262 static void ConvertRGB2GRAY(FX_FLOAT dR,
266 static void ConvertGRAY2RGB(FX_FLOAT dGray,
271 static void ConvertCMYK2GRAY(FX_FLOAT dC,
276 static void ConvertGRAY2CMYK(FX_FLOAT dGray,
282 static void PWLColorToARGB(const CPWL_Color& color,
289 static CFX_ByteString GetIconAppStream(
291 const CPDF_Rect& rect,
292 const CPWL_Color& crFill,
293 const CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);
294 static void DrawIconAppStream(CFX_RenderDevice* pDevice,
295 CPDF_Matrix* pUser2Device,
297 const CPDF_Rect& rect,
298 const CPWL_Color& crFill,
299 const CPWL_Color& crStroke,
300 const int32_t nTransparancy);
303 static CFX_ByteString GetAppStreamFromArray(const CPWL_PathData* pPathData,
305 static void GetPathDataFromArray(CFX_PathData& path,
306 const CPWL_PathData* pPathData,
309 static CFX_ByteString GetAppStream_Check(const CPDF_Rect& rcBBox,
310 const CPWL_Color& crText);
311 static CFX_ByteString GetAppStream_Circle(const CPDF_Rect& rcBBox,
312 const CPWL_Color& crText);
313 static CFX_ByteString GetAppStream_Cross(const CPDF_Rect& rcBBox,
314 const CPWL_Color& crText);
315 static CFX_ByteString GetAppStream_Diamond(const CPDF_Rect& rcBBox,
316 const CPWL_Color& crText);
317 static CFX_ByteString GetAppStream_Square(const CPDF_Rect& rcBBox,
318 const CPWL_Color& crText);
319 static CFX_ByteString GetAppStream_Star(const CPDF_Rect& rcBBox,
320 const CPWL_Color& crText);
322 static CFX_ByteString GetAP_Check(const CPDF_Rect& crBBox);
323 static CFX_ByteString GetAP_Circle(const CPDF_Rect& crBBox);
324 static CFX_ByteString GetAP_Cross(const CPDF_Rect& crBBox);
325 static CFX_ByteString GetAP_Diamond(const CPDF_Rect& crBBox);
326 static CFX_ByteString GetAP_Square(const CPDF_Rect& crBBox);
327 static CFX_ByteString GetAP_Star(const CPDF_Rect& crBBox);
328 static CFX_ByteString GetAP_HalfCircle(const CPDF_Rect& crBBox,
331 static void GetGraphics_Checkmark(CFX_ByteString& sPathData,
333 const CPDF_Rect& crBBox,
334 const PWL_PATH_TYPE type);
335 static void GetGraphics_Circle(CFX_ByteString& sPathData,
337 const CPDF_Rect& crBBox,
338 const PWL_PATH_TYPE type);
339 static void GetGraphics_Comment(CFX_ByteString& sPathData,
341 const CPDF_Rect& crBBox,
342 const PWL_PATH_TYPE type);
343 static void GetGraphics_Cross(CFX_ByteString& sPathData,
345 const CPDF_Rect& crBBox,
346 const PWL_PATH_TYPE type);
347 static void GetGraphics_Help(CFX_ByteString& sPathData,
349 const CPDF_Rect& crBBox,
350 const PWL_PATH_TYPE type);
351 static void GetGraphics_InsertText(CFX_ByteString& sPathData,
353 const CPDF_Rect& crBBox,
354 const PWL_PATH_TYPE type);
355 static void GetGraphics_Key(CFX_ByteString& sPathData,
357 const CPDF_Rect& crBBox,
358 const PWL_PATH_TYPE type);
359 static void GetGraphics_NewParagraph(CFX_ByteString& sPathData,
361 const CPDF_Rect& crBBox,
362 const PWL_PATH_TYPE type);
363 static void GetGraphics_TextNote(CFX_ByteString& sPathData,
365 const CPDF_Rect& crBBox,
366 const PWL_PATH_TYPE type);
367 static void GetGraphics_Paragraph(CFX_ByteString& sPathData,
369 const CPDF_Rect& crBBox,
370 const PWL_PATH_TYPE type);
371 static void GetGraphics_RightArrow(CFX_ByteString& sPathData,
373 const CPDF_Rect& crBBox,
374 const PWL_PATH_TYPE type);
375 static void GetGraphics_RightPointer(CFX_ByteString& sPathData,
377 const CPDF_Rect& crBBox,
378 const PWL_PATH_TYPE type);
379 static void GetGraphics_Star(CFX_ByteString& sPathData,
381 const CPDF_Rect& crBBox,
382 const PWL_PATH_TYPE type);
383 static void GetGraphics_UpArrow(CFX_ByteString& sPathData,
385 const CPDF_Rect& crBBox,
386 const PWL_PATH_TYPE type);
387 static void GetGraphics_UpLeftArrow(CFX_ByteString& sPathData,
389 const CPDF_Rect& crBBox,
390 const PWL_PATH_TYPE type);
391 static void GetGraphics_Graph(CFX_ByteString& sPathData,
393 const CPDF_Rect& crBBox,
394 const PWL_PATH_TYPE type);
395 static void GetGraphics_Paperclip(CFX_ByteString& sPathData,
397 const CPDF_Rect& crBBox,
398 const PWL_PATH_TYPE type);
399 static void GetGraphics_Attachment(CFX_ByteString& sPathData,
401 const CPDF_Rect& crBBox,
402 const PWL_PATH_TYPE type);
403 static void GetGraphics_Tag(CFX_ByteString& sPathData,
405 const CPDF_Rect& crBBox,
406 const PWL_PATH_TYPE type);
407 static void GetGraphics_Foxit(CFX_ByteString& sPathData,
409 const CPDF_Rect& crBBox,
410 const PWL_PATH_TYPE type);
413 #endif // FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_