mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 03:23:51 +00:00
- Fix region deleting and ownership for DCEs.
- Fix uninitialized hDC variable in painting code :) svn path=/trunk/; revision=17932
This commit is contained in:
parent
1d878e0ba5
commit
e402efe2c3
5 changed files with 24 additions and 22 deletions
|
@ -112,7 +112,7 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window);
|
||||||
/*************** WINDC.C ***************/
|
/*************** WINDC.C ***************/
|
||||||
|
|
||||||
INT FASTCALL
|
INT FASTCALL
|
||||||
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc);
|
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint);
|
||||||
|
|
||||||
HDC FASTCALL
|
HDC FASTCALL
|
||||||
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);
|
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);
|
||||||
|
|
|
@ -259,11 +259,14 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags)
|
||||||
{
|
{
|
||||||
if (Window->UpdateRegion)
|
if (Window->UpdateRegion)
|
||||||
{
|
{
|
||||||
|
hDC = UserGetDCEx(Window, Window->UpdateRegion,
|
||||||
|
DCX_CACHE | DCX_USESTYLE |
|
||||||
|
DCX_INTERSECTRGN | DCX_KEEPCLIPRGN);
|
||||||
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
|
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
|
||||||
{
|
{
|
||||||
Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBKGND;
|
Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBKGND;
|
||||||
}
|
}
|
||||||
UserReleaseDC(Window, hDC);
|
UserReleaseDC(Window, hDC, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -829,7 +832,7 @@ NtUserEndPaint(HWND hWnd, CONST PAINTSTRUCT* lPs)
|
||||||
RETURN(FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
UserReleaseDC(Window, lPs->hdc);
|
UserReleaseDC(Window, lPs->hdc, TRUE);
|
||||||
|
|
||||||
UserRefObjectCo(Window);
|
UserRefObjectCo(Window);
|
||||||
co_UserShowCaret(Window);
|
co_UserShowCaret(Window);
|
||||||
|
@ -1295,7 +1298,7 @@ NtUserScrollWindowEx(HWND hWnd, INT dx, INT dy, const RECT *UnsafeRect,
|
||||||
if (hDC)
|
if (hDC)
|
||||||
{
|
{
|
||||||
UserScrollDC(hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
|
UserScrollDC(hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
|
||||||
UserReleaseDC(Window, hDC);
|
UserReleaseDC(Window, hDC, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -118,7 +118,7 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
|
||||||
if (NULL == defaultDCstate)
|
if (NULL == defaultDCstate)
|
||||||
{
|
{
|
||||||
defaultDCstate = NtGdiGetDCState(Dce->hDC);
|
defaultDCstate = NtGdiGetDCState(Dce->hDC);
|
||||||
GDIOBJ_SetOwnership(defaultDCstate, NULL);
|
DC_SetOwnership(defaultDCstate, NULL);
|
||||||
}
|
}
|
||||||
GDIOBJ_SetOwnership(Dce->Self, NULL);
|
GDIOBJ_SetOwnership(Dce->Self, NULL);
|
||||||
DC_SetOwnership(Dce->hDC, NULL);
|
DC_SetOwnership(Dce->hDC, NULL);
|
||||||
|
@ -193,7 +193,6 @@ DceDeleteClipRgn(DCE* Dce)
|
||||||
}
|
}
|
||||||
else if (Dce->hClipRgn != NULL)
|
else if (Dce->hClipRgn != NULL)
|
||||||
{
|
{
|
||||||
GDIOBJ_SetOwnership(Dce->hClipRgn, PsGetCurrentProcess());
|
|
||||||
NtGdiDeleteObject(Dce->hClipRgn);
|
NtGdiDeleteObject(Dce->hClipRgn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +203,7 @@ DceDeleteClipRgn(DCE* Dce)
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC INT FASTCALL
|
STATIC INT FASTCALL
|
||||||
DceReleaseDC(DCE* dce)
|
DceReleaseDC(DCE* dce, BOOL EndPaint)
|
||||||
{
|
{
|
||||||
if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY)))
|
if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY)))
|
||||||
{
|
{
|
||||||
|
@ -214,7 +213,7 @@ DceReleaseDC(DCE* dce)
|
||||||
/* restore previous visible region */
|
/* restore previous visible region */
|
||||||
|
|
||||||
if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) &&
|
if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) &&
|
||||||
(dce->DCXFlags & DCX_CACHE) )
|
((dce->DCXFlags & DCX_CACHE) || EndPaint))
|
||||||
{
|
{
|
||||||
DceDeleteClipRgn(dce);
|
DceDeleteClipRgn(dce);
|
||||||
}
|
}
|
||||||
|
@ -463,23 +462,27 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
Dce->hwndCurrent = (Window ? Window->hSelf : NULL);
|
Dce->hwndCurrent = (Window ? Window->hSelf : NULL);
|
||||||
Dce->DCXFlags = DcxFlags | DCX_DCEBUSY;
|
Dce->DCXFlags = Flags | DCX_DCEBUSY;
|
||||||
|
|
||||||
if (0 == (Flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN)) && NULL != ClipRegion)
|
if (0 == (Flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN)) && NULL != ClipRegion)
|
||||||
{
|
{
|
||||||
|
if (Flags & DCX_KEEPCLIPRGN)
|
||||||
NtGdiDeleteObject(ClipRegion);
|
NtGdiDeleteObject(ClipRegion);
|
||||||
ClipRegion = NULL;
|
ClipRegion = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (NULL != Dce->hClipRgn)
|
if (NULL != Dce->hClipRgn)
|
||||||
{
|
{
|
||||||
DceDeleteClipRgn(Dce);
|
DceDeleteClipRgn(Dce);
|
||||||
Dce->hClipRgn = NULL;
|
Dce->hClipRgn = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion)
|
if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion)
|
||||||
{
|
{
|
||||||
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
||||||
|
Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
|
||||||
ClipRegion = Window->UpdateRegion;
|
ClipRegion = Window->UpdateRegion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,18 +491,15 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
|
||||||
if (!(Flags & DCX_WINDOW))
|
if (!(Flags & DCX_WINDOW))
|
||||||
{
|
{
|
||||||
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect);
|
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect);
|
||||||
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect);
|
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect);
|
||||||
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ClipRegion != NULL)
|
else if (ClipRegion != NULL)
|
||||||
{
|
{
|
||||||
Dce->hClipRgn = ClipRegion;
|
Dce->hClipRgn = ClipRegion;
|
||||||
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
|
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
|
||||||
|
@ -583,7 +583,7 @@ IntWindowFromDC(HDC hDc)
|
||||||
|
|
||||||
|
|
||||||
INT FASTCALL
|
INT FASTCALL
|
||||||
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc)
|
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint)
|
||||||
{
|
{
|
||||||
DCE *dce;
|
DCE *dce;
|
||||||
INT nRet = 0;
|
INT nRet = 0;
|
||||||
|
@ -599,7 +599,7 @@ UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc)
|
||||||
|
|
||||||
if (dce && (dce->DCXFlags & DCX_DCEBUSY))
|
if (dce && (dce->DCXFlags & DCX_DCEBUSY))
|
||||||
{
|
{
|
||||||
nRet = DceReleaseDC(dce);
|
nRet = DceReleaseDC(dce, EndPaint);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nRet;
|
return nRet;
|
||||||
|
@ -615,7 +615,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc)
|
||||||
DPRINT("Enter NtUserReleaseDC\n");
|
DPRINT("Enter NtUserReleaseDC\n");
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
RETURN(UserReleaseDC(NULL, hDc));
|
RETURN(UserReleaseDC(NULL, hDc, FALSE));
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
DPRINT("Leave NtUserReleaseDC, ret=%i\n",_ret_);
|
DPRINT("Leave NtUserReleaseDC, ret=%i\n",_ret_);
|
||||||
|
@ -650,7 +650,6 @@ DceFreeDCE(PDCE dce, BOOLEAN Force)
|
||||||
}
|
}
|
||||||
|
|
||||||
NtGdiDeleteDC(dce->hDC);
|
NtGdiDeleteDC(dce->hDC);
|
||||||
GDIOBJ_SetOwnership(dce->hClipRgn, PsGetCurrentProcess());
|
|
||||||
if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN))
|
if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN))
|
||||||
{
|
{
|
||||||
NtGdiDeleteObject(dce->hClipRgn);
|
NtGdiDeleteObject(dce->hClipRgn);
|
||||||
|
@ -703,7 +702,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
|
||||||
* (for 1.0?).
|
* (for 1.0?).
|
||||||
*/
|
*/
|
||||||
DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf);
|
DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf);
|
||||||
DceReleaseDC(pDCE);
|
DceReleaseDC(pDCE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
pDCE->DCXFlags &= DCX_CACHE;
|
pDCE->DCXFlags &= DCX_CACHE;
|
||||||
|
@ -715,12 +714,12 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FASTCALL
|
VOID FASTCALL
|
||||||
DceEmptyCache()
|
DceEmptyCache()
|
||||||
{
|
{
|
||||||
while (FirstDce != NULL)
|
while (FirstDce != NULL)
|
||||||
{
|
{
|
||||||
DceFreeDCE(FirstDce, TRUE);
|
FirstDce = DceFreeDCE(FirstDce, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1189,7 +1189,7 @@ co_WinPosSetWindowPos(
|
||||||
CopyRect.bottom - CopyRect.top, Dc,
|
CopyRect.bottom - CopyRect.top, Dc,
|
||||||
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
|
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
|
||||||
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY);
|
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY);
|
||||||
UserReleaseDC(Window, Dc);
|
UserReleaseDC(Window, Dc, FALSE);
|
||||||
IntValidateParent(Window, CopyRgn);
|
IntValidateParent(Window, CopyRgn);
|
||||||
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
|
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,7 @@ BOOL STDCALL NtGdiAnimatePalette(HPALETTE hPal, UINT StartIndex,
|
||||||
else
|
else
|
||||||
DC_UnlockDc(dc);
|
DC_UnlockDc(dc);
|
||||||
}
|
}
|
||||||
UserReleaseDC(Wnd,hDC);
|
UserReleaseDC(Wnd,hDC, FALSE);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue