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