mirror of
https://github.com/reactos/reactos.git
synced 2024-07-18 02:16:14 +00:00
[WIN32K]
Properly implement EngPaint, calling IntEngBitBlt, instead of doing a manual single color fill. svn path=/trunk/; revision=65729
This commit is contained in:
parent
9697fb6e1e
commit
c3d2353ed6
|
@ -1,5 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
extern const BYTE gajRop2ToRop3[16];
|
||||||
|
|
||||||
|
#define MIX_TO_ROP4(mix) \
|
||||||
|
(((ULONG)gajRop2ToRop3[((mix) - 1) & 0xF]) | \
|
||||||
|
((ULONG)gajRop2ToRop3[(((mix) >> 8) - 1) & 0xF] << 8))
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
EngAcquireSemaphoreShared(
|
EngAcquireSemaphoreShared(
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* PURPOSE: GDI Driver Paint Functions
|
* PURPOSE: GDI Driver Paint Functions
|
||||||
* FILE: subsys/win32k/eng/paint.c
|
* FILE: subsys/win32k/eng/paint.c
|
||||||
* PROGRAMER: Jason Filby
|
* PROGRAMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
|
||||||
|
* Jason Filby
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <win32k.h>
|
#include <win32k.h>
|
||||||
|
@ -11,6 +12,26 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
const BYTE gajRop2ToRop3[16] =
|
||||||
|
{
|
||||||
|
0x00, // 1: R2_BLACK 0
|
||||||
|
0x05, // 2: R2_NOTMERGEPEN DPon
|
||||||
|
0x0A, // 3: R2_MASKNOTPEN DPna
|
||||||
|
0x0F, // 4: R2_NOTCOPYPEN Pn
|
||||||
|
0x50, // 5: R2_MASKPENNOT PDna
|
||||||
|
0x55, // 6: R2_NOT Dn
|
||||||
|
0x5A, // 7: R2_XORPEN DPx
|
||||||
|
0x5F, // 8: R2_NOTMASKPEN DPan
|
||||||
|
0xA0, // 9: R2_MASKPEN DPa
|
||||||
|
0xA5, // 10: R2_NOTXORPEN PDxn
|
||||||
|
0xAA, // 11: R2_NOP D
|
||||||
|
0xAF, // 12: R2_MERGENOTPEN DPno
|
||||||
|
0xF0, // 13: R2_COPYPEN P
|
||||||
|
0xF5, // 14: R2_MERGEPENNOT PDno
|
||||||
|
0xFA, // 15: R2_MERGEPEN DPo
|
||||||
|
0xFF, // 16: R2_WHITE 1
|
||||||
|
};
|
||||||
|
|
||||||
BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
||||||
{
|
{
|
||||||
LONG y;
|
LONG y;
|
||||||
|
@ -28,87 +49,57 @@ BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL APIENTRY
|
BOOL
|
||||||
EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
|
APIENTRY
|
||||||
BRUSHOBJ *BrushObj, POINTL *BrushPoint)
|
EngPaint(
|
||||||
|
_In_ SURFOBJ *pso,
|
||||||
|
_In_ CLIPOBJ *pco,
|
||||||
|
_In_ BRUSHOBJ *pbo,
|
||||||
|
_In_ POINTL *pptlBrushOrg,
|
||||||
|
_In_ __in_data_source(USER_MODE) MIX mix)
|
||||||
{
|
{
|
||||||
RECT_ENUM RectEnum;
|
ROP4 rop4;
|
||||||
BOOL EnumMore;
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
ASSERT(pso);
|
/* Convert the MIX, consisting of 2 ROP2 codes into a ROP4 */
|
||||||
ASSERT(ClipRegion);
|
rop4 = MIX_TO_ROP4(mix);
|
||||||
|
|
||||||
DPRINT("ClipRegion->iMode:%u, ClipRegion->iDComplexity: %u\n Color: %lu", ClipRegion->iMode, ClipRegion->iDComplexity, iColor);
|
/* Sanity checks */
|
||||||
switch(ClipRegion->iMode) {
|
NT_ASSERT(!ROP4_USES_SOURCE(rop4));
|
||||||
|
NT_ASSERT(!ROP4_USES_MASK(rop4));
|
||||||
|
|
||||||
case TC_RECTANGLES:
|
/* Forward the call to Eng/DrvBitBlt */
|
||||||
|
return IntEngBitBlt(pso,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
pco,
|
||||||
|
NULL,
|
||||||
|
&pco->rclBounds,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
pbo,
|
||||||
|
pptlBrushOrg,
|
||||||
|
rop4);
|
||||||
|
}
|
||||||
|
|
||||||
/* Rectangular clipping can be handled without enumeration.
|
BOOL
|
||||||
Note that trivial clipping is not possible, since the clipping
|
APIENTRY
|
||||||
region defines the area to fill */
|
IntEngPaint(
|
||||||
|
_In_ SURFOBJ *pso,
|
||||||
|
_In_ CLIPOBJ *pco,
|
||||||
|
_In_ BRUSHOBJ *pbo,
|
||||||
|
_In_ POINTL *pptlBrushOrg,
|
||||||
|
_In_ __in_data_source(USER_MODE) MIX mix)
|
||||||
|
{
|
||||||
|
SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
|
||||||
|
|
||||||
if (ClipRegion->iDComplexity == DC_RECT)
|
/* Is the surface's Paint function hooked? */
|
||||||
|
if ((pso->iType != STYPE_BITMAP) && (psurf->flags & HOOK_PAINT))
|
||||||
{
|
{
|
||||||
FillSolid(pso, &(ClipRegion->rclBounds), iColor);
|
/* Call the driver's DrvPaint */
|
||||||
} else {
|
return GDIDEVFUNCS(pso).Paint(pso, pco, pbo, pptlBrushOrg, mix);
|
||||||
|
|
||||||
/* Enumerate all the rectangles and draw them */
|
|
||||||
CLIPOBJ_cEnumStart(ClipRegion, FALSE, CT_RECTANGLES, CD_ANY, 0);
|
|
||||||
|
|
||||||
do {
|
|
||||||
EnumMore = CLIPOBJ_bEnum(ClipRegion, sizeof(RectEnum), (PVOID) &RectEnum);
|
|
||||||
for (i = 0; i < RectEnum.c; i++) {
|
|
||||||
FillSolid(pso, RectEnum.arcl + i, iColor);
|
|
||||||
}
|
|
||||||
} while (EnumMore);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(TRUE);
|
return EngPaint(pso, pco, pbo, pptlBrushOrg, mix);
|
||||||
|
|
||||||
default:
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL APIENTRY
|
|
||||||
EngPaint(IN SURFOBJ *pso,
|
|
||||||
IN CLIPOBJ *ClipRegion,
|
|
||||||
IN BRUSHOBJ *Brush,
|
|
||||||
IN POINTL *BrushOrigin,
|
|
||||||
IN MIX Mix)
|
|
||||||
{
|
|
||||||
BOOLEAN ret;
|
|
||||||
|
|
||||||
// FIXME: We only support a brush's solid color attribute
|
|
||||||
ret = EngPaintRgn(pso, ClipRegion, Brush->iSolidColor, Mix, Brush, BrushOrigin);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL APIENTRY
|
|
||||||
IntEngPaint(IN SURFOBJ *pso,
|
|
||||||
IN CLIPOBJ *ClipRegion,
|
|
||||||
IN BRUSHOBJ *Brush,
|
|
||||||
IN POINTL *BrushOrigin,
|
|
||||||
IN MIX Mix)
|
|
||||||
{
|
|
||||||
SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
|
|
||||||
BOOL ret;
|
|
||||||
|
|
||||||
DPRINT("pso->iType == %u\n", pso->iType);
|
|
||||||
/* Is the surface's Paint function hooked? */
|
|
||||||
if((pso->iType!=STYPE_BITMAP) && (psurf->flags & HOOK_PAINT))
|
|
||||||
{
|
|
||||||
// Call the driver's DrvPaint
|
|
||||||
ret = GDIDEVFUNCS(pso).Paint(
|
|
||||||
pso, ClipRegion, Brush, BrushOrigin, Mix);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return EngPaint(pso, ClipRegion, Brush, BrushOrigin, Mix );
|
|
||||||
|
|
||||||
}
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue