mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 00:43:21 +00:00
[WIN32K]
- Always store alpha-aware cursors in a 32bpp RGB surface. CORE-8695 svn path=/trunk/; revision=64992
This commit is contained in:
parent
5211c92255
commit
35e122d62f
|
@ -263,11 +263,9 @@ IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest)
|
||||||
BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } };
|
BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } };
|
||||||
EXLATEOBJ exlo;
|
EXLATEOBJ exlo;
|
||||||
EXLATEOBJ_vInitialize(&exlo,
|
EXLATEOBJ_vInitialize(&exlo,
|
||||||
pgp->psurfColor->ppal,
|
&gpalRGB,
|
||||||
ppdev->ppalSurf,
|
ppdev->ppalSurf,
|
||||||
0xFFFFFFFF,
|
0, 0, 0);
|
||||||
0xFFFFFFFF,
|
|
||||||
0);
|
|
||||||
IntEngAlphaBlend(psoDest,
|
IntEngAlphaBlend(psoDest,
|
||||||
&pgp->psurfColor->SurfObj,
|
&pgp->psurfColor->SurfObj,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -373,34 +371,62 @@ EngSetPointerShape(
|
||||||
|
|
||||||
if (psoColor)
|
if (psoColor)
|
||||||
{
|
{
|
||||||
/* Color bitmap must have the same format as the dest surface */
|
if (fl & SPS_ALPHA)
|
||||||
if (psoColor->iBitmapFormat != pso->iBitmapFormat)
|
|
||||||
{
|
{
|
||||||
/* It's OK if we have an alpha bitmap */
|
/* Always store the alpha cursor in RGB. */
|
||||||
if(!(fl & SPS_ALPHA))
|
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");
|
DPRINT1("Screen surface and cursor color bitmap format don't match!.\n");
|
||||||
goto failure;
|
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 */
|
/* Create a mask surface */
|
||||||
|
@ -409,6 +435,8 @@ EngSetPointerShape(
|
||||||
EXLATEOBJ exlo;
|
EXLATEOBJ exlo;
|
||||||
PPALETTE ppal;
|
PPALETTE ppal;
|
||||||
|
|
||||||
|
lDelta = WIDTH_BYTES_ALIGN32(sizel.cx, BitsPerFormat(pso->iBitmapFormat));
|
||||||
|
|
||||||
/* Create a bitmap for the mask */
|
/* Create a bitmap for the mask */
|
||||||
hbmMask = EngCreateBitmap(psoMask->sizlBitmap,
|
hbmMask = EngCreateBitmap(psoMask->sizlBitmap,
|
||||||
lDelta,
|
lDelta,
|
||||||
|
|
|
@ -30,7 +30,6 @@ typedef struct _GDIPOINTER /* should stay private to ENG? No, part of PDEVOBJ ak
|
||||||
BOOL Enabled;
|
BOOL Enabled;
|
||||||
SIZEL Size;
|
SIZEL Size;
|
||||||
POINTL HotSpot;
|
POINTL HotSpot;
|
||||||
XLATEOBJ *XlateObject;
|
|
||||||
SURFACE *psurfColor;
|
SURFACE *psurfColor;
|
||||||
SURFACE *psurfMask;
|
SURFACE *psurfMask;
|
||||||
SURFACE *psurfSave;
|
SURFACE *psurfSave;
|
||||||
|
|
Loading…
Reference in a new issue