[PATCH 2/3] d2d1: Store separate bezier vertices.
Henri Verbeet
hverbeet at codeweavers.com
Thu Dec 8 07:31:59 CST 2016
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d2d1/d2d1_private.h | 15 +++++-------
dlls/d2d1/geometry.c | 62 ++++++++++++++++++++++-------------------------
dlls/d2d1/render_target.c | 10 ++++----
3 files changed, 40 insertions(+), 47 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 6704ec5..2e05b80 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -285,16 +285,13 @@ enum d2d_geometry_state
D2D_GEOMETRY_STATE_FIGURE,
};
-struct d2d_bezier
+struct d2d_bezier_vertex
{
+ D2D1_POINT_2F position;
struct
{
- D2D1_POINT_2F position;
- struct
- {
- float u, v, sign;
- } texcoord;
- } v[3];
+ float u, v, sign;
+ } texcoord;
};
struct d2d_face
@@ -320,8 +317,8 @@ struct d2d_geometry
size_t faces_size;
size_t face_count;
- struct d2d_bezier *beziers;
- size_t bezier_count;
+ struct d2d_bezier_vertex *bezier_vertices;
+ size_t bezier_vertex_count;
} fill;
union
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index a04a003..8bdd818 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -118,6 +118,15 @@ struct d2d_fp_fin
size_t length;
};
+static void d2d_bezier_vertex_set(struct d2d_bezier_vertex *b,
+ const D2D1_POINT_2F *p, float u, float v, float sign)
+{
+ b->position = *p;
+ b->texcoord.u = u;
+ b->texcoord.v = v;
+ b->texcoord.sign = sign;
+}
+
static void d2d_fp_two_sum(float *out, float a, float b)
{
float a_virt, a_round, b_virt, b_round;
@@ -1679,7 +1688,7 @@ static BOOL d2d_path_geometry_add_figure(struct d2d_geometry *geometry)
static void d2d_geometry_cleanup(struct d2d_geometry *geometry)
{
- HeapFree(GetProcessHeap(), 0, geometry->fill.beziers);
+ HeapFree(GetProcessHeap(), 0, geometry->fill.bezier_vertices);
HeapFree(GetProcessHeap(), 0, geometry->fill.faces);
HeapFree(GetProcessHeap(), 0, geometry->fill.vertices);
ID2D1Factory_Release(geometry->factory);
@@ -1900,14 +1909,14 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry)
for (i = 0; i < geometry->u.path.figure_count; ++i)
{
- geometry->fill.bezier_count += geometry->u.path.figures[i].bezier_control_count;
+ geometry->fill.bezier_vertex_count += 3 * geometry->u.path.figures[i].bezier_control_count;
}
- if (!(geometry->fill.beziers = HeapAlloc(GetProcessHeap(), 0,
- geometry->fill.bezier_count * sizeof(*geometry->fill.beziers))))
+ if (!(geometry->fill.bezier_vertices = HeapAlloc(GetProcessHeap(), 0,
+ geometry->fill.bezier_vertex_count * sizeof(*geometry->fill.bezier_vertices))))
{
- ERR("Failed to allocate beziers array.\n");
- geometry->fill.bezier_count = 0;
+ ERR("Failed to allocate bezier vertices array.\n");
+ geometry->fill.bezier_vertex_count = 0;
return E_OUTOFMEMORY;
}
@@ -1919,44 +1928,31 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry)
for (j = 0, control_idx = 0; j < figure->vertex_count; ++j)
{
const D2D1_POINT_2F *p0, *p1, *p2;
- struct d2d_bezier *b;
+ struct d2d_bezier_vertex *b;
+ float sign = -1.0f;
if (figure->vertex_types[j] != D2D_VERTEX_TYPE_BEZIER)
continue;
- b = &geometry->fill.beziers[bezier_idx];
+ b = &geometry->fill.bezier_vertices[bezier_idx * 3];
p0 = &figure->vertices[j];
p1 = &figure->bezier_controls[control_idx++];
- if (j == figure->vertex_count - 1)
- p2 = &figure->vertices[0];
- else
- p2 = &figure->vertices[j + 1];
-
- b->v[0].position = *p0;
- b->v[0].texcoord.u = 0.0f;
- b->v[0].texcoord.v = 0.0f;
- b->v[1].position = *p1;
- b->v[1].texcoord.u = 0.5f;
- b->v[1].texcoord.v = 0.0f;
- b->v[2].position = *p2;
- b->v[2].texcoord.u = 1.0f;
- b->v[2].texcoord.v = 1.0f;
if (d2d_path_geometry_point_inside(geometry, p1, FALSE))
{
- b->v[0].texcoord.sign = 1.0f;
- b->v[1].texcoord.sign = 1.0f;
- b->v[2].texcoord.sign = 1.0f;
+ sign = 1.0f;
d2d_figure_insert_vertex(figure, j + 1, *p1);
++j;
}
+
+ if (j == figure->vertex_count - 1)
+ p2 = &figure->vertices[0];
else
- {
- b->v[0].texcoord.sign = -1.0f;
- b->v[1].texcoord.sign = -1.0f;
- b->v[2].texcoord.sign = -1.0f;
- }
+ p2 = &figure->vertices[j + 1];
+ d2d_bezier_vertex_set(&b[0], p0, 0.0f, 0.0f, sign);
+ d2d_bezier_vertex_set(&b[1], p1, 0.5f, 0.0f, sign);
+ d2d_bezier_vertex_set(&b[2], p2, 1.0f, 1.0f, sign);
++bezier_idx;
}
}
@@ -1990,8 +1986,8 @@ static HRESULT STDMETHODCALLTYPE d2d_geometry_sink_Close(ID2D1GeometrySink *ifac
done:
if (FAILED(hr))
{
- HeapFree(GetProcessHeap(), 0, geometry->fill.beziers);
- geometry->fill.bezier_count = 0;
+ HeapFree(GetProcessHeap(), 0, geometry->fill.bezier_vertices);
+ geometry->fill.bezier_vertex_count = 0;
d2d_path_geometry_free_figures(geometry);
geometry->u.path.state = D2D_GEOMETRY_STATE_ERROR;
}
@@ -2685,7 +2681,7 @@ static ULONG STDMETHODCALLTYPE d2d_transformed_geometry_Release(ID2D1Transformed
if (!refcount)
{
- geometry->fill.beziers = NULL;
+ geometry->fill.bezier_vertices = NULL;
geometry->fill.faces = NULL;
geometry->fill.vertices = NULL;
ID2D1Geometry_Release(geometry->u.transformed.src_geometry);
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 40ddecb..74dbfb7 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -717,10 +717,10 @@ static void d2d_rt_fill_geometry(struct d2d_d3d_render_target *render_target,
ID3D10Buffer_Release(ib);
}
- if (geometry->fill.bezier_count)
+ if (geometry->fill.bezier_vertex_count)
{
- buffer_desc.ByteWidth = geometry->fill.bezier_count * sizeof(*geometry->fill.beziers);
- buffer_data.pSysMem = geometry->fill.beziers;
+ buffer_desc.ByteWidth = geometry->fill.bezier_vertex_count * sizeof(*geometry->fill.bezier_vertices);
+ buffer_data.pSysMem = geometry->fill.bezier_vertices;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->device, &buffer_desc, &buffer_data, &vb)))
{
@@ -728,8 +728,8 @@ static void d2d_rt_fill_geometry(struct d2d_d3d_render_target *render_target,
goto done;
}
- d2d_rt_draw(render_target, D2D_SHAPE_TYPE_BEZIER, NULL, 3 * geometry->fill.bezier_count, vb,
- sizeof(*geometry->fill.beziers->v), vs_cb, ps_cb, brush, opacity_brush);
+ d2d_rt_draw(render_target, D2D_SHAPE_TYPE_BEZIER, NULL, geometry->fill.bezier_vertex_count, vb,
+ sizeof(*geometry->fill.bezier_vertices), vs_cb, ps_cb, brush, opacity_brush);
ID3D10Buffer_Release(vb);
}
--
2.1.4
More information about the wine-patches
mailing list