1 // Copyright 2016 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 XFA_FXGRAPHICS_CXFA_GRAPHICS_H_
8 #define XFA_FXGRAPHICS_CXFA_GRAPHICS_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fxcrt/fx_system.h"
14 #include "core/fxge/cfx_graphstatedata.h"
15 #include "xfa/fxgraphics/cxfa_gecolor.h"
16 
17 using FX_FillMode = int32_t;
18 
19 enum class FX_HatchStyle {
20   Horizontal = 0,
21   Vertical = 1,
22   ForwardDiagonal = 2,
23   BackwardDiagonal = 3,
24   Cross = 4,
25   DiagonalCross = 5
26 };
27 
28 class CFX_DIBBase;
29 class CFX_RenderDevice;
30 class CXFA_GEPath;
31 
32 class CXFA_Graphics {
33  public:
34   explicit CXFA_Graphics(CFX_RenderDevice* renderDevice);
35   ~CXFA_Graphics();
36 
37   void SaveGraphState();
38   void RestoreGraphState();
39 
40   CFX_RectF GetClipRect() const;
41   const CFX_Matrix* GetMatrix() const;
42   CFX_RenderDevice* GetRenderDevice();
43 
44   void SetLineCap(CFX_GraphStateData::LineCap lineCap);
45   void SetLineDash(float dashPhase, const float* dashArray, size_t dashCount);
46   void SetSolidLineDash();
47   void SetLineWidth(float lineWidth);
48   void EnableActOnDash();
49   void SetStrokeColor(const CXFA_GEColor& color);
50   void SetFillColor(const CXFA_GEColor& color);
51   void SetClipRect(const CFX_RectF& rect);
52   void StrokePath(CXFA_GEPath* path, const CFX_Matrix* matrix);
53   void FillPath(CXFA_GEPath* path,
54                 FX_FillMode fillMode,
55                 const CFX_Matrix* matrix);
56   void ConcatMatrix(const CFX_Matrix* matrix);
57 
58  private:
59   struct TInfo {
60     TInfo();
61     explicit TInfo(const TInfo& info);
62     TInfo& operator=(const TInfo& other);
63 
64     CFX_GraphStateData graphState;
65     CFX_Matrix CTM;
66     bool isActOnDash;
67     CXFA_GEColor strokeColor;
68     CXFA_GEColor fillColor;
69   };
70 
71   void RenderDeviceStrokePath(const CXFA_GEPath* path,
72                               const CFX_Matrix* matrix);
73   void RenderDeviceFillPath(const CXFA_GEPath* path,
74                             FX_FillMode fillMode,
75                             const CFX_Matrix* matrix);
76   void FillPathWithPattern(const CXFA_GEPath* path,
77                            FX_FillMode fillMode,
78                            const CFX_Matrix& matrix);
79   void FillPathWithShading(const CXFA_GEPath* path,
80                            FX_FillMode fillMode,
81                            const CFX_Matrix& matrix);
82   void SetDIBitsWithMatrix(const RetainPtr<CFX_DIBBase>& source,
83                            const CFX_Matrix& matrix);
84 
85   CFX_RenderDevice* const m_renderDevice;  // Not owned.
86   TInfo m_info;
87   std::vector<std::unique_ptr<TInfo>> m_infoStack;
88 };
89 
90 #endif  // XFA_FXGRAPHICS_CXFA_GRAPHICS_H_
91