[USP10_WINETEST] Sync with Wine Staging 4.0. CORE-15682
[reactos.git] / modules / rostests / winetests / usp10 / usp10.c
index f548b57..e907c8c 100644 (file)
 #include <windows.h>
 #include <usp10.h>
 
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
-#endif
-
 typedef struct _itemTest {
     char todo_flag[6];
     int iCharPos;
@@ -3353,7 +3349,7 @@ static void test_ScriptCacheGetHeight(HDC hdc)
 
     height = 123;
     hr = ScriptCacheGetHeight(hdc, NULL, &height);
-    ok(hr == E_INVALIDARG, "Uexpected hr %#x.\n", hr);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
     ok(height == 123, "Unexpected height.\n");
 
     memset(&tm, 0, sizeof(tm));
@@ -3407,26 +3403,76 @@ static void test_ScriptGetGlyphABCWidth(HDC hdc)
 {
     HRESULT hr;
     SCRIPT_CACHE sc = NULL;
-    ABC abc;
+    HFONT hfont, prev_hfont;
+    TEXTMETRICA tm;
+    ABC abc, abc2;
+    LOGFONTA lf;
+    WORD glyph;
+    INT width;
+    DWORD ret;
+
+    glyph = 0;
+    ret = GetGlyphIndicesA(hdc, "a", 1, &glyph, 0);
+    ok(ret == 1, "Failed to get glyph index.\n");
+    ok(glyph != 0, "Unexpected glyph index.\n");
 
-    hr = ScriptGetGlyphABCWidth(NULL, NULL, 'a', NULL);
+    hr = ScriptGetGlyphABCWidth(NULL, NULL, glyph, NULL);
     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
 
-    hr = ScriptGetGlyphABCWidth(NULL, &sc, 'a', NULL);
+    hr = ScriptGetGlyphABCWidth(NULL, &sc, glyph, NULL);
     ok(broken(hr == E_PENDING) ||
        hr == E_INVALIDARG, /* WIN7 */
        "expected E_INVALIDARG, got 0x%08x\n", hr);
 
-    hr = ScriptGetGlyphABCWidth(NULL, &sc, 'a', &abc);
+    hr = ScriptGetGlyphABCWidth(NULL, &sc, glyph, &abc);
     ok(hr == E_PENDING, "expected E_PENDING, got 0x%08x\n", hr);
 
     if (0) {    /* crashes on WinXP */
-    hr = ScriptGetGlyphABCWidth(hdc, &sc, 'a', NULL);
+    hr = ScriptGetGlyphABCWidth(hdc, &sc, glyph, NULL);
     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
     }
 
-    hr = ScriptGetGlyphABCWidth(hdc, &sc, 'a', &abc);
+    hr = ScriptGetGlyphABCWidth(hdc, &sc, glyph, &abc);
     ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
+    ok(abc.abcB != 0, "Unexpected width.\n");
+
+    ret = GetCharABCWidthsI(hdc, glyph, 1, NULL, &abc2);
+    ok(ret, "Failed to get char width.\n");
+    ok(!memcmp(&abc, &abc2, sizeof(abc)), "Unexpected width.\n");
+
+    ScriptFreeCache(&sc);
+
+    /* Bitmap font */
+    memset(&lf, 0, sizeof(lf));
+    strcpy(lf.lfFaceName, "System");
+    lf.lfHeight = 20;
+
+    hfont = CreateFontIndirectA(&lf);
+    prev_hfont = SelectObject(hdc, hfont);
+
+    ret = GetTextMetricsA(hdc, &tm);
+    ok(ret, "Failed to get text metrics.\n");
+    ok(!(tm.tmPitchAndFamily & TMPF_TRUETYPE), "Unexpected TrueType font.\n");
+    ok(tm.tmPitchAndFamily & TMPF_FIXED_PITCH, "Unexpected fixed pitch font.\n");
+
+    glyph = 0;
+    ret = GetGlyphIndicesA(hdc, "i", 1, &glyph, 0);
+    ok(ret == 1, "Failed to get glyph index.\n");
+    ok(glyph != 0, "Unexpected glyph index.\n");
+
+    sc = NULL;
+    hr = ScriptGetGlyphABCWidth(hdc, &sc, glyph, &abc);
+    ok(hr == S_OK, "Failed to get glyph width, hr %#x.\n", hr);
+    ok(abc.abcB != 0, "Unexpected width.\n");
+
+    ret = GetCharWidthI(hdc, glyph, 1, NULL, &width);
+    ok(ret, "Failed to get char width.\n");
+    abc2.abcA = abc2.abcC = 0;
+    abc2.abcB = width;
+    ok(!memcmp(&abc, &abc2, sizeof(abc)), "Unexpected width.\n");
+
+    SelectObject(hdc, prev_hfont);
+    DeleteObject(hfont);
 
     ScriptFreeCache(&sc);
 }