Author: tkreuzer Date: Sun Jan 9 18:11:44 2011 New Revision: 50342
URL: http://svn.reactos.org/svn/reactos?rev=50342&view=rev Log: [WIN32K] Improve NtGdiStretchDIBitsInternal, use _SEH2_YIELT instead of saving an NTSTATUS and handle the fast path in place instead of setting a BOOL variable. Fixes warnings about uninitialized variables.
Modified: trunk/reactos/subsystems/win32/win32k/objects/dibobj.c
Modified: trunk/reactos/subsystems/win32/win32k/objects/dibobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] Sun Jan 9 18:11:44 2011 @@ -1028,49 +1028,45 @@ WORD planes, bpp; DWORD compr, size; HBITMAP hBitmap; - BOOL fastpath = FALSE; - NTSTATUS Status = STATUS_SUCCESS; - PBYTE safeBits ; + HBITMAP hOldBitmap; + HDC hdcMem; + PVOID pvBits; + PBYTE safeBits;
if (!Bits || !BitsInfo) return 0;
- safeBits = ExAllocatePoolWithTag(PagedPool, cjMaxBits, TAG_DIB); - if(!safeBits) - { - EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } + safeBits = ExAllocatePoolWithTag(PagedPool, cjMaxBits, TAG_DIB); + if(!safeBits) + { + EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + }
if (!(pdc = DC_LockDc(hDC))) - { - ExFreePoolWithTag(safeBits, TAG_DIB); - EngSetLastError(ERROR_INVALID_HANDLE); - return 0; - } + { + ExFreePoolWithTag(safeBits, TAG_DIB); + EngSetLastError(ERROR_INVALID_HANDLE); + return 0; + }
_SEH2_TRY { ProbeForRead(BitsInfo, cjMaxInfo, 1); ProbeForRead(Bits, cjMaxBits, 1); - if (DIB_GetBitmapInfo( &BitsInfo->bmiHeader, &width, &height, &planes, &bpp, &compr, &size ) == -1) + if (DIB_GetBitmapInfo(&BitsInfo->bmiHeader, &width, &height, &planes, &bpp, &compr, &size) == -1) { DPRINT1("Invalid bitmap\n"); - Status = STATUS_INVALID_PARAMETER; - } - RtlCopyMemory(safeBits, Bits, cjMaxBits); + _SEH2_YIELD(goto cleanup;) + } + RtlCopyMemory(safeBits, Bits, cjMaxBits); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = _SEH2_GetExceptionCode(); + DPRINT1("Error, failed to read the DIB bits\n"); + _SEH2_YIELD(goto cleanup;) } _SEH2_END - - if(!NT_SUCCESS(Status)) - { - DPRINT1("Error, failed to read the DIB bits\n"); - goto cleanup; - }
if (width < 0) { @@ -1086,54 +1082,47 @@ ROP == SRCCOPY) { BITMAP bmp; - if (IntGdiGetObject(hBitmap, sizeof(bmp), &bmp) == sizeof(bmp)) - { - if (bmp.bmBitsPixel == bpp && - bmp.bmWidth == SrcWidth && - bmp.bmHeight == SrcHeight && - bmp.bmPlanes == planes) - fastpath = TRUE; - } - } - - if (fastpath) - { - /* fast path */ - DPRINT1("using fast path\n"); - ret = IntSetDIBits( pdc, hBitmap, 0, height, safeBits, BitsInfo, Usage); - } - else - { - /* slow path - need to use StretchBlt */ - HBITMAP hOldBitmap; - HDC hdcMem; - PVOID pvBits; - - hdcMem = NtGdiCreateCompatibleDC( hDC ); - hBitmap = DIB_CreateDIBSection(pdc, BitsInfo, Usage, &pvBits, NULL, 0, 0); - if(!hBitmap) - { - DPRINT1("Error, failed to create a DIB section\n"); - NtGdiDeleteObjectApp(hdcMem); - goto cleanup; - } - RtlCopyMemory(pvBits, safeBits, cjMaxBits); - hOldBitmap = NtGdiSelectBitmap( hdcMem, hBitmap ); - - /* Origin for DIBitmap may be bottom left (positive biHeight) or top - left (negative biHeight) */ - ret = NtGdiStretchBlt( hDC, XDest, YDest, DestWidth, DestHeight, - hdcMem, XSrc, abs(height) - SrcHeight - YSrc, - SrcWidth, SrcHeight, ROP, 0 ); - - if(ret) - ret = SrcHeight; - NtGdiSelectBitmap( hdcMem, hOldBitmap ); - NtGdiDeleteObjectApp( hdcMem ); - GreDeleteObject( hBitmap ); - } + ret = IntGdiGetObject(hBitmap, sizeof(bmp), &bmp) == sizeof(bmp); + if (ret && + bmp.bmBitsPixel == bpp && + bmp.bmWidth == SrcWidth && + bmp.bmHeight == SrcHeight && + bmp.bmPlanes == planes) + { + /* fast path */ + ret = IntSetDIBits(pdc, hBitmap, 0, height, safeBits, BitsInfo, Usage); + goto cleanup; + } + } + + /* slow path - need to use StretchBlt */ + + hdcMem = NtGdiCreateCompatibleDC(hDC); + hBitmap = DIB_CreateDIBSection(pdc, BitsInfo, Usage, &pvBits, NULL, 0, 0); + if(!hBitmap) + { + DPRINT1("Error, failed to create a DIB section\n"); + NtGdiDeleteObjectApp(hdcMem); + goto cleanup; + } + + RtlCopyMemory(pvBits, safeBits, cjMaxBits); + hOldBitmap = NtGdiSelectBitmap(hdcMem, hBitmap); + + /* Origin for DIBitmap may be bottom left (positive biHeight) or top + left (negative biHeight) */ + ret = NtGdiStretchBlt(hDC, XDest, YDest, DestWidth, DestHeight, + hdcMem, XSrc, abs(height) - SrcHeight - YSrc, + SrcWidth, SrcHeight, ROP, 0); + + if(ret) + ret = SrcHeight; + NtGdiSelectBitmap(hdcMem, hOldBitmap); + NtGdiDeleteObjectApp(hdcMem); + GreDeleteObject(hBitmap); + cleanup: - ExFreePoolWithTag(safeBits, TAG_DIB); + ExFreePoolWithTag(safeBits, TAG_DIB); DC_UnlockDc(pdc); return ret; }