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 CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
8 #define CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fpdfapi/page/cpdf_clippath.h"
14 #include "core/fpdfapi/page/cpdf_graphicstates.h"
15 #include "core/fpdfapi/page/cpdf_transparency.h"
16 #include "core/fpdfapi/parser/cpdf_dictionary.h"
17 #include "core/fpdfapi/render/cpdf_renderoptions.h"
18 #include "core/fxcrt/retain_ptr.h"
19 #include "core/fxcrt/unowned_ptr.h"
20 #include "core/fxge/fx_dib.h"
21 
22 class CFX_DIBitmap;
23 class CFX_PathData;
24 class CFX_RenderDevice;
25 class CPDF_Color;
26 class CPDF_Font;
27 class CPDF_FormObject;
28 class CPDF_ImageCacheEntry;
29 class CPDF_ImageObject;
30 class CPDF_ImageRenderer;
31 class CPDF_Object;
32 class CPDF_PageObject;
33 class CPDF_PageObjectHolder;
34 class CPDF_PathObject;
35 class CPDF_RenderContext;
36 class CPDF_ShadingObject;
37 class CPDF_ShadingPattern;
38 class CPDF_TilingPattern;
39 class CPDF_TransferFunc;
40 class CPDF_Type3Cache;
41 class CPDF_Type3Char;
42 class CPDF_Type3Font;
43 class PauseIndicatorIface;
44 
45 class CPDF_RenderStatus {
46  public:
47   CPDF_RenderStatus(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice);
48   ~CPDF_RenderStatus();
49 
50   // Called prior to Initialize().
SetOptions(const CPDF_RenderOptions & options)51   void SetOptions(const CPDF_RenderOptions& options) { m_Options = options; }
SetDeviceMatrix(const CFX_Matrix & matrix)52   void SetDeviceMatrix(const CFX_Matrix& matrix) { m_DeviceMatrix = matrix; }
SetStopObject(const CPDF_PageObject * pStopObj)53   void SetStopObject(const CPDF_PageObject* pStopObj) { m_pStopObj = pStopObj; }
SetFormResource(const CPDF_Dictionary * pRes)54   void SetFormResource(const CPDF_Dictionary* pRes) {
55     m_pFormResource.Reset(pRes);
56   }
SetType3Char(CPDF_Type3Char * pType3Char)57   void SetType3Char(CPDF_Type3Char* pType3Char) { m_pType3Char = pType3Char; }
SetFillColor(FX_ARGB color)58   void SetFillColor(FX_ARGB color) { m_T3FillColor = color; }
SetDropObjects(bool bDropObjects)59   void SetDropObjects(bool bDropObjects) { m_bDropObjects = bDropObjects; }
SetLoadMask(bool bLoadMask)60   void SetLoadMask(bool bLoadMask) { m_bLoadMask = bLoadMask; }
SetStdCS(bool bStdCS)61   void SetStdCS(bool bStdCS) { m_bStdCS = bStdCS; }
SetGroupFamily(uint32_t family)62   void SetGroupFamily(uint32_t family) { m_GroupFamily = family; }
SetTransparency(const CPDF_Transparency & transparency)63   void SetTransparency(const CPDF_Transparency& transparency) {
64     m_Transparency = transparency;
65   }
66 
67   void Initialize(const CPDF_RenderStatus* pParentStatus,
68                   const CPDF_GraphicStates* pInitialStates);
69 
70   void RenderObjectList(const CPDF_PageObjectHolder* pObjectHolder,
71                         const CFX_Matrix& mtObj2Device);
72   void RenderSingleObject(CPDF_PageObject* pObj,
73                           const CFX_Matrix& mtObj2Device);
74   bool ContinueSingleObject(CPDF_PageObject* pObj,
75                             const CFX_Matrix& mtObj2Device,
76                             PauseIndicatorIface* pPause);
77   void ProcessClipPath(const CPDF_ClipPath& ClipPath,
78                        const CFX_Matrix& mtObj2Device);
79 
GetGroupFamily()80   uint32_t GetGroupFamily() const { return m_GroupFamily; }
GetLoadMask()81   bool GetLoadMask() const { return m_bLoadMask; }
GetDropObjects()82   bool GetDropObjects() const { return m_bDropObjects; }
IsPrint()83   bool IsPrint() const { return m_bPrint; }
IsStopped()84   bool IsStopped() const { return m_bStopped; }
GetContext()85   CPDF_RenderContext* GetContext() const { return m_pContext.Get(); }
GetFormResource()86   const CPDF_Dictionary* GetFormResource() const {
87     return m_pFormResource.Get();
88   }
GetPageResource()89   CPDF_Dictionary* GetPageResource() const { return m_pPageResource.Get(); }
GetRenderDevice()90   CFX_RenderDevice* GetRenderDevice() const { return m_pDevice; }
GetRenderOptions()91   const CPDF_RenderOptions& GetRenderOptions() const { return m_Options; }
92 
93 #if defined _SKIA_SUPPORT_
94   void DebugVerifyDeviceIsPreMultiplied() const;
95 #endif
96 
97   RetainPtr<CPDF_TransferFunc> GetTransferFunc(
98       const CPDF_Object* pObject) const;
99 
GetFillArgb(CPDF_PageObject * pObj)100   FX_ARGB GetFillArgb(CPDF_PageObject* pObj) const {
101     return GetFillArgbInternal(pObj, false);
102   }
GetFillArgbForType3(CPDF_PageObject * pObj)103   FX_ARGB GetFillArgbForType3(CPDF_PageObject* pObj) const {
104     return GetFillArgbInternal(pObj, true);
105   }
106 
107   void DrawTilingPattern(CPDF_TilingPattern* pPattern,
108                          CPDF_PageObject* pPageObj,
109                          const CFX_Matrix& mtObj2Device,
110                          bool bStroke);
111   void DrawShadingPattern(CPDF_ShadingPattern* pPattern,
112                           const CPDF_PageObject* pPageObj,
113                           const CFX_Matrix& mtObj2Device,
114                           bool bStroke);
115   void CompositeDIBitmap(const RetainPtr<CFX_DIBitmap>& pDIBitmap,
116                          int left,
117                          int top,
118                          FX_ARGB mask_argb,
119                          int bitmap_alpha,
120                          BlendMode blend_mode,
121                          const CPDF_Transparency& transparency);
122 
123  private:
124   static std::unique_ptr<CPDF_GraphicStates> CloneObjStates(
125       const CPDF_GraphicStates* pSrcStates,
126       bool bStroke);
127 
128   FX_ARGB GetFillArgbInternal(CPDF_PageObject* pObj, bool bType3) const;
129   bool ProcessTransparency(CPDF_PageObject* PageObj,
130                            const CFX_Matrix& mtObj2Device);
131   void ProcessObjectNoClip(CPDF_PageObject* pObj,
132                            const CFX_Matrix& mtObj2Device);
133   void DrawObjWithBackground(CPDF_PageObject* pObj,
134                              const CFX_Matrix& mtObj2Device);
135   bool DrawObjWithBlend(CPDF_PageObject* pObj, const CFX_Matrix& mtObj2Device);
136   bool ProcessPath(CPDF_PathObject* pPathObj, const CFX_Matrix& mtObj2Device);
137   void ProcessPathPattern(CPDF_PathObject* pPathObj,
138                           const CFX_Matrix& mtObj2Device,
139                           int* filltype,
140                           bool* bStroke);
141   void DrawPathWithPattern(CPDF_PathObject* pPathObj,
142                            const CFX_Matrix& mtObj2Device,
143                            const CPDF_Color* pColor,
144                            bool bStroke);
145   bool ClipPattern(const CPDF_PageObject* pPageObj,
146                    const CFX_Matrix& mtObj2Device,
147                    bool bStroke);
148   bool SelectClipPath(const CPDF_PathObject* pPathObj,
149                       const CFX_Matrix& mtObj2Device,
150                       bool bStroke);
151   bool ProcessImage(CPDF_ImageObject* pImageObj,
152                     const CFX_Matrix& mtObj2Device);
153   void ProcessShading(const CPDF_ShadingObject* pShadingObj,
154                       const CFX_Matrix& mtObj2Device);
155   bool ProcessType3Text(CPDF_TextObject* textobj,
156                         const CFX_Matrix& mtObj2Device);
157   bool ProcessText(CPDF_TextObject* textobj,
158                    const CFX_Matrix& mtObj2Device,
159                    CFX_PathData* pClippingPath);
160   void DrawTextPathWithPattern(const CPDF_TextObject* textobj,
161                                const CFX_Matrix& mtObj2Device,
162                                CPDF_Font* pFont,
163                                float font_size,
164                                const CFX_Matrix* pTextMatrix,
165                                bool bFill,
166                                bool bStroke);
167   bool ProcessForm(const CPDF_FormObject* pFormObj,
168                    const CFX_Matrix& mtObj2Device);
169   RetainPtr<CFX_DIBitmap> GetBackdrop(const CPDF_PageObject* pObj,
170                                       const FX_RECT& rect,
171                                       bool bBackAlphaRequired,
172                                       int* left,
173                                       int* top);
174   RetainPtr<CFX_DIBitmap> LoadSMask(CPDF_Dictionary* pSMaskDict,
175                                     FX_RECT* pClipRect,
176                                     const CFX_Matrix* pMatrix);
177   // Optionally write the colorspace family value into |pCSFamily|.
178   FX_ARGB GetBackColor(const CPDF_Dictionary* pSMaskDict,
179                        const CPDF_Dictionary* pGroupDict,
180                        int* pCSFamily);
181   FX_ARGB GetStrokeArgb(CPDF_PageObject* pObj) const;
182   FX_RECT GetObjectClippedRect(const CPDF_PageObject* pObj,
183                                const CFX_Matrix& mtObj2Device) const;
184 
185   CPDF_RenderOptions m_Options;
186   RetainPtr<const CPDF_Dictionary> m_pFormResource;
187   RetainPtr<CPDF_Dictionary> m_pPageResource;
188   std::vector<CPDF_Type3Font*> m_Type3FontCache;
189   UnownedPtr<CPDF_RenderContext> const m_pContext;
190   bool m_bStopped = false;
191   CFX_RenderDevice* const m_pDevice;
192   CFX_Matrix m_DeviceMatrix;
193   CPDF_ClipPath m_LastClipPath;
194   UnownedPtr<const CPDF_PageObject> m_pCurObj;
195   UnownedPtr<const CPDF_PageObject> m_pStopObj;
196   CPDF_GraphicStates m_InitialStates;
197   std::unique_ptr<CPDF_ImageRenderer> m_pImageRenderer;
198   CPDF_Transparency m_Transparency;
199   bool m_bPrint = false;
200   bool m_bDropObjects = false;
201   bool m_bStdCS = false;
202   bool m_bLoadMask = false;
203   uint32_t m_GroupFamily = 0;
204   UnownedPtr<CPDF_Type3Char> m_pType3Char;
205   FX_ARGB m_T3FillColor = 0;
206   BlendMode m_curBlend = BlendMode::kNormal;
207 };
208 
209 #endif  // CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
210