// 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 _FPDF_DIB_H_
#define _FPDF_DIB_H_
#ifndef _FXCRT_EXTENSION_
#include "../fxcrt/fx_ext.h"
#endif
enum FXDIB_Format {
    FXDIB_Invalid = 0,
    FXDIB_1bppMask = 0x101,
    FXDIB_1bppRgb = 0x001,
    FXDIB_1bppCmyk = 0x401,
    FXDIB_8bppMask = 0x108,
    FXDIB_8bppRgb = 0x008,
    FXDIB_8bppRgba = 0x208,
    FXDIB_8bppCmyk = 0x408,
    FXDIB_8bppCmyka = 0x608,
    FXDIB_Rgb = 0x018,
    FXDIB_Rgba = 0x218,
    FXDIB_Rgb32 = 0x020,
    FXDIB_Argb = 0x220,
    FXDIB_Cmyk = 0x420,
    FXDIB_Cmyka = 0x620,
};
enum FXDIB_Channel {
    FXDIB_Red = 1,
    FXDIB_Green,
    FXDIB_Blue,
    FXDIB_Cyan,
    FXDIB_Magenta,
    FXDIB_Yellow,
    FXDIB_Black,
    FXDIB_Alpha
};
#define FXDIB_DOWNSAMPLE		0x04
#define FXDIB_INTERPOL			0x20
#define FXDIB_BICUBIC_INTERPOL  0x80
#define FXDIB_NOSMOOTH			0x100
#define FXDIB_PALETTE_LOC		0x01
#define FXDIB_PALETTE_WIN		0x02
#define FXDIB_PALETTE_MAC		0x04
#define FXDIB_BLEND_NORMAL			0
#define FXDIB_BLEND_MULTIPLY		1
#define FXDIB_BLEND_SCREEN			2
#define FXDIB_BLEND_OVERLAY			3
#define FXDIB_BLEND_DARKEN			4
#define FXDIB_BLEND_LIGHTEN			5

#define FXDIB_BLEND_COLORDODGE		6
#define FXDIB_BLEND_COLORBURN		7
#define FXDIB_BLEND_HARDLIGHT		8
#define FXDIB_BLEND_SOFTLIGHT		9
#define FXDIB_BLEND_DIFFERENCE		10
#define FXDIB_BLEND_EXCLUSION		11
#define FXDIB_BLEND_NONSEPARABLE	21
#define FXDIB_BLEND_HUE				21
#define FXDIB_BLEND_SATURATION		22
#define FXDIB_BLEND_COLOR			23
#define FXDIB_BLEND_LUMINOSITY		24
#define FXDIB_BLEND_UNSUPPORTED		-1
typedef FX_DWORD	FX_ARGB;
typedef FX_DWORD	FX_COLORREF;
typedef FX_DWORD	FX_CMYK;
class CFX_ClipRgn;
class CFX_DIBSource;
class CFX_DIBitmap;
#define FXSYS_RGB(r, g, b)  ((r) | ((g) << 8) | ((b) << 16))
#define FXSYS_GetRValue(rgb) ((rgb) & 0xff)
#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
#define FX_CCOLOR(val) (255-(val))
#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))
#define FXSYS_GetCValue(cmyk) ((FX_BYTE)((cmyk) >> 24) & 0xff)
#define FXSYS_GetMValue(cmyk) ((FX_BYTE)((cmyk) >> 16) & 0xff)
#define FXSYS_GetYValue(cmyk) ((FX_BYTE)((cmyk) >> 8) & 0xff)
#define FXSYS_GetKValue(cmyk) ((FX_BYTE)(cmyk) & 0xff)
void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);
inline FX_CMYK CmykEncode(int c, int m, int y, int k)
{
    return (c << 24) | (m << 16) | (y << 8) | k;
}
void ArgbDecode(FX_ARGB argb, int& a, int& r, int&g, int& b);
void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);
inline FX_ARGB ArgbEncode(int a, int r, int g, int b)
{
    return (a << 24) | (r << 16) | (g << 8) | b;
}
FX_ARGB ArgbEncode(int a, FX_COLORREF rgb);
#define FXARGB_A(argb) ((FX_BYTE)((argb) >> 24))
#define FXARGB_R(argb) ((FX_BYTE)((argb) >> 16))
#define FXARGB_G(argb) ((FX_BYTE)((argb) >> 8))
#define FXARGB_B(argb) ((FX_BYTE)(argb))
#define FXARGB_MAKE(a,r,g,b) (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define FXARGB_MUL_ALPHA(argb, alpha) (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb) & 0xffffff))
#define FXRGB2GRAY(r,g,b) (((b) * 11 + (g) * 59 + (r) * 30) / 100)
#define FXCMYK2GRAY(c,m,y,k) (((255-(c)) * (255-(k)) * 30 + (255-(m)) * (255-(k)) * 59 + (255-(y)) * (255-(k)) * 11) / 25500)
#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) (((backdrop) * (255-(source_alpha)) + (source)*(source_alpha))/255)
#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest)*(src)/255)
#define FXCMYK_GETDIB(p) ((((FX_LPBYTE)(p))[0] << 24 | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | ((FX_LPBYTE)(p))[3]))
#define FXCMYK_SETDIB(p, cmyk)  ((FX_LPBYTE)(p))[0] = (FX_BYTE)((cmyk) >> 24), \
        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((cmyk) >> 16), \
                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((cmyk) >> 8), \
                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)(cmyk))
