[ros-diffs] [jimtabor] 33460: Fixed wine all of gdi32 dc tests and only 2 of gdiobj tests left todo.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Mon May 12 06:59:21 CEST 2008


Author: jimtabor
Date: Sun May 11 23:59:20 2008
New Revision: 33460

URL: http://svn.reactos.org/svn/reactos?rev=33460&view=rev
Log:
Fixed wine all of gdi32 dc tests and only 2 of gdiobj tests left todo.

Modified:
    trunk/reactos/dll/win32/gdi32/misc/stubs.c
    trunk/reactos/dll/win32/gdi32/objects/dc.c

Modified: trunk/reactos/dll/win32/gdi32/misc/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/misc/stubs.c?rev=33460&r1=33459&r2=33460&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/misc/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/gdi32/misc/stubs.c [iso-8859-1] Sun May 11 23:59:20 2008
@@ -1657,74 +1657,46 @@
  */
 DEVMODEW *
 STDCALL
-GdiConvertToDevmodeW(DEVMODEA *dm)
-{
-    LPDEVMODEW dmw;
-
-    dmw = HEAP_alloc(sizeof(DEVMODEW));
-    #define COPYS(f,len) MultiByteToWideChar ( CP_THREAD_ACP, 0, (LPSTR)dm->f, len, dmw->f, len )
-    #define COPYN(f) dmw->f = dm->f
-    COPYS(dmDeviceName, CCHDEVICENAME );
-    COPYN(dmSpecVersion);
-    COPYN(dmDriverVersion);
-    switch ( dm->dmSize )
+GdiConvertToDevmodeW(DEVMODEA *dmA)
+{
+    DEVMODEW *dmW;
+    WORD dmW_size, dmA_size;
+
+    dmA_size = dmA->dmSize;
+
+    /* this is the minimal dmSize that XP accepts */
+    if (dmA_size < FIELD_OFFSET(DEVMODEA, dmFields))
+        return NULL;
+
+    if (dmA_size > sizeof(DEVMODEA))
+        dmA_size = sizeof(DEVMODEA);
+
+    dmW_size = dmA_size + CCHDEVICENAME;
+    if (dmA_size >= FIELD_OFFSET(DEVMODEA, dmFormName) + CCHFORMNAME)
+        dmW_size += CCHFORMNAME;
+
+    dmW = HeapAlloc(GetProcessHeap(), 0, dmW_size + dmA->dmDriverExtra);
+    if (!dmW) return NULL;
+
+    MultiByteToWideChar(CP_ACP, 0, (const char*) dmA->dmDeviceName, CCHDEVICENAME,
+                                   dmW->dmDeviceName, CCHDEVICENAME);
+    /* copy slightly more, to avoid long computations */
+    memcpy(&dmW->dmSpecVersion, &dmA->dmSpecVersion, dmA_size - CCHDEVICENAME);
+
+    if (dmA_size >= FIELD_OFFSET(DEVMODEA, dmFormName) + CCHFORMNAME)
     {
-        case SIZEOF_DEVMODEA_300:
-            dmw->dmSize = SIZEOF_DEVMODEW_300;
-            break;
-        case SIZEOF_DEVMODEA_400:
-            dmw->dmSize = SIZEOF_DEVMODEW_400;
-            break;
-        case SIZEOF_DEVMODEA_500:
-            default: /* FIXME what to do??? */
-                dmw->dmSize = SIZEOF_DEVMODEW_500;
-            break;
+        MultiByteToWideChar(CP_ACP, 0, (const char*) dmA->dmFormName, CCHFORMNAME,
+                                       dmW->dmFormName, CCHFORMNAME);
+        if (dmA_size > FIELD_OFFSET(DEVMODEA, dmLogPixels))
+            memcpy(&dmW->dmLogPixels, &dmA->dmLogPixels, dmA_size - FIELD_OFFSET(DEVMODEA, dmLogPixels));
     }
-    COPYN(dmDriverExtra);
-    COPYN(dmFields);
-    COPYN(dmPosition.x);
-    COPYN(dmPosition.y);
-    COPYN(dmScale);
-    COPYN(dmCopies);
-    COPYN(dmDefaultSource);
-    COPYN(dmPrintQuality);
-    COPYN(dmColor);
-    COPYN(dmDuplex);
-    COPYN(dmYResolution);
-    COPYN(dmTTOption);
-    COPYN(dmCollate);
-    COPYS(dmFormName,CCHFORMNAME);
-    COPYN(dmLogPixels);
-    COPYN(dmBitsPerPel);
-    COPYN(dmPelsWidth);
-    COPYN(dmPelsHeight);
-    COPYN(dmDisplayFlags); // aka dmNup
-    COPYN(dmDisplayFrequency);
-
-    if ( dm->dmSize <= SIZEOF_DEVMODEA_300 )
-    {
-        return dmw; // we're done with 0x300 fields
-    }
-
-    COPYN(dmICMMethod);
-    COPYN(dmICMIntent);
-    COPYN(dmMediaType);
-    COPYN(dmDitherType);
-    COPYN(dmReserved1);
-    COPYN(dmReserved2);
-
-    if ( dm->dmSize <= SIZEOF_DEVMODEA_400 )
-    {
-        return dmw; // we're done with 0x400 fields
-    }
-
-    COPYN(dmPanningWidth);
-    COPYN(dmPanningHeight);
-
-    return dmw;
-
-    #undef COPYN
-    #undef COPYS
+
+    if (dmA->dmDriverExtra)
+        memcpy((char *)dmW + dmW_size, (const char *)dmA + dmA_size, dmA->dmDriverExtra);
+
+    dmW->dmSize = dmW_size;
+
+    return dmW;
 }
 
 /*

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=33460&r1=33459&r2=33460&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] Sun May 11 23:59:20 2008
@@ -386,6 +386,8 @@
  {
    HGDIOBJ hGO = NULL;
    PDC_ATTR Dc_Attr;
+
+   if (!hDC) return hGO;
 
    if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return NULL;
 



More information about the Ros-diffs mailing list