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