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 "core/include/fxcrt/fx_basic.h"
     11 #include "core/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 class CStretchEngine;
     73 
     74 #define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
     75 #define FXSYS_GetRValue(rgb) ((rgb)&0xff)
     76 #define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
     77 #define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
     78 #define FX_CCOLOR(val) (255 - (val))
     79 #define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))
     80 #define FXSYS_GetCValue(cmyk) ((uint8_t)((cmyk) >> 24) & 0xff)
     81 #define FXSYS_GetMValue(cmyk) ((uint8_t)((cmyk) >> 16) & 0xff)
     82 #define FXSYS_GetYValue(cmyk) ((uint8_t)((cmyk) >> 8) & 0xff)
     83 #define FXSYS_GetKValue(cmyk) ((uint8_t)(cmyk)&0xff)
     84 void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);
     85 inline FX_CMYK CmykEncode(int c, int m, int y, int k) {
     86   return (c << 24) | (m << 16) | (y << 8) | k;
     87 }
     88 void ArgbDecode(FX_ARGB argb, int& a, int& r, int& g, int& b);
     89 void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);
     90 inline FX_ARGB ArgbEncode(int a, int r, int g, int b) {
     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) \
     99   (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
    100 #define FXARGB_MUL_ALPHA(argb, alpha) \
    101   (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb)&0xffffff))
    102 #define FXRGB2GRAY(r, g, b) (((b)*11 + (g)*59 + (r)*30) / 100)
    103 #define FXCMYK2GRAY(c, m, y, k)                                       \
    104   (((255 - (c)) * (255 - (k)) * 30 + (255 - (m)) * (255 - (k)) * 59 + \
    105     (255 - (y)) * (255 - (k)) * 11) /                                 \
    106    25500)
    107 #define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) \
    108   (((backdrop) * (255 - (source_alpha)) + (source) * (source_alpha)) / 255)
    109 #define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest) * (src) / 255)
    110 #define FXCMYK_GETDIB(p)                                    \
    111   ((((uint8_t*)(p))[0] << 24 | (((uint8_t*)(p))[1] << 16) | \
    112     (((uint8_t*)(p))[2] << 8) | ((uint8_t*)(p))[3]))
    113 #define FXCMYK_SETDIB(p, cmyk)  ((uint8_t*)(p))[0] = (uint8_t)((cmyk) >> 24), \
    114         ((uint8_t*)(p))[1] = (uint8_t)((cmyk) >> 16), \
    115                               ((uint8_t*)(p))[2] = (uint8_t)((cmyk) >> 8), \
    116                                       ((uint8_t*)(p))[3] = (uint8_t)(cmyk))
    117 #define FXARGB_GETDIB(p)                              \
    118   ((((uint8_t*)(p))[0]) | (((uint8_t*)(p))[1] << 8) | \
    119    (((uint8_t*)(p))[2] << 16) | (((uint8_t*)(p))[3] << 24))
    120 #define FXARGB_SETDIB(p, argb)                  \
    121   ((uint8_t*)(p))[0] = (uint8_t)(argb),         \
    122   ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8),  \
    123   ((uint8_t*)(p))[2] = (uint8_t)((argb) >> 16), \
    124   ((uint8_t*)(p))[3] = (uint8_t)((argb) >> 24)
    125 #define FXARGB_COPY(dest, src)                      \
    126   *(uint8_t*)(dest) = *(uint8_t*)(src),             \
    127   *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
    128   *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \
    129   *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3)
    130 #define FXCMYK_COPY(dest, src)                      \
    131   *(uint8_t*)(dest) = *(uint8_t*)(src),             \
    132   *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
    133   *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \
    134   *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3)
    135 #define FXARGB_SETRGBORDERDIB(p, argb)          \
    136   ((uint8_t*)(p))[3] = (uint8_t)(argb >> 24),   \
    137   ((uint8_t*)(p))[0] = (uint8_t)((argb) >> 16), \
    138   ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8),  \
    139   ((uint8_t*)(p))[2] = (uint8_t)(argb)
    140 #define FXARGB_GETRGBORDERDIB(p)                     \
    141   (((uint8_t*)(p))[2]) | (((uint8_t*)(p))[1] << 8) | \
    142       (((uint8_t*)(p))[0] << 16) | (((uint8_t*)(p))[3] << 24)
    143 #define FXARGB_RGBORDERCOPY(dest, src)                                   \
    144   *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3),                      \
    145                        *(uint8_t*)(dest) = *((uint8_t*)(src) + 2),       \
    146                        *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
    147                        *((uint8_t*)(dest) + 2) = *((uint8_t*)(src))
    148 #define FXARGB_TODIB(argb) (argb)
    149 #define FXCMYK_TODIB(cmyk)                                    \
    150   ((uint8_t)((cmyk) >> 24) | ((uint8_t)((cmyk) >> 16)) << 8 | \
    151    ((uint8_t)((cmyk) >> 8)) << 16 | ((uint8_t)(cmyk) << 24))
    152 #define FXARGB_TOBGRORDERDIB(argb)                       \
    153   ((uint8_t)(argb >> 16) | ((uint8_t)(argb >> 8)) << 8 | \
    154    ((uint8_t)(argb)) << 16 | ((uint8_t)(argb >> 24) << 24))
    155 #define FXGETFLAG_COLORTYPE(flag) (uint8_t)((flag) >> 8)
    156 #define FXGETFLAG_ALPHA_FILL(flag) (uint8_t)(flag)
    157 #define FXGETFLAG_ALPHA_STROKE(flag) (uint8_t)((flag) >> 16)
    158 #define FXSETFLAG_COLORTYPE(flag, val) \
    159   flag = (((val) << 8) | (flag & 0xffff00ff))
    160 #define FXSETFLAG_ALPHA_FILL(flag, val) flag = ((val) | (flag & 0xffffff00))
    161 #define FXSETFLAG_ALPHA_STROKE(flag, val) \
    162   flag = (((val) << 16) | (flag & 0xff00ffff))
    163 class CFX_DIBSource {
    164  public:
    165   virtual ~CFX_DIBSource();
    166 
    167   int GetWidth() const { return m_Width; }
    168 
    169   int GetHeight() const { return m_Height; }
    170 
    171   FXDIB_Format GetFormat() const {
    172     return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);
    173   }
    174 
    175   FX_DWORD GetPitch() const { return m_Pitch; }
    176 
    177   FX_DWORD* GetPalette() const { return m_pPalette; }
    178 
    179   virtual uint8_t* GetBuffer() const { return NULL; }
    180 
    181   virtual const uint8_t* GetScanline(int line) const = 0;
    182 
    183   virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const {
    184     return FALSE;
    185   }
    186 
    187   virtual void DownSampleScanline(int line,
    188                                   uint8_t* dest_scan,
    189                                   int dest_bpp,
    190                                   int dest_width,
    191                                   FX_BOOL bFlipX,
    192                                   int clip_left,
    193                                   int clip_width) const = 0;
    194 
    195   virtual void SetDownSampleSize(int width, int height) const {}
    196 
    197   int GetBPP() const { return m_bpp; }
    198 
    199   // TODO(thestig): Investigate this. Given the possible values of FXDIB_Format,
    200   // it feels as though this should be implemented as !!(m_AlphaFlag & 1) and
    201   // IsOpaqueImage() below should never be able to return TRUE.
    202   FX_BOOL IsAlphaMask() const { return m_AlphaFlag == 1; }
    203 
    204   FX_BOOL HasAlpha() const { return !!(m_AlphaFlag & 2); }
    205 
    206   FX_BOOL IsOpaqueImage() const { return !(m_AlphaFlag & 3); }
    207 
    208   FX_BOOL IsCmykImage() const { return !!(m_AlphaFlag & 4); }
    209 
    210   int GetPaletteSize() const {
    211     return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));
    212   }
    213 
    214   FX_DWORD GetPaletteEntry(int index) const;
    215 
    216   void SetPaletteEntry(int index, FX_DWORD color);
    217   FX_DWORD GetPaletteArgb(int index) const { return GetPaletteEntry(index); }
    218   void SetPaletteArgb(int index, FX_DWORD color) {
    219     SetPaletteEntry(index, color);
    220   }
    221 
    222   void CopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);
    223 
    224   CFX_DIBitmap* Clone(const FX_RECT* pClip = NULL) const;
    225 
    226   CFX_DIBitmap* CloneConvert(FXDIB_Format format,
    227                              const FX_RECT* pClip = NULL,
    228                              void* pIccTransform = NULL) const;
    229 
    230   CFX_DIBitmap* StretchTo(int dest_width,
    231                           int dest_height,
    232                           FX_DWORD flags = 0,
    233                           const FX_RECT* pClip = NULL) const;
    234 
    235   CFX_DIBitmap* TransformTo(const CFX_Matrix* pMatrix,
    236                             int& left,
    237                             int& top,
    238                             FX_DWORD flags = 0,
    239                             const FX_RECT* pClip = NULL) const;
    240 
    241   CFX_DIBitmap* GetAlphaMask(const FX_RECT* pClip = NULL) const;
    242 
    243   FX_BOOL CopyAlphaMask(const CFX_DIBSource* pAlphaMask,
    244                         const FX_RECT* pClip = NULL);
    245 
    246   CFX_DIBitmap* SwapXY(FX_BOOL bXFlip,
    247                        FX_BOOL bYFlip,
    248                        const FX_RECT* pClip = NULL) const;
    249 
    250   CFX_DIBitmap* FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;
    251 
    252   void GetOverlapRect(int& dest_left,
    253                       int& dest_top,
    254                       int& width,
    255                       int& height,
    256                       int src_width,
    257                       int src_height,
    258                       int& src_left,
    259                       int& src_top,
    260                       const CFX_ClipRgn* pClipRgn);
    261 
    262   CFX_DIBitmap* m_pAlphaMask;
    263 
    264  protected:
    265   CFX_DIBSource();
    266 
    267   int m_Width;
    268 
    269   int m_Height;
    270 
    271   int m_bpp;
    272 
    273   FX_DWORD m_AlphaFlag;
    274 
    275   FX_DWORD m_Pitch;
    276 
    277   FX_DWORD* m_pPalette;
    278 
    279   void BuildPalette();
    280 
    281   FX_BOOL BuildAlphaMask();
    282 
    283   int FindPalette(FX_DWORD color) const;
    284 
    285   void GetPalette(FX_DWORD* pal, int alpha) const;
    286 };
    287 class CFX_DIBitmap : public CFX_DIBSource {
    288  public:
    289   CFX_DIBitmap();
    290   explicit CFX_DIBitmap(const CFX_DIBitmap& src);
    291   ~CFX_DIBitmap() override;
    292 
    293   FX_BOOL Create(int width,
    294                  int height,
    295                  FXDIB_Format format,
    296                  uint8_t* pBuffer = NULL,
    297                  int pitch = 0);
    298 
    299   FX_BOOL Copy(const CFX_DIBSource* pSrc);
    300 
    301   // CFX_DIBSource
    302   uint8_t* GetBuffer() const override { return m_pBuffer; }
    303   const uint8_t* GetScanline(int line) const override {
    304     return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;
    305   }
    306   void DownSampleScanline(int line,
    307                           uint8_t* dest_scan,
    308                           int dest_bpp,
    309                           int dest_width,
    310                           FX_BOOL bFlipX,
    311                           int clip_left,
    312                           int clip_width) const override;
    313 
    314   void TakeOver(CFX_DIBitmap* pSrcBitmap);
    315 
    316   FX_BOOL ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);
    317 
    318   void Clear(FX_DWORD color);
    319 
    320   FX_DWORD GetPixel(int x, int y) const;
    321 
    322   void SetPixel(int x, int y, FX_DWORD color);
    323 
    324   FX_BOOL LoadChannel(FXDIB_Channel destChannel,
    325                       const CFX_DIBSource* pSrcBitmap,
    326                       FXDIB_Channel srcChannel);
    327 
    328   FX_BOOL LoadChannel(FXDIB_Channel destChannel, int value);
    329 
    330   FX_BOOL MultiplyAlpha(int alpha);
    331 
    332   FX_BOOL MultiplyAlpha(const CFX_DIBSource* pAlphaMask);
    333 
    334   FX_BOOL TransferBitmap(int dest_left,
    335                          int dest_top,
    336                          int width,
    337                          int height,
    338                          const CFX_DIBSource* pSrcBitmap,
    339                          int src_left,
    340                          int src_top,
    341                          void* pIccTransform = NULL);
    342 
    343   FX_BOOL CompositeBitmap(int dest_left,
    344                           int dest_top,
    345                           int width,
    346                           int height,
    347                           const CFX_DIBSource* pSrcBitmap,
    348                           int src_left,
    349                           int src_top,
    350                           int blend_type = FXDIB_BLEND_NORMAL,
    351                           const CFX_ClipRgn* pClipRgn = NULL,
    352                           FX_BOOL bRgbByteOrder = FALSE,
    353                           void* pIccTransform = NULL);
    354 
    355   FX_BOOL TransferMask(int dest_left,
    356                        int dest_top,
    357                        int width,
    358                        int height,
    359                        const CFX_DIBSource* pMask,
    360                        FX_DWORD color,
    361                        int src_left,
    362                        int src_top,
    363                        int alpha_flag = 0,
    364                        void* pIccTransform = NULL);
    365 
    366   FX_BOOL CompositeMask(int dest_left,
    367                         int dest_top,
    368                         int width,
    369                         int height,
    370                         const CFX_DIBSource* pMask,
    371                         FX_DWORD color,
    372                         int src_left,
    373                         int src_top,
    374                         int blend_type = FXDIB_BLEND_NORMAL,
    375                         const CFX_ClipRgn* pClipRgn = NULL,
    376                         FX_BOOL bRgbByteOrder = FALSE,
    377                         int alpha_flag = 0,
    378                         void* pIccTransform = NULL);
    379 
    380   FX_BOOL CompositeRect(int dest_left,
    381                         int dest_top,
    382                         int width,
    383                         int height,
    384                         FX_DWORD color,
    385                         int alpha_flag = 0,
    386                         void* pIccTransform = NULL);
    387 
    388   FX_BOOL ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);
    389 
    390   FX_BOOL DitherFS(const FX_DWORD* pPalette,
    391                    int pal_size,
    392                    const FX_RECT* pRect = NULL);
    393 
    394  protected:
    395   uint8_t* m_pBuffer;
    396 
    397   FX_BOOL m_bExtBuf;
    398 
    399   FX_BOOL GetGrayData(void* pIccTransform = NULL);
    400 };
    401 class CFX_DIBExtractor {
    402  public:
    403   CFX_DIBExtractor(const CFX_DIBSource* pSrc);
    404 
    405   ~CFX_DIBExtractor();
    406 
    407   operator CFX_DIBitmap*() { return m_pBitmap; }
    408 
    409  private:
    410   CFX_DIBitmap* m_pBitmap;
    411 };
    412 
    413 typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;
    414 class CFX_FilteredDIB : public CFX_DIBSource {
    415  public:
    416   CFX_FilteredDIB();
    417   ~CFX_FilteredDIB() override;
    418 
    419   void LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);
    420 
    421   virtual FXDIB_Format GetDestFormat() = 0;
    422 
    423   virtual FX_DWORD* GetDestPalette() = 0;
    424 
    425   virtual void TranslateScanline(uint8_t* dest_buf,
    426                                  const uint8_t* src_buf) const = 0;
    427 
    428   virtual void TranslateDownSamples(uint8_t* dest_buf,
    429                                     const uint8_t* src_buf,
    430                                     int pixels,
    431                                     int Bpp) const = 0;
    432 
    433  protected:
    434   // CFX_DIBSource
    435   const uint8_t* GetScanline(int line) const override;
    436   void DownSampleScanline(int line,
    437                           uint8_t* dest_scan,
    438                           int dest_bpp,
    439                           int dest_width,
    440                           FX_BOOL bFlipX,
    441                           int clip_left,
    442                           int clip_width) const override;
    443 
    444   const CFX_DIBSource* m_pSrc;
    445 
    446   FX_BOOL m_bAutoDropSrc;
    447 
    448   uint8_t* m_pScanline;
    449 };
    450 
    451 class IFX_ScanlineComposer {
    452  public:
    453   virtual ~IFX_ScanlineComposer() {}
    454 
    455   virtual void ComposeScanline(int line,
    456                                const uint8_t* scanline,
    457                                const uint8_t* scan_extra_alpha = NULL) = 0;
    458 
    459   virtual FX_BOOL SetInfo(int width,
    460                           int height,
    461                           FXDIB_Format src_format,
    462                           FX_DWORD* pSrcPalette) = 0;
    463 };
    464 class CFX_ScanlineCompositor {
    465  public:
    466   CFX_ScanlineCompositor();
    467 
    468   ~CFX_ScanlineCompositor();
    469 
    470   FX_BOOL Init(FXDIB_Format dest_format,
    471                FXDIB_Format src_format,
    472                int32_t width,
    473                FX_DWORD* pSrcPalette,
    474                FX_DWORD mask_color,
    475                int blend_type,
    476                FX_BOOL bClip,
    477                FX_BOOL bRgbByteOrder = FALSE,
    478                int alpha_flag = 0,
    479                void* pIccTransform = NULL);
    480 
    481   void CompositeRgbBitmapLine(uint8_t* dest_scan,
    482                               const uint8_t* src_scan,
    483                               int width,
    484                               const uint8_t* clip_scan,
    485                               const uint8_t* src_extra_alpha = NULL,
    486                               uint8_t* dst_extra_alpha = NULL);
    487 
    488   void CompositePalBitmapLine(uint8_t* dest_scan,
    489                               const uint8_t* src_scan,
    490                               int src_left,
    491                               int width,
    492                               const uint8_t* clip_scan,
    493                               const uint8_t* src_extra_alpha = NULL,
    494                               uint8_t* dst_extra_alpha = NULL);
    495 
    496   void CompositeByteMaskLine(uint8_t* dest_scan,
    497                              const uint8_t* src_scan,
    498                              int width,
    499                              const uint8_t* clip_scan,
    500                              uint8_t* dst_extra_alpha = NULL);
    501 
    502   void CompositeBitMaskLine(uint8_t* dest_scan,
    503                             const uint8_t* src_scan,
    504                             int src_left,
    505                             int width,
    506                             const uint8_t* clip_scan,
    507                             uint8_t* dst_extra_alpha = NULL);
    508 
    509  protected:
    510   int m_Transparency;
    511   FXDIB_Format m_SrcFormat, m_DestFormat;
    512   FX_DWORD* m_pSrcPalette;
    513 
    514   int m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack;
    515   int m_BlendType;
    516   void* m_pIccTransform;
    517   uint8_t* m_pCacheScanline;
    518   int m_CacheSize;
    519   FX_BOOL m_bRgbByteOrder;
    520 };
    521 
    522 class CFX_BitmapComposer : public IFX_ScanlineComposer {
    523  public:
    524   CFX_BitmapComposer();
    525   ~CFX_BitmapComposer() override;
    526 
    527   void Compose(CFX_DIBitmap* pDest,
    528                const CFX_ClipRgn* pClipRgn,
    529                int bitmap_alpha,
    530                FX_DWORD mask_color,
    531                FX_RECT& dest_rect,
    532                FX_BOOL bVertical,
    533                FX_BOOL bFlipX,
    534                FX_BOOL bFlipY,
    535                FX_BOOL bRgbByteOrder = FALSE,
    536                int alpha_flag = 0,
    537                void* pIccTransform = NULL,
    538                int blend_type = FXDIB_BLEND_NORMAL);
    539 
    540   // IFX_ScanlineComposer
    541   FX_BOOL SetInfo(int width,
    542                   int height,
    543                   FXDIB_Format src_format,
    544                   FX_DWORD* pSrcPalette) override;
    545 
    546   void ComposeScanline(int line,
    547                        const uint8_t* scanline,
    548                        const uint8_t* scan_extra_alpha) override;
    549 
    550  protected:
    551   void DoCompose(uint8_t* dest_scan,
    552                  const uint8_t* src_scan,
    553                  int dest_width,
    554                  const uint8_t* clip_scan,
    555                  const uint8_t* src_extra_alpha = NULL,
    556                  uint8_t* dst_extra_alpha = NULL);
    557   CFX_DIBitmap* m_pBitmap;
    558   const CFX_ClipRgn* m_pClipRgn;
    559   FXDIB_Format m_SrcFormat;
    560   int m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;
    561   FX_DWORD m_MaskColor;
    562   const CFX_DIBitmap* m_pClipMask;
    563   CFX_ScanlineCompositor m_Compositor;
    564   FX_BOOL m_bVertical, m_bFlipX, m_bFlipY;
    565   int m_AlphaFlag;
    566   void* m_pIccTransform;
    567   FX_BOOL m_bRgbByteOrder;
    568   int m_BlendType;
    569   void ComposeScanlineV(int line,
    570                         const uint8_t* scanline,
    571                         const uint8_t* scan_extra_alpha = NULL);
    572   uint8_t* m_pScanlineV;
    573   uint8_t* m_pClipScanV;
    574   uint8_t* m_pAddClipScan;
    575   uint8_t* m_pScanlineAlphaV;
    576 };
    577 
    578 class CFX_BitmapStorer : public IFX_ScanlineComposer {
    579  public:
    580   CFX_BitmapStorer();
    581   ~CFX_BitmapStorer() override;
    582 
    583   // IFX_ScanlineComposer
    584   void ComposeScanline(int line,
    585                        const uint8_t* scanline,
    586                        const uint8_t* scan_extra_alpha) override;
    587 
    588   FX_BOOL SetInfo(int width,
    589                   int height,
    590                   FXDIB_Format src_format,
    591                   FX_DWORD* pSrcPalette) override;
    592 
    593   CFX_DIBitmap* GetBitmap() { return m_pBitmap; }
    594 
    595   CFX_DIBitmap* Detach();
    596 
    597   void Replace(CFX_DIBitmap* pBitmap);
    598 
    599  private:
    600   CFX_DIBitmap* m_pBitmap;
    601 };
    602 
    603 class CFX_ImageStretcher {
    604  public:
    605   CFX_ImageStretcher();
    606   ~CFX_ImageStretcher();
    607 
    608   FX_BOOL Start(IFX_ScanlineComposer* pDest,
    609                 const CFX_DIBSource* pBitmap,
    610                 int dest_width,
    611                 int dest_height,
    612                 const FX_RECT& bitmap_rect,
    613                 FX_DWORD flags);
    614 
    615   FX_BOOL Continue(IFX_Pause* pPause);
    616   FX_BOOL StartQuickStretch();
    617   FX_BOOL StartStretch();
    618   FX_BOOL ContinueQuickStretch(IFX_Pause* pPause);
    619   FX_BOOL ContinueStretch(IFX_Pause* pPause);
    620 
    621   IFX_ScanlineComposer* m_pDest;
    622   const CFX_DIBSource* m_pSource;
    623   CStretchEngine* m_pStretchEngine;
    624   FX_DWORD m_Flags;
    625   FX_BOOL m_bFlipX;
    626   FX_BOOL m_bFlipY;
    627   int m_DestWidth;
    628   int m_DestHeight;
    629   FX_RECT m_ClipRect;
    630   int m_LineIndex;
    631   int m_DestBPP;
    632   uint8_t* m_pScanline;
    633   uint8_t* m_pMaskScanline;
    634   FXDIB_Format m_DestFormat;
    635 };
    636 class CFX_ImageTransformer {
    637  public:
    638   CFX_ImageTransformer();
    639   ~CFX_ImageTransformer();
    640 
    641   FX_BOOL Start(const CFX_DIBSource* pSrc,
    642                 const CFX_Matrix* pMatrix,
    643                 int flags,
    644                 const FX_RECT* pClip);
    645 
    646   FX_BOOL Continue(IFX_Pause* pPause);
    647 
    648   CFX_Matrix* m_pMatrix;
    649   FX_RECT m_StretchClip;
    650   int m_ResultLeft;
    651   int m_ResultTop;
    652   int m_ResultWidth;
    653   int m_ResultHeight;
    654   CFX_Matrix m_dest2stretch;
    655   CFX_ImageStretcher m_Stretcher;
    656   CFX_BitmapStorer m_Storer;
    657   FX_DWORD m_Flags;
    658   int m_Status;
    659 };
    660 class CFX_ImageRenderer {
    661  public:
    662   CFX_ImageRenderer();
    663   ~CFX_ImageRenderer();
    664 
    665   FX_BOOL Start(CFX_DIBitmap* pDevice,
    666                 const CFX_ClipRgn* pClipRgn,
    667                 const CFX_DIBSource* pSource,
    668                 int bitmap_alpha,
    669                 FX_DWORD mask_color,
    670                 const CFX_Matrix* pMatrix,
    671                 FX_DWORD dib_flags,
    672                 FX_BOOL bRgbByteOrder = FALSE,
    673                 int alpha_flag = 0,
    674                 void* pIccTransform = NULL,
    675                 int blend_type = FXDIB_BLEND_NORMAL);
    676 
    677   FX_BOOL Continue(IFX_Pause* pPause);
    678 
    679  protected:
    680   CFX_DIBitmap* m_pDevice;
    681   const CFX_ClipRgn* m_pClipRgn;
    682   int m_BitmapAlpha;
    683   FX_DWORD m_MaskColor;
    684   CFX_Matrix m_Matrix;
    685   CFX_ImageTransformer* m_pTransformer;
    686   CFX_ImageStretcher m_Stretcher;
    687   CFX_BitmapComposer m_Composer;
    688   int m_Status;
    689   FX_RECT m_ClipBox;
    690   FX_DWORD m_Flags;
    691   int m_AlphaFlag;
    692   void* m_pIccTransform;
    693   FX_BOOL m_bRgbByteOrder;
    694   int m_BlendType;
    695 };
    696 
    697 #endif  // CORE_INCLUDE_FXGE_FX_DIB_H_
    698