emf: fix for EnumEnhMetaFile with a null hdc

Huw D M Davies h.davies1 at physics.ox.ac.uk
Tue Mar 29 08:18:43 CST 2005


        Huw Davies <huw at codeweavers.com>
        In a call to EnumEnhMetaFile when hdc is NULL, lpRect may be
        NULL.
        Add a test for this.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/gdi/enhmetafile.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/enhmetafile.c,v
retrieving revision 1.10
diff -u -p -r1.10 enhmetafile.c
--- dlls/gdi/enhmetafile.c	23 Mar 2005 13:15:19 -0000	1.10
+++ dlls/gdi/enhmetafile.c	29 Mar 2005 14:16:01 -0000
@@ -2147,7 +2147,7 @@ BOOL WINAPI EnumEnhMetaFile(
     INT mapMode = MM_TEXT;
     COLORREF old_text_color = 0, old_bk_color = 0;
 
-    if(!lpRect)
+    if(!lpRect && hdc)
     {
 	SetLastError(ERROR_INVALID_PARAMETER);
 	return FALSE;
@@ -2228,7 +2228,7 @@ BOOL WINAPI EnumEnhMetaFile(
         CombineTransform(&info->init_transform, &savedXform, &info->init_transform);
     }
 
-    if ( WIDTH(emh->rclFrame) && HEIGHT(emh->rclFrame) )
+    if ( lpRect && WIDTH(emh->rclFrame) && HEIGHT(emh->rclFrame) )
     {
         FLOAT xSrcPixSize, ySrcPixSize, xscale, yscale;
         XFORM xform;
@@ -2256,7 +2256,7 @@ BOOL WINAPI EnumEnhMetaFile(
     }
 
     /* WinNT resets the current vp/win org/ext */
-    if ( !IS_WIN9X() )
+    if ( !IS_WIN9X() && hdc )
     {
         SetMapMode(hdc, MM_TEXT);
         SetWindowOrgEx(hdc, 0, 0, NULL);
Index: dlls/gdi/tests/metafile.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/tests/metafile.c,v
retrieving revision 1.6
diff -u -p -r1.6 metafile.c
--- dlls/gdi/tests/metafile.c	14 Feb 2005 21:04:45 -0000	1.6
+++ dlls/gdi/tests/metafile.c	29 Mar 2005 14:16:01 -0000
@@ -43,6 +43,8 @@ static int CALLBACK emf_enum_proc(HDC hd
     trace("hdc %p, emr->iType %ld, emr->nSize %ld, param %p\n",
            hdc, emr->iType, emr->nSize, (void *)param);
 
+    if(!hdc) return 1;
+
     PlayEnhMetaFileRecord(hdc, handle_table, emr, n_objs);
 
     switch (emr->iType)
@@ -189,6 +191,9 @@ static void test_ExtTextOut(void)
 
     ok(!EnumEnhMetaFile(hdcDisplay, hMetafile, emf_enum_proc, dx, NULL),
        "A valid hdc has to require a valid rc\n");
+
+    ok(EnumEnhMetaFile(NULL, hMetafile, emf_enum_proc, dx, NULL),
+       "A null hdc does not require a valid rc\n");
 
     ret = DeleteEnhMetaFile(hMetafile);
     ok( ret, "DeleteEnhMetaFile error %ld\n", GetLastError());



More information about the wine-patches mailing list