From 4ed72ce5b7672ac05d2be1f323189ff5182372ce Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 7 Mar 2011 09:53:03 +0000 Subject: [PATCH] [WIN32K] Fix the RLE hack (partly) svn path=/trunk/; revision=50988 --- .../subsystems/win32/win32k/objects/bitmaps.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index 96b75bbdc5c..c6b9dfee78a 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -82,8 +82,6 @@ GreCreateBitmapEx( PSURFACE psurf; SURFOBJ *pso; HBITMAP hbmp; - PVOID pvCompressedBits; - SIZEL sizl; /* Verify format */ if (iFormat < BMF_1BPP || iFormat > BMF_PNG) return NULL; @@ -103,22 +101,31 @@ GreCreateBitmapEx( /* The infamous RLE hack */ if (iFormat == BMF_4RLE || iFormat == BMF_8RLE) { + PVOID pvCompressedBits; + SIZEL sizl; + LONG lDelta; + sizl.cx = nWidth; sizl.cy = nHeight; + lDelta = WIDTH_BYTES_ALIGN32(nWidth, gajBitsPerFormat[iFormat]); + pvCompressedBits = pvBits; - pvBits = EngAllocMem(FL_ZERO_MEMORY, pso->cjBits, TAG_DIB); + pvBits = EngAllocMem(FL_ZERO_MEMORY, lDelta * nHeight, TAG_DIB); if (!pvBits) { EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); SURFACE_FreeSurfaceByHandle(hbmp); return NULL; } - DecompressBitmap(sizl, pvCompressedBits, pvBits, pso->lDelta, iFormat); + DecompressBitmap(sizl, pvCompressedBits, pvBits, lDelta, iFormat); fjBitmap |= BMF_RLE_HACK; + + iFormat = iFormat == BMF_4RLE ? BMF_4BPP : BMF_8BPP; + psurf->SurfObj.iBitmapFormat = iFormat; } - /* Mark as API bitmap */ - psurf->flags |= (flags | API_BITMAP); + /* Mark as API bitmap */ + psurf->flags |= (flags | API_BITMAP); /* Set the bitmap bits */ if (!SURFACE_bSetBitmapBits(psurf, fjBitmap, cjWidthBytes, pvBits)) -- 2.17.1