diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-11-01 08:37:58 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-11-01 08:37:58 +0000 |
commit | 5844dead01db9ddab7f10a4d685bc5ee874d0eba (patch) | |
tree | a38540517b3b941fd3c5dd3e82ae2184961fec3b | |
parent | 03adea2f50aa10d49ff578389927e7b37e265918 (diff) | |
download | cairo-5844dead01db9ddab7f10a4d685bc5ee874d0eba.tar.gz |
util/show-polygon: Show the limited range of each edge
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | util/show-polygon.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/util/show-polygon.c b/util/show-polygon.c index fc1444dbb..35c0014d1 100644 --- a/util/show-polygon.c +++ b/util/show-polygon.c @@ -55,17 +55,35 @@ static void draw_edges (cairo_t *cr, polygon_t *p, gdouble sf, int dir) { int n; + if (dir < 0) + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + else + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + for (n = 0; n < p->num_edges; n++) { const edge_t *e = &p->edges[n]; + double dx, dy; + double x1, x2; if (e->dir != dir) continue; - cairo_arc (cr, e->p1.x, e->p1.y, 2/sf, 0, 2*M_PI); - cairo_arc (cr, e->p2.x, e->p2.y, 2/sf, 0, 2*M_PI); + dx = e->p2.x - e->p1.x; + dy = e->p2.y - e->p1.y; + + x1 = e->p1.x + (e->top - e->p1.y) / dy * dx; + x2 = e->p1.x + (e->bot - e->p1.y) / dy * dx; + + cairo_arc (cr, x1, e->top, 2/sf, 0, 2*M_PI); + cairo_arc (cr, x2, e->bot, 2/sf, 0, 2*M_PI); cairo_fill (cr); } + if (dir < 0) + cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.5); + else + cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 0.5); + for (n = 0; n < p->num_edges; n++) { const edge_t *e = &p->edges[n]; @@ -80,14 +98,40 @@ static void draw_edges (cairo_t *cr, polygon_t *p, gdouble sf, int dir) cairo_set_line_width (cr, 1.); cairo_stroke (cr); } cairo_restore (cr); + + if (dir < 0) + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + else + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + + for (n = 0; n < p->num_edges; n++) { + const edge_t *e = &p->edges[n]; + double dx, dy; + double x1, x2; + + if (e->dir != dir) + continue; + + dx = e->p2.x - e->p1.x; + dy = e->p2.y - e->p1.y; + + x1 = e->p1.x + (e->top - e->p1.y) / dy * dx; + x2 = e->p1.x + (e->bot - e->p1.y) / dy * dx; + + cairo_move_to (cr, x1, e->top); + cairo_line_to (cr, x2, e->bot); + } + cairo_save (cr); { + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); } static void draw_polygon (cairo_t *cr, polygon_t *p, gdouble sf) { - cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); draw_edges (cr, p, sf, -1); - cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); draw_edges (cr, p, sf, +1); } |