#define FXARGB_GETDIB(p) (((FX_LPBYTE)(p))[0]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[3] << 24)
#define FXARGB_SETDIB(p, argb) ((FX_LPBYTE)(p))[0] = (FX_BYTE)(argb), \
        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((argb) >> 16), \
                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)((argb) >> 24)
#define FXARGB_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
#define FXCMYK_COPY(dest, src)  *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
#define FXARGB_SETRGBORDERDIB(p, argb) ((FX_LPBYTE)(p))[3] = (FX_BYTE)(argb>>24), \
        ((FX_LPBYTE)(p))[0] = (FX_BYTE)((argb) >> 16), \
                              ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
                                      ((FX_LPBYTE)(p))[2] = (FX_BYTE)(argb)
#define FXARGB_GETRGBORDERDIB(p) (((FX_LPBYTE)(p))[2]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0] << 16) | (((FX_LPBYTE)(p))[3] << 24)
#define FXARGB_RGBORDERCOPY(dest, src) *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3), \
        *(FX_LPBYTE)(dest) = *((FX_LPBYTE)(src)+2), \
                             *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
                                     *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src))
#define FXARGB_TODIB(argb) (argb)
#define FXCMYK_TODIB(cmyk) ((FX_BYTE)((cmyk) >> 24) | ((FX_BYTE)((cmyk) >> 16)) << 8 | ((FX_BYTE)((cmyk) >> 8)) << 16 | ((FX_BYTE)(cmyk) << 24))
#define FXARGB_TOBGRORDERDIB(argb) ((FX_BYTE)(argb>>16) | ((FX_BYTE)(argb>>8)) << 8 | ((FX_BYTE)(argb)) << 16 | ((FX_BYTE)(argb>>24) << 24))
#define FXGETFLAG_COLORTYPE(flag)			(FX_BYTE)((flag)>>8)
#define FXGETFLAG_ALPHA_FILL(flag)			(FX_BYTE)(flag)
#define FXGETFLAG_ALPHA_STROKE(flag)		(FX_BYTE)((flag)>>16)
#define FXSETFLAG_COLORTYPE(flag, val)		flag = (((val)<<8)|(flag&0xffff00ff))
#define FXSETFLAG_ALPHA_FILL(flag, val)		flag = ((val)|(flag&0xffffff00))
#define FXSETFLAG_ALPHA_STROKE(flag, val)	flag = (((val)<<16)|(flag&0xff00ffff))
class CFX_DIBSource : public CFX_Object
{
public:

