[GDI32|User32|Win32k]

- Fix ScrollDC ApiTest.

svn path=/trunk/; revision=51179
This commit is contained in:
James Tabor 2011-03-28 00:17:21 +00:00
parent f21acd6f09
commit 4ef3dbc225
4 changed files with 43 additions and 25 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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);

View file

@ -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;
}