diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-05-07 09:32:29 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-06-13 21:34:42 +0100 |
commit | 963ff0b9485dbd4b3d5d1a65f6cdd73b170a6a79 (patch) | |
tree | 257fcf6eb72ea18c4fa0b9858d99c4fcb4e95d1a /src/cairo-pen.c | |
parent | d9b2e8f0045dcde8beafed7fe08728ae15194ffa (diff) | |
download | cairo-963ff0b9485dbd4b3d5d1a65f6cdd73b170a6a79.tar.gz |
[cairo-pen] Embed a small array of vertices into cairo_pen_t.
Eliminate allocation of the vertex array for the common cases.
Diffstat (limited to 'src/cairo-pen.c')
-rw-r--r-- | src/cairo-pen.c | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/src/cairo-pen.c b/src/cairo-pen.c index 37456d99f..4a882d566 100644 --- a/src/cairo-pen.c +++ b/src/cairo-pen.c @@ -45,15 +45,6 @@ _cairo_pen_compute_slopes (cairo_pen_t *pen); static void _cairo_pen_stroke_spline_half (cairo_pen_t *pen, cairo_spline_t *spline, cairo_direction_t dir, cairo_polygon_t *polygon); -void -_cairo_pen_init_empty (cairo_pen_t *pen) -{ - pen->radius = 0; - pen->tolerance = 0; - pen->vertices = NULL; - pen->num_vertices = 0; -} - cairo_status_t _cairo_pen_init (cairo_pen_t *pen, double radius, @@ -78,10 +69,14 @@ _cairo_pen_init (cairo_pen_t *pen, radius, ctm); - pen->vertices = _cairo_malloc_ab (pen->num_vertices, - sizeof (cairo_pen_vertex_t)); - if (pen->vertices == NULL) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); + if (pen->num_vertices > ARRAY_LENGTH (pen->vertices_embedded)) { + pen->vertices = _cairo_malloc_ab (pen->num_vertices, + sizeof (cairo_pen_vertex_t)); + if (pen->vertices == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else { + pen->vertices = pen->vertices_embedded; + } /* * Compute pen coordinates. To generate the right ellipse, compute points around @@ -107,10 +102,11 @@ _cairo_pen_init (cairo_pen_t *pen, void _cairo_pen_fini (cairo_pen_t *pen) { - free (pen->vertices); - pen->vertices = NULL; + if (pen->vertices != pen->vertices_embedded) + free (pen->vertices); - _cairo_pen_init_empty (pen); + pen->vertices = pen->vertices_embedded; + pen->num_vertices = 0; } cairo_status_t @@ -118,13 +114,17 @@ _cairo_pen_init_copy (cairo_pen_t *pen, cairo_pen_t *other) { *pen = *other; + pen->vertices = pen->vertices_embedded; if (pen->num_vertices) { - pen->vertices = _cairo_malloc_ab (pen->num_vertices, - sizeof (cairo_pen_vertex_t)); - if (pen->vertices == NULL) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); + if (pen->num_vertices > ARRAY_LENGTH (pen->vertices_embedded)) { + pen->vertices = _cairo_malloc_ab (pen->num_vertices, + sizeof (cairo_pen_vertex_t)); + if (pen->vertices == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } - memcpy (pen->vertices, other->vertices, pen->num_vertices * sizeof (cairo_pen_vertex_t)); + memcpy (pen->vertices, other->vertices, + pen->num_vertices * sizeof (cairo_pen_vertex_t)); } return CAIRO_STATUS_SUCCESS; @@ -133,18 +133,35 @@ _cairo_pen_init_copy (cairo_pen_t *pen, cairo_pen_t *other) cairo_status_t _cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points) { - cairo_pen_vertex_t *vertices; cairo_status_t status; int num_vertices; int i; num_vertices = pen->num_vertices + num_points; - vertices = _cairo_realloc_ab (pen->vertices, - num_vertices, sizeof (cairo_pen_vertex_t)); - if (vertices == NULL) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); + if (num_vertices > ARRAY_LENGTH (pen->vertices_embedded) || + pen->vertices != pen->vertices_embedded) + { + cairo_pen_vertex_t *vertices; + + if (pen->vertices == pen->vertices_embedded) { + vertices = _cairo_malloc_ab (num_vertices, + sizeof (cairo_pen_vertex_t)); + if (vertices == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (vertices, pen->vertices, + pen->num_vertices * sizeof (cairo_pen_vertex_t)); + } else { + vertices = _cairo_realloc_ab (pen->vertices, + num_vertices, + sizeof (cairo_pen_vertex_t)); + if (vertices == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pen->vertices = vertices; + } - pen->vertices = vertices; pen->num_vertices = num_vertices; /* initialize new vertices */ |