blob: 1d2193e9bba83d40283419474c831b24c19f1e75 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef CORE_FXGE_DIB_DIB_INT_H_
#define CORE_FXGE_DIB_DIB_INT_H_
#include <stdint.h>
#include "core/fxcrt/include/fx_coordinates.h"
#include "core/include/fxge/fx_dib.h"
class IFX_ScanlineComposer;
extern const int16_t SDP_Table[513];
class CPDF_FixedMatrix {
public:
CPDF_FixedMatrix(const CFX_Matrix& src, int bits) {
base = 1 << bits;
a = FXSYS_round(src.a * base);
b = FXSYS_round(src.b * base);
c = FXSYS_round(src.c * base);
d = FXSYS_round(src.d * base);
e = FXSYS_round(src.e * base);
f = FXSYS_round(src.f * base);
}
inline void Transform(int x, int y, int& x1, int& y1) {
x1 = (a * x + c * y + e + base / 2) / base;
y1 = (b * x + d * y + f + base / 2) / base;
}
int a, b, c, d, e, f;
int base;
};
#define FPDF_HUGE_IMAGE_SIZE 60000000
struct PixelWeight {
int m_SrcStart;
int m_SrcEnd;
int m_Weights[1];
};
class CWeightTable {
public:
CWeightTable() { m_pWeightTables = NULL; }
~CWeightTable() {
FX_Free(m_pWeightTables);
m_pWeightTables = NULL;
}
void Calc(int dest_len,
int dest_min,
int dest_max,
int src_len,
int src_min,
int src_max,
int flags);
PixelWeight* GetPixelWeight(int pixel) {
return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
}
int m_DestMin, m_ItemSize;
uint8_t* m_pWeightTables;
};
class CStretchEngine {
public:
CStretchEngine(IFX_ScanlineComposer* pDestBitmap,
FXDIB_Format dest_format,
int dest_width,
int dest_height,
const FX_RECT& clip_rect,
const CFX_DIBSource* pSrcBitmap,
int flags);
~CStretchEngine();
FX_BOOL Continue(IFX_Pause* pPause);
public:
FXDIB_Format m_DestFormat;
int m_DestBpp, m_SrcBpp, m_bHasAlpha;
IFX_ScanlineComposer* m_pDestBitmap;
int m_DestWidth, m_DestHeight;
FX_RECT m_DestClip;
uint8_t* m_pDestScanline;
uint8_t* m_pDestMaskScanline;
FX_RECT m_SrcClip;
const CFX_DIBSource* m_pSource;
uint32_t* m_pSrcPalette;
int m_SrcWidth, m_SrcHeight;
int m_SrcPitch, m_InterPitch;
int m_ExtraMaskPitch;
unsigned char* m_pInterBuf;
unsigned char* m_pExtraAlphaBuf;
int m_TransMethod;
int m_Flags;
CWeightTable m_WeightTable;
int m_CurRow;
FX_BOOL StartStretchHorz();
FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
void StretchVert();
int m_State;
};
FX_RECT FXDIB_SwapClipBox(FX_RECT& clip,
int width,
int height,
FX_BOOL bFlipX,
FX_BOOL bFlipY);
#endif // CORE_FXGE_DIB_DIB_INT_H_