summaryrefslogtreecommitdiff
path: root/src/cairo-pen.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-05-07 09:32:29 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2008-06-13 21:34:42 +0100
commit963ff0b9485dbd4b3d5d1a65f6cdd73b170a6a79 (patch)
tree257fcf6eb72ea18c4fa0b9858d99c4fcb4e95d1a /src/cairo-pen.c
parentd9b2e8f0045dcde8beafed7fe08728ae15194ffa (diff)
downloadcairo-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.c71
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 */