- Finish object attribute support.

svn path=/trunk/; revision=51170
This commit is contained in:
James Tabor 2011-03-27 05:40:30 +00:00
parent 8900f7d5d4
commit 34bb476056
3 changed files with 70 additions and 18 deletions

View file

@ -275,7 +275,7 @@ HGDIOBJ
FASTCALL FASTCALL
hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
{ {
int Number; int Number, Count, MaxNum, GdiType;
HANDLE Lock; HANDLE Lock;
HGDIOBJ Handle = NULL; HGDIOBJ Handle = NULL;
@ -287,26 +287,54 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
Number = GdiHandleCache->ulNumHandles[Type]; Number = GdiHandleCache->ulNumHandles[Type];
if ( Number && Number <= CACHE_REGION_ENTRIES ) if (Type == hctBrushHandle)
{ {
if ( Type == hctRegionHandle) Count = 0;
{ MaxNum = CACHE_BRUSH_ENTRIES;
PRGN_ATTR pRgn_Attr; GdiType = GDILoObjType_LO_BRUSH_TYPE;
HGDIOBJ *hPtr; }
hPtr = GdiHandleCache->Handle + CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; else if (Type == hctPenHandle)
Handle = hPtr[Number - 1]; {
Count = CACHE_BRUSH_ENTRIES;
MaxNum = CACHE_PEN_ENTRIES;
GdiType = GDILoObjType_LO_PEN_TYPE;
}
else if (Type == hctRegionHandle)
{
Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
MaxNum = CACHE_REGION_ENTRIES;
GdiType = GDILoObjType_LO_REGION_TYPE;
}
else // Font is not supported here.
{
return Handle;
}
if (GdiGetHandleUserData( Handle, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr)) if ( Number && Number <= MaxNum )
{ {
if (pRgn_Attr->AttrFlags & ATTR_CACHED) PBRUSH_ATTR pBrush_Attr;
HGDIOBJ *hPtr;
hPtr = GdiHandleCache->Handle + Count;
Handle = hPtr[Number - 1];
if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr))
{
if (pBrush_Attr->AttrFlags & ATTR_CACHED)
{
DPRINT("Get Handle! Type %d Count %d PEB 0x%x\n", Type, GdiHandleCache->ulNumHandles[Type], NtCurrentTeb()->ProcessEnvironmentBlock);
pBrush_Attr->AttrFlags &= ~ATTR_CACHED;
hPtr[Number - 1] = NULL;
GdiHandleCache->ulNumHandles[Type]--;
if ( Type == hctBrushHandle ) // Handle only brush.
{
if ( pBrush_Attr->lbColor != cr )
{ {
DPRINT("Get Handle! Count %d PEB 0x%x\n", GdiHandleCache->ulNumHandles[Type], NtCurrentTeb()->ProcessEnvironmentBlock); pBrush_Attr->lbColor = cr ;
pRgn_Attr->AttrFlags &= ~ATTR_CACHED; pBrush_Attr->AttrFlags |= ATTR_NEW_COLOR;
hPtr[Number - 1] = NULL;
GdiHandleCache->ulNumHandles[Type]--;
} }
} }
} }
}
} }
(void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock);
return Handle; return Handle;

View file

@ -234,6 +234,8 @@ CreateBrushIndirect(
break; break;
case BS_SOLID: case BS_SOLID:
/* hBrush = hGetPEBHandle(hctBrushHandle, LogBrush->lbColor);
if (!hBrush)*/
hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0); hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0);
break; break;

View file

@ -23,12 +23,34 @@ CreatePen(
int nWidth, int nWidth,
COLORREF crColor) COLORREF crColor)
{ {
/* FIXME Some part need be done in user mode */ /* HPEN hPen;
PBRUSH_ATTR Pen_Attr;
*/
if (nPenStyle < PS_SOLID) nPenStyle = PS_SOLID;
if (nPenStyle > PS_DASHDOTDOT) if (nPenStyle > PS_DASHDOTDOT)
{ {
if (nPenStyle == PS_NULL) return GetStockObject(NULL_PEN); if (nPenStyle == PS_NULL) return GetStockObject(NULL_PEN);
if (nPenStyle != PS_INSIDEFRAME) nPenStyle = PS_SOLID; if (nPenStyle != PS_INSIDEFRAME) nPenStyle = PS_SOLID;
} }
#if 0
hPen = hGetPEBHandle(hctPenHandle, nPenStyle);
if ( nWidth || nPenStyle || !hPen )
{
return NtGdiCreatePen(nPenStyle, nWidth, crColor, NULL);
}
if ((GdiGetHandleUserData( hPen, GDI_OBJECT_TYPE_PEN, (PVOID) &Pen_Attr)) &&
( Pen_Attr != NULL ))
{
if ( Pen_Attr->lbColor != crColor)
{
Pen_Attr->lbColor = crColor;
Pen_Attr->AttrFlags |= ATTR_NEW_COLOR;
}
return hPen;
}
DeleteObject(hPen);
#endif
return NtGdiCreatePen(nPenStyle, nWidth, crColor, NULL); return NtGdiCreatePen(nPenStyle, nWidth, crColor, NULL);
} }