From 6cb31035547d30b7d1bec6375a4d2c86e6aa17cf Mon Sep 17 00:00:00 2001 From: Bo Xu Date: Mon, 10 Nov 2014 13:34:05 -0800 Subject: Fix a bug when performing StretchDIBits on bit mask BUG=401988 R=vitalybuka@chromium.org Review URL: https://codereview.chromium.org/618073003 --- core/src/fxge/win32/fx_win32_device.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp index eee4fd8285..d82102462a 100644 --- a/core/src/fxge/win32/fx_win32_device.cpp +++ b/core/src/fxge/win32/fx_win32_device.cpp @@ -570,8 +570,32 @@ FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int d } bmi.bmiColors[0] = 0xffffff; bmi.bmiColors[1] = 0; - ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, - 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND); + + HBRUSH hPattern = CreateSolidBrush(bitmap_color & 0xffffff); + HBRUSH hOld = (HBRUSH)SelectObject(m_hDC, hPattern); + + + // In PDF, when image mask is 1, use device bitmap; when mask is 0, use brush bitmap. + // A complete list of the boolen operations is as follows: + + /* P(bitmap_color) S(ImageMask) D(DeviceBitmap) Result + * 0 0 0 0 + * 0 0 1 0 + * 0 1 0 0 + * 0 1 1 1 + * 1 0 0 1 + * 1 0 1 1 + * 1 1 0 0 + * 1 1 1 1 + */ + // The boolen codes is B8. Based on http://msdn.microsoft.com/en-us/library/aa932106.aspx, the ROP3 code is 0xB8074A + + ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, + 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, 0xB8074A); + + SelectObject(m_hDC, hOld); + DeleteObject(hPattern); + return TRUE; } BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect) -- cgit v1.2.3