In windows printing, convert src bitmap to dest bitmap using CompositeBitmap.
authorBo Xu <bo_xu@foxitsoftware.com>
Mon, 5 Jan 2015 18:11:47 +0000 (10:11 -0800)
committerBo Xu <bo_xu@foxitsoftware.com>
Mon, 5 Jan 2015 18:11:47 +0000 (10:11 -0800)
When dealing with transparency, the printing procedure will generate a bitmap first,
then draw this bitmap in windows DC.
The format of source bitmap is argb, but the destination bitmap is rgb.
Simply doing memcpy will lose the alpha channel information, so CompositeBitmap function is needed.

BUG=412908
R=vitalybuka@chromium.org

Review URL: https://codereview.chromium.org/826633002

fpdfsdk/src/fpdfview.cpp

index d8ec8c6..6537023 100644 (file)
@@ -383,9 +383,10 @@ DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int
                        if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
                        {
                                CFX_DIBitmap* pDst = FX_NEW CFX_DIBitmap;
-                               pDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);
-                               FXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());
-//                             WinDC.SetDIBits(pDst,0,0);
+                               int pitch = pBitmap->GetPitch();
+                               pDst->Create(size_x, size_y, FXDIB_Rgb32);
+                               FXSYS_memset(pDst->GetBuffer(), -1, pitch*size_y);
+                               pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, NULL);
                                WinDC.StretchDIBits(pDst,0,0,size_x,size_y);
                                delete pDst;
                        }