[PATCH 05/10] d3dx9/tests: Cleanup test_createtext() a bit.

Matteo Bruni mbruni at codeweavers.com
Wed Mar 14 13:53:20 CDT 2018


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
Inspired by a (~1 year-old) patch by Alex Henrie.

I'm sure there is still a lot of room for improvement here and
elsewhere. Patches welcome :)

 dlls/d3dx9_36/tests/mesh.c | 213 ++++++++++++++-------------------------------
 1 file changed, 67 insertions(+), 146 deletions(-)

diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index 8fd5938fac6..6ebd5b82156 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -3791,7 +3791,21 @@ static HRESULT create_outline(struct glyphinfo *glyph, void *raw_outline, int da
     return S_OK;
 }
 
-static BOOL compute_text_mesh(struct mesh *mesh, const char *text,
+static void free_outline(struct outline *outline)
+{
+    HeapFree(GetProcessHeap(), 0, outline->items);
+}
+
+static void free_glyphinfo(struct glyphinfo *glyph)
+{
+    unsigned int i;
+
+    for (i = 0; i < glyph->outlines.count; ++i)
+        free_outline(&glyph->outlines.items[i]);
+    HeapFree(GetProcessHeap(), 0, glyph->outlines.items);
+}
+
+static void compute_text_mesh(struct mesh *mesh, const char *text,
         float deviation, float extrusion, float otmEMSquare, const struct glyphinfo *glyphs)
 {
     DWORD nb_vertices, nb_faces;
@@ -3824,8 +3838,7 @@ static BOOL compute_text_mesh(struct mesh *mesh, const char *text,
     nb_vertices = (nb_outline_points + nb_corners) * 2 + textlen;
     nb_faces = nb_outline_points * 2;
 
-    if (!new_mesh(mesh, nb_vertices, nb_faces))
-        return FALSE;
+    ok(new_mesh(mesh, nb_vertices, nb_faces), "Failed to create reference text mesh.\n");
 
     /* convert 2D vertices and faces into 3D mesh */
     vertex_ptr = mesh->vertices;
@@ -3934,8 +3947,6 @@ static BOOL compute_text_mesh(struct mesh *mesh, const char *text,
         vertex_ptr->normal.z = 1;
         vertex_ptr++;
     }
-
-    return TRUE;
 }
 
 static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, struct mesh *mesh,
@@ -3955,93 +3966,48 @@ static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, str
     number_of_vertices = d3dxmesh->lpVtbl->GetNumVertices(d3dxmesh);
     number_of_faces = d3dxmesh->lpVtbl->GetNumFaces(d3dxmesh);
 
-    /* vertex buffer */
     hr = d3dxmesh->lpVtbl->GetVertexBuffer(d3dxmesh, &vertex_buffer);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't get vertex buffers\n");
-        goto error;
-    }
-
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
     hr = IDirect3DVertexBuffer9_GetDesc(vertex_buffer, &vertex_buffer_description);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
-
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't get vertex buffer description\n");
-    }
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
+    ok(vertex_buffer_description.Format == D3DFMT_VERTEXDATA, "Test %s, unexpected format %u.\n",
+            name, vertex_buffer_description.Format);
+    ok(vertex_buffer_description.Type == D3DRTYPE_VERTEXBUFFER, "Test %s, unexpected resource type %u.\n",
+            name, vertex_buffer_description.Type);
+    ok(!vertex_buffer_description.Usage, "Test %s, unexpected usage %#x.\n", name, vertex_buffer_description.Usage);
+    ok(vertex_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, unexpected pool %u.\n",
+            name, vertex_buffer_description.Pool);
+    ok(vertex_buffer_description.FVF == mesh->fvf, "Test %s, unexpected FVF %#x (expected %#x).\n",
+            name, vertex_buffer_description.FVF, mesh->fvf);
+    if (!mesh->fvf)
+        expected = number_of_vertices * mesh->vertex_size;
     else
-    {
-        ok(vertex_buffer_description.Format == D3DFMT_VERTEXDATA, "Test %s, result %x, expected %x (D3DFMT_VERTEXDATA)\n",
-           name, vertex_buffer_description.Format, D3DFMT_VERTEXDATA);
-        ok(vertex_buffer_description.Type == D3DRTYPE_VERTEXBUFFER, "Test %s, result %x, expected %x (D3DRTYPE_VERTEXBUFFER)\n",
-           name, vertex_buffer_description.Type, D3DRTYPE_VERTEXBUFFER);
-        ok(vertex_buffer_description.Usage == 0, "Test %s, result %x, expected %x\n", name, vertex_buffer_description.Usage, 0);
-        ok(vertex_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, result %x, expected %x (D3DPOOL_MANAGED)\n",
-           name, vertex_buffer_description.Pool, D3DPOOL_MANAGED);
-        ok(vertex_buffer_description.FVF == mesh->fvf, "Test %s, result %x, expected %x\n",
-           name, vertex_buffer_description.FVF, mesh->fvf);
-        if (mesh->fvf == 0)
-        {
-            expected = number_of_vertices * mesh->vertex_size;
-        }
-        else
-        {
-            expected = number_of_vertices * D3DXGetFVFVertexSize(mesh->fvf);
-        }
-        ok(vertex_buffer_description.Size == expected, "Test %s, result %x, expected %x\n",
-           name, vertex_buffer_description.Size, expected);
-    }
+        expected = number_of_vertices * D3DXGetFVFVertexSize(mesh->fvf);
+    ok(vertex_buffer_description.Size == expected, "Test %s, unexpected size %u (expected %u).\n",
+            name, vertex_buffer_description.Size, expected);
 
     hr = d3dxmesh->lpVtbl->GetIndexBuffer(d3dxmesh, &index_buffer);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't get index buffer\n");
-        goto error;
-    }
-
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
     hr = IDirect3DIndexBuffer9_GetDesc(index_buffer, &index_buffer_description);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
+    ok(index_buffer_description.Format == D3DFMT_INDEX16, "Test %s, unexpected format %u.\n",
+            name, index_buffer_description.Format);
+    ok(index_buffer_description.Type == D3DRTYPE_INDEXBUFFER, "Test %s, unexpected resource type %u.\n",
+            name, index_buffer_description.Type);
+    ok(!index_buffer_description.Usage, "Test %s, unexpected usage %#x.\n",
+            name, index_buffer_description.Usage);
+    ok(index_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, unexpected pool %u.\n",
+            name, index_buffer_description.Pool);
+    expected = number_of_faces * sizeof(WORD) * 3;
+    ok(index_buffer_description.Size == expected, "Test %s, unexpected size %u.\n",
+            name, index_buffer_description.Size);
 
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't get index buffer description\n");
-    }
-    else
-    {
-        ok(index_buffer_description.Format == D3DFMT_INDEX16, "Test %s, result %x, expected %x (D3DFMT_INDEX16)\n",
-           name, index_buffer_description.Format, D3DFMT_INDEX16);
-        ok(index_buffer_description.Type == D3DRTYPE_INDEXBUFFER, "Test %s, result %x, expected %x (D3DRTYPE_INDEXBUFFER)\n",
-           name, index_buffer_description.Type, D3DRTYPE_INDEXBUFFER);
-        ok(index_buffer_description.Usage == 0, "Test %s, result %#x, expected %#x.\n",
-                name, index_buffer_description.Usage, 0);
-        ok(index_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, result %x, expected %x (D3DPOOL_MANAGED)\n",
-           name, index_buffer_description.Pool, D3DPOOL_MANAGED);
-        expected = number_of_faces * sizeof(WORD) * 3;
-        ok(index_buffer_description.Size == expected, "Test %s, result %x, expected %x\n",
-           name, index_buffer_description.Size, expected);
-    }
-
-    /* specify offset and size to avoid potential overruns */
     hr = IDirect3DVertexBuffer9_Lock(vertex_buffer, 0, number_of_vertices * sizeof(D3DXVECTOR3) * 2,
             (void **)&vertices, D3DLOCK_DISCARD);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't lock vertex buffer\n");