    virtual			~CFX_DIBSource();



    int				GetWidth() const
    {
        return m_Width;
    }

    int				GetHeight() const
    {
        return m_Height;
    }

    FXDIB_Format	GetFormat() const
    {
        return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);
    }

    FX_DWORD		GetPitch() const
    {
        return m_Pitch;
    }

    FX_DWORD*		GetPalette() const
    {
        return m_pPalette;
    }



    virtual	FX_LPBYTE	GetBuffer() const
    {
        return NULL;
    }

    virtual FX_LPCBYTE	GetScanline(int line) const = 0;

    virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) const
    {
        return FALSE;
    }

    virtual void		DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
                                           int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const = 0;

    virtual void		SetDownSampleSize(int width, int height) const {}

    int				GetBPP() const
    {
        return m_bpp;
    }

    FX_BOOL			IsAlphaMask() const
    {
        return m_AlphaFlag == 1;
    }

    FX_BOOL			HasAlpha() const
    {
        return m_AlphaFlag & 2 ? TRUE : FALSE;
    }

    FX_BOOL			IsOpaqueImage() const
    {
        return !(m_AlphaFlag & 3);
    }

    FX_BOOL			IsCmykImage() const
    {
        return m_AlphaFlag & 4 ? TRUE : FALSE;
    }



    int				GetPaletteSize() const
    {
        return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));
    }

    FX_DWORD		GetPaletteEntry(int index) const;

    void			SetPaletteEntry(int index, FX_DWORD color);
    FX_DWORD		GetPaletteArgb(int index) const
    {
        return GetPaletteEntry(index);
    }
    void			SetPaletteArgb(int index, FX_DWORD color)
    {
        SetPaletteEntry(index, color);
    }

    void			CopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);


    CFX_DIBitmap*	Clone(const FX_RECT* pClip = NULL) const;

    CFX_DIBitmap*	CloneConvert(FXDIB_Format format, const FX_RECT* pClip = NULL, void* pIccTransform = NULL) const;

    CFX_DIBitmap*	StretchTo(int dest_width, int dest_height, FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;


    CFX_DIBitmap*	TransformTo(const CFX_AffineMatrix* pMatrix, int& left, int &top,
                                FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;

    CFX_DIBitmap*	GetAlphaMask(const FX_RECT* pClip = NULL) const;

    FX_BOOL			CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip = NULL);

    CFX_DIBitmap*	SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pClip = NULL) const;

    CFX_DIBitmap*	FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;

    void			GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height, int src_width,
                                   int src_height, int& src_left, int& src_top, const CFX_ClipRgn* pClipRgn);

    CFX_DIBitmap*	m_pAlphaMask;
protected:

    CFX_DIBSource();

    int				m_Width;

    int				m_Height;

    int				m_bpp;

    FX_DWORD		m_AlphaFlag;

    FX_DWORD		m_Pitch;

    FX_DWORD*		m_pPalette;

    void			BuildPalette();

    FX_BOOL			BuildAlphaMask();

    int				FindPalette(FX_DWORD color) const;

    void			GetPalette(FX_DWORD* pal, int alpha) const;
};
class CFX_DIBitmap : public CFX_DIBSource
{
public:

    virtual ~CFX_DIBitmap();

    CFX_DIBitmap();

    CFX_DIBitmap(const CFX_DIBitmap& src);

