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