Author: jimtabor Date: Tue May 13 00:13:25 2008 New Revision: 33490
URL: http://svn.reactos.org/svn/reactos?rev=33490&view=rev Log: Added W32PF and Brush flags. Fixed IntGdiExtCreatePen and all related so to pass wine gdi32 pen tests. Fail 100 out of 664 no skips.
Modified: trunk/reactos/dll/win32/gdi32/objects/dc.c trunk/reactos/subsystems/win32/win32k/include/brush.h trunk/reactos/subsystems/win32/win32k/include/misc.h trunk/reactos/subsystems/win32/win32k/include/pen.h trunk/reactos/subsystems/win32/win32k/objects/pen.c
Modified: trunk/reactos/dll/win32/gdi32/objects/dc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/dc.... ============================================================================== --- trunk/reactos/dll/win32/gdi32/objects/dc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdi32/objects/dc.c [iso-8859-1] Tue May 13 00:13:25 2008 @@ -1392,7 +1392,7 @@ return NtGdiSelectBrush(hDC, hGdiObj);
case GDI_OBJECT_TYPE_PEN: -// case GDI_OBJECT_TYPE_EXTPEN: + case GDI_OBJECT_TYPE_EXTPEN: #if 0 // enable this when support is ready in win32k hOldObj = pDc_Attr->hpen; pDc_Attr->ulDirty_ |= DC_PEN_DIRTY;
Modified: trunk/reactos/subsystems/win32/win32k/include/brush.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/brush.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/brush.h [iso-8859-1] Tue May 13 00:13:25 2008 @@ -58,7 +58,7 @@ } GDIBRUSHINST, *PGDIBRUSHINST;
/* GDI Brush Attributes */ - +#define GDIBRUSH_NEED_FG_CLR 0x0001 #define GDIBRUSH_NEED_BK_CLR 0x0002 /* Background color is needed */ #define GDIBRUSH_DITHER_OK 0x0004 /* Allow color dithering */ #define GDIBRUSH_IS_SOLID 0x0010 /* Solid brush */ @@ -69,7 +69,12 @@ #define GDIBRUSH_IS_GLOBAL 0x0200 /* Stock objects */ #define GDIBRUSH_IS_PEN 0x0400 /* Pen */ #define GDIBRUSH_IS_OLDSTYLEPEN 0x0800 /* Geometric pen */ +#define GDIBRUSH_IS_DIBPALCOLORS 0x1000 +#define GDIBRUSH_IS_DIBPALINDICE 0x2000 +#define GDIBRUSH_IS_DEFAULTSTYLE 0x4000 #define GDIBRUSH_IS_MASKING 0x8000 /* Pattern bitmap is used as transparent mask (?) */ +#define GDIBRUSH_IS_INSIDEFRAME 0x00010000 +#define GDIBRUSH_CACHED_ENGINE 0x00040000 #define GDIBRUSH_CACHED_IS_SOLID 0x80000000
#define BRUSHOBJ_AllocBrush() ((PGDIBRUSHOBJ) GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE))
Modified: trunk/reactos/subsystems/win32/win32k/include/misc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/misc.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/misc.h [iso-8859-1] Tue May 13 00:13:25 2008 @@ -2,9 +2,34 @@ #define __WIN32K_MISC_H
/* W32PROCESS flags */ -#define W32PF_NOWINDOWGHOSTING (0x0001) -#define W32PF_MANUALGUICHECK (0x0002) -#define W32PF_CREATEDWINORDC (0x0004) +#define W32PF_CONSOLEAPPLICATION 0x00000001 +#define W32PF_FORCEOFFFEEDBACK 0x00000002 +#define W32PF_STARTGLASS 0x00000004 +#define W32PF_WOW 0x00000008 +#define W32PF_READSCREENACCESSGRANTED 0x00000010 +#define W32PF_INITIALIZED 0x00000020 +#define W32PF_APPSTARTING 0x00000040 +#define W32PF_WOW64 0x00000080 +#define W32PF_ALLOWFOREGROUNDACTIVATE 0x00000100 +#define W32PF_OWNDCCLEANUP 0x00000200 +#define W32PF_SHOWSTARTGLASSCALLED 0x00000400 +#define W32PF_FORCEBACKGROUNDPRIORITY 0x00000800 +#define W32PF_TERMINATED 0x00001000 +#define W32PF_CLASSESREGISTERED 0x00002000 +#define W32PF_THREADCONNECTED 0x00004000 +#define W32PF_PROCESSCONNECTED 0x00008000 +#define W32PF_WAKEWOWEXEC 0x00010000 +#define W32PF_WAITFORINPUTIDLE 0x00020000 +#define W32PF_IOWINSTA 0x00040000 +#define W32PF_CONSOLEFOREGROUND 0x00080000 +#define W32PF_OLELOADED 0x00100000 +#define W32PF_SCREENSAVER 0x00200000 +#define W32PF_IDLESCREENSAVER 0x00400000 +// ReactOS +#define W32PF_NOWINDOWGHOSTING (0x01000000) +#define W32PF_MANUALGUICHECK (0x02000000) +#define W32PF_CREATEDWINORDC (0x04000000) +
ULONG FASTCALL IntSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); DWORD STDCALL IntGetQueueStatus(BOOL ClearChanges);
Modified: trunk/reactos/subsystems/win32/win32k/include/pen.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/pen.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/pen.h [iso-8859-1] Tue May 13 00:13:25 2008 @@ -8,16 +8,24 @@
#define PENOBJ_AllocPen() ((HPEN)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) #define PENOBJ_AllocPenWithHandle() ((PGDIBRUSHOBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PEN)) -#define PENOBJ_FreePen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDI_OBJECT_TYPE_PEN) + +#define PENOBJ_FreePen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_BRUSH_TYPE) #define PENOBJ_FreePenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) -#define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) + +//#define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) + #define PENOBJ_AllocExtPen() ((PGDIBRUSHOBJ)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) #define PENOBJ_AllocExtPenWithHandle() ((PGDIBRUSHOBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_EXTPEN)) -#define PENOBJ_FreeExtPen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDI_OBJECT_TYPE_EXTPEN) + +#define PENOBJ_FreeExtPen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_BRUSH_TYPE) #define PENOBJ_FreeExtPenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN) -#define PENOBJ_LockExtPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN)) + +//#define PENOBJ_LockExtPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN)) + #define PENOBJ_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr((POBJ)pPenObj)
+ +PGDIBRUSHOBJ FASTCALL PENOBJ_LockPen(HGDIOBJ); INT STDCALL PEN_GetObject(PGDIBRUSHOBJ hPen, INT Count, PLOGPEN Buffer);
#endif
Modified: trunk/reactos/subsystems/win32/win32k/objects/pen.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/pen.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/pen.c [iso-8859-1] Tue May 13 00:13:25 2008 @@ -26,6 +26,16 @@ #include <debug.h>
/* PRIVATE FUNCTIONS **********************************************************/ + +PGDIBRUSHOBJ +FASTCALL +PENOBJ_LockPen(HGDIOBJ hBMObj) +{ + if (GDI_HANDLE_GET_TYPE(hBMObj) == GDI_OBJECT_TYPE_EXTPEN) + return GDIOBJ_LockObj( hBMObj, GDI_OBJECT_TYPE_EXTPEN); + else + return GDIOBJ_LockObj( hBMObj, GDI_OBJECT_TYPE_PEN); +}
HPEN STDCALL IntGdiExtCreatePen( @@ -37,7 +47,7 @@ IN ULONG_PTR ulHatch, DWORD dwStyleCount, PULONG pStyle, - IN ULONG cjDIB, + IN ULONG cjDIB, // FIXME! We are shipping this too! IN BOOL bOldStylePen, IN OPTIONAL HBRUSH hbrush) { @@ -49,6 +59,8 @@ static const BYTE PatternDashDot[] = {0xFF, 0x81, 0xC0}; static const BYTE PatternDashDotDot[] = {0xFF, 0x8E, 0x38};
+ dwWidth = abs(dwWidth); + if (bOldStylePen) { PenObject = PENOBJ_AllocPenWithHandle(); @@ -65,6 +77,9 @@ return 0; } hPen = PenObject->BaseObject.hHmgr; + + // If nWidth is zero, the pen is a single pixel wide, regardless of the current transformation. + if ((bOldStylePen) && (!dwWidth)) dwWidth = 1;
PenObject->ptPenWidth.x = dwWidth; PenObject->ptPenWidth.y = 0; @@ -78,6 +93,10 @@
PenObject->flAttrs = bOldStylePen? GDIBRUSH_IS_OLDSTYLEPEN : GDIBRUSH_IS_PEN;
+ // If dwPenStyle is PS_COSMETIC, the width must be set to 1. + if ( !(bOldStylePen) && ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) && ( dwWidth != 1) ) + goto EEXIT; + switch (dwPenStyle & PS_STYLE_MASK) { case PS_NULL: @@ -89,6 +108,8 @@ break;
case PS_ALTERNATE: + /* PS_ALTERNATE is applicable only for cosmetic pens */ + if ((dwPenStyle & PS_TYPE_MASK) == PS_GEOMETRIC) goto EEXIT; PenObject->flAttrs |= GDIBRUSH_IS_BITMAP; PenObject->hbmPattern = IntGdiCreateBitmap(24, 1, 1, 1, (LPBYTE)PatternAlternate); break; @@ -115,10 +136,35 @@
case PS_INSIDEFRAME: /* FIXME: does it need some additional work? */ - PenObject->flAttrs |= GDIBRUSH_IS_SOLID; + /* PS_INSIDEFRAME is applicable only for geometric pens */ + if ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) goto EEXIT; + PenObject->flAttrs |= (GDIBRUSH_IS_SOLID|GDIBRUSH_IS_INSIDEFRAME); break;
case PS_USERSTYLE: + if ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) + { + /* FIXME: PS_USERSTYLE workaround */ + DPRINT1("PS_COSMETIC | PS_USERSTYLE not handled\n"); + PenObject->flAttrs |= GDIBRUSH_IS_SOLID; + break; + } + else + { + UINT i; + BOOL has_neg = FALSE, all_zero = TRUE; + + for(i = 0; (i < dwStyleCount) && !has_neg; i++) + { + has_neg = has_neg || (((INT)(pStyle[i])) < 0); + all_zero = all_zero && (pStyle[i] == 0); + } + + if(all_zero || has_neg) + { + goto EEXIT; + } + } /* FIXME: what style here? */ PenObject->flAttrs |= 0; break; @@ -127,8 +173,16 @@ DPRINT1("IntGdiExtCreatePen unknown penstyle %x\n", dwPenStyle); } PENOBJ_UnlockPen(PenObject); - return hPen; + +EEXIT: + SetLastWin32Error(ERROR_INVALID_PARAMETER); + PENOBJ_UnlockPen(PenObject); + if (bOldStylePen) + PENOBJ_FreePenByHandle(hPen); + else + PENOBJ_FreeExtPenByHandle(hPen); + return NULL; }
VOID FASTCALL @@ -201,9 +255,10 @@ COLORREF Color, IN HBRUSH hbr) { - if (PenStyle > PS_INSIDEFRAME) - { - PenStyle = PS_SOLID; + if ( PenStyle < PS_SOLID || PenStyle > PS_INSIDEFRAME ) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return NULL; }
return IntGdiExtCreatePen(PenStyle, @@ -237,8 +292,10 @@ DWORD* pSafeStyle = NULL; HPEN hPen;
+ if (dwStyleCount < 0) return 0; if (dwStyleCount > 16) { + SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; }
@@ -281,12 +338,7 @@ cjDIB, bOldStylePen, hBrush); - - if ((!hPen) && (pSafeStyle)) - { - ExFreePool(pSafeStyle); - } - +// BRUSH_Cleanup takes care of pSafeStyle return hPen; }