From f57bcb3e254cc380840ae383fd645fdfbe4fd86d Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 10 Jun 2010 14:32:05 +0000 Subject: [PATCH] [GDI32] - DIB data is not mandatory in CreateDIBitmap [WIN32K] - Simplify GreCreateDIBitmap - Surface data should be 16 bits aligned svn path=/branches/reactos-yarotows/; revision=47735 --- dll/win32/gdi32/objects/bitmap.c | 25 ++++---- subsystems/win32/win32k/eng/surface.c | 6 +- subsystems/win32/win32k/objects/dibobj.c | 79 ++++++++---------------- 3 files changed, 42 insertions(+), 68 deletions(-) diff --git a/dll/win32/gdi32/objects/bitmap.c b/dll/win32/gdi32/objects/bitmap.c index 97cae2ceb1f..10708385dd6 100644 --- a/dll/win32/gdi32/objects/bitmap.c +++ b/dll/win32/gdi32/objects/bitmap.c @@ -461,8 +461,8 @@ CreateDIBitmap( HDC hDC, LONG width, height, compr, dibsize; WORD planes, bpp; // PDC_ATTR pDc_Attr; - UINT InfoSize; - UINT cjBmpScanSize; + UINT InfoSize = 0; + UINT cjBmpScanSize = 0; HBITMAP hBmp; NTSTATUS Status = STATUS_SUCCESS; @@ -477,17 +477,20 @@ CreateDIBitmap( HDC hDC, // For Icm support. // GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) - _SEH2_TRY - { - cjBmpScanSize = DIB_BitmapBitsSize(Data); - CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize); - InfoSize += Data->bmiHeader.biSize; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + if(Data) { - Status = _SEH2_GetExceptionCode(); + _SEH2_TRY + { + cjBmpScanSize = DIB_BitmapBitsSize(Data); + CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize); + InfoSize += Data->bmiHeader.biSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END } - _SEH2_END if(!NT_SUCCESS(Status)) { diff --git a/subsystems/win32/win32k/eng/surface.c b/subsystems/win32/win32k/eng/surface.c index 76c502ff775..a57470b7936 100644 --- a/subsystems/win32/win32k/eng/surface.c +++ b/subsystems/win32/win32k/eng/surface.c @@ -203,12 +203,12 @@ SURFACE_bSetBitmapBits( if (ulWidth) { /* Align the width (Windows compatibility) */ - ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3; + ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 15) & ~15) >> 3; } else { /* Calculate width from the bitmap width in pixels */ - ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 31) & ~31) >> 3; + ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 15) & ~15) >> 3; } /* Calculate the bitmap size in bytes */ @@ -236,7 +236,7 @@ SURFACE_bSetBitmapBits( (fjBitmap & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY, pso->cjBits, TAG_DIB); - + /* Free the section already, but keep the mapping */ if (pvBits) EngFreeSectionMem(pvSection, NULL); } diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index 44ba00fb56a..f0b84be36cc 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -1177,68 +1177,39 @@ GreCreateDIBitmapInternal( PDC Dc; HBITMAP Bmp; WORD bpp; + HDC hdcDest; - if (!hDc) // CreateBitmap + if (!hDc) /* 1bpp monochrome bitmap */ { // Should use System Bitmap DC hSystemBM, with CreateCompatibleDC for this. - hDc = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE); - if (!hDc) + hdcDest = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE); + if(!hdcDest) { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return NULL; - } - - Dc = DC_LockDc(hDc); - if (!Dc) - { - NtGdiDeleteObjectApp(hDc); - SetLastWin32Error(ERROR_INVALID_HANDLE); return NULL; } - bpp = 1; - Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage); + } + else + { + hdcDest = hDc; + } - DC_UnlockDc(Dc); - NtGdiDeleteObjectApp(hDc); + Dc = DC_LockDc(hdcDest); + if (!Dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; } - else // CreateCompatibleBitmap + /* It's OK to set bpp=0 here, as IntCreateDIBitmap will create a compatible Bitmap + * if bpp != 1 and ignore the real value that was passed */ + if (pbmi) + bpp = pbmi->bmiHeader.bV5BitCount; + else + bpp = 0; + Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage); + DC_UnlockDc(Dc); + + if(!hDc) { - Dc = DC_LockDc(hDc); - if (!Dc) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return NULL; - } - /* pbmi == null - First create an un-initialised bitmap. The depth of the bitmap - should match that of the hdc and not that supplied in bmih. - */ - if (pbmi) - bpp = pbmi->bmiHeader.bV5BitCount; - else - { - if (Dc->dctype != DC_TYPE_MEMORY) - bpp = Dc->ppdev->gdiinfo.cBitsPixel; - else - { - DIBSECTION dibs; - INT Count; - SURFACE *psurf = Dc->dclevel.pSurface; - Count = BITMAP_GetObject(psurf, sizeof(dibs), &dibs); - if (!Count) - bpp = 1; - else - { - if (Count == sizeof(BITMAP)) - /* A device-dependent bitmap is selected in the DC */ - bpp = dibs.dsBm.bmBitsPixel; - else - /* A DIB section is selected in the DC */ - bpp = dibs.dsBmih.biBitCount; - } - } - } - Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage); - DC_UnlockDc(Dc); + NtGdiDeleteObjectApp(hdcDest); } return Bmp; } -- 2.17.1