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