    FX_BOOL			Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer = NULL, int pitch = 0);

    FX_BOOL			Copy(const CFX_DIBSource* pSrc);

    virtual	FX_LPBYTE	GetBuffer() const
    {
        return m_pBuffer;
    }

    virtual FX_LPCBYTE	GetScanline(int line) const
    {
        return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;
    }

    virtual void	DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
                                       int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;

    void			TakeOver(CFX_DIBitmap* pSrcBitmap);

    FX_BOOL			ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);

    void			Clear(FX_DWORD color);

    FX_DWORD		GetPixel(int x, int y) const;

    void			SetPixel(int x, int y, FX_DWORD color);

    FX_BOOL			LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel);

    FX_BOOL			LoadChannel(FXDIB_Channel destChannel, int value);

    FX_BOOL			MultiplyAlpha(int alpha);

    FX_BOOL			MultiplyAlpha(const CFX_DIBSource* pAlphaMask);

    FX_BOOL			TransferBitmap(int dest_left, int dest_top, int width, int height,
                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform = NULL);

    FX_BOOL			CompositeBitmap(int dest_left, int dest_top, int width, int height,
                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
                                    int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, void* pIccTransform = NULL);

    FX_BOOL			TransferMask(int dest_left, int dest_top, int width, int height,
                                 const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag = 0, void* pIccTransform = NULL);

    FX_BOOL			CompositeMask(int dest_left, int dest_top, int width, int height,
                                  const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
                                  int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);

    FX_BOOL			CompositeRect(int dest_left, int dest_top, int width, int height, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL);

    FX_BOOL			ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);

    FX_BOOL			DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect = NULL);
protected:

    FX_LPBYTE		m_pBuffer;

    FX_BOOL			m_bExtBuf;

    FX_BOOL			GetGrayData(void* pIccTransform = NULL);
};
class CFX_DIBExtractor : public CFX_Object
{
public:

    CFX_DIBExtractor(const CFX_DIBSource* pSrc);

    ~CFX_DIBExtractor();

    operator CFX_DIBitmap*()
    {
        return m_pBitmap;
    }
private:

    CFX_DIBitmap*			m_pBitmap;
};
typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;
class CFX_FilteredDIB : public CFX_DIBSource
{
public:

    CFX_FilteredDIB();

    ~CFX_FilteredDIB();

    void					LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);

    virtual FXDIB_Format	GetDestFormat() = 0;

    virtual FX_DWORD*		GetDestPalette() = 0;


    virtual void			TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const = 0;

    virtual void			TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const = 0;
protected:
    virtual FX_LPCBYTE		GetScanline(int line) const;
    virtual void			DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
            int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;

    const CFX_DIBSource*	m_pSrc;

    FX_BOOL					m_bAutoDropSrc;

    FX_LPBYTE				m_pScanline;
};
class IFX_ScanlineComposer
{
public:

    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL) = 0;


    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette) = 0;
};
class CFX_ScanlineCompositor : public CFX_Object
{
public:

    CFX_ScanlineCompositor();

    ~CFX_ScanlineCompositor();

    FX_BOOL				Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
                             FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);


    void				CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);


    void				CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);


    void				CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
            FX_LPBYTE dst_extra_alpha = NULL);


    void				CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
            FX_LPBYTE dst_extra_alpha = NULL);
protected:
    int					m_Transparency;
    FXDIB_Format		m_SrcFormat,
                        m_DestFormat;
    FX_DWORD*			m_pSrcPalette;

    int					m_MaskAlpha,
                        m_MaskRed,
                        m_MaskGreen,
                        m_MaskBlue,
                        m_MaskBlack;
    int					m_BlendType;
    void*				m_pIccTransform;
    FX_LPBYTE			m_pCacheScanline;
    int					m_CacheSize;
    FX_BOOL             m_bRgbByteOrder;
};
class CFX_BitmapComposer : public IFX_ScanlineComposer, public CFX_Object
{
public:

    CFX_BitmapComposer();

    ~CFX_BitmapComposer();


    void				Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
                                FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
                                FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder = FALSE,
                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);


    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);
protected:

    void				DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
                                  FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
    CFX_DIBitmap*		m_pBitmap;
    const CFX_ClipRgn*	m_pClipRgn;
    FXDIB_Format		m_SrcFormat;
    int					m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;
    FX_DWORD			m_MaskColor;
    const CFX_DIBitmap*	m_pClipMask;
    CFX_ScanlineCompositor	m_Compositor;
    FX_BOOL				m_bVertical, m_bFlipX, m_bFlipY;
    int					m_AlphaFlag;
    void*				m_pIccTransform;
    FX_BOOL             m_bRgbByteOrder;
    int					m_BlendType;
    void				ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL);
    FX_LPBYTE			m_pScanlineV, m_pClipScanV, m_pAddClipScan, m_pScanlineAlphaV;
};
class CFX_BitmapStorer : public IFX_ScanlineComposer, public CFX_Object
{
public:

