1 // Copyright 2017 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_FXGE_DIB_CFX_IMAGETRANSFORMER_H_
8 #define CORE_FXGE_DIB_CFX_IMAGETRANSFORMER_H_
9 
10 #include <memory>
11 
12 #include "core/fxcrt/fx_coordinates.h"
13 #include "core/fxcrt/retain_ptr.h"
14 #include "core/fxge/dib/cfx_bitmapstorer.h"
15 
16 class CFX_DIBBase;
17 class CFX_DIBitmap;
18 class CFX_ImageStretcher;
19 class PauseIndicatorIface;
20 
21 class CFX_ImageTransformer {
22  public:
23   struct BilinearData {
24     int res_x;
25     int res_y;
26     int src_col_l;
27     int src_row_l;
28     int src_col_r;
29     int src_row_r;
30     int row_offset_l;
31     int row_offset_r;
32   };
33 
34   struct BicubicData {
35     int res_x;
36     int res_y;
37     int src_col_l;
38     int src_row_l;
39     int src_col_r;
40     int src_row_r;
41     int pos_pixel[8];
42     int u_w[4];
43     int v_w[4];
44   };
45 
46   struct DownSampleData {
47     int src_col;
48     int src_row;
49   };
50 
51   struct CalcData {
52     CFX_DIBitmap* bitmap;
53     const CFX_Matrix& matrix;
54     const uint8_t* buf;
55     uint32_t pitch;
56   };
57 
58   CFX_ImageTransformer(const RetainPtr<CFX_DIBBase>& pSrc,
59                        const CFX_Matrix& matrix,
60                        const FXDIB_ResampleOptions& options,
61                        const FX_RECT* pClip);
62   ~CFX_ImageTransformer();
63 
64   bool Continue(PauseIndicatorIface* pPause);
65 
result()66   const FX_RECT& result() const { return m_result; }
67   RetainPtr<CFX_DIBitmap> DetachBitmap();
68 
69  private:
70   enum StretchType {
71     kNone,
72     kNormal,
73     kRotate,
74     kOther,
75   };
76 
77   void ContinueRotate(PauseIndicatorIface* pPause);
78   void ContinueOther(PauseIndicatorIface* pPause);
79 
80   void CalcMask(const CalcData& cdata);
81   void CalcAlpha(const CalcData& cdata);
82   void CalcMono(const CalcData& cdata, FXDIB_Format format);
83   void CalcColor(const CalcData& cdata, FXDIB_Format format, int Bpp);
84 
85   bool IsBilinear() const;
86   bool IsBiCubic() const;
87 
88   RetainPtr<CFX_DIBBase> const m_pSrc;
89   const CFX_Matrix m_matrix;
90   FX_RECT m_StretchClip;
91   FX_RECT m_result;
92   CFX_Matrix m_dest2stretch;
93   std::unique_ptr<CFX_ImageStretcher> m_Stretcher;
94   CFX_BitmapStorer m_Storer;
95   const FXDIB_ResampleOptions m_ResampleOptions;
96   StretchType m_type = kNone;
97 };
98 
99 #endif  // CORE_FXGE_DIB_CFX_IMAGETRANSFORMER_H_
100