[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 FASTCALL
hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
{ {
int Number, Count, MaxNum, GdiType; int Number, Offset, MaxNum, GdiType;
HANDLE Lock; HANDLE Lock;
HGDIOBJ Handle = NULL; HGDIOBJ Handle = NULL;
@ -289,19 +289,19 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
if (Type == hctBrushHandle) if (Type == hctBrushHandle)
{ {
Count = 0; Offset = 0;
MaxNum = CACHE_BRUSH_ENTRIES; MaxNum = CACHE_BRUSH_ENTRIES;
GdiType = GDILoObjType_LO_BRUSH_TYPE; GdiType = GDILoObjType_LO_BRUSH_TYPE;
} }
else if (Type == hctPenHandle) else if (Type == hctPenHandle)
{ {
Count = CACHE_BRUSH_ENTRIES; Offset = CACHE_BRUSH_ENTRIES;
MaxNum = CACHE_PEN_ENTRIES; MaxNum = CACHE_PEN_ENTRIES;
GdiType = GDILoObjType_LO_PEN_TYPE; GdiType = GDILoObjType_LO_PEN_TYPE;
} }
else if (Type == hctRegionHandle) else if (Type == hctRegionHandle)
{ {
Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
MaxNum = CACHE_REGION_ENTRIES; MaxNum = CACHE_REGION_ENTRIES;
GdiType = GDILoObjType_LO_REGION_TYPE; GdiType = GDILoObjType_LO_REGION_TYPE;
} }
@ -314,7 +314,7 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
{ {
PBRUSH_ATTR pBrush_Attr; PBRUSH_ATTR pBrush_Attr;
HGDIOBJ *hPtr; HGDIOBJ *hPtr;
hPtr = GdiHandleCache->Handle + Count; hPtr = GdiHandleCache->Handle + Offset;
Handle = hPtr[Number - 1]; Handle = hPtr[Number - 1];
if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr)) 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); (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock);
return Handle; return Handle;

View file

@ -107,19 +107,19 @@ GetUpdateRect(
pWnd = ValidateHwnd(Wnd); pWnd = ValidateHwnd(Wnd);
if (!pWnd) if (!pWnd)
return FALSE; return FALSE;
/*
if ( pWnd->hrgnUpdate || if ( pWnd->hrgnUpdate ||
pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED))
{*/ {
return NtUserGetUpdateRect(Wnd, Rect, Erase); return NtUserGetUpdateRect(Wnd, Rect, Erase);
/* } }
if (Rect) if (Rect)
{ // Did the Rgn update? No! Back set and shutup! { // Did the Rgn update? No! Back set and shutup!
Rect->left = Rect->right = Rect->top = Rect->bottom = 0; Rect->left = Rect->right = Rect->top = Rect->bottom = 0;
} }
return FALSE; // msdn: "If there is no update region, the return value is zero." return FALSE; // msdn: "If there is no update region, the return value is zero."
*/
} }
@ -144,14 +144,14 @@ GetUpdateRgn(
pWnd = ValidateHwnd(hWnd); pWnd = ValidateHwnd(hWnd);
if (!pWnd) if (!pWnd)
return ERROR; return ERROR;
/*
if ( pWnd->hrgnUpdate || if ( pWnd->hrgnUpdate ||
pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED))
{*/ {
return NtUserGetUpdateRgn(hWnd, hRgn, bErase); return NtUserGetUpdateRgn(hWnd, hRgn, bErase);
/* } }
SetRectRgn(hRgn, 0, 0, 0, 0); SetRectRgn(hRgn, 0, 0, 0, 0);
return NULLREGION;*/ return NULLREGION;
} }
@ -239,14 +239,14 @@ UpdateWindow(
if (!pWnd) if (!pWnd)
return FALSE; return FALSE;
/*
if ( pWnd->hrgnUpdate || if ( pWnd->hrgnUpdate ||
pWnd->state & WNDS_INTERNALPAINT || pWnd->state & WNDS_INTERNALPAINT ||
pWnd->spwndChild ) pWnd->spwndChild )
{*/ {
return NtUserCallHwndLock(hWnd, HWNDLOCK_ROUTINE_UPDATEWINDOW); return NtUserCallHwndLock(hWnd, HWNDLOCK_ROUTINE_UPDATEWINDOW);
/* } }
return TRUE;*/ return TRUE;
} }
/* /*
@ -286,7 +286,7 @@ GetWindowRgn(
if (!Ret) if (!Ret)
return ERROR; return ERROR;
if (pWnd->fnid != FNID_DESKTOP) if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top); Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
if (pWnd->ExStyle & WS_EX_LAYOUTRTL) if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
@ -320,7 +320,7 @@ GetWindowRgnBox(
if (!Ret) if (!Ret)
return ERROR; return ERROR;
if (pWnd->fnid != FNID_DESKTOP) if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top); OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
if (pWnd->ExStyle & WS_EX_LAYOUTRTL) if (pWnd->ExStyle & WS_EX_LAYOUTRTL)

View file

@ -1248,6 +1248,7 @@ UserScrollDC(
hrgnOwn = hrgnUpdate; hrgnOwn = hrgnUpdate;
if (!NtGdiSetRectRgn(hrgnOwn, rcDst.left, rcDst.top, rcDst.right, rcDst.bottom)) if (!NtGdiSetRectRgn(hrgnOwn, rcDst.left, rcDst.top, rcDst.right, rcDst.bottom))
{ {
DC_UnlockDc(pDC);
return ERROR; return ERROR;
} }
} }

View file

@ -2080,6 +2080,7 @@ REGION_AllocUserRgnWithHandle(INT nRgn)
{ {
Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr); Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr);
Entry->UserData = AllocateObjectAttr(); Entry->UserData = AllocateObjectAttr();
RtlZeroMemory(Entry->UserData, sizeof(RGN_ATTR));
} }
return pRgn; return pRgn;
} }
@ -2090,6 +2091,7 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
{ {
PGDI_TABLE_ENTRY Entry; PGDI_TABLE_ENTRY Entry;
PRGN_ATTR pRgn_Attr; PRGN_ATTR pRgn_Attr;
BOOL Hit = FALSE;
PROSRGNDATA pRgn = NULL; PROSRGNDATA pRgn = NULL;
pRgn = REGION_LockRgn(hRgn); pRgn = REGION_LockRgn(hRgn);
@ -2103,8 +2105,9 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
{ {
_SEH2_TRY _SEH2_TRY
{ {
if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) && if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) )
pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) ) {
if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
{ {
switch (pRgn_Attr->Flags) switch (pRgn_Attr->Flags)
{ {
@ -2123,11 +2126,21 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
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) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
} }
_SEH2_END; _SEH2_END;
if (Hit)
{
REGION_UnlockRgn(pRgn);
return NULL;
}
if (ppRgn_Attr) if (ppRgn_Attr)
*ppRgn_Attr = pRgn_Attr; *ppRgn_Attr = pRgn_Attr;
} }