mirror of
https://github.com/reactos/reactos.git
synced 2025-07-24 16:03:45 +00:00
[GDI32|User32|Win32k]
- Fix ScrollDC ApiTest. svn path=/trunk/; revision=51179
This commit is contained in:
parent
f21acd6f09
commit
4ef3dbc225
4 changed files with 43 additions and 25 deletions
|
@ -275,7 +275,7 @@ HGDIOBJ
|
|||
FASTCALL
|
||||
hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
|
||||
{
|
||||
int Number, Count, MaxNum, GdiType;
|
||||
int Number, Offset, MaxNum, GdiType;
|
||||
HANDLE Lock;
|
||||
HGDIOBJ Handle = NULL;
|
||||
|
||||
|
@ -289,19 +289,19 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
|
|||
|
||||
if (Type == hctBrushHandle)
|
||||
{
|
||||
Count = 0;
|
||||
Offset = 0;
|
||||
MaxNum = CACHE_BRUSH_ENTRIES;
|
||||
GdiType = GDILoObjType_LO_BRUSH_TYPE;
|
||||
}
|
||||
else if (Type == hctPenHandle)
|
||||
{
|
||||
Count = CACHE_BRUSH_ENTRIES;
|
||||
Offset = CACHE_BRUSH_ENTRIES;
|
||||
MaxNum = CACHE_PEN_ENTRIES;
|
||||
GdiType = GDILoObjType_LO_PEN_TYPE;
|
||||
}
|
||||
else if (Type == hctRegionHandle)
|
||||
{
|
||||
Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
|
||||
Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
|
||||
MaxNum = CACHE_REGION_ENTRIES;
|
||||
GdiType = GDILoObjType_LO_REGION_TYPE;
|
||||
}
|
||||
|
@ -314,7 +314,7 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
|
|||
{
|
||||
PBRUSH_ATTR pBrush_Attr;
|
||||
HGDIOBJ *hPtr;
|
||||
hPtr = GdiHandleCache->Handle + Count;
|
||||
hPtr = GdiHandleCache->Handle + Offset;
|
||||
Handle = hPtr[Number - 1];
|
||||
|
||||
if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr))
|
||||
|
@ -335,6 +335,10 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Handle = NULL;
|
||||
}
|
||||
}
|
||||
(void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock);
|
||||
return Handle;
|
||||
|
|
|
@ -107,19 +107,19 @@ GetUpdateRect(
|
|||
pWnd = ValidateHwnd(Wnd);
|
||||
if (!pWnd)
|
||||
return FALSE;
|
||||
/*
|
||||
|
||||
if ( pWnd->hrgnUpdate ||
|
||||
pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED))
|
||||
{*/
|
||||
{
|
||||
return NtUserGetUpdateRect(Wnd, Rect, Erase);
|
||||
/* }
|
||||
}
|
||||
|
||||
if (Rect)
|
||||
{ // Did the Rgn update? No! Back set and shutup!
|
||||
Rect->left = Rect->right = Rect->top = Rect->bottom = 0;
|
||||
}
|
||||
return FALSE; // msdn: "If there is no update region, the return value is zero."
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -144,14 +144,14 @@ GetUpdateRgn(
|
|||
pWnd = ValidateHwnd(hWnd);
|
||||
if (!pWnd)
|
||||
return ERROR;
|
||||
/*
|
||||
|
||||
if ( pWnd->hrgnUpdate ||
|
||||
pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED))
|
||||
{*/
|
||||
{
|
||||
return NtUserGetUpdateRgn(hWnd, hRgn, bErase);
|
||||
/* }
|
||||
}
|
||||
SetRectRgn(hRgn, 0, 0, 0, 0);
|
||||
return NULLREGION;*/
|
||||
return NULLREGION;
|
||||
}
|
||||
|
||||
|
||||
|
@ -239,14 +239,14 @@ UpdateWindow(
|
|||
|
||||
if (!pWnd)
|
||||
return FALSE;
|
||||
/*
|
||||
|
||||
if ( pWnd->hrgnUpdate ||
|
||||
pWnd->state & WNDS_INTERNALPAINT ||
|
||||
pWnd->spwndChild )
|
||||
{*/
|
||||
{
|
||||
return NtUserCallHwndLock(hWnd, HWNDLOCK_ROUTINE_UPDATEWINDOW);
|
||||
/* }
|
||||
return TRUE;*/
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -286,7 +286,7 @@ GetWindowRgn(
|
|||
if (!Ret)
|
||||
return ERROR;
|
||||
|
||||
if (pWnd->fnid != FNID_DESKTOP)
|
||||
if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
|
||||
Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
|
||||
|
||||
if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
|
||||
|
@ -320,7 +320,7 @@ GetWindowRgnBox(
|
|||
if (!Ret)
|
||||
return ERROR;
|
||||
|
||||
if (pWnd->fnid != FNID_DESKTOP)
|
||||
if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
|
||||
OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
|
||||
|
||||
if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
|
||||
|
|
|
@ -1248,6 +1248,7 @@ UserScrollDC(
|
|||
hrgnOwn = hrgnUpdate;
|
||||
if (!NtGdiSetRectRgn(hrgnOwn, rcDst.left, rcDst.top, rcDst.right, rcDst.bottom))
|
||||
{
|
||||
DC_UnlockDc(pDC);
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -1265,8 +1266,8 @@ UserScrollDC(
|
|||
NtGdiOffsetRgn(hrgnTmp, dx, dy);
|
||||
Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF);
|
||||
|
||||
/* DO NOT Unlock DC while messing with prgnVis! */
|
||||
DC_UnlockDc(pDC);
|
||||
/* DO NOT Unlock DC while messing with prgnVis! */
|
||||
DC_UnlockDc(pDC);
|
||||
|
||||
REGION_FreeRgnByHandle(hrgnTmp);
|
||||
|
||||
|
|
|
@ -2080,6 +2080,7 @@ REGION_AllocUserRgnWithHandle(INT nRgn)
|
|||
{
|
||||
Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr);
|
||||
Entry->UserData = AllocateObjectAttr();
|
||||
RtlZeroMemory(Entry->UserData, sizeof(RGN_ATTR));
|
||||
}
|
||||
return pRgn;
|
||||
}
|
||||
|
@ -2090,6 +2091,7 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
|
|||
{
|
||||
PGDI_TABLE_ENTRY Entry;
|
||||
PRGN_ATTR pRgn_Attr;
|
||||
BOOL Hit = FALSE;
|
||||
PROSRGNDATA pRgn = NULL;
|
||||
|
||||
pRgn = REGION_LockRgn(hRgn);
|
||||
|
@ -2103,11 +2105,12 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
|
|||
{
|
||||
_SEH2_TRY
|
||||
{
|
||||
if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) &&
|
||||
pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
|
||||
if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) )
|
||||
{
|
||||
switch (pRgn_Attr->Flags)
|
||||
if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
|
||||
{
|
||||
switch (pRgn_Attr->Flags)
|
||||
{
|
||||
case NULLREGION:
|
||||
EMPTY_REGION( pRgn );
|
||||
break;
|
||||
|
@ -2119,8 +2122,13 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
|
|||
pRgn_Attr->Rect.right,
|
||||
pRgn_Attr->Rect.bottom );
|
||||
break;
|
||||
}
|
||||
pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY;
|
||||
}
|
||||
pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY;
|
||||
}
|
||||
else
|
||||
{ // This object is cached an waiting for it's resurrection by the users.
|
||||
Hit = TRUE;
|
||||
}
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
|
@ -2128,6 +2136,11 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
|
|||
}
|
||||
_SEH2_END;
|
||||
|
||||
if (Hit)
|
||||
{
|
||||
REGION_UnlockRgn(pRgn);
|
||||
return NULL;
|
||||
}
|
||||
if (ppRgn_Attr)
|
||||
*ppRgn_Attr = pRgn_Attr;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue