Author: jgardou Date: Sat Oct 25 18:11:31 2014 New Revision: 64992
URL: http://svn.reactos.org/svn/reactos?rev=64992&view=rev Log: [WIN32K] - Always store alpha-aware cursors in a 32bpp RGB surface. CORE-8695
Modified: trunk/reactos/win32ss/gdi/eng/mouse.c trunk/reactos/win32ss/gdi/eng/pdevobj.h
Modified: trunk/reactos/win32ss/gdi/eng/mouse.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/eng/mouse.c?rev... ============================================================================== --- trunk/reactos/win32ss/gdi/eng/mouse.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/eng/mouse.c [iso-8859-1] Sat Oct 25 18:11:31 2014 @@ -263,11 +263,9 @@ BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } }; EXLATEOBJ exlo; EXLATEOBJ_vInitialize(&exlo, - pgp->psurfColor->ppal, + &gpalRGB, ppdev->ppalSurf, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0); + 0, 0, 0); IntEngAlphaBlend(psoDest, &pgp->psurfColor->SurfObj, NULL, @@ -373,34 +371,62 @@
if (psoColor) { - /* Color bitmap must have the same format as the dest surface */ - if (psoColor->iBitmapFormat != pso->iBitmapFormat) + if (fl & SPS_ALPHA) { - /* It's OK if we have an alpha bitmap */ - if(!(fl & SPS_ALPHA)) + /* Always store the alpha cursor in RGB. */ + EXLATEOBJ exloSrcRGB; + PEXLATEOBJ pexlo; + + pexlo = CONTAINING_RECORD(pxlo, EXLATEOBJ, xlo); + EXLATEOBJ_vInitialize(&exloSrcRGB, pexlo->ppalSrc, &gpalRGB, 0, 0, 0); + + hbmColor = EngCreateBitmap(psoColor->sizlBitmap, + WIDTH_BYTES_ALIGN32(sizel.cx, 32), + BMF_32BPP, + BMF_TOPDOWN | BMF_NOZEROINIT, + NULL); + psurfColor = SURFACE_ShareLockSurface(hbmColor); + if (!psurfColor) goto failure; + + /* Now copy the given bitmap. */ + rectl.bottom = psoColor->sizlBitmap.cy; + IntEngCopyBits(&psurfColor->SurfObj, + psoColor, + NULL, + &exloSrcRGB.xlo, + &rectl, + (POINTL*)&rectl); + + EXLATEOBJ_vCleanup(&exloSrcRGB); + } + else + { + /* Color bitmap must have the same format as the dest surface */ + if (psoColor->iBitmapFormat != pso->iBitmapFormat) { DPRINT1("Screen surface and cursor color bitmap format don't match!.\n"); goto failure; } + + /* Create a bitmap to copy the color bitmap to */ + hbmColor = EngCreateBitmap(psoColor->sizlBitmap, + lDelta, + pso->iBitmapFormat, + BMF_TOPDOWN | BMF_NOZEROINIT, + NULL); + psurfColor = SURFACE_ShareLockSurface(hbmColor); + if (!psurfColor) goto failure; + + /* Now copy the given bitmap. */ + rectl.bottom = psoColor->sizlBitmap.cy; + IntEngCopyBits(&psurfColor->SurfObj, + psoColor, + NULL, + pxlo, + &rectl, + (POINTL*)&rectl); }
- /* Create a bitmap to copy the color bitmap to */ - hbmColor = EngCreateBitmap(psoColor->sizlBitmap, - lDelta, - pso->iBitmapFormat, - BMF_TOPDOWN | BMF_NOZEROINIT, - NULL); - psurfColor = SURFACE_ShareLockSurface(hbmColor); - if (!psurfColor) goto failure; - - /* Now copy the given bitmap */ - rectl.bottom = psoColor->sizlBitmap.cy; - IntEngCopyBits(&psurfColor->SurfObj, - psoColor, - NULL, - pxlo, - &rectl, - (POINTL*)&rectl); }
/* Create a mask surface */ @@ -408,6 +434,8 @@ { EXLATEOBJ exlo; PPALETTE ppal; + + lDelta = WIDTH_BYTES_ALIGN32(sizel.cx, BitsPerFormat(pso->iBitmapFormat));
/* Create a bitmap for the mask */ hbmMask = EngCreateBitmap(psoMask->sizlBitmap,
Modified: trunk/reactos/win32ss/gdi/eng/pdevobj.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/eng/pdevobj.h?r... ============================================================================== --- trunk/reactos/win32ss/gdi/eng/pdevobj.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/eng/pdevobj.h [iso-8859-1] Sat Oct 25 18:11:31 2014 @@ -30,7 +30,6 @@ BOOL Enabled; SIZEL Size; POINTL HotSpot; - XLATEOBJ *XlateObject; SURFACE *psurfColor; SURFACE *psurfMask; SURFACE *psurfSave;