Add the EMF test suite

Dmitry Timoshkov dmitry at baikal.ru
Tue Mar 9 09:04:48 CST 2004


Hello,

this a very old test finally cleaned up and merged from CX Office sources.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Add the EMF test suite.

diff -u cvs/hq/wine/dlls/gdi/tests/.cvsignore wine/dlls/gdi/tests/.cvsignore
--- cvs/hq/wine/dlls/gdi/tests/.cvsignore	Wed Mar 03 02:30:12 2004
+++ wine/dlls/gdi/tests/.cvsignore	Tue Mar 09 14:52:52 2004
@@ -1,3 +1,4 @@
 Makefile
 generated.ok
+metafile.ok
 testlist.c
diff -u cvs/hq/wine/dlls/gdi/tests/Makefile.in wine/dlls/gdi/tests/Makefile.in
--- cvs/hq/wine/dlls/gdi/tests/Makefile.in	Wed Oct 02 20:58:28 2002
+++ wine/dlls/gdi/tests/Makefile.in	Tue Mar 09 14:53:16 2004
@@ -6,7 +6,8 @@
 IMPORTS   = gdi32
 
 CTESTS = \
-	generated.c
+	generated.c \
+	metafile.c
 
 @MAKE_TEST_RULES@
 
diff -u /dev/null wine/dlls/gdi/tests/metafile.c
--- /dev/null	Wed May  6 05:32:27 1998
+++ wine/dlls/gdi/tests/metafile.c	Tue Mar 09 14:50:10 2004
@@ -0,0 +1,196 @@
+/*
+ * Unit tests for metafile functions
+ *
+ * Copyright (c) 2002 Dmitry Timoshkov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <assert.h>
+
+#include "wine/test.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+
+#define STRUCTOFFSET(type,field) ((int)&((type *)0)->field)
+
+static LOGFONTA orig_lf;
+static BOOL emr_processed = FALSE;
+
+static int CALLBACK emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
+    const ENHMETARECORD *emr, int n_objs, LPARAM param)
+{
+    static int n_record;
+    DWORD i;
+    INT *dx, *orig_dx = (INT *)param;
+    LOGFONTA device_lf;
+
+    trace("hdc %p, emr->iType %ld, emr->nSize %ld, param %p\n",
+           hdc, emr->iType, emr->nSize, (void *)param);
+
+    PlayEnhMetaFileRecord(hdc, handle_table, emr, n_objs);
+
+    switch (emr->iType)
+    {
+    case EMR_HEADER:
+        n_record = 0;
+        break;
+
+    case EMR_EXTTEXTOUTA:
+    {
+        EMREXTTEXTOUTA *emr_ExtTextOutA = (EMREXTTEXTOUTA *)emr;
+        dx = (INT *)((char *)emr + emr_ExtTextOutA->emrtext.offDx);
+
+        ok(GetObjectA(GetCurrentObject(hdc, OBJ_FONT), sizeof(device_lf), &device_lf) == sizeof(device_lf),
+           "GetObjectA error %ld\n", GetLastError());
+
+        /* compare up to lfOutPrecision, other values are not interesting,
+         * and in fact sometimes arbitrary adapted by Win9x.
+         */
+        ok(!memcmp(&orig_lf, &device_lf, STRUCTOFFSET(LOGFONTA, lfOutPrecision)), "fonts don't match\n");
+        ok(!lstrcmpA(orig_lf.lfFaceName, device_lf.lfFaceName), "font names don't match\n");
+
+        for(i = 0; i < emr_ExtTextOutA->emrtext.nChars; i++)
+        {
+            ok(orig_dx[i] == dx[i], "pass %d: dx[%ld] (%d) didn't match %d\n",
+                                     n_record, i, dx[i], orig_dx[i]);
+        }
+        n_record++;
+        emr_processed = TRUE;
+        break;
+    }
+
+    case EMR_EXTTEXTOUTW:
+    {
+        EMREXTTEXTOUTW *emr_ExtTextOutW = (EMREXTTEXTOUTW *)emr;
+        dx = (INT *)((char *)emr + emr_ExtTextOutW->emrtext.offDx);
+
+        ok(GetObjectA(GetCurrentObject(hdc, OBJ_FONT), sizeof(device_lf), &device_lf) == sizeof(device_lf),
+           "GetObjectA error %ld\n", GetLastError());
+
+        /* compare up to lfOutPrecision, other values are not interesting,
+         * and in fact sometimes arbitrary adapted by Win9x.
+         */
+        ok(!memcmp(&orig_lf, &device_lf, STRUCTOFFSET(LOGFONTA, lfOutPrecision)), "fonts don't match\n");
+        ok(!lstrcmpA(orig_lf.lfFaceName, device_lf.lfFaceName), "font names don't match\n");
+
+        for(i = 0; i < emr_ExtTextOutW->emrtext.nChars; i++)
+        {
+            ok(orig_dx[i] == dx[i], "pass %d: dx[%ld] (%d) didn't match %d\n",
+                                     n_record, i, dx[i], orig_dx[i]);
+        }
+        n_record++;
+        emr_processed = TRUE;
+        break;
+    }
+
+    default:
+        break;
+    }
+
+    return 1;
+}
+
+static void test_ExtTextOut(void)
+{
+    HWND hwnd;
+    HDC hdcDisplay, hdcMetafile;
+    HENHMETAFILE hMetafile;
+    HFONT hFont;
+    static const char text[] = "Simple text to test ExtTextOut on metafiles";
+    INT i, len, dx[256];
+    static const RECT rc = { 0, 0, 100, 100 };
+
+    assert(sizeof(dx)/sizeof(dx[0]) >= lstrlenA(text));
+
+    /* Win9x doesn't play EMFs on invisible windows */
+    hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP | WS_VISIBLE,
+                           0, 0, 200, 200, 0, 0, 0, NULL);
+    ok(hwnd != 0, "CreateWindowExA error %ld\n", GetLastError());
+
+    hdcDisplay = GetDC(hwnd);
+    ok(hdcDisplay != 0, "GetDC error %ld\n", GetLastError());
+
+    trace("hdcDisplay %p\n", hdcDisplay);
+
+    SetMapMode(hdcDisplay, MM_TEXT);
+
+    memset(&orig_lf, 0, sizeof(orig_lf));
+
+    orig_lf.lfCharSet = ANSI_CHARSET;
+    orig_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+    orig_lf.lfWeight = FW_DONTCARE;
+    orig_lf.lfHeight = 7;
+    orig_lf.lfQuality = DEFAULT_QUALITY;
+    lstrcpyA(orig_lf.lfFaceName, "Arial");
+    hFont = CreateFontIndirectA(&orig_lf);
+    ok(hFont != 0, "CreateFontIndirectA error %ld\n", GetLastError());
+
+    hFont = SelectObject(hdcDisplay, hFont);
+
+    len = lstrlenA(text);
+    for (i = 0; i < len; i++)
+    {
+        ok(GetCharWidthA(hdcDisplay, text[i], text[i], &dx[i]),
+           "GetCharWidthA error %ld\n", GetLastError());
+    }
+    hFont = SelectObject(hdcDisplay, hFont);
+
+    hdcMetafile = CreateEnhMetaFileA(hdcDisplay, NULL, NULL, NULL);
+    ok(hdcMetafile != 0, "CreateEnhMetaFileA error %ld\n", GetLastError());
+
+    trace("hdcMetafile %p\n", hdcMetafile);
+
+    ok(GetDeviceCaps(hdcMetafile, TECHNOLOGY) == DT_RASDISPLAY,
+       "GetDeviceCaps(TECHNOLOGY) has to return DT_RASDISPLAY for a display based EMF\n");
+
+    hFont = SelectObject(hdcMetafile, hFont);
+
+    /* 1. pass NULL lpDx */
+    ok(ExtTextOutA(hdcMetafile, 0, 0, 0, &rc, text, lstrlenA(text), NULL),
+       "ExtTextOutA error %ld\n", GetLastError());
+
+    /* 2. pass custom lpDx */
+    ok(ExtTextOutA(hdcMetafile, 0, 20, 0, &rc, text, lstrlenA(text), dx),
+       "ExtTextOutA error %ld\n", GetLastError());
+
+    hFont = SelectObject(hdcMetafile, hFont);
+    ok(DeleteObject(hFont), "DeleteObject error %ld\n", GetLastError());
+
+    hMetafile = CloseEnhMetaFile(hdcMetafile);
+    ok(hMetafile != 0, "CloseEnhMetaFile error %ld\n", GetLastError());
+
+    ok(!GetObjectType(hdcMetafile), "CloseEnhMetaFile has to destroy metafile hdc\n");
+
+    ok(PlayEnhMetaFile(hdcDisplay, hMetafile, &rc), "PlayEnhMetaFile error %ld\n", GetLastError());
+
+    ok(EnumEnhMetaFile(hdcDisplay, hMetafile, emf_enum_proc, dx, &rc),
+       "EnumEnhMetaFile error %ld\n", GetLastError());
+
+    ok(emr_processed, "EnumEnhMetaFile couldn't find EMR_EXTTEXTOUTA or EMR_EXTTEXTOUTW record\n");
+
+    ok(!EnumEnhMetaFile(hdcDisplay, hMetafile, emf_enum_proc, dx, NULL),
+       "A valid hdc has to require a valid rc\n");
+
+    ok(DeleteEnhMetaFile(hMetafile), "DeleteEnhMetaFile error %ld\n", GetLastError());
+    ok(ReleaseDC(hwnd, hdcDisplay), "ReleaseDC error %ld\n", GetLastError());
+}
+
+START_TEST(metafile)
+{
+    test_ExtTextOut();
+}






More information about the wine-patches mailing list