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