From: Timo Kreuzer Date: Sun, 27 Feb 2011 17:38:18 +0000 (+0000) Subject: [WIN32K] X-Git-Tag: ReactOS-0.3.13~123 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=760940d0bd2de1ebdcc15675d5ba2ab893a6d05d;ds=sidebyside [WIN32K] - In NtGdiGetDIBitsInternal use a shared lock for the bitmaps and provide background colors when initializing the XLATEOBJ. This fixes mono bitmaps passed to GetDIBits. (no it does not fix pink icons in VLC) - In BuildDIBPalette don't handle 15bpp, its not valid. and 16 bpp is 555, this is documented in MSDN. svn path=/trunk/; revision=50920 --- diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index f33a8bc4ab5..a0e29d92b19 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -649,7 +649,7 @@ NtGdiGetDIBitsInternal( } /* Get a pointer to the source bitmap object */ - psurf = SURFACE_LockSurface(hBitmap); + psurf = SURFACE_ShareLockSurface(hBitmap); if (psurf == NULL) { ScanLines = 0; @@ -944,7 +944,7 @@ NtGdiGetDIBitsInternal( goto done ; } - psurfDest = SURFACE_LockSurface(hBmpDest); + psurfDest = SURFACE_ShareLockSurface(hBmpDest); rcDest.left = 0; rcDest.top = 0; @@ -955,7 +955,7 @@ NtGdiGetDIBitsInternal( srcPoint.y = height < 0 ? psurf->SurfObj.sizlBitmap.cy - (StartScan + ScanLines) : StartScan; - EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0, 0, 0); + EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0xffffff, 0xffffff, 0); ret = IntEngCopyBits(&psurfDest->SurfObj, &psurf->SurfObj, @@ -964,6 +964,8 @@ NtGdiGetDIBitsInternal( &rcDest, &srcPoint); + SURFACE_ShareUnlockSurface(psurfDest); + if(!ret) ScanLines = 0; else @@ -994,7 +996,7 @@ NtGdiGetDIBitsInternal( done: if(pDC) DC_UnlockDc(pDC); - if(psurf) SURFACE_UnlockSurface(psurf); + if(psurf) SURFACE_ShareUnlockSurface(psurf); if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci); return ScanLines; @@ -1101,14 +1103,14 @@ NtGdiStretchDIBitsInternal( hBitmap = DIB_CreateDIBSection(pdc, BitsInfo, Usage, &pvBits, NULL, 0, 0); DC_UnlockDc(pdc); - hdcMem = NtGdiCreateCompatibleDC(hDC); if(!hBitmap) { DPRINT1("Error, failed to create a DIB section\n"); - NtGdiDeleteObjectApp(hdcMem); goto cleanup; } + hdcMem = NtGdiCreateCompatibleDC(hDC); + RtlCopyMemory(pvBits, safeBits, cjMaxBits); hOldBitmap = NtGdiSelectBitmap(hdcMem, hBitmap); @@ -1771,20 +1773,13 @@ BuildDIBPalette(CONST BITMAPINFO *bmi) paletteType = PAL_BITFIELDS; switch (bits) { - case 15: + case 16: paletteType |= PAL_RGB16_555; RedMask = 0x7C00; GreenMask = 0x03E0; BlueMask = 0x001F; break; - case 16: - paletteType |= PAL_RGB16_565; - RedMask = 0xF800; - GreenMask = 0x07E0; - BlueMask = 0x001F; - break; - case 24: case 32: paletteType |= PAL_BGR;