Home | History | Annotate | Download | only in fxge
      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_INCLUDE_FXGE_FX_DIB_H_
      8 #define CORE_INCLUDE_FXGE_FX_DIB_H_
      9 
     10 #include "../fxcrt/fx_ext.h"
     11 
     12 enum FXDIB_Format {
     13     FXDIB_Invalid = 0,
     14     FXDIB_1bppMask = 0x101,
     15     FXDIB_1bppRgb = 0x001,
     16     FXDIB_1bppCmyk = 0x401,
     17     FXDIB_8bppMask = 0x108,
     18     FXDIB_8bppRgb = 0x008,
     19     FXDIB_8bppRgba = 0x208,
     20     FXDIB_8bppCmyk = 0x408,
     21     FXDIB_8bppCmyka = 0x608,
     22     FXDIB_Rgb = 0x018,
     23     FXDIB_Rgba = 0x218,
     24     FXDIB_Rgb32 = 0x020,
     25     FXDIB_Argb = 0x220,
     26     FXDIB_Cmyk = 0x420,
     27     FXDIB_Cmyka = 0x620,
     28 };
     29 enum FXDIB_Channel {
     30     FXDIB_Red = 1,
     31     FXDIB_Green,
     32     FXDIB_Blue,
     33     FXDIB_Cyan,
     34     FXDIB_Magenta,
     35     FXDIB_Yellow,
     36     FXDIB_Black,
     37     FXDIB_Alpha
     38 };
     39 #define FXDIB_DOWNSAMPLE		0x04
     40 #define FXDIB_INTERPOL			0x20
     41 #define FXDIB_BICUBIC_INTERPOL  0x80
     42 #define FXDIB_NOSMOOTH			0x100
     43 #define FXDIB_PALETTE_LOC		0x01
     44 #define FXDIB_PALETTE_WIN		0x02
     45 #define FXDIB_PALETTE_MAC		0x04
     46 #define FXDIB_BLEND_NORMAL			0
     47 #define FXDIB_BLEND_MULTIPLY		1
     48 #define FXDIB_BLEND_SCREEN			2
     49 #define FXDIB_BLEND_OVERLAY			3
     50 #define FXDIB_BLEND_DARKEN			4
     51 #define FXDIB_BLEND_LIGHTEN			5
     52 
     53 #define FXDIB_BLEND_COLORDODGE		6
     54 #define FXDIB_BLEND_COLORBURN		7
     55 #define FXDIB_BLEND_HARDLIGHT		8
     56 #define FXDIB_BLEND_SOFTLIGHT		9
     57 #define FXDIB_BLEND_DIFFERENCE		10
     58 #define FXDIB_BLEND_EXCLUSION		11
     59 #define FXDIB_BLEND_NONSEPARABLE	21
     60 #define FXDIB_BLEND_HUE				21
     61 #define FXDIB_BLEND_SATURATION		22
     62 #define FXDIB_BLEND_COLOR			23
     63 #define FXDIB_BLEND_LUMINOSITY		24
     64 #define FXDIB_BLEND_UNSUPPORTED		-1
     65 typedef FX_DWORD	FX_ARGB;
     66 typedef FX_DWORD	FX_COLORREF;
     67 typedef FX_DWORD	FX_CMYK;
     68 class CFX_ClipRgn;
     69 class CFX_DIBSource;
     70 class CFX_DIBitmap;
     71 #define FXSYS_RGB(r, g, b)  ((r) | ((g) << 8) | ((b) << 16))
     72 #define FXSYS_GetRValue(rgb) ((rgb) & 0xff)
     73 #define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
     74 #define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
     75 #define FX_CCOLOR(val) (255-(val))
     76 #define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))
     77 #define FXSYS_GetCValue(cmyk) ((FX_BYTE)((cmyk) >> 24) & 0xff)
     78 #define FXSYS_GetMValue(cmyk) ((FX_BYTE)((cmyk) >> 16) & 0xff)
     79 #define FXSYS_GetYValue(cmyk) ((FX_BYTE)((cmyk) >> 8) & 0xff)
     80 #define FXSYS_GetKValue(cmyk) ((FX_BYTE)(cmyk) & 0xff)
     81 void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);
     82 inline FX_CMYK CmykEncode(int c, int m, int y, int k)
     83 {
     84     return (c << 24) | (m << 16) | (y << 8) | k;
     85 }
     86 void ArgbDecode(FX_ARGB argb, int& a, int& r, int&g, int& b);
     87 void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);
     88 inline FX_ARGB ArgbEncode(int a, int r, int g, int b)
     89 {
     90     return (a << 24) | (r << 16) | (g << 8) | b;
     91 }
     92 FX_ARGB ArgbEncode(int a, FX_COLORREF rgb);
     93 #define FXARGB_A(argb) ((FX_BYTE)((argb) >> 24))
     94 #define FXARGB_R(argb) ((FX_BYTE)((argb) >> 16))
     95 #define FXARGB_G(argb) ((FX_BYTE)((argb) >> 8))
     96 #define FXARGB_B(argb) ((FX_BYTE)(argb))
     97 #define FXARGB_MAKE(a,r,g,b) (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
     98 #define FXARGB_MUL_ALPHA(argb, alpha) (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb) & 0xffffff))
     99 #define FXRGB2GRAY(r,g,b) (((b) * 11 + (g) * 59 + (r) * 30) / 100)
    100 #define FXCMYK2GRAY(c,m,y,k) (((255-(c)) * (255-(k)) * 30 + (255-(m)) * (255-(k)) * 59 + (255-(y)) * (255-(k)) * 11) / 25500)
    101 #define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) (((backdrop) * (255-(source_alpha)) + (source)*(source_alpha))/255)
    102 #define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest)*(src)/255)
    103 #define FXCMYK_GETDIB(p) ((((FX_LPBYTE)(p))[0] << 24 | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | ((FX_LPBYTE)(p))[3]))
    104 #define FXCMYK_SETDIB(p, cmyk)  ((FX_LPBYTE)(p))[0] = (FX_BYTE)((cmyk) >> 24), \
    105         ((FX_LPBYTE)(p))[1] = (FX_BYTE)((cmyk) >> 16), \
    106                               ((FX_LPBYTE)(p))[2] = (FX_BYTE)((cmyk) >> 8), \
    107                                       ((FX_LPBYTE)(p))[3] = (FX_BYTE)(cmyk))
    108 #define FXARGB_GETDIB(p) ((((FX_LPBYTE)(p))[0]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[3] << 24))
    109 #define FXARGB_SETDIB(p, argb) ((FX_LPBYTE)(p))[0] = (FX_BYTE)(argb), \
    110         ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
    111                               ((FX_LPBYTE)(p))[2] = (FX_BYTE)((argb) >> 16), \
    112                                       ((FX_LPBYTE)(p))[3] = (FX_BYTE)((argb) >> 24)
    113 #define FXARGB_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
    114         *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
    115                                  *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
    116                                          *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
    117 #define FXCMYK_COPY(dest, src)  *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
    118         *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
    119                                  *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
    120                                          *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
    121 #define FXARGB_SETRGBORDERDIB(p, argb) ((FX_LPBYTE)(p))[3] = (FX_BYTE)(argb>>24), \
    122         ((FX_LPBYTE)(p))[0] = (FX_BYTE)((argb) >> 16), \
    123                               ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
    124                                       ((FX_LPBYTE)(p))[2] = (FX_BYTE)(argb)
    125 #define FXARGB_GETRGBORDERDIB(p) (((FX_LPBYTE)(p))[2]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0] << 16) | (((FX_LPBYTE)(p))[3] << 24)
    126 #define FXARGB_RGBORDERCOPY(dest, src) *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3), \
    127         *(FX_LPBYTE)(dest) = *((FX_LPBYTE)(src)+2), \
    128                              *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
    129                                      *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src))
    130 #define FXARGB_TODIB(argb) (argb)
    131 #define FXCMYK_TODIB(cmyk) ((FX_BYTE)((cmyk) >> 24) | ((FX_BYTE)((cmyk) >> 16)) << 8 | ((FX_BYTE)((cmyk) >> 8)) << 16 | ((FX_BYTE)(cmyk) << 24))
    132 #define FXARGB_TOBGRORDERDIB(argb) ((FX_BYTE)(argb>>16) | ((FX_BYTE)(argb>>8)) << 8 | ((FX_BYTE)(argb)) << 16 | ((FX_BYTE)(argb>>24) << 24))
    133 #define FXGETFLAG_COLORTYPE(flag)			(FX_BYTE)((flag)>>8)
    134 #define FXGETFLAG_ALPHA_FILL(flag)			(FX_BYTE)(flag)
    135 #define FXGETFLAG_ALPHA_STROKE(flag)		(FX_BYTE)((flag)>>16)
    136 #define FXSETFLAG_COLORTYPE(flag, val)		flag = (((val)<<8)|(flag&0xffff00ff))
    137 #define FXSETFLAG_ALPHA_FILL(flag, val)		flag = ((val)|(flag&0xffffff00))
    138 #define FXSETFLAG_ALPHA_STROKE(flag, val)	flag = (((val)<<16)|(flag&0xff00ffff))
    139 class CFX_DIBSource
    140 {
    141 public:
    142 
    143     virtual			~CFX_DIBSource();
    144 
    145 
    146 
    147     int				GetWidth() const
    148     {
    149         return m_Width;
    150     }
    151 
    152     int				GetHeight() const
    153     {
    154         return m_Height;
    155     }
    156 
    157     FXDIB_Format	GetFormat() const
    158     {
    159         return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);
    160     }
    161 
    162     FX_DWORD		GetPitch() const
    163     {
    164         return m_Pitch;
    165     }
    166 
    167     FX_DWORD*		GetPalette() const
    168     {
    169         return m_pPalette;
    170     }
    171 
    172 
    173 
    174     virtual	FX_LPBYTE	GetBuffer() const
    175     {
    176         return NULL;
    177     }
    178 
    179     virtual FX_LPCBYTE	GetScanline(int line) const = 0;
    180 
    181     virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) const
    182     {
    183         return FALSE;
    184     }
    185 
    186     virtual void		DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
    187                                            int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const = 0;
    188 
    189     virtual void		SetDownSampleSize(int width, int height) const {}
    190 
    191     int				GetBPP() const
    192     {
    193         return m_bpp;
    194     }
    195 
    196     FX_BOOL			IsAlphaMask() const
    197     {
    198         return m_AlphaFlag == 1;
    199     }
    200 
    201     FX_BOOL			HasAlpha() const
    202     {
    203         return m_AlphaFlag & 2 ? TRUE : FALSE;
    204     }
    205 
    206     FX_BOOL			IsOpaqueImage() const
    207     {
    208         return !(m_AlphaFlag & 3);
    209     }
    210 
    211     FX_BOOL			IsCmykImage() const
    212     {
    213         return m_AlphaFlag & 4 ? TRUE : FALSE;
    214     }
    215 
    216 
    217 
    218     int				GetPaletteSize() const
    219     {
    220         return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));
    221     }
    222 
    223     FX_DWORD		GetPaletteEntry(int index) const;
    224 
    225     void			SetPaletteEntry(int index, FX_DWORD color);
    226     FX_DWORD		GetPaletteArgb(int index) const
    227     {
    228         return GetPaletteEntry(index);
    229     }
    230     void			SetPaletteArgb(int index, FX_DWORD color)
    231     {
    232         SetPaletteEntry(index, color);
    233     }
    234 
    235     void			CopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);
    236 
    237 
    238     CFX_DIBitmap*	Clone(const FX_RECT* pClip = NULL) const;
    239 
    240     CFX_DIBitmap*	CloneConvert(FXDIB_Format format, const FX_RECT* pClip = NULL, void* pIccTransform = NULL) const;
    241 
    242     CFX_DIBitmap*	StretchTo(int dest_width, int dest_height, FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;
    243 
    244 
    245     CFX_DIBitmap*	TransformTo(const CFX_AffineMatrix* pMatrix, int& left, int &top,
    246                                 FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;
    247 
    248     CFX_DIBitmap*	GetAlphaMask(const FX_RECT* pClip = NULL) const;
    249 
    250     FX_BOOL			CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip = NULL);
    251 
    252     CFX_DIBitmap*	SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pClip = NULL) const;
    253 
    254     CFX_DIBitmap*	FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;
    255 
    256     void			GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height, int src_width,
    257                                    int src_height, int& src_left, int& src_top, const CFX_ClipRgn* pClipRgn);
    258 
    259     CFX_DIBitmap*	m_pAlphaMask;
    260 protected:
    261 
    262     CFX_DIBSource();
    263 
    264     int				m_Width;
    265 
    266     int				m_Height;
    267 
    268     int				m_bpp;
    269 
    270     FX_DWORD		m_AlphaFlag;
    271 
    272     FX_DWORD		m_Pitch;
    273 
    274     FX_DWORD*		m_pPalette;
    275 
    276     void			BuildPalette();
    277 
    278     FX_BOOL			BuildAlphaMask();
    279 
    280     int				FindPalette(FX_DWORD color) const;
    281 
    282     void			GetPalette(FX_DWORD* pal, int alpha) const;
    283 };
    284 class CFX_DIBitmap : public CFX_DIBSource
    285 {
    286 public:
    287 
    288     virtual ~CFX_DIBitmap();
    289 
    290     CFX_DIBitmap();
    291 
    292     CFX_DIBitmap(const CFX_DIBitmap& src);
    293 
    294     FX_BOOL			Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer = NULL, int pitch = 0);
    295 
    296     FX_BOOL			Copy(const CFX_DIBSource* pSrc);
    297 
    298     virtual	FX_LPBYTE	GetBuffer() const
    299     {
    300         return m_pBuffer;
    301     }
    302 
    303     virtual FX_LPCBYTE	GetScanline(int line) const
    304     {
    305         return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;
    306     }
    307 
    308     virtual void	DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
    309                                        int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
    310 
    311     void			TakeOver(CFX_DIBitmap* pSrcBitmap);
    312 
    313     FX_BOOL			ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);
    314 
    315     void			Clear(FX_DWORD color);
    316 
    317     FX_DWORD		GetPixel(int x, int y) const;
    318 
    319     void			SetPixel(int x, int y, FX_DWORD color);
    320 
    321     FX_BOOL			LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel);
    322 
    323     FX_BOOL			LoadChannel(FXDIB_Channel destChannel, int value);
    324 
    325     FX_BOOL			MultiplyAlpha(int alpha);
    326 
    327     FX_BOOL			MultiplyAlpha(const CFX_DIBSource* pAlphaMask);
    328 
    329     FX_BOOL			TransferBitmap(int dest_left, int dest_top, int width, int height,
    330                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform = NULL);
    331 
    332     FX_BOOL			CompositeBitmap(int dest_left, int dest_top, int width, int height,
    333                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
    334                                     int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, void* pIccTransform = NULL);
    335 
    336     FX_BOOL			TransferMask(int dest_left, int dest_top, int width, int height,
    337                                  const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag = 0, void* pIccTransform = NULL);
    338 
    339     FX_BOOL			CompositeMask(int dest_left, int dest_top, int width, int height,
    340                                   const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
    341                                   int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);
    342 
    343     FX_BOOL			CompositeRect(int dest_left, int dest_top, int width, int height, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL);
    344 
    345     FX_BOOL			ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);
    346 
    347     FX_BOOL			DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect = NULL);
    348 protected:
    349 
    350     FX_LPBYTE		m_pBuffer;
    351 
    352     FX_BOOL			m_bExtBuf;
    353 
    354     FX_BOOL			GetGrayData(void* pIccTransform = NULL);
    355 };
    356 class CFX_DIBExtractor
    357 {
    358 public:
    359 
    360     CFX_DIBExtractor(const CFX_DIBSource* pSrc);
    361 
    362     ~CFX_DIBExtractor();
    363 
    364     operator CFX_DIBitmap*()
    365     {
    366         return m_pBitmap;
    367     }
    368 private:
    369 
    370     CFX_DIBitmap*			m_pBitmap;
    371 };
    372 typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;
    373 class CFX_FilteredDIB : public CFX_DIBSource
    374 {
    375 public:
    376 
    377     CFX_FilteredDIB();
    378 
    379     ~CFX_FilteredDIB();
    380 
    381     void					LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);
    382 
    383     virtual FXDIB_Format	GetDestFormat() = 0;
    384 
    385     virtual FX_DWORD*		GetDestPalette() = 0;
    386 
    387 
    388     virtual void			TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const = 0;
    389 
    390     virtual void			TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const = 0;
    391 protected:
    392     virtual FX_LPCBYTE		GetScanline(int line) const;
    393     virtual void			DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
    394             int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
    395 
    396     const CFX_DIBSource*	m_pSrc;
    397 
    398     FX_BOOL					m_bAutoDropSrc;
    399 
    400     FX_LPBYTE				m_pScanline;
    401 };
    402 class IFX_ScanlineComposer
    403 {
    404 public:
    405     virtual ~IFX_ScanlineComposer() { }
    406 
    407     virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL) = 0;
    408 
    409     virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette) = 0;
    410 };
    411 class CFX_ScanlineCompositor
    412 {
    413 public:
    414     CFX_ScanlineCompositor();
    415 
    416     ~CFX_ScanlineCompositor();
    417 
    418     FX_BOOL				Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
    419                              FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);
    420 
    421 
    422     void				CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
    423             FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
    424 
    425 
    426     void				CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
    427             FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
    428 
    429 
    430     void				CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
    431             FX_LPBYTE dst_extra_alpha = NULL);
    432 
    433 
    434     void				CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
    435             FX_LPBYTE dst_extra_alpha = NULL);
    436 protected:
    437     int					m_Transparency;
    438     FXDIB_Format		m_SrcFormat,
    439                         m_DestFormat;
    440     FX_DWORD*			m_pSrcPalette;
    441 
    442     int					m_MaskAlpha,
    443                         m_MaskRed,
    444                         m_MaskGreen,
    445                         m_MaskBlue,
    446                         m_MaskBlack;
    447     int					m_BlendType;
    448     void*				m_pIccTransform;
    449     FX_LPBYTE			m_pCacheScanline;
    450     int					m_CacheSize;
    451     FX_BOOL             m_bRgbByteOrder;
    452 };
    453 class CFX_BitmapComposer : public IFX_ScanlineComposer
    454 {
    455 public:
    456 
    457     CFX_BitmapComposer();
    458 
    459     ~CFX_BitmapComposer();
    460 
    461 
    462     void				Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
    463                                 FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
    464                                 FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder = FALSE,
    465                                 int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
    466 
    467     virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);
    468 
    469 
    470     virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);
    471 protected:
    472 
    473     void				DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
    474                                   FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
    475     CFX_DIBitmap*		m_pBitmap;
    476     const CFX_ClipRgn*	m_pClipRgn;
    477     FXDIB_Format		m_SrcFormat;
    478     int					m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;
    479     FX_DWORD			m_MaskColor;
    480     const CFX_DIBitmap*	m_pClipMask;
    481     CFX_ScanlineCompositor	m_Compositor;
    482     FX_BOOL				m_bVertical, m_bFlipX, m_bFlipY;
    483     int					m_AlphaFlag;
    484     void*				m_pIccTransform;
    485     FX_BOOL             m_bRgbByteOrder;
    486     int					m_BlendType;
    487     void				ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL);
    488     FX_LPBYTE			m_pScanlineV, m_pClipScanV, m_pAddClipScan, m_pScanlineAlphaV;
    489 };
    490 class CFX_BitmapStorer : public IFX_ScanlineComposer
    491 {
    492 public:
    493 
    494     CFX_BitmapStorer();
    495 
    496     ~CFX_BitmapStorer();
    497 
    498     virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);
    499 
    500     virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);
    501 
    502     CFX_DIBitmap*		GetBitmap()
    503     {
    504         return m_pBitmap;
    505     }
    506 
    507     CFX_DIBitmap*		Detach();
    508 
    509     void				Replace(CFX_DIBitmap* pBitmap);
    510 private:
    511     CFX_DIBitmap*		m_pBitmap;
    512 };
    513 class CStretchEngine;
    514 class CFX_ImageStretcher
    515 {
    516 public:
    517 
    518     CFX_ImageStretcher();
    519 
    520     ~CFX_ImageStretcher();
    521 
    522     FX_INT32		Start(IFX_ScanlineComposer* pDest, const CFX_DIBSource* pBitmap,
    523                           int dest_width, int dest_height, const FX_RECT& bitmap_rect, FX_DWORD flags);
    524 
    525 
    526     FX_INT32		Continue(IFX_Pause* pPause);
    527     IFX_ScanlineComposer*	m_pDest;
    528     const CFX_DIBSource*	m_pSource;
    529     CStretchEngine*		m_pStretchEngine;
    530     FX_DWORD		m_Flags;
    531     FX_BOOL			m_bFlipX,
    532                     m_bFlipY;
    533     int				m_DestWidth,
    534                     m_DestHeight;
    535     FX_RECT			m_ClipRect;
    536     int				m_LineIndex;
    537     int				m_DestBPP;
    538     FX_LPBYTE		m_pScanline;
    539     FX_LPBYTE       m_pMaskScanline;
    540     FXDIB_Format	m_DestFormat;
    541     FX_INT32		m_Status;
    542 
    543     FX_INT32		StartQuickStretch();
    544 
    545     FX_INT32		StartStretch();
    546 
    547     FX_INT32		ContinueQuickStretch(IFX_Pause* pPause);
    548 
    549     FX_INT32		ContinueStretch(IFX_Pause* pPause);
    550 };
    551 class CFX_ImageTransformer
    552 {
    553 public:
    554 
    555     CFX_ImageTransformer();
    556 
    557     ~CFX_ImageTransformer();
    558 
    559     FX_INT32	Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pMatrix, int flags, const FX_RECT* pClip);
    560 
    561 
    562     FX_INT32	Continue(IFX_Pause* pPause);
    563     CFX_AffineMatrix* m_pMatrix;
    564     FX_RECT		m_StretchClip;
    565     int			m_ResultLeft, m_ResultTop, m_ResultWidth, m_ResultHeight;
    566     CFX_AffineMatrix	m_dest2stretch;
    567     CFX_ImageStretcher	m_Stretcher;
    568     CFX_BitmapStorer	m_Storer;
    569     FX_DWORD	m_Flags;
    570     int			m_Status;
    571 };
    572 class CFX_ImageRenderer
    573 {
    574 public:
    575 
    576     CFX_ImageRenderer();
    577 
    578     ~CFX_ImageRenderer();
    579 
    580     FX_INT32			Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
    581                               const CFX_DIBSource* pSource, int bitmap_alpha,
    582                               FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix, FX_DWORD dib_flags,
    583                               FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL,
    584                               int blend_type = FXDIB_BLEND_NORMAL);
    585 
    586     FX_INT32			Continue(IFX_Pause* pPause);
    587 protected:
    588     CFX_DIBitmap*		m_pDevice;
    589     const CFX_ClipRgn*	m_pClipRgn;
    590     int					m_BitmapAlpha;
    591     FX_DWORD			m_MaskColor;
    592     CFX_AffineMatrix	m_Matrix;
    593     CFX_ImageTransformer*	m_pTransformer;
    594     CFX_ImageStretcher	m_Stretcher;
    595     CFX_BitmapComposer	m_Composer;
    596     int					m_Status;
    597     int					m_DestLeft, m_DestTop;
    598     FX_RECT				m_ClipBox;
    599     FX_DWORD			m_Flags;
    600     int					m_AlphaFlag;
    601     void*				m_pIccTransform;
    602     FX_BOOL				m_bRgbByteOrder;
    603     int					m_BlendType;
    604 };
    605 
    606 #endif  // CORE_INCLUDE_FXGE_FX_DIB_H_
    607