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_IMAGERENDERER_H_ 8 #define CORE_FPDFAPI_RENDER_CPDF_IMAGERENDERER_H_ 9 10 #include <memory> 11 12 #include "core/fpdfapi/render/cpdf_imageloader.h" 13 #include "core/fxcrt/fx_coordinates.h" 14 #include "core/fxcrt/unowned_ptr.h" 15 #include "core/fxge/dib/cfx_imagerenderer.h" 16 #include "core/fxge/dib/fx_dib.h" 17 #include "third_party/base/optional.h" 18 19 class CFX_DIBitmap; 20 class CFX_DIBBase; 21 class CFX_DefaultRenderDevice; 22 class CFX_ImageTransformer; 23 class CPDF_ImageObject; 24 class CPDF_PageObject; 25 class CPDF_Pattern; 26 class CPDF_RenderOptions; 27 class CPDF_RenderStatus; 28 29 class CPDF_ImageRenderer { 30 public: 31 CPDF_ImageRenderer(); 32 ~CPDF_ImageRenderer(); 33 34 bool Start(CPDF_RenderStatus* pStatus, 35 CPDF_ImageObject* pImageObject, 36 const CFX_Matrix& mtObj2Device, 37 bool bStdCS, 38 BlendMode blendType); 39 40 bool Start(CPDF_RenderStatus* pStatus, 41 const RetainPtr<CFX_DIBBase>& pDIBBase, 42 FX_ARGB bitmap_argb, 43 const CFX_Matrix& mtImage2Device, 44 const FXDIB_ResampleOptions& options, 45 bool bStdCS); 46 47 bool Continue(PauseIndicatorIface* pPause); GetResult()48 bool GetResult() const { return m_Result; } 49 50 private: 51 enum class Mode { 52 kNone = 0, 53 kDefault, 54 kBlend, 55 kTransform, 56 }; 57 58 bool StartBitmapAlpha(); 59 bool StartDIBBase(); 60 bool StartRenderDIBBase(); 61 bool StartLoadDIBBase(); 62 bool ContinueDefault(PauseIndicatorIface* pPause); 63 bool ContinueBlend(PauseIndicatorIface* pPause); 64 bool ContinueTransform(PauseIndicatorIface* pPause); 65 bool DrawMaskedImage(); 66 bool DrawPatternImage(); 67 bool NotDrawing() const; 68 FX_RECT GetDrawRect() const; 69 CFX_Matrix GetDrawMatrix(const FX_RECT& rect) const; 70 void CalculateDrawImage(CFX_DefaultRenderDevice* pBitmapDevice1, 71 CFX_DefaultRenderDevice* pBitmapDevice2, 72 const RetainPtr<CFX_DIBBase>& pDIBBase, 73 const CFX_Matrix& mtNewMatrix, 74 const FX_RECT& rect) const; 75 const CPDF_RenderOptions& GetRenderOptions() const; 76 void HandleFilters(); 77 Optional<FX_RECT> GetUnitRect() const; 78 bool GetDimensionsFromUnitRect(const FX_RECT& rect, 79 int* left, 80 int* top, 81 int* width, 82 int* height) const; 83 84 UnownedPtr<CPDF_RenderStatus> m_pRenderStatus; 85 UnownedPtr<CPDF_ImageObject> m_pImageObject; 86 RetainPtr<CPDF_Pattern> m_pPattern; 87 RetainPtr<CFX_DIBBase> m_pDIBBase; 88 CFX_Matrix m_mtObj2Device; 89 CFX_Matrix m_ImageMatrix; 90 CPDF_ImageLoader m_Loader; 91 std::unique_ptr<CFX_ImageTransformer> m_pTransformer; 92 std::unique_ptr<CFX_ImageRenderer> m_DeviceHandle; 93 Mode m_Mode = Mode::kNone; 94 int m_BitmapAlpha = 0; 95 BlendMode m_BlendType = BlendMode::kNormal; 96 FX_ARGB m_FillArgb = 0; 97 FXDIB_ResampleOptions m_ResampleOptions; 98 bool m_bPatternColor = false; 99 bool m_bStdCS = false; 100 bool m_Result = true; 101 }; 102 103 #endif // CORE_FPDFAPI_RENDER_CPDF_IMAGERENDERER_H_ 104