summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBertram Felgenhauer <int-e@gmx.de>2005-09-29 17:28:54 +0000
committerBertram Felgenhauer <int-e@gmx.de>2005-09-29 17:28:54 +0000
commit7e5bdaeb62d0dfb2ac622f05a2c6ab9228cb53f6 (patch)
tree5a77baea749cccc0f013a88202238e766d819349
parent9b27a73020354cc40f829dd6f83769979c640a36 (diff)
Using a pointer comparison as the fallback total order was wrong - these pointers are not stable. So we introduce our own total order instead.
reviewed by: cworth
-rw-r--r--ChangeLog9
-rw-r--r--src/cairo-hull.c14
2 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 876ceaa19..2c29c3c1b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-09-30 Bertram Felgenhauer <int-e@gmx.de>
+
+ reviewed by: cworth
+
+ * src/cairo-hull.c (_cairo_hull_create),
+ (_cairo_hull_vertex_compare): Using a pointer comparison as the
+ fallback total order was wrong - these pointers are not stable.
+ So we introduce our own total order instead.
+
2005-09-28 T Rowley <tim.rowley@gmail.com>
* src/cairo-atsui-font.c (_cairo_atsui_font_text_to_glyphs):
diff --git a/src/cairo-hull.c b/src/cairo-hull.c
index 34e0588af..ca5465b75 100644
--- a/src/cairo-hull.c
+++ b/src/cairo-hull.c
@@ -41,6 +41,7 @@ typedef struct cairo_hull
cairo_point_t point;
cairo_slope_t slope;
int discard;
+ int id;
} cairo_hull_t;
static cairo_hull_t *
@@ -70,10 +71,13 @@ _cairo_hull_create (cairo_pen_vertex_t *vertices, int num_vertices)
_cairo_slope_init (&hull[i].slope, &hull[0].point, &hull[i].point);
/* Discard all points coincident with the extremal point */
- if (i != 0 && hull[i].slope.dx == 0 && hull[i].slope.dy == 0)
+ if (i != 0 && hull[i].slope.dx == 0 && hull[i].slope.dy == 0) {
hull[i].discard = 1;
- else
+ hull[i].id = -i;
+ } else {
hull[i].discard = 0;
+ hull[i].id = i;
+ }
}
return hull;
@@ -98,11 +102,11 @@ _cairo_hull_vertex_compare (const void *av, const void *bv)
b_dist = ((cairo_fixed_48_16_t) b->slope.dx * b->slope.dx +
(cairo_fixed_48_16_t) b->slope.dy * b->slope.dy);
/*
- * Use pointer comparison for coincident points to ensure
+ * Use the point's ids to ensure a total ordering.
* a well-defined ordering, and avoid setting discard on
- * both points.
+ * both points.
*/
- if (a_dist < b_dist || (a_dist == b_dist && a < b)) {
+ if (a_dist < b_dist || (a_dist == b_dist && a->id < b->id)) {
a->discard = 1;
ret = -1;
} else {