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/in…
==============================================================================
--- 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/in…
==============================================================================
--- 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/in…
==============================================================================
--- 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/ob…
==============================================================================
--- 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;
}