summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-11-01 08:37:58 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-11-01 08:37:58 +0000
commit5844dead01db9ddab7f10a4d685bc5ee874d0eba (patch)
treea38540517b3b941fd3c5dd3e82ae2184961fec3b
parent03adea2f50aa10d49ff578389927e7b37e265918 (diff)
downloadcairo-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.c52
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);
}