From 34bb47605692747a889bc652c87d34d1d1e9fc2d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 27 Mar 2011 05:40:30 +0000 Subject: [PATCH] [GDI32] - Finish object attribute support. svn path=/trunk/; revision=51170 --- reactos/dll/win32/gdi32/misc/misc.c | 62 ++++++++++++++++++------- reactos/dll/win32/gdi32/objects/brush.c | 2 + reactos/dll/win32/gdi32/objects/pen.c | 24 +++++++++- 3 files changed, 70 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c index 8fedb8fb820..25ff84253de 100644 --- a/reactos/dll/win32/gdi32/misc/misc.c +++ b/reactos/dll/win32/gdi32/misc/misc.c @@ -275,7 +275,7 @@ HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { - int Number; + int Number, Count, MaxNum, GdiType; HANDLE Lock; HGDIOBJ Handle = NULL; @@ -287,26 +287,54 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) Number = GdiHandleCache->ulNumHandles[Type]; - if ( Number && Number <= CACHE_REGION_ENTRIES ) + if (Type == hctBrushHandle) { - if ( Type == hctRegionHandle) - { - PRGN_ATTR pRgn_Attr; - HGDIOBJ *hPtr; - hPtr = GdiHandleCache->Handle + CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; - Handle = hPtr[Number - 1]; + Count = 0; + MaxNum = CACHE_BRUSH_ENTRIES; + GdiType = GDILoObjType_LO_BRUSH_TYPE; + } + else if (Type == hctPenHandle) + { + 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 (pRgn_Attr->AttrFlags & ATTR_CACHED) + if ( Number && Number <= MaxNum ) + { + 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); - pRgn_Attr->AttrFlags &= ~ATTR_CACHED; - hPtr[Number - 1] = NULL; - GdiHandleCache->ulNumHandles[Type]--; + pBrush_Attr->lbColor = cr ; + pBrush_Attr->AttrFlags |= ATTR_NEW_COLOR; } - } - } + } + } + } } (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); return Handle; diff --git a/reactos/dll/win32/gdi32/objects/brush.c b/reactos/dll/win32/gdi32/objects/brush.c index 185bed6c3fb..e1b7f2951e5 100644 --- a/reactos/dll/win32/gdi32/objects/brush.c +++ b/reactos/dll/win32/gdi32/objects/brush.c @@ -234,6 +234,8 @@ CreateBrushIndirect( break; case BS_SOLID: +/* hBrush = hGetPEBHandle(hctBrushHandle, LogBrush->lbColor); + if (!hBrush)*/ hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0); break; diff --git a/reactos/dll/win32/gdi32/objects/pen.c b/reactos/dll/win32/gdi32/objects/pen.c index 0a431c20049..dbbe0f2de2b 100644 --- a/reactos/dll/win32/gdi32/objects/pen.c +++ b/reactos/dll/win32/gdi32/objects/pen.c @@ -23,12 +23,34 @@ CreatePen( int nWidth, 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_NULL) return GetStockObject(NULL_PEN); 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); }