Author: tkreuzer
Date: Thu Oct 6 13:38:45 2011
New Revision: 54024
URL:
http://svn.reactos.org/svn/reactos?rev=54024&view=rev
Log:
[WIN32K]
use GreCreateBitmapEx in IntSetDIBits as well to handle RLE images. Fixes bug 6388
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] Thu Oct 6
13:38:45 2011
@@ -250,21 +250,26 @@
INT result = 0;
RECT rcDst;
POINTL ptSrc;
- PVOID pvBits;
EXLATEOBJ exlo;
-
- SourceBitmap = DIB_CreateDIBSection(DC, bmi, ColorUse, &pvBits, NULL, 0, 0);
- if (0 == SourceBitmap)
- {
- DPRINT1("Error : Could not create a DIBSection.\n");
+ HPALETTE hpalDIB = 0;
+ PPALETTE ppalDIB = 0;
+
+ SourceBitmap = GreCreateBitmapEx(bmi->bmiHeader.biWidth,
+ ScanLines,
+ 0,
+ BitmapFormat(bmi->bmiHeader.biBitCount,
+ bmi->bmiHeader.biCompression),
+ bmi->bmiHeader.biHeight < 0 ? BMF_TOPDOWN :
0,
+ bmi->bmiHeader.biSizeImage,
+ (PVOID)Bits,
+ 0);
+ if (!SourceBitmap)
+ {
+ DPRINT1("Error: Could not create a bitmap.\n");
EngSetLastError(ERROR_NO_SYSTEM_RESOURCES);
return 0;
}
- RtlCopyMemory(pvBits, Bits, DIB_GetDIBImageBytes(bmi->bmiHeader.biWidth,
- bmi->bmiHeader.biHeight,
- bmi->bmiHeader.biBitCount));
-
psurfDst = SURFACE_ShareLockSurface(hBitmap);
psurfSrc = SURFACE_ShareLockSurface(SourceBitmap);
@@ -273,17 +278,37 @@
DPRINT1("Error, could not lock surfaces\n");
goto cleanup;
}
+
+ /* Create a palette for the DIB */
+ hpalDIB = BuildDIBPalette(bmi);
+ if (!hpalDIB)
+ {
+ EngSetLastError(ERROR_NO_SYSTEM_RESOURCES);
+ goto cleanup;
+ }
+
+ /* Lock the DIB palette */
+ ppalDIB = PALETTE_ShareLockPalette(hpalDIB);
+ if (!ppalDIB)
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ goto cleanup;
+ }
+
+ /* Initialize EXLATEOBJ */
+ EXLATEOBJ_vInitialize(&exlo,
+ ppalDIB,
+ psurfDst->ppal,
+ RGB(0xff, 0xff, 0xff),
+ RGB(0xff, 0xff, 0xff), //DC->pdcattr->crBackgroundClr,
+ 0); // DC->pdcattr->crForegroundClr);
rcDst.top = StartScan;
rcDst.left = 0;
rcDst.bottom = rcDst.top + ScanLines;
rcDst.right = psurfDst->SurfObj.sizlBitmap.cx;
-
ptSrc.x = 0;
ptSrc.y = 0;
-
- /* 1bpp bitmaps have 0 for white, 1 for black */
- EXLATEOBJ_vInitialize(&exlo, psurfSrc->ppal, psurfDst->ppal, 0xFFFFFF,
0xFFFFFF, 0);
result = IntEngCopyBits(&psurfDst->SurfObj,
&psurfSrc->SurfObj,
@@ -297,14 +322,10 @@
EXLATEOBJ_vCleanup(&exlo);
cleanup:
- if(psurfSrc)
- {
- SURFACE_ShareUnlockSurface(psurfSrc);
- }
- if(psurfDst)
- {
- SURFACE_ShareUnlockSurface(psurfDst);
- }
+ if (ppalDIB) PALETTE_ShareUnlockPalette(ppalDIB);
+ if (hpalDIB) GreDeleteObject(hpalDIB);
+ if(psurfSrc) SURFACE_ShareUnlockSurface(psurfSrc);
+ if(psurfDst) SURFACE_ShareUnlockSurface(psurfDst);
GreDeleteObject(SourceBitmap);
return result;