From 35e122d62f12506c9c6e755bca89ebabf12da40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 25 Oct 2014 18:11:31 +0000 Subject: [PATCH] [WIN32K] - Always store alpha-aware cursors in a 32bpp RGB surface. CORE-8695 svn path=/trunk/; revision=64992 --- reactos/win32ss/gdi/eng/mouse.c | 78 +++++++++++++++++++++---------- reactos/win32ss/gdi/eng/pdevobj.h | 1 - 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/reactos/win32ss/gdi/eng/mouse.c b/reactos/win32ss/gdi/eng/mouse.c index e4cd3abbba3..5170644b650 100644 --- a/reactos/win32ss/gdi/eng/mouse.c +++ b/reactos/win32ss/gdi/eng/mouse.c @@ -263,11 +263,9 @@ IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest) 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 @@ EngSetPointerShape( 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 */ @@ -409,6 +435,8 @@ EngSetPointerShape( EXLATEOBJ exlo; PPALETTE ppal; + lDelta = WIDTH_BYTES_ALIGN32(sizel.cx, BitsPerFormat(pso->iBitmapFormat)); + /* Create a bitmap for the mask */ hbmMask = EngCreateBitmap(psoMask->sizlBitmap, lDelta, diff --git a/reactos/win32ss/gdi/eng/pdevobj.h b/reactos/win32ss/gdi/eng/pdevobj.h index d319078b043..f5bd95a305a 100644 --- a/reactos/win32ss/gdi/eng/pdevobj.h +++ b/reactos/win32ss/gdi/eng/pdevobj.h @@ -30,7 +30,6 @@ typedef struct _GDIPOINTER /* should stay private to ENG? No, part of PDEVOBJ ak BOOL Enabled; SIZEL Size; POINTL HotSpot; - XLATEOBJ *XlateObject; SURFACE *psurfColor; SURFACE *psurfMask; SURFACE *psurfSave;