    CFX_BitmapStorer();

    ~CFX_BitmapStorer();

    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);

    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);

    CFX_DIBitmap*		GetBitmap()
    {
        return m_pBitmap;
    }

    CFX_DIBitmap*		Detach();

    void				Replace(CFX_DIBitmap* pBitmap);
private:
    CFX_DIBitmap*		m_pBitmap;
};
class CStretchEngine;
class CFX_ImageStretcher : public CFX_Object
{
public:

    CFX_ImageStretcher();

    ~CFX_ImageStretcher();

    FX_INT32		Start(IFX_ScanlineComposer* pDest, const CFX_DIBSource* pBitmap,
                          int dest_width, int dest_height, const FX_RECT& bitmap_rect, FX_DWORD flags);


    FX_INT32		Continue(IFX_Pause* pPause);
    IFX_ScanlineComposer*	m_pDest;
    const CFX_DIBSource*	m_pSource;
    CStretchEngine*		m_pStretchEngine;
    FX_DWORD		m_Flags;
    FX_BOOL			m_bFlipX,
                    m_bFlipY;
    int				m_DestWidth,
                    m_DestHeight;
    FX_RECT			m_ClipRect;
    int				m_LineIndex;
    int				m_DestBPP;
    FX_LPBYTE		m_pScanline;
    FX_LPBYTE       m_pMaskScanline;
    FXDIB_Format	m_DestFormat;
    FX_INT32		m_Status;

    FX_INT32		StartQuickStretch();

    FX_INT32		StartStretch();

    FX_INT32		ContinueQuickStretch(IFX_Pause* pPause);

    FX_INT32		ContinueStretch(IFX_Pause* pPause);
};
class CFX_ImageTransformer : public CFX_Object
{
public:

    CFX_ImageTransformer();

    ~CFX_ImageTransformer();

    FX_INT32	Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pMatrix, int flags, const FX_RECT* pClip);


    FX_INT32	Continue(IFX_Pause* pPause);
    CFX_AffineMatrix* m_pMatrix;
    FX_RECT		m_StretchClip;
    int			m_ResultLeft, m_ResultTop, m_ResultWidth, m_ResultHeight;
    CFX_AffineMatrix	m_dest2stretch;
    CFX_ImageStretcher	m_Stretcher;
    CFX_BitmapStorer	m_Storer;
    FX_DWORD	m_Flags;
    int			m_Status;
};
class CFX_ImageRenderer : public CFX_Object
{
public:

    CFX_ImageRenderer();

    ~CFX_ImageRenderer();

    FX_INT32			Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
                              const CFX_DIBSource* pSource, int bitmap_alpha,
                              FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix, FX_DWORD dib_flags,
                              FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL,
                              int blend_type = FXDIB_BLEND_NORMAL);

    FX_INT32			Continue(IFX_Pause* pPause);
protected:
    CFX_DIBitmap*		m_pDevice;
    const CFX_ClipRgn*	m_pClipRgn;
    int					m_BitmapAlpha;
    FX_DWORD			m_MaskColor;
    CFX_AffineMatrix	m_Matrix;
    CFX_ImageTransformer*	m_pTransformer;
    CFX_ImageStretcher	m_Stretcher;
    CFX_BitmapComposer	m_Composer;
    int					m_Status;
    int					m_DestLeft, m_DestTop;
    FX_RECT				m_ClipBox;
    FX_DWORD			m_Flags;
    int					m_AlphaFlag;
    void*				m_pIccTransform;
    FX_BOOL				m_bRgbByteOrder;
    int					m_BlendType;
};
#endif
