From 5762f7b639318e70f797924078709f7e8129429b Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Mon, 2 Aug 2010 19:40:42 +0000 Subject: [PATCH] [WIN32K] - Use lower level function to set bitmap bits in IntSetDIBits. Fixes rapps icons. svn path=/branches/reactos-yarotows/; revision=48420 --- subsystems/win32/win32k/objects/dibobj.c | 50 ++++++++++++++---------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index db8e5c9f432..8accc4188b3 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -265,10 +265,13 @@ IntSetDIBits( CONST BITMAPINFO *bmi, UINT ColorUse) { - HBITMAP SourceBitmap, hOldSrcBmp = NULL, hOldDstBmp = NULL; - HDC hdcSrc, hdcDst; + HBITMAP SourceBitmap; + PSURFACE psurfDst, psurfSrc; INT result = 0; + RECT rcDst; + POINTL ptSrc; PVOID pvBits; + EXLATEOBJ exlo; SourceBitmap = DIB_CreateDIBSection(DC, bmi, ColorUse, &pvBits, NULL, 0, 0); if (0 == SourceBitmap) @@ -282,40 +285,45 @@ IntSetDIBits( bmi->bmiHeader.biHeight, bmi->bmiHeader.biBitCount)); - hdcSrc = NtGdiCreateCompatibleDC(0); - hdcDst = NtGdiCreateCompatibleDC(0); + psurfDst = SURFACE_LockSurface(hBitmap); + psurfSrc = SURFACE_LockSurface(SourceBitmap); - if(!(hdcSrc && hdcDst)) + if(!(psurfSrc && psurfDst)) { - DPRINT1("Error, could not create memory DCs.\n"); + DPRINT1("Error, could not lock surfaces.\n"); goto cleanup; } - hOldSrcBmp = NtGdiSelectBitmap(hdcSrc, SourceBitmap); - hOldDstBmp = NtGdiSelectBitmap(hdcDst, hBitmap); + rcDst.top = bmi->bmiHeader.biHeight < 0 ? + abs(bmi->bmiHeader.biHeight) - (ScanLines + StartScan) : StartScan; + rcDst.left = 0; + rcDst.bottom = rcDst.top + ScanLines; + rcDst.right = psurfDst->SurfObj.sizlBitmap.cx; - if(!(hOldSrcBmp && hOldDstBmp)) - { - DPRINT1("Error : Could not select bitmaps into DCs\n"); - goto cleanup; - } + ptSrc.x = 0; + ptSrc.y = 0; - result = NtGdiBitBlt(hdcDst, 0, 0, bmi->bmiHeader.biWidth, ScanLines, hdcSrc, 0, StartScan, - SRCCOPY, 0, 0); + EXLATEOBJ_vInitialize(&exlo, psurfSrc->ppal, psurfDst->ppal, 0, 0, 0); + result = IntEngCopyBits(&psurfDst->SurfObj, + &psurfSrc->SurfObj, + NULL, + &exlo.xlo, + &rcDst, + &ptSrc); if(result) result = ScanLines; + EXLATEOBJ_vCleanup(&exlo); + cleanup: - if(hdcSrc) + if(psurfSrc) { - if(hOldSrcBmp) NtGdiSelectBitmap(hdcSrc, hOldSrcBmp); - NtGdiDeleteObjectApp(hdcSrc); + SURFACE_UnlockSurface(psurfSrc); } - if(hdcDst) + if(psurfDst) { - if(hOldDstBmp) NtGdiSelectBitmap(hdcDst, hOldDstBmp); - NtGdiDeleteObjectApp(hdcDst); + SURFACE_UnlockSurface(psurfDst); } GreDeleteObject(SourceBitmap); -- 2.17.1