1 // Copyright 2014 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_SRC_FXGE_DIB_DIB_INT_H_
8 #define CORE_SRC_FXGE_DIB_DIB_INT_H_
9 
10 class CPDF_FixedMatrix
11 {
12 public:
CPDF_FixedMatrix(const CFX_AffineMatrix & src,int bits)13     CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
14     {
15         base = 1 << bits;
16         a = FXSYS_round(src.a * base);
17         b = FXSYS_round(src.b * base);
18         c = FXSYS_round(src.c * base);
19         d = FXSYS_round(src.d * base);
20         e = FXSYS_round(src.e * base);
21         f = FXSYS_round(src.f * base);
22     }
Transform(int x,int y,int & x1,int & y1)23     inline void	Transform(int x, int y, int& x1, int& y1)
24     {
25         x1 = (a * x + c * y + e + base / 2) / base;
26         y1 = (b * x + d * y + f + base / 2) / base;
27     }
28     int		a, b, c, d, e, f;
29     int		base;
30 };
31 #define FPDF_HUGE_IMAGE_SIZE	60000000
32 struct PixelWeight {
33     int		m_SrcStart;
34     int		m_SrcEnd;
35     int		m_Weights[1];
36 };
37 class CWeightTable
38 {
39 public:
CWeightTable()40     CWeightTable()
41     {
42         m_pWeightTables = NULL;
43     }
~CWeightTable()44     ~CWeightTable()
45     {
46         if(m_pWeightTables) {
47             FX_Free(m_pWeightTables);
48         }
49         m_pWeightTables = NULL;
50     }
51     void			Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
GetPixelWeight(int pixel)52     PixelWeight*	GetPixelWeight(int pixel)
53     {
54         return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
55     }
56     int				m_DestMin, m_ItemSize;
57     FX_LPBYTE		m_pWeightTables;
58 };
59 class CStretchEngine
60 {
61 public:
62     CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
63                    int dest_width, int dest_height, const FX_RECT& clip_rect,
64                    const CFX_DIBSource* pSrcBitmap, int flags);
65     ~CStretchEngine();
66     FX_BOOL		Continue(IFX_Pause* pPause);
67 public:
68     FXDIB_Format m_DestFormat;
69     int		m_DestBpp, m_SrcBpp, m_bHasAlpha;
70     IFX_ScanlineComposer*	m_pDestBitmap;
71     int		m_DestWidth, m_DestHeight;
72     FX_RECT	m_DestClip;
73     FX_LPBYTE	m_pDestScanline;
74     FX_LPBYTE   m_pDestMaskScanline;
75     FX_RECT	m_SrcClip;
76     const CFX_DIBSource*	m_pSource;
77     FX_DWORD*	m_pSrcPalette;
78     int		m_SrcWidth, m_SrcHeight;
79     int		m_SrcPitch, m_InterPitch;
80     int m_ExtraMaskPitch;
81     unsigned char*	m_pInterBuf;
82     unsigned char*	m_pExtraAlphaBuf;
83     int		m_TransMethod;
84     int 	m_Flags;
85     CWeightTable	m_WeightTable;
86     int		m_CurRow;
87     FX_BOOL	StartStretchHorz();
88     FX_BOOL	ContinueStretchHorz(IFX_Pause* pPause);
89     void	StretchVert();
90     int		m_State;
91 };
92 
93 #endif  // CORE_SRC_FXGE_DIB_DIB_INT_H_
94