-        goto error;
-    }
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
     hr = IDirect3DIndexBuffer9_Lock(index_buffer, 0, number_of_faces * sizeof(WORD) * 3,
             (void **)&faces, D3DLOCK_DISCARD);
-    ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr);
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't lock index buffer\n");
-        goto error;
-    }
-
+    ok(hr == D3D_OK, "Test %s, unexpected hr %#x.\n", name, hr);
     face_idx1 = 0;
     vtx_idx2 = 0;
     face_idx2 = 0;
@@ -4242,66 +4208,49 @@ static void compare_text_outline_mesh(const char *name, ID3DXMesh *d3dxmesh, str
         }
     }
 
-error:
-    if (vertices) IDirect3DVertexBuffer9_Unlock(vertex_buffer);
-    if (faces) IDirect3DIndexBuffer9_Unlock(index_buffer);
-    if (index_buffer) IDirect3DIndexBuffer9_Release(index_buffer);
-    if (vertex_buffer) IDirect3DVertexBuffer9_Release(vertex_buffer);
+    IDirect3DIndexBuffer9_Unlock(index_buffer);
+    IDirect3DVertexBuffer9_Unlock(vertex_buffer);
+    IDirect3DIndexBuffer9_Release(index_buffer);
+    IDirect3DVertexBuffer9_Release(vertex_buffer);
 }
 
 static void test_createtext(IDirect3DDevice9 *device, HDC hdc, const char *text, float deviation, float extrusion)
 {
+    static const MAT2 identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
     HRESULT hr;
     ID3DXMesh *d3dxmesh = NULL;
     struct mesh mesh = {0};
     char name[256];
     OUTLINETEXTMETRICA otm;
     GLYPHMETRICS gm;
-    struct glyphinfo *glyphs = NULL;
+    struct glyphinfo *glyphs;
     GLYPHMETRICSFLOAT *glyphmetrics_float = HeapAlloc(GetProcessHeap(), 0, sizeof(GLYPHMETRICSFLOAT) * strlen(text));
     int i;
     LOGFONTA lf;
     float offset_x;
     size_t textlen;
     HFONT font = NULL, oldfont = NULL;
-    char *raw_outline = NULL;
+    char *raw_outline;
 
     sprintf(name, "text ('%s', %f, %f)", text, deviation, extrusion);
 
     hr = D3DXCreateTextA(device, hdc, text, deviation, extrusion, &d3dxmesh, NULL, glyphmetrics_float);
     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
-    if (hr != D3D_OK)
-    {
-        skip("Couldn't create text with D3DXCreateText\n");
-        goto error;
-    }
 
     /* must select a modified font having lfHeight = otm.otmEMSquare before
      * calling GetGlyphOutline to get the expected values */
-    if (!GetObjectA(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf)
-            || !GetOutlineTextMetricsA(hdc, sizeof(otm), &otm))
-    {
-        skip("Couldn't get text outline\n");
-        goto error;
-    }
+    ok(GetObjectA(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf), "Failed to get current DC font.\n");
+    ok(GetOutlineTextMetricsA(hdc, sizeof(otm), &otm), "Failed to get DC font outline.\n");
     lf.lfHeight = otm.otmEMSquare;
     lf.lfWidth = 0;
-    if (!(font = CreateFontIndirectA(&lf)))
-    {
-        skip("Couldn't create the modified font\n");
-        goto error;
-    }
+    ok(!!(font = CreateFontIndirectA(&lf)), "Failed to create font.\n");
 
     textlen = strlen(text);
     glyphs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, textlen * sizeof(*glyphs));
