Author: jgardou Date: Mon Aug 2 00:53:25 2010 New Revision: 48406
URL: http://svn.reactos.org/svn/reactos?rev=48406&view=rev Log: [WIN32K] - DDB are 16 bits aligned. - Reset hdc field of the unselected bitmap. - Lock it too, so it's not messed with when we unselect it. - Move Pattern creation of IntGdiCreateDIBBrush to DIB_CreateDIBSection.
Modified: branches/reactos-yarotows/subsystems/win32/win32k/eng/surface.c branches/reactos-yarotows/subsystems/win32/win32k/include/bitmaps.h branches/reactos-yarotows/subsystems/win32/win32k/objects/bitmaps.c branches/reactos-yarotows/subsystems/win32/win32k/objects/brush.c branches/reactos-yarotows/subsystems/win32/win32k/objects/dcobjs.c branches/reactos-yarotows/subsystems/win32/win32k/objects/dibobj.c
Modified: branches/reactos-yarotows/subsystems/win32/win32k/eng/surface.c URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/eng/surface.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/eng/surface.c [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -200,16 +200,21 @@ cBitsPixel = gajBitsPerFormat[pso->iBitmapFormat];
/* Is a width in bytes given? */ - if (ulWidth) - { - /* Align the width (Windows compatibility) */ - ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3; - } - else - { - /* Calculate width from the bitmap width in pixels */ - ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 31) & ~31) >> 3; - } + if (!ulWidth) + { + /* Align the width (windows compatibility) */ + if(psurf->flags & DDB_SURFACE) + { + /* DDB are 16 bits aligned */ + ulWidth = BITMAP_GetWidthBytes(pso->sizlBitmap.cx, cBitsPixel); + } + else + { + /* Others are 32 bits aligned */ + ulWidth = DIB_GetDIBWidthBytes(pso->sizlBitmap.cx, cBitsPixel); + } + } +
/* Calculate the bitmap size in bytes */ pso->cjBits = ulWidth * pso->sizlBitmap.cy;
Modified: branches/reactos-yarotows/subsystems/win32/win32k/include/bitmaps.h URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/include/bitmaps.h [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/include/bitmaps.h [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -32,7 +32,8 @@ IN ULONG iFormat, IN USHORT fjBitmap, IN ULONG cjBits, - IN OPTIONAL PVOID pvBits); + IN OPTIONAL PVOID pvBits, + IN FLONG flags);
HBITMAP FASTCALL
Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/bitmaps.c URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/objects/bitmaps.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/objects/bitmaps.c [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -76,14 +76,14 @@ IN ULONG iFormat, IN USHORT fjBitmap, IN ULONG cjSizeImage, - IN OPTIONAL PVOID pvBits) + IN OPTIONAL PVOID pvBits, + IN FLONG flags) { PSURFACE psurf; SURFOBJ *pso; HBITMAP hbmp; PVOID pvCompressedBits; SIZEL sizl; - FLONG fl = 0;
/* Verify format */ if (iFormat < BMF_1BPP || iFormat > BMF_PNG) return NULL; @@ -107,7 +107,7 @@ pvCompressedBits = pvBits; pvBits = EngAllocMem(FL_ZERO_MEMORY, pso->cjBits, TAG_DIB); Decompress4bpp(sizl, pvCompressedBits, pvBits, pso->lDelta); - fl |= BMF_RLE_HACK; + fjBitmap |= BMF_RLE_HACK; } else if (iFormat == BMF_8RLE) { @@ -115,8 +115,11 @@ pvCompressedBits = pvBits; pvBits = EngAllocMem(FL_ZERO_MEMORY, pso->cjBits, TAG_DIB); Decompress8bpp(sizl, pvCompressedBits, pvBits, pso->lDelta); - fl |= BMF_RLE_HACK; - } + fjBitmap |= BMF_RLE_HACK; + } + + /* Mark as API bitmap */ + psurf->flags |= (flags | API_BITMAP);
/* Set the bitmap bits */ if (!SURFACE_bSetBitmapBits(psurf, fjBitmap, cjWidthBytes, pvBits)) @@ -127,14 +130,14 @@ return NULL; }
- /* Mark as API bitmap */ - psurf->flags |= API_BITMAP; - /* Unlock the surface and return */ SURFACE_UnlockSurface(psurf); return hbmp; }
+/* Creates a DDB surface, + * as in CreateCompatibleBitmap or CreateBitmap. + */ HBITMAP APIENTRY GreCreateBitmap( @@ -151,7 +154,8 @@ BitmapFormat(cBitsPixel * cPlanes, BI_RGB), 0, /* no bitmap flags */ 0, /* auto size */ - pvBits); + pvBits, + DDB_SURFACE /* DDB */); }
HBITMAP @@ -163,10 +167,7 @@ IN UINT cBitsPixel, IN OPTIONAL LPBYTE pUnsafeBits) { - PSURFACE psurf; - SURFOBJ *pso; HBITMAP hbmp; - FLONG fl = 0; ULONG cjWidthBytes, iFormat;
/* NOTE: Windows also doesn't store nr. of planes separately! */ @@ -185,7 +186,7 @@ }
/* Make sure that cjBits will not overflow */ - cjWidthBytes = DIB_GetDIBWidthBytes(nWidth, cBitsPixel); + cjWidthBytes = BITMAP_GetWidthBytes(nWidth, cBitsPixel); if ((ULONGLONG)cjWidthBytes * nHeight >= 0x100000000ULL) { DPRINT1("Width = %d, Height = %d BitsPixel = %d\n", @@ -194,30 +195,12 @@ return NULL; }
- /* Allocate a surface */ - psurf = SURFACE_AllocSurface(STYPE_BITMAP, nWidth, nHeight, iFormat); - if (!psurf) - { - DPRINT1("SURFACE_AllocSurface failed.\n"); - EngSetLastError(ERROR_OUTOFMEMORY); - return NULL; - } - - /* Get the handle for the bitmap and the surfobj */ - hbmp = (HBITMAP)psurf->SurfObj.hsurf; - pso = &psurf->SurfObj; - - /* Allocate the bitmap bits */ - if (!SURFACE_bSetBitmapBits(psurf, fl, 0, NULL)) - { - /* Bail out if that failed */ - DPRINT1("SURFACE_bSetBitmapBits failed.\n"); - SURFACE_FreeSurfaceByHandle(hbmp); - return NULL; - } - + /* cBitsPixel = cBitsPixel * cPlanes now! */ + hbmp = GreCreateBitmap(nWidth, nHeight, 1, cBitsPixel, NULL); + if (pUnsafeBits) { + PSURFACE psurf = SURFACE_LockSurface(hbmp); _SEH2_TRY { ProbeForRead(pUnsafeBits, cjWidthBytes * nHeight, 1); @@ -225,17 +208,15 @@ } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + SURFACE_UnlockSurface(psurf); SURFACE_FreeSurfaceByHandle(hbmp); _SEH2_YIELD(return NULL;) } _SEH2_END - } - - /* Mark as API bitmap */ - psurf->flags |= API_BITMAP; - - /* Unlock the surface and return */ - SURFACE_UnlockSurface(psurf); + + SURFACE_UnlockSurface(psurf); + } + return hbmp; }
@@ -931,7 +912,8 @@ Bitmap->SurfObj.iBitmapFormat, Bitmap->SurfObj.fjBitmap, Bitmap->SurfObj.cjBits, - NULL); + NULL, + Bitmap->flags);
if (res) @@ -1052,4 +1034,5 @@ return hdc; }
+ /* EOF */
Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/brush.c URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/objects/brush.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/objects/brush.c [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -25,7 +25,7 @@ RGN_ATTR Attr[GDIOBJATTRFREE]; } GDI_OBJ_ATTR_ENTRY, *PGDI_OBJ_ATTR_ENTRY;
-static const ULONG HatchBrushes[NB_HATCH_STYLES][8] = +static const USHORT HatchBrushes[NB_HATCH_STYLES][8] = { {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF}, /* HS_HORIZONTAL */ {0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7}, /* HS_VERTICAL */ @@ -256,8 +256,7 @@ PBRUSH pbrush; HBITMAP hPattern; ULONG_PTR DataPtr; - PSURFACE psurfPattern; - HPALETTE hpal ; + PVOID pvDIBits;
if (BitmapInfo->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) { @@ -267,25 +266,17 @@
DataPtr = (ULONG_PTR)BitmapInfo + DIB_BitmapInfoSize(BitmapInfo, ColorSpec);
- hPattern = GreCreateBitmap(BitmapInfo->bmiHeader.biWidth, - BitmapInfo->bmiHeader.biHeight, - BitmapInfo->bmiHeader.biPlanes, - BitmapInfo->bmiHeader.biBitCount, - (PVOID)DataPtr); + hPattern = DIB_CreateDIBSection(NULL, BitmapInfo, ColorSpec, &pvDIBits, NULL, 0, 0); if (hPattern == NULL) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return NULL; } - - psurfPattern = SURFACE_LockSurface(hPattern); - ASSERT(psurfPattern != NULL); - if(ColorSpec == DIB_PAL_COLORS) DPRINT1("FIXME, unsupported color spec!\n"); - hpal = BuildDIBPalette(BitmapInfo); - psurfPattern->ppal = PALETTE_ShareLockPalette(hpal); - /* Lazy delete palette, it will be freed when its shared reference is zeroed */ - GreDeleteObject(hpal); - SURFACE_UnlockSurface(psurfPattern); + RtlCopyMemory(pvDIBits, + (PVOID)DataPtr, + DIB_GetDIBImageBytes(BitmapInfo->bmiHeader.biWidth, + BitmapInfo->bmiHeader.biHeight, + BitmapInfo->bmiHeader.biBitCount * BitmapInfo->bmiHeader.biPlanes));
pbrush = BRUSH_AllocBrushWithHandle(); if (pbrush == NULL)
Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/dcobjs.c URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/objects/dcobjs.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/objects/dcobjs.c [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -284,14 +284,24 @@ }
/* Get the handle for the old bitmap */ - psurfOld = pDC->dclevel.pSurface; - hOrgBmp = psurfOld ? psurfOld->BaseObject.hHmgr : NULL; + ASSERT(pDC->dclevel.pSurface); + hOrgBmp = pDC->dclevel.pSurface->BaseObject.hHmgr; + + /* Lock it, to be sure while we mess with it*/ + psurfOld = SURFACE_LockSurface(hOrgBmp); + + /* Reset hdc, this surface isn't selected anymore */ + psurfOld->hdc = NULL;
/* Release the old bitmap, reference the new */ DC_vSelectSurface(pDC, psurfBmp);
+ /* And unlock it, now we're done */ + SURFACE_UnlockSurface(psurfOld); + // If Info DC this is zero and pSurface is moved to DC->pSurfInfo. psurfBmp->hdc = hDC; +
/* FIXME; improve by using a region without a handle and selecting it */ hVisRgn = IntSysCreateRectRgn( 0,
Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/dibobj.c URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win3... ============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] Mon Aug 2 00:53:25 2010 @@ -1463,10 +1463,20 @@
if (usage == DIB_PAL_COLORS) { - PPALETTE pdcPal ; - pdcPal = PALETTE_LockPalette(dc->dclevel.hpal); - hpal = DIB_MapPaletteColors(pdcPal, bmi); - PALETTE_UnlockPalette(pdcPal); + if(dc) + { + PPALETTE pdcPal ; + pdcPal = PALETTE_LockPalette(dc->dclevel.hpal); + hpal = DIB_MapPaletteColors(pdcPal, bmi); + PALETTE_UnlockPalette(pdcPal); + } + else + { + /* For DIB Brushes */ + DPRINT1("FIXME : Unsupported DIB_PAL_COLORS without a DC to map colors.\n"); + /* HACK */ + hpal = (HPALETTE) 0xFFFFFFFF; + } } else { @@ -1475,7 +1485,7 @@
if(!hpal) { - DPRINT1("Error : Could not create a aplette for the DIB.\n"); + DPRINT1("Error : Could not create a palette for the DIB.\n"); goto cleanup; }
@@ -1489,7 +1499,8 @@ BMF_DONTCACHE | BMF_USERMEM | BMF_NOZEROINIT | (bi->biHeight < 0 ? BMF_TOPDOWN : 0), bi->biSizeImage, - bm.bmBits); + bm.bmBits, + 0); if (!res) { SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); @@ -1512,9 +1523,13 @@ bmp->flags = API_BITMAP; bmp->biClrImportant = bi->biClrImportant;
- bmp->ppal = PALETTE_ShareLockPalette(hpal); - /* Lazy delete hpal, it will be freed at surface release */ - GreDeleteObject(hpal); + /* HACK */ + if(hpal != (HPALETTE)0xFFFFFFFF) + { + bmp->ppal = PALETTE_ShareLockPalette(hpal); + /* Lazy delete hpal, it will be freed at surface release */ + GreDeleteObject(hpal); + }
// Clean up in case of errors cleanup: