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
15class IFX_ScanlineComposer;
16
17extern const int16_t SDP_Table[513];
18
19class CPDF_FixedMatrix {
20 public:
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  }
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
38struct PixelWeight {
39  int m_SrcStart;
40  int m_SrcEnd;
41  int m_Weights[1];
42};
43class CWeightTable {
44 public:
45  CWeightTable() { m_pWeightTables = NULL; }
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);
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};
63class 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
101FX_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