1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXGE_DIB_DIB_INT_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXGE_DIB_DIB_INT_H_
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdint.h>
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_coordinates.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_dib.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_ScanlineComposer;
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int16_t SDP_Table[513];
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_FixedMatrix {
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_FixedMatrix(const CFX_Matrix& src, int bits) {
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    base = 1 << bits;
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    a = FXSYS_round(src.a * base);
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    b = FXSYS_round(src.b * base);
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    c = FXSYS_round(src.c * base);
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    d = FXSYS_round(src.d * base);
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    e = FXSYS_round(src.e * base);
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    f = FXSYS_round(src.f * base);
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  inline void Transform(int x, int y, int& x1, int& y1) {
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    x1 = (a * x + c * y + e + base / 2) / base;
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    y1 = (b * x + d * y + f + base / 2) / base;
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int a, b, c, d, e, f;
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int base;
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FPDF_HUGE_IMAGE_SIZE 60000000
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct PixelWeight {
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_SrcStart;
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_SrcEnd;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_Weights[1];
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CWeightTable {
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CWeightTable();
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CWeightTable();
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool Calc(int dest_len,
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int dest_min,
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int dest_max,
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int src_len,
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int src_min,
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int src_max,
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            int flags);
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  PixelWeight* GetPixelWeight(int pixel) const;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int* GetValueFromPixelWeight(PixelWeight* pWeight, int index) const;
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t GetPixelWeightSize() const;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_DestMin;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_ItemSize;
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* m_pWeightTables;
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t m_dwWeightTablesSize;
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CStretchEngine {
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CStretchEngine(IFX_ScanlineComposer* pDestBitmap,
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 FXDIB_Format dest_format,
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 int dest_width,
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 int dest_height,
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 const FX_RECT& clip_rect,
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 const CFX_DIBSource* pSrcBitmap,
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 int flags);
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ~CStretchEngine();
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool Continue(IFX_Pause* pPause);
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool StartStretchHorz();
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ContinueStretchHorz(IFX_Pause* pPause);
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void StretchVert();
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Format m_DestFormat;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_DestBpp;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_SrcBpp;
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_bHasAlpha;
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_ScanlineComposer* m_pDestBitmap;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_DestWidth, m_DestHeight;
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_RECT m_DestClip;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* m_pDestScanline;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* m_pDestMaskScanline;
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_RECT m_SrcClip;
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const CFX_DIBSource* m_pSource;
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t* m_pSrcPalette;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_SrcWidth;
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_SrcHeight;
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_SrcPitch;
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_InterPitch;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_ExtraMaskPitch;
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t* m_pInterBuf;
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t* m_pExtraAlphaBuf;
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_TransMethod;
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_Flags;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CWeightTable m_WeightTable;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_CurRow;
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_State;
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_RECT FXDIB_SwapClipBox(FX_RECT& clip,
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          int width,
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          int height,
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          bool bFlipX,
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          bool bFlipY);
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FXGE_DIB_DIB_INT_H_
117