-    if (!glyphs)
-        goto error;
-
     oldfont = SelectObject(hdc, font);
 
     for (i = 0; i < textlen; i++)
     {
-        const MAT2 identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
         GetGlyphOutlineA(hdc, text[i], GGO_NATIVE, &gm, 0, NULL, &identity);
         compare_float(glyphmetrics_float[i].gmfBlackBoxX, gm.gmBlackBoxX / (float)otm.otmEMSquare);
         compare_float(glyphmetrics_float[i].gmfBlackBoxY, gm.gmBlackBoxY / (float)otm.otmEMSquare);
@@ -4317,64 +4266,36 @@ static void test_createtext(IDirect3DDevice9 *device, HDC hdc, const char *text,
     offset_x = 0.0f;
     for (i = 0; i < textlen; i++)
     {
-        /* get outline points from data returned from GetGlyphOutline */
-        const MAT2 identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
-        int datasize;
+        DWORD datasize;
 
         glyphs[i].offset_x = offset_x;
 
         datasize = GetGlyphOutlineA(hdc, text[i], GGO_NATIVE, &gm, 0, NULL, &identity);
-        if (datasize < 0)
-        {
-            SelectObject(hdc, oldfont);
-            goto error;
-        }
-        HeapFree(GetProcessHeap(), 0, raw_outline);
+        ok(datasize != GDI_ERROR, "Failed to retrieve GDI glyph outline size.\n");
         raw_outline = HeapAlloc(GetProcessHeap(), 0, datasize);
-        if (!raw_outline)
-        {
-            SelectObject(hdc, oldfont);
-            goto error;
-        }
         datasize = GetGlyphOutlineA(hdc, text[i], GGO_NATIVE, &gm, datasize, raw_outline, &identity);
-
+        ok(datasize != GDI_ERROR, "Failed to retrieve GDI glyph outline.\n");
         create_outline(&glyphs[i], raw_outline, datasize, deviation, otm.otmEMSquare);
+        HeapFree(GetProcessHeap(), 0, raw_outline);
 
         offset_x += gm.gmCellIncX / (float)otm.otmEMSquare;
     }
 
     SelectObject(hdc, oldfont);
 
-    ZeroMemory(&mesh, sizeof(mesh));
-    if (!compute_text_mesh(&mesh, text, deviation, extrusion, otm.otmEMSquare, glyphs))
-    {
-        skip("Couldn't create mesh\n");
-        d3dxmesh->lpVtbl->Release(d3dxmesh);
-        return;
-    }
+    compute_text_mesh(&mesh, text, deviation, extrusion, otm.otmEMSquare, glyphs);
     mesh.fvf = D3DFVF_XYZ | D3DFVF_NORMAL;
 
     compare_text_outline_mesh(name, d3dxmesh, &mesh, textlen, extrusion, glyphs);
 
-error:
     free_mesh(&mesh);
-
-    if (d3dxmesh) d3dxmesh->lpVtbl->Release(d3dxmesh);
-    if (font) DeleteObject(font);
+    d3dxmesh->lpVtbl->Release(d3dxmesh);
+    DeleteObject(font);
     HeapFree(GetProcessHeap(), 0, glyphmetrics_float);
 
-    if (glyphs)
-    {
-        for (i = 0; i < textlen; i++)
-        {
-            int j;
-            for (j = 0; j < glyphs[i].outlines.count; j++)
-                HeapFree(GetProcessHeap(), 0, glyphs[i].outlines.items[j].items);
-            HeapFree(GetProcessHeap(), 0, glyphs[i].outlines.items);
-        }
-        HeapFree(GetProcessHeap(), 0, glyphs);
-    }
-    HeapFree(GetProcessHeap(), 0, raw_outline);
+    for (i = 0; i < textlen; i++)
+        free_glyphinfo(&glyphs[i]);
+    HeapFree(GetProcessHeap(), 0, glyphs);
 }
 
 static void D3DXCreateTextTest(void)
-- 
2.13.6




More information about the wine-devel mailing list