mirror of
https://github.com/reactos/reactos.git
synced 2024-07-07 21:25:05 +00:00
[Win32k]
- Fixed DCE masks, clipping and added support for mirror and process owned dce. - Reference: http://www.reactos.org/archives/public/ros-dev/2008-July/010498.html http://www.reactos.org/archives/public/ros-dev/2008-July/010499.html svn path=/trunk/; revision=45221
This commit is contained in:
parent
24c017fb93
commit
98006d367a
|
@ -775,6 +775,8 @@ typedef struct _USERCONNECT
|
||||||
//
|
//
|
||||||
#define DCX_USESTYLE 0x00010000
|
#define DCX_USESTYLE 0x00010000
|
||||||
#define DCX_KEEPCLIPRGN 0x00040000
|
#define DCX_KEEPCLIPRGN 0x00040000
|
||||||
|
#define DCX_KEEPLAYOUT 0x40000000
|
||||||
|
#define DCX_PROCESSOWNED 0x80000000
|
||||||
|
|
||||||
//
|
//
|
||||||
// Non SDK Queue message types.
|
// Non SDK Queue message types.
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc);
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
/* NOTE - I think we should store this per window station (including gdi objects) */
|
/* NOTE - I think we should store this per window station (including gdi objects) */
|
||||||
|
@ -22,7 +24,9 @@ static PDCE FirstDce = NULL;
|
||||||
//static INT DCECount = 0; // Count of DCE in system.
|
//static INT DCECount = 0; // Count of DCE in system.
|
||||||
|
|
||||||
#define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \
|
#define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \
|
||||||
DCX_CACHE | DCX_WINDOW | DCX_PARENTCLIP)
|
DCX_NORESETATTRS | DCX_LOCKWINDOWUPDATE | \
|
||||||
|
DCX_LAYEREDWIN | DCX_CACHE | DCX_WINDOW | \
|
||||||
|
DCX_PARENTCLIP)
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
@ -68,7 +72,6 @@ DceGetVisRgn(PWINDOW_OBJECT Window, ULONG Flags, HWND hWndChild, ULONG CFlags)
|
||||||
return VisRgn;
|
return VisRgn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PDCE FASTCALL
|
PDCE FASTCALL
|
||||||
DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
||||||
{
|
{
|
||||||
|
@ -94,7 +97,6 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
||||||
pDce->hrgnClip = NULL;
|
pDce->hrgnClip = NULL;
|
||||||
pDce->hrgnClipPublic = NULL;
|
pDce->hrgnClipPublic = NULL;
|
||||||
pDce->hrgnSavedVis = NULL;
|
pDce->hrgnSavedVis = NULL;
|
||||||
pDce->ptiOwner = NULL;
|
|
||||||
pDce->ppiOwner = NULL;
|
pDce->ppiOwner = NULL;
|
||||||
|
|
||||||
KeEnterCriticalRegion();
|
KeEnterCriticalRegion();
|
||||||
|
@ -112,12 +114,12 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
||||||
if (Type == DCE_WINDOW_DC || Type == DCE_CLASS_DC) //Window DCE have ownership.
|
if (Type == DCE_WINDOW_DC || Type == DCE_CLASS_DC) //Window DCE have ownership.
|
||||||
{
|
{
|
||||||
pDce->ptiOwner = GetW32ThreadInfo();
|
pDce->ptiOwner = GetW32ThreadInfo();
|
||||||
pDce->ppiOwner = pDce->ptiOwner->ppi;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DPRINT("FREE DCATTR!!!! NOT DCE_WINDOW_DC!!!!! hDC-> %x\n", pDce->hDC);
|
DPRINT("FREE DCATTR!!!! NOT DCE_WINDOW_DC!!!!! hDC-> %x\n", pDce->hDC);
|
||||||
IntGdiSetDCOwnerEx( pDce->hDC, GDI_OBJ_HMGR_NONE, FALSE);
|
IntGdiSetDCOwnerEx( pDce->hDC, GDI_OBJ_HMGR_NONE, FALSE);
|
||||||
|
pDce->ptiOwner = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Type == DCE_CACHE_DC)
|
if (Type == DCE_CACHE_DC)
|
||||||
|
@ -140,7 +142,9 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID APIENTRY
|
static VOID APIENTRY
|
||||||
DceSetDrawable(PWINDOW_OBJECT Window OPTIONAL, HDC hDC, ULONG Flags,
|
DceSetDrawable( PWINDOW_OBJECT Window OPTIONAL,
|
||||||
|
HDC hDC,
|
||||||
|
ULONG Flags,
|
||||||
BOOL SetClipOrigin)
|
BOOL SetClipOrigin)
|
||||||
{
|
{
|
||||||
PWND Wnd;
|
PWND Wnd;
|
||||||
|
@ -302,8 +306,7 @@ noparent:
|
||||||
hRgnVisible = IntSysCreateRectRgn(0, 0, 0, 0);
|
hRgnVisible = IntSysCreateRectRgn(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL)
|
||||||
if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL)
|
|
||||||
{
|
{
|
||||||
NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF);
|
NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF);
|
||||||
}
|
}
|
||||||
|
@ -328,10 +331,10 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
PWINDOW_OBJECT Parent;
|
PWINDOW_OBJECT Parent;
|
||||||
ULONG DcxFlags;
|
ULONG DcxFlags;
|
||||||
DCE* Dce = NULL;
|
DCE* Dce = NULL;
|
||||||
BOOL UpdateVisRgn = TRUE;
|
|
||||||
BOOL UpdateClipOrigin = FALSE;
|
BOOL UpdateClipOrigin = FALSE;
|
||||||
PWND Wnd = NULL;
|
PWND Wnd = NULL;
|
||||||
HDC hDC = NULL;
|
HDC hDC = NULL;
|
||||||
|
PPROCESSINFO ppi;
|
||||||
|
|
||||||
if (NULL == Window)
|
if (NULL == Window)
|
||||||
{
|
{
|
||||||
|
@ -382,6 +385,12 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
{
|
{
|
||||||
Flags |= DCX_CLIPCHILDREN;
|
Flags |= DCX_CLIPCHILDREN;
|
||||||
}
|
}
|
||||||
|
/* If minized with icon in the set, we are forced to be cheap! */
|
||||||
|
if (Wnd->style & WS_MINIMIZE &&
|
||||||
|
Wnd->pcls->hIcon)
|
||||||
|
{
|
||||||
|
Flags |= DCX_CACHE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -458,9 +467,6 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
else if (Dce->hwndCurrent == (Window ? Window->hSelf : NULL) &&
|
else if (Dce->hwndCurrent == (Window ? Window->hSelf : NULL) &&
|
||||||
((Dce->DCXFlags & DCX_CACHECOMPAREMASK) == DcxFlags))
|
((Dce->DCXFlags & DCX_CACHECOMPAREMASK) == DcxFlags))
|
||||||
{
|
{
|
||||||
#if 0 /* FIXME */
|
|
||||||
UpdateVisRgn = FALSE;
|
|
||||||
#endif
|
|
||||||
UpdateClipOrigin = TRUE;
|
UpdateClipOrigin = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -485,31 +491,19 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
Dce = FirstDce;
|
Dce = FirstDce;
|
||||||
do
|
do
|
||||||
{ // Check for Window handle than HDC match for CLASS.
|
{ // Check for Window handle than HDC match for CLASS.
|
||||||
if ((Dce->hwndCurrent == Window->hSelf) || (Dce->hDC == hDC)) break;
|
if ((Dce->hwndCurrent == Window->hSelf) ||
|
||||||
|
(Dce->hDC == hDC))
|
||||||
|
break;
|
||||||
Dce = (PDCE)Dce->List.Flink;
|
Dce = (PDCE)Dce->List.Flink;
|
||||||
} while (Dce != FirstDce);
|
} while (Dce != FirstDce);
|
||||||
KeLeaveCriticalRegion();
|
KeLeaveCriticalRegion();
|
||||||
|
|
||||||
DPRINT("DCX:Flags -> %x:%x\n",Dce->DCXFlags & DCX_CACHE, Flags & DCX_CACHE);
|
if ( (Flags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) &&
|
||||||
|
(Dce->DCXFlags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) )
|
||||||
if (Dce->hwndCurrent == Window->hSelf)
|
|
||||||
{
|
{
|
||||||
DPRINT("Owned DCE!\n");
|
DceDeleteClipRgn(Dce);
|
||||||
UpdateVisRgn = FALSE; /* updated automatically, via DCHook() */
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
DPRINT("Owned/Class DCE\n");
|
|
||||||
/* we should free dce->clip_rgn here, but Windows apparently doesn't */
|
|
||||||
Dce->DCXFlags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN);
|
|
||||||
Dce->hrgnClip = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1 /* FIXME */
|
|
||||||
UpdateVisRgn = TRUE;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// First time use hax, need to use DceAllocDCE during window display init.
|
// First time use hax, need to use DceAllocDCE during window display init.
|
||||||
if (NULL == Dce)
|
if (NULL == Dce)
|
||||||
{
|
{
|
||||||
|
@ -523,23 +517,24 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
/* FIXME: Handle error */
|
/* FIXME: Handle error */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(Flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN)) && ClipRegion)
|
|
||||||
{
|
|
||||||
if (!(Flags & DCX_KEEPCLIPRGN))
|
|
||||||
REGION_FreeRgnByHandle(ClipRegion);
|
|
||||||
ClipRegion = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (NULL != Dce->hrgnClip)
|
|
||||||
{
|
|
||||||
DceDeleteClipRgn(Dce);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Dce->DCXFlags = Flags | DCX_DCEBUSY;
|
Dce->DCXFlags = Flags | DCX_DCEBUSY;
|
||||||
|
|
||||||
if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion)
|
/*
|
||||||
|
Bump it up! This prevents the random errors in wine dce tests and with
|
||||||
|
proper bits set in DCX_CACHECOMPAREMASK.
|
||||||
|
Reference:
|
||||||
|
http://www.reactos.org/archives/public/ros-dev/2008-July/010498.html
|
||||||
|
http://www.reactos.org/archives/public/ros-dev/2008-July/010499.html
|
||||||
|
*/
|
||||||
|
if ((Dce != FirstDce))
|
||||||
|
{
|
||||||
|
RemoveEntryList(&Dce->List);
|
||||||
|
InsertHeadList(&FirstDce->List, &Dce->List);
|
||||||
|
FirstDce = Dce;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Introduced in rev 6691 and modified later. */
|
||||||
|
if ( (Flags & DCX_INTERSECTUPDATE) && !ClipRegion )
|
||||||
{
|
{
|
||||||
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
||||||
Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
||||||
|
@ -565,10 +560,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
|
|
||||||
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
|
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
|
||||||
|
|
||||||
// if (UpdateVisRgn)
|
|
||||||
{
|
|
||||||
DceUpdateVisRgn(Dce, Window, Flags);
|
DceUpdateVisRgn(Dce, Window, Flags);
|
||||||
}
|
|
||||||
|
|
||||||
if (Dce->DCXFlags & DCX_CACHE)
|
if (Dce->DCXFlags & DCX_CACHE)
|
||||||
{
|
{
|
||||||
|
@ -576,8 +568,23 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
// Need to set ownership so Sync dcattr will work.
|
// Need to set ownership so Sync dcattr will work.
|
||||||
IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE);
|
IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE);
|
||||||
Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning
|
Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning
|
||||||
Dce->ppiOwner = Dce->ptiOwner->ppi;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( Wnd &&
|
||||||
|
Wnd->ExStyle & WS_EX_LAYOUTRTL &&
|
||||||
|
!(Flags & DCX_KEEPLAYOUT) )
|
||||||
|
{
|
||||||
|
NtGdiSetLayout(Dce->hDC, -1, LAYOUT_RTL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Dce->DCXFlags & DCX_PROCESSOWNED)
|
||||||
|
{
|
||||||
|
ppi = PsGetCurrentProcessWin32Process();
|
||||||
|
ppi->W32PF_flags |= W32PF_OWNDCCLEANUP;
|
||||||
|
Dce->ptiOwner = NULL;
|
||||||
|
Dce->ppiOwner = ppi;
|
||||||
|
}
|
||||||
|
|
||||||
return(Dce->hDC);
|
return(Dce->hDC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -726,7 +733,6 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window)
|
||||||
}
|
}
|
||||||
if (NULL != dc->rosdc.hClipRgn)
|
if (NULL != dc->rosdc.hClipRgn)
|
||||||
{
|
{
|
||||||
int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc);
|
|
||||||
NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY);
|
NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY);
|
||||||
CLIPPING_UpdateGCRegion(dc);
|
CLIPPING_UpdateGCRegion(dc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue