wok-next annotate cairo-gl/stuff/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch @ rev 18847
midori-video: remove gst-plugins-bad from depends
most used codecs are inside gst-ffmpeg-0.10.13
most used codecs are inside gst-ffmpeg-0.10.13
author | Xander Ziiryanoff <psychomaniak@xakep.ru> |
---|---|
date | Sat Jan 23 11:28:22 2016 +0100 (2016-01-23) |
parents | |
children |
rev | line source |
---|---|
pankso@16204 | 1 From f228769dfe5a8b5d73c49a41e95e31ed73a77fb3 Mon Sep 17 00:00:00 2001 |
pankso@16204 | 2 From: Chris Wilson <chris@chris-wilson.co.uk> |
pankso@16204 | 3 Date: Fri, 08 Jun 2012 16:22:41 +0000 |
pankso@16204 | 4 Subject: polygon-reduce: Reduce broken stopped-edge continuation |
pankso@16204 | 5 |
pankso@16204 | 6 This is hopefully a lesser used path and the attempted optimisation to |
pankso@16204 | 7 continue a stopped edge with a colinear stopped edge highly unlikely and |
pankso@16204 | 8 lost in the noise of the general inefficiency of the routine. As it was |
pankso@16204 | 9 broken, rather than attempt to rectify the "optimisation" remove it. |
pankso@16204 | 10 |
pankso@16204 | 11 Reported-by: Evangelos Foutras <evangelos@foutrelis.com> |
pankso@16204 | 12 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50852 |
pankso@16204 | 13 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> |
pankso@16204 | 14 --- |
pankso@16204 | 15 diff --git a/src/cairo-polygon-reduce.c b/src/cairo-polygon-reduce.c |
pankso@16204 | 16 index 8758070..ea457fe 100644 |
pankso@16204 | 17 --- a/src/cairo-polygon-reduce.c |
pankso@16204 | 18 +++ b/src/cairo-polygon-reduce.c |
pankso@16204 | 19 @@ -42,6 +42,8 @@ |
pankso@16204 | 20 #include "cairo-freelist-private.h" |
pankso@16204 | 21 #include "cairo-combsort-inline.h" |
pankso@16204 | 22 |
pankso@16204 | 23 +#define DEBUG_POLYGON 0 |
pankso@16204 | 24 + |
pankso@16204 | 25 typedef cairo_point_t cairo_bo_point32_t; |
pankso@16204 | 26 |
pankso@16204 | 27 typedef struct _cairo_bo_intersect_ordinate { |
pankso@16204 | 28 @@ -114,7 +116,6 @@ typedef struct _cairo_bo_event_queue { |
pankso@16204 | 29 |
pankso@16204 | 30 typedef struct _cairo_bo_sweep_line { |
pankso@16204 | 31 cairo_bo_edge_t *head; |
pankso@16204 | 32 - cairo_bo_edge_t *stopped; |
pankso@16204 | 33 int32_t current_y; |
pankso@16204 | 34 cairo_bo_edge_t *current_edge; |
pankso@16204 | 35 } cairo_bo_sweep_line_t; |
pankso@16204 | 36 @@ -476,8 +477,8 @@ edges_compare_x_for_y (const cairo_bo_edge_t *a, |
pankso@16204 | 37 static inline int |
pankso@16204 | 38 _line_equal (const cairo_line_t *a, const cairo_line_t *b) |
pankso@16204 | 39 { |
pankso@16204 | 40 - return a->p1.x == b->p1.x && a->p1.y == b->p1.y && |
pankso@16204 | 41 - a->p2.x == b->p2.x && a->p2.y == b->p2.y; |
pankso@16204 | 42 + return (a->p1.x == b->p1.x && a->p1.y == b->p1.y && |
pankso@16204 | 43 + a->p2.x == b->p2.x && a->p2.y == b->p2.y); |
pankso@16204 | 44 } |
pankso@16204 | 45 |
pankso@16204 | 46 static int |
pankso@16204 | 47 @@ -1024,7 +1025,6 @@ static void |
pankso@16204 | 48 _cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line) |
pankso@16204 | 49 { |
pankso@16204 | 50 sweep_line->head = NULL; |
pankso@16204 | 51 - sweep_line->stopped = NULL; |
pankso@16204 | 52 sweep_line->current_y = INT32_MIN; |
pankso@16204 | 53 sweep_line->current_edge = NULL; |
pankso@16204 | 54 } |
pankso@16204 | 55 @@ -1139,6 +1139,8 @@ edges_colinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b) |
pankso@16204 | 56 */ |
pankso@16204 | 57 if (a->edge.line.p1.y == b->edge.line.p1.y) { |
pankso@16204 | 58 return a->edge.line.p1.x == b->edge.line.p1.x; |
pankso@16204 | 59 + } else if (a->edge.line.p2.y == b->edge.line.p2.y) { |
pankso@16204 | 60 + return a->edge.line.p2.x == b->edge.line.p2.x; |
pankso@16204 | 61 } else if (a->edge.line.p1.y < b->edge.line.p1.y) { |
pankso@16204 | 62 return edge_compare_for_y_against_x (b, |
pankso@16204 | 63 a->edge.line.p1.y, |
pankso@16204 | 64 @@ -1205,82 +1207,48 @@ _active_edges_to_polygon (cairo_bo_edge_t *left, |
pankso@16204 | 65 cairo_polygon_t *polygon) |
pankso@16204 | 66 { |
pankso@16204 | 67 cairo_bo_edge_t *right; |
pankso@16204 | 68 + unsigned int mask; |
pankso@16204 | 69 |
pankso@16204 | 70 - if (fill_rule == CAIRO_FILL_RULE_WINDING) { |
pankso@16204 | 71 - while (left != NULL) { |
pankso@16204 | 72 - int in_out = left->edge.dir; |
pankso@16204 | 73 - |
pankso@16204 | 74 - right = left->next; |
pankso@16204 | 75 - if (left->deferred.right == NULL) { |
pankso@16204 | 76 - while (right != NULL && right->deferred.right == NULL) |
pankso@16204 | 77 - right = right->next; |
pankso@16204 | 78 - |
pankso@16204 | 79 - if (right != NULL && edges_colinear (left, right)) { |
pankso@16204 | 80 - /* continuation on left */ |
pankso@16204 | 81 - left->deferred = right->deferred; |
pankso@16204 | 82 - right->deferred.right = NULL; |
pankso@16204 | 83 - } |
pankso@16204 | 84 - } |
pankso@16204 | 85 - |
pankso@16204 | 86 - right = left->next; |
pankso@16204 | 87 - while (right != NULL) { |
pankso@16204 | 88 - if (right->deferred.right != NULL) |
pankso@16204 | 89 - _cairo_bo_edge_end (right, top, polygon); |
pankso@16204 | 90 - |
pankso@16204 | 91 - in_out += right->edge.dir; |
pankso@16204 | 92 - if (in_out == 0) { |
pankso@16204 | 93 - cairo_bo_edge_t *next; |
pankso@16204 | 94 - cairo_bool_t skip = FALSE; |
pankso@16204 | 95 - |
pankso@16204 | 96 - /* skip co-linear edges */ |
pankso@16204 | 97 - next = right->next; |
pankso@16204 | 98 - if (next != NULL) |
pankso@16204 | 99 - skip = edges_colinear (right, next); |
pankso@16204 | 100 + if (fill_rule == CAIRO_FILL_RULE_WINDING) |
pankso@16204 | 101 + mask = ~0; |
pankso@16204 | 102 + else |
pankso@16204 | 103 + mask = 1; |
pankso@16204 | 104 |
pankso@16204 | 105 - if (! skip) |
pankso@16204 | 106 - break; |
pankso@16204 | 107 - } |
pankso@16204 | 108 + while (left != NULL) { |
pankso@16204 | 109 + int in_out = left->edge.dir; |
pankso@16204 | 110 |
pankso@16204 | 111 + right = left->next; |
pankso@16204 | 112 + if (left->deferred.right == NULL) { |
pankso@16204 | 113 + while (right != NULL && right->deferred.right == NULL) |
pankso@16204 | 114 right = right->next; |
pankso@16204 | 115 - } |
pankso@16204 | 116 - |
pankso@16204 | 117 - _cairo_bo_edge_start_or_continue (left, right, top, polygon); |
pankso@16204 | 118 |
pankso@16204 | 119 - left = right; |
pankso@16204 | 120 - if (left != NULL) |
pankso@16204 | 121 - left = left->next; |
pankso@16204 | 122 + if (right != NULL && edges_colinear (left, right)) { |
pankso@16204 | 123 + /* continuation on left */ |
pankso@16204 | 124 + left->deferred = right->deferred; |
pankso@16204 | 125 + right->deferred.right = NULL; |
pankso@16204 | 126 + } |
pankso@16204 | 127 } |
pankso@16204 | 128 - } else { |
pankso@16204 | 129 - while (left != NULL) { |
pankso@16204 | 130 - int in_out = 0; |
pankso@16204 | 131 |
pankso@16204 | 132 - right = left->next; |
pankso@16204 | 133 - while (right != NULL) { |
pankso@16204 | 134 - if (right->deferred.right != NULL) |
pankso@16204 | 135 - _cairo_bo_edge_end (right, top, polygon); |
pankso@16204 | 136 + right = left->next; |
pankso@16204 | 137 + while (right != NULL) { |
pankso@16204 | 138 + if (right->deferred.right != NULL) |
pankso@16204 | 139 + _cairo_bo_edge_end (right, top, polygon); |
pankso@16204 | 140 |
pankso@16204 | 141 - if ((in_out++ & 1) == 0) { |
pankso@16204 | 142 - cairo_bo_edge_t *next; |
pankso@16204 | 143 - cairo_bool_t skip = FALSE; |
pankso@16204 | 144 - |
pankso@16204 | 145 - /* skip co-linear edges */ |
pankso@16204 | 146 - next = right->next; |
pankso@16204 | 147 - if (next != NULL) |
pankso@16204 | 148 - skip = edges_colinear (right, next); |
pankso@16204 | 149 - |
pankso@16204 | 150 - if (! skip) |
pankso@16204 | 151 - break; |
pankso@16204 | 152 - } |
pankso@16204 | 153 - |
pankso@16204 | 154 - right = right->next; |
pankso@16204 | 155 + in_out += right->edge.dir; |
pankso@16204 | 156 + if ((in_out & mask) == 0) { |
pankso@16204 | 157 + /* skip co-linear edges */ |
pankso@16204 | 158 + if (right->next == NULL || !edges_colinear (right, right->next)) |
pankso@16204 | 159 + break; |
pankso@16204 | 160 } |
pankso@16204 | 161 |
pankso@16204 | 162 - _cairo_bo_edge_start_or_continue (left, right, top, polygon); |
pankso@16204 | 163 - |
pankso@16204 | 164 - left = right; |
pankso@16204 | 165 - if (left != NULL) |
pankso@16204 | 166 - left = left->next; |
pankso@16204 | 167 + right = right->next; |
pankso@16204 | 168 } |
pankso@16204 | 169 + |
pankso@16204 | 170 + _cairo_bo_edge_start_or_continue (left, right, top, polygon); |
pankso@16204 | 171 + |
pankso@16204 | 172 + left = right; |
pankso@16204 | 173 + if (left != NULL) |
pankso@16204 | 174 + left = left->next; |
pankso@16204 | 175 } |
pankso@16204 | 176 } |
pankso@16204 | 177 |
pankso@16204 | 178 @@ -1303,12 +1271,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, |
pankso@16204 | 179 |
pankso@16204 | 180 while ((event = _cairo_bo_event_dequeue (&event_queue))) { |
pankso@16204 | 181 if (event->point.y != sweep_line.current_y) { |
pankso@16204 | 182 - for (e1 = sweep_line.stopped; e1; e1 = e1->next) { |
pankso@16204 | 183 - if (e1->deferred.right != NULL) |
pankso@16204 | 184 - _cairo_bo_edge_end (e1, e1->edge.bottom, polygon); |
pankso@16204 | 185 - } |
pankso@16204 | 186 - sweep_line.stopped = NULL; |
pankso@16204 | 187 - |
pankso@16204 | 188 _active_edges_to_polygon (sweep_line.head, |
pankso@16204 | 189 sweep_line.current_y, |
pankso@16204 | 190 fill_rule, polygon); |
pankso@16204 | 191 @@ -1328,23 +1290,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, |
pankso@16204 | 192 if (unlikely (status)) |
pankso@16204 | 193 goto unwind; |
pankso@16204 | 194 |
pankso@16204 | 195 - /* check to see if this is a continuation of a stopped edge */ |
pankso@16204 | 196 - /* XXX change to an infinitesimal lengthening rule */ |
pankso@16204 | 197 - for (left = sweep_line.stopped; left; left = left->next) { |
pankso@16204 | 198 - if (e1->edge.top <= left->edge.bottom && |
pankso@16204 | 199 - edges_colinear (e1, left)) |
pankso@16204 | 200 - { |
pankso@16204 | 201 - e1->deferred = left->deferred; |
pankso@16204 | 202 - if (left->prev != NULL) |
pankso@16204 | 203 - left->prev = left->next; |
pankso@16204 | 204 - else |
pankso@16204 | 205 - sweep_line.stopped = left->next; |
pankso@16204 | 206 - if (left->next != NULL) |
pankso@16204 | 207 - left->next->prev = left->prev; |
pankso@16204 | 208 - break; |
pankso@16204 | 209 - } |
pankso@16204 | 210 - } |
pankso@16204 | 211 - |
pankso@16204 | 212 left = e1->prev; |
pankso@16204 | 213 right = e1->next; |
pankso@16204 | 214 |
pankso@16204 | 215 @@ -1371,14 +1316,8 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, |
pankso@16204 | 216 |
pankso@16204 | 217 _cairo_bo_sweep_line_delete (&sweep_line, e1); |
pankso@16204 | 218 |
pankso@16204 | 219 - /* first, check to see if we have a continuation via a fresh edge */ |
pankso@16204 | 220 - if (e1->deferred.right != NULL) { |
pankso@16204 | 221 - e1->next = sweep_line.stopped; |
pankso@16204 | 222 - if (sweep_line.stopped != NULL) |
pankso@16204 | 223 - sweep_line.stopped->prev = e1; |
pankso@16204 | 224 - sweep_line.stopped = e1; |
pankso@16204 | 225 - e1->prev = NULL; |
pankso@16204 | 226 - } |
pankso@16204 | 227 + if (e1->deferred.right != NULL) |
pankso@16204 | 228 + _cairo_bo_edge_end (e1, e1->edge.bottom, polygon); |
pankso@16204 | 229 |
pankso@16204 | 230 if (left != NULL && right != NULL) { |
pankso@16204 | 231 status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, right); |
pankso@16204 | 232 @@ -1420,10 +1359,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, |
pankso@16204 | 233 } |
pankso@16204 | 234 } |
pankso@16204 | 235 |
pankso@16204 | 236 - for (e1 = sweep_line.stopped; e1; e1 = e1->next) { |
pankso@16204 | 237 - if (e1->deferred.right != NULL) |
pankso@16204 | 238 - _cairo_bo_edge_end (e1, e1->edge.bottom, polygon); |
pankso@16204 | 239 - } |
pankso@16204 | 240 unwind: |
pankso@16204 | 241 _cairo_bo_event_queue_fini (&event_queue); |
pankso@16204 | 242 |
pankso@16204 | 243 @@ -1447,6 +1382,12 @@ _cairo_polygon_reduce (cairo_polygon_t *polygon, |
pankso@16204 | 244 if (unlikely (0 == num_events)) |
pankso@16204 | 245 return CAIRO_STATUS_SUCCESS; |
pankso@16204 | 246 |
pankso@16204 | 247 + if (DEBUG_POLYGON) { |
pankso@16204 | 248 + FILE *file = fopen ("reduce_in.txt", "w"); |
pankso@16204 | 249 + _cairo_debug_print_polygon (file, polygon); |
pankso@16204 | 250 + fclose (file); |
pankso@16204 | 251 + } |
pankso@16204 | 252 + |
pankso@16204 | 253 events = stack_events; |
pankso@16204 | 254 event_ptrs = stack_event_ptrs; |
pankso@16204 | 255 if (num_events > ARRAY_LENGTH (stack_events)) { |
pankso@16204 | 256 @@ -1482,10 +1423,16 @@ _cairo_polygon_reduce (cairo_polygon_t *polygon, |
pankso@16204 | 257 num_events, |
pankso@16204 | 258 fill_rule, |
pankso@16204 | 259 polygon); |
pankso@16204 | 260 - polygon->num_limits = num_limits; |
pankso@16204 | 261 + polygon->num_limits = num_limits; |
pankso@16204 | 262 |
pankso@16204 | 263 if (events != stack_events) |
pankso@16204 | 264 free (events); |
pankso@16204 | 265 |
pankso@16204 | 266 + if (DEBUG_POLYGON) { |
pankso@16204 | 267 + FILE *file = fopen ("reduce_out.txt", "w"); |
pankso@16204 | 268 + _cairo_debug_print_polygon (file, polygon); |
pankso@16204 | 269 + fclose (file); |
pankso@16204 | 270 + } |
pankso@16204 | 271 + |
pankso@16204 | 272 return status; |
pankso@16204 | 273 } |
pankso@16204 | 274 -- |
pankso@16204 | 275 cgit v0.9.0.2-2-gbebe |