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