diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-14 21:19:54 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-19 21:14:34 +0100 |
commit | b132fae5e843c329d1414d1a65b2e8d66b99852f (patch) | |
tree | 7df5e21300eefe3abcc30616b22d7f5d3248b4d4 /src/cairo-path-stroke.c | |
parent | f58ade7bace8c82d0ea6740f56d227696181d616 (diff) | |
download | cairo-b132fae5e843c329d1414d1a65b2e8d66b99852f.tar.gz |
clip: Rudimentary support for clip-polygon extraction
Step 1, fix the failings sighted recently by tracking clip-boxes as an
explicit property of the clipping and of composition.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-path-stroke.c')
-rw-r--r-- | src/cairo-path-stroke.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/cairo-path-stroke.c b/src/cairo-path-stroke.c index 6b0df9cc1..31ce1ac06 100644 --- a/src/cairo-path-stroke.c +++ b/src/cairo-path-stroke.c @@ -1402,6 +1402,7 @@ _cairo_path_fixed_stroke_to_traps (const cairo_path_fixed_t *path, status = _cairo_path_fixed_stroke_rectilinear_to_traps (path, stroke_style, ctm, + CAIRO_ANTIALIAS_DEFAULT, traps); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; @@ -1440,6 +1441,7 @@ typedef struct _segment_t { typedef struct _cairo_rectilinear_stroker { const cairo_stroke_style_t *stroke_style; const cairo_matrix_t *ctm; + cairo_antialias_t antialias; cairo_fixed_t half_line_width; cairo_bool_t do_traps; @@ -1478,6 +1480,7 @@ static cairo_bool_t _cairo_rectilinear_stroker_init (cairo_rectilinear_stroker_t *stroker, const cairo_stroke_style_t *stroke_style, const cairo_matrix_t *ctm, + cairo_antialias_t antialias, cairo_bool_t do_traps, void *container) { @@ -1512,6 +1515,7 @@ _cairo_rectilinear_stroker_init (cairo_rectilinear_stroker_t *stroker, stroker->stroke_style = stroke_style; stroker->ctm = ctm; + stroker->antialias = antialias; stroker->half_line_width = _cairo_fixed_from_double (stroke_style->line_width / 2.0); @@ -1687,6 +1691,12 @@ _cairo_rectilinear_stroker_emit_segments (cairo_rectilinear_stroker_t *stroker) } if (stroker->do_traps) { + if (stroker->antialias == CAIRO_ANTIALIAS_NONE) { + a->x = _cairo_fixed_round_down (a->x); + a->y = _cairo_fixed_round_down (a->y); + b->x = _cairo_fixed_round_down (b->x); + b->y = _cairo_fixed_round_down (b->y); + } status = _cairo_traps_tessellate_rectangle (stroker->container, a, b); } else { cairo_box_t box; @@ -1694,7 +1704,7 @@ _cairo_rectilinear_stroker_emit_segments (cairo_rectilinear_stroker_t *stroker) box.p1 = *a; box.p2 = *b; - status = _cairo_boxes_add (stroker->container, &box); + status = _cairo_boxes_add (stroker->container, stroker->antialias, &box); } if (unlikely (status)) return status; @@ -1762,6 +1772,12 @@ _cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *st } if (stroker->do_traps) { + if (stroker->antialias == CAIRO_ANTIALIAS_NONE) { + p1.x = _cairo_fixed_round_down (p1.x); + p1.y = _cairo_fixed_round_down (p1.y); + p2.x = _cairo_fixed_round_down (p2.x); + p2.y = _cairo_fixed_round_down (p2.y); + } status = _cairo_traps_tessellate_rectangle (stroker->container, &p1, &p2); } else { cairo_box_t box; @@ -1769,7 +1785,7 @@ _cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *st box.p1 = p1; box.p2 = p2; - status = _cairo_boxes_add (stroker->container, &box); + status = _cairo_boxes_add (stroker->container, stroker->antialias, &box); } if (unlikely (status)) return status; @@ -1824,6 +1840,12 @@ _cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *st continue; if (stroker->do_traps) { + if (stroker->antialias == CAIRO_ANTIALIAS_NONE) { + a->x = _cairo_fixed_round_down (a->x); + a->y = _cairo_fixed_round_down (a->y); + b->x = _cairo_fixed_round_down (b->x); + b->y = _cairo_fixed_round_down (b->y); + } status = _cairo_traps_tessellate_rectangle (stroker->container, a, b); } else { cairo_box_t box; @@ -1831,7 +1853,7 @@ _cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *st box.p1 = *a; box.p2 = *b; - status = _cairo_boxes_add (stroker->container, &box); + status = _cairo_boxes_add (stroker->container, stroker->antialias, &box); } if (unlikely (status)) return status; @@ -2029,6 +2051,7 @@ cairo_int_status_t _cairo_path_fixed_stroke_rectilinear_to_traps (const cairo_path_fixed_t *path, const cairo_stroke_style_t *stroke_style, const cairo_matrix_t *ctm, + cairo_antialias_t antialias, cairo_traps_t *traps) { cairo_rectilinear_stroker_t rectilinear_stroker; @@ -2037,7 +2060,7 @@ _cairo_path_fixed_stroke_rectilinear_to_traps (const cairo_path_fixed_t *path, assert (_cairo_path_fixed_stroke_is_rectilinear (path)); if (! _cairo_rectilinear_stroker_init (&rectilinear_stroker, - stroke_style, ctm, + stroke_style, ctm, antialias, TRUE, traps)) { return CAIRO_INT_STATUS_UNSUPPORTED; @@ -2082,6 +2105,7 @@ cairo_int_status_t _cairo_path_fixed_stroke_rectilinear_to_boxes (const cairo_path_fixed_t *path, const cairo_stroke_style_t *stroke_style, const cairo_matrix_t *ctm, + cairo_antialias_t antialias, cairo_boxes_t *boxes) { cairo_rectilinear_stroker_t rectilinear_stroker; @@ -2090,7 +2114,7 @@ _cairo_path_fixed_stroke_rectilinear_to_boxes (const cairo_path_fixed_t *path, assert (_cairo_path_fixed_stroke_is_rectilinear (path)); if (! _cairo_rectilinear_stroker_init (&rectilinear_stroker, - stroke_style, ctm, + stroke_style, ctm, antialias, FALSE, boxes)) { return CAIRO_INT_STATUS_UNSUPPORTED; |