[ros-diffs] [jimtabor] 33490: Added W32PF and Brush flags. Fixed IntGdiExtCreatePen and all related so to pass wine gdi32 pen tests. Fail 100 out of 664 no skips.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Tue May 13 07:13:25 CEST 2008


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.c?rev=33490&r1=33489&r2=33490&view=diff
==============================================================================
--- 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/include/brush.h?rev=33490&r1=33489&r2=33490&view=diff
==============================================================================
--- 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/include/misc.h?rev=33490&r1=33489&r2=33490&view=diff
==============================================================================
--- 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/include/pen.h?rev=33490&r1=33489&r2=33490&view=diff
==============================================================================
--- 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/objects/pen.c?rev=33490&r1=33489&r2=33490&view=diff
==============================================================================
--- 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;
 }
 



More information about the Ros-diffs mailing list