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