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/ob…
==============================================================================
--- 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;
}