• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The PDFium Authors
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 <utility>
12 #include <vector>
13 
14 #include "build/build_config.h"
15 #include "core/fpdfapi/page/cpdf_clippath.h"
16 #include "core/fpdfapi/page/cpdf_colorspace.h"
17 #include "core/fpdfapi/page/cpdf_graphicstates.h"
18 #include "core/fpdfapi/page/cpdf_transparency.h"
19 #include "core/fpdfapi/parser/cpdf_dictionary.h"
20 #include "core/fpdfapi/render/cpdf_renderoptions.h"
21 #include "core/fxcrt/retain_ptr.h"
22 #include "core/fxcrt/unowned_ptr.h"
23 #include "core/fxge/dib/fx_dib.h"
24 
25 class CFX_DIBitmap;
26 class CFX_Path;
27 class CFX_RenderDevice;
28 class CPDF_Color;
29 class CPDF_Font;
30 class CPDF_FormObject;
31 class CPDF_ImageObject;
32 class CPDF_ImageRenderer;
33 class CPDF_Object;
34 class CPDF_PageObject;
35 class CPDF_PageObjectHolder;
36 class CPDF_PathObject;
37 class CPDF_RenderContext;
38 class CPDF_ShadingObject;
39 class CPDF_ShadingPattern;
40 class CPDF_TilingPattern;
41 class CPDF_TransferFunc;
42 class CPDF_Type3Char;
43 class CPDF_Type3Font;
44 class PauseIndicatorIface;
45 
46 class CPDF_RenderStatus {
47  public:
48   CPDF_RenderStatus(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice);
49   ~CPDF_RenderStatus();
50 
51   // Called prior to Initialize().
SetOptions(const CPDF_RenderOptions & options)52   void SetOptions(const CPDF_RenderOptions& options) { m_Options = options; }
SetDeviceMatrix(const CFX_Matrix & matrix)53   void SetDeviceMatrix(const CFX_Matrix& matrix) { m_DeviceMatrix = matrix; }
SetStopObject(const CPDF_PageObject * pStopObj)54   void SetStopObject(const CPDF_PageObject* pStopObj) { m_pStopObj = pStopObj; }
SetFormResource(RetainPtr<const CPDF_Dictionary> pRes)55   void SetFormResource(RetainPtr<const CPDF_Dictionary> pRes) {
56     m_pFormResource = std::move(pRes);
57   }
SetType3Char(CPDF_Type3Char * pType3Char)58   void SetType3Char(CPDF_Type3Char* pType3Char) { m_pType3Char = pType3Char; }
SetFillColor(FX_ARGB color)59   void SetFillColor(FX_ARGB color) { m_T3FillColor = color; }
SetDropObjects(bool bDropObjects)60   void SetDropObjects(bool bDropObjects) { m_bDropObjects = bDropObjects; }
SetLoadMask(bool bLoadMask)61   void SetLoadMask(bool bLoadMask) { m_bLoadMask = bLoadMask; }
SetStdCS(bool bStdCS)62   void SetStdCS(bool bStdCS) { m_bStdCS = bStdCS; }
SetGroupFamily(CPDF_ColorSpace::Family family)63   void SetGroupFamily(CPDF_ColorSpace::Family family) {
64     m_GroupFamily = family;
65   }
SetTransparency(const CPDF_Transparency & transparency)66   void SetTransparency(const CPDF_Transparency& transparency) {
67     m_Transparency = transparency;
68   }
SetInGroup(bool bInGroup)69   void SetInGroup(bool bInGroup) { m_bInGroup = bInGroup; }
70 
71   void Initialize(const CPDF_RenderStatus* pParentStatus,
72                   const CPDF_GraphicStates* pInitialStates);
73 
74   void RenderObjectList(const CPDF_PageObjectHolder* pObjectHolder,
75                         const CFX_Matrix& mtObj2Device);
76   void RenderSingleObject(CPDF_PageObject* pObj,
77                           const CFX_Matrix& mtObj2Device);
78   bool ContinueSingleObject(CPDF_PageObject* pObj,
79                             const CFX_Matrix& mtObj2Device,
80                             PauseIndicatorIface* pPause);
81   void ProcessClipPath(const CPDF_ClipPath& ClipPath,
82                        const CFX_Matrix& mtObj2Device);
83 
GetGroupFamily()84   CPDF_ColorSpace::Family GetGroupFamily() const { return m_GroupFamily; }
GetLoadMask()85   bool GetLoadMask() const { return m_bLoadMask; }
GetDropObjects()86   bool GetDropObjects() const { return m_bDropObjects; }
IsPrint()87   bool IsPrint() const {
88 #if BUILDFLAG(IS_WIN)
89     return m_bPrint;
90 #else
91     return false;
92 #endif
93   }
IsStopped()94   bool IsStopped() const { return m_bStopped; }
GetContext()95   CPDF_RenderContext* GetContext() const { return m_pContext; }
GetFormResource()96   const CPDF_Dictionary* GetFormResource() const {
97     return m_pFormResource.Get();
98   }
GetPageResource()99   const CPDF_Dictionary* GetPageResource() const {
100     return m_pPageResource.Get();
101   }
GetRenderDevice()102   CFX_RenderDevice* GetRenderDevice() const { return m_pDevice; }
GetRenderOptions()103   const CPDF_RenderOptions& GetRenderOptions() const { return m_Options; }
104 
105   RetainPtr<CPDF_TransferFunc> GetTransferFunc(
106       RetainPtr<const CPDF_Object> pObject) const;
107 
108   FX_ARGB GetFillArgb(CPDF_PageObject* pObj) const;
109   FX_ARGB GetFillArgbForType3(CPDF_PageObject* pObj) const;
110 
111   void DrawTilingPattern(CPDF_TilingPattern* pattern,
112                          CPDF_PageObject* pPageObj,
113                          const CFX_Matrix& mtObj2Device,
114                          bool stroke);
115   void DrawShadingPattern(CPDF_ShadingPattern* pattern,
116                           const CPDF_PageObject* pPageObj,
117                           const CFX_Matrix& mtObj2Device,
118                           bool stroke);
119   // `pDIBitmap` must be non-null.
120   void CompositeDIBitmap(RetainPtr<CFX_DIBitmap> bitmap,
121                          int left,
122                          int top,
123                          FX_ARGB mask_argb,
124                          float alpha,
125                          BlendMode blend_mode,
126                          const CPDF_Transparency& transparency);
127 
128   static std::unique_ptr<CPDF_GraphicStates> CloneObjStates(
129       const CPDF_GraphicStates* pSrcStates,
130       bool stroke);
131 
132  private:
133   bool ProcessTransparency(CPDF_PageObject* PageObj,
134                            const CFX_Matrix& mtObj2Device);
135   void ProcessObjectNoClip(CPDF_PageObject* pObj,
136                            const CFX_Matrix& mtObj2Device);
137   void DrawObjWithBackground(CPDF_PageObject* pObj,
138                              const CFX_Matrix& mtObj2Device);
139   void DrawObjWithBackgroundToDevice(CPDF_PageObject* obj,
140                                      const CFX_Matrix& object_to_device,
141                                      CFX_RenderDevice* device,
142                                      const CFX_Matrix& device_matrix);
143   bool DrawObjWithBlend(CPDF_PageObject* pObj, const CFX_Matrix& mtObj2Device);
144   bool ProcessPath(CPDF_PathObject* path_obj, const CFX_Matrix& mtObj2Device);
145   void ProcessPathPattern(CPDF_PathObject* path_obj,
146                           const CFX_Matrix& mtObj2Device,
147                           CFX_FillRenderOptions::FillType* fill_type,
148                           bool* stroke);
149   void DrawPathWithPattern(CPDF_PathObject* path_obj,
150                            const CFX_Matrix& mtObj2Device,
151                            const CPDF_Color* pColor,
152                            bool stroke);
153   bool ClipPattern(const CPDF_PageObject* page_obj,
154                    const CFX_Matrix& mtObj2Device,
155                    bool stroke);
156   bool SelectClipPath(const CPDF_PathObject* path_obj,
157                       const CFX_Matrix& mtObj2Device,
158                       bool stroke);
159   bool ProcessImage(CPDF_ImageObject* pImageObj,
160                     const CFX_Matrix& mtObj2Device);
161   void ProcessShading(const CPDF_ShadingObject* pShadingObj,
162                       const CFX_Matrix& mtObj2Device);
163   bool ProcessType3Text(CPDF_TextObject* textobj,
164                         const CFX_Matrix& mtObj2Device);
165   bool ProcessText(CPDF_TextObject* textobj,
166                    const CFX_Matrix& mtObj2Device,
167                    CFX_Path* clipping_path);
168   void DrawTextPathWithPattern(const CPDF_TextObject* textobj,
169                                const CFX_Matrix& mtObj2Device,
170                                CPDF_Font* pFont,
171                                float font_size,
172                                const CFX_Matrix& mtTextMatrix,
173                                bool fill,
174                                bool stroke);
175   bool ProcessForm(const CPDF_FormObject* pFormObj,
176                    const CFX_Matrix& mtObj2Device);
177   FX_RECT GetClippedBBox(const FX_RECT& rect) const;
178   RetainPtr<CFX_DIBitmap> GetBackdrop(const CPDF_PageObject* pObj,
179                                       const FX_RECT& bbox,
180                                       bool bBackAlphaRequired);
181   RetainPtr<CFX_DIBitmap> LoadSMask(CPDF_Dictionary* smask_dict,
182                                     const FX_RECT& clip_rect,
183                                     const CFX_Matrix& smask_matrix);
184   // Optionally write the colorspace family value into |pCSFamily|.
185   FX_ARGB GetBackgroundColor(const CPDF_Dictionary* pSMaskDict,
186                              const CPDF_Dictionary* pGroupDict,
187                              CPDF_ColorSpace::Family* pCSFamily);
188   FX_ARGB GetStrokeArgb(CPDF_PageObject* pObj) const;
189   FX_RECT GetObjectClippedRect(const CPDF_PageObject* pObj,
190                                const CFX_Matrix& mtObj2Device) const;
191   // Returns the format that is compatible with `m_pDevice`.
192   FXDIB_Format GetCompatibleArgbFormat() const;
193 
194   CPDF_RenderOptions m_Options;
195   RetainPtr<const CPDF_Dictionary> m_pFormResource;
196   RetainPtr<const CPDF_Dictionary> m_pPageResource;
197   std::vector<UnownedPtr<const CPDF_Type3Font>> m_Type3FontCache;
198   UnownedPtr<CPDF_RenderContext> const m_pContext;
199   UnownedPtr<CFX_RenderDevice> const m_pDevice;
200   CFX_Matrix m_DeviceMatrix;
201   CPDF_ClipPath m_LastClipPath;
202   UnownedPtr<const CPDF_PageObject> m_pCurObj;
203   UnownedPtr<const CPDF_PageObject> m_pStopObj;
204   CPDF_GraphicStates m_InitialStates;
205   std::unique_ptr<CPDF_ImageRenderer> m_pImageRenderer;
206   UnownedPtr<const CPDF_Type3Char> m_pType3Char;
207   CPDF_Transparency m_Transparency;
208   bool m_bStopped = false;
209 #if BUILDFLAG(IS_WIN)
210   bool m_bPrint = false;
211 #endif
212   bool m_bDropObjects = false;
213   bool m_bStdCS = false;
214   bool m_bLoadMask = false;
215   bool m_bInGroup = false;
216   CPDF_ColorSpace::Family m_GroupFamily = CPDF_ColorSpace::Family::kUnknown;
217   FX_ARGB m_T3FillColor = 0;
218 };
219 
220 #endif  // CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
221