summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-09-30 15:58:14 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-09-30 15:58:14 +0100
commit538fa0d6fbfe5f03b325e2dfb296538295f3b409 (patch)
treebf026f434a73e9aab71fc8b133e82755a0b45ae3
parent719bef0c90b73850e373c70d627fa1f730be84a1 (diff)
downloadcairo-538fa0d6fbfe5f03b325e2dfb296538295f3b409.tar.gz
fill: Fix unantialiased rectilinear-fill-to-boxes
We were calling the antialias close function from the unantialiased paths - a function that operates on a completely different structure to the one passed in. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/cairo-clip-boxes.c6
-rw-r--r--src/cairo-image-compositor.c2
-rw-r--r--src/cairo-path-fill.c16
-rw-r--r--src/cairo-traps-compositor.c16
-rw-r--r--util/cairo-script/csi-exec.c20
5 files changed, 44 insertions, 16 deletions
diff --git a/src/cairo-clip-boxes.c b/src/cairo-clip-boxes.c
index 3b8265b9c..16f5f7fc2 100644
--- a/src/cairo-clip-boxes.c
+++ b/src/cairo-clip-boxes.c
@@ -142,7 +142,7 @@ _cairo_clip_intersect_rectilinear_path (cairo_clip_t *clip,
fill_rule,
antialias,
&boxes);
- if (likely (status == CAIRO_STATUS_SUCCESS))
+ if (likely (status == CAIRO_STATUS_SUCCESS && boxes.num_boxes))
clip = _cairo_clip_intersect_boxes (clip, &boxes);
else
clip = _cairo_clip_set_all_clipped (clip);
@@ -297,7 +297,9 @@ _cairo_clip_intersect_boxes (cairo_clip_t *clip,
boxes = &clip_boxes;
}
- if (boxes->num_boxes == 1) {
+ if (boxes->num_boxes == 0) {
+ return _cairo_clip_set_all_clipped (clip);
+ } else if (boxes->num_boxes == 1) {
clip->boxes = &clip->embedded_box;
clip->boxes[0] = boxes->chunks.base[0];
clip->num_boxes = 1;
diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c
index 5c112576e..d299c9f8f 100644
--- a/src/cairo-image-compositor.c
+++ b/src/cairo-image-compositor.c
@@ -1079,7 +1079,7 @@ _cairo_image_bounded_spans (void *abstract_renderer,
pixman_image_compositor_blt (r->compositor,
spans[0].x, y,
spans[1].x - spans[0].x, height,
- r->opacity * spans[0].coverage);
+ r->opacity * spans[0].coverage);
}
spans++;
} while (--num_spans > 1);
diff --git a/src/cairo-path-fill.c b/src/cairo-path-fill.c
index 83393070b..4000c9c58 100644
--- a/src/cairo-path-fill.c
+++ b/src/cairo-path-fill.c
@@ -53,7 +53,6 @@ typedef struct cairo_filler {
cairo_point_t last_move_to;
} cairo_filler_t;
-
static cairo_status_t
_cairo_filler_line_to (void *closure,
const cairo_point_t *point)
@@ -185,15 +184,22 @@ _cairo_filler_ra_line_to (void *closure,
}
static cairo_status_t
+_cairo_filler_ra_close (void *closure)
+{
+ cairo_filler_ra_t *filler = closure;
+ return _cairo_filler_ra_line_to (closure, &filler->last_move_to);
+}
+
+static cairo_status_t
_cairo_filler_ra_move_to (void *closure,
const cairo_point_t *point)
{
- cairo_filler_t *filler = closure;
+ cairo_filler_ra_t *filler = closure;
cairo_status_t status;
cairo_point_t p;
/* close current subpath */
- status = _cairo_filler_close (closure);
+ status = _cairo_filler_ra_close (closure);
if (unlikely (status))
return status;
@@ -228,13 +234,13 @@ _cairo_path_fixed_fill_rectilinear_to_polygon (const cairo_path_fixed_t *path,
status = _cairo_path_fixed_interpret_flat (path,
_cairo_filler_ra_move_to,
_cairo_filler_ra_line_to,
- _cairo_filler_close,
+ _cairo_filler_ra_close,
&filler,
0.);
if (unlikely (status))
return status;
- return _cairo_filler_close (&filler);
+ return _cairo_filler_ra_close (&filler);
}
cairo_status_t
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c
index 012719a54..0df3b7840 100644
--- a/src/cairo-traps-compositor.c
+++ b/src/cairo-traps-compositor.c
@@ -327,8 +327,10 @@ out:
return surface;
error:
- cairo_surface_destroy (surface);
- surface = _cairo_surface_create_in_error (status);
+ if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) {
+ cairo_surface_destroy (surface);
+ surface = _cairo_surface_create_in_error (status);
+ }
compositor->release (surface);
return surface;
}
@@ -355,6 +357,9 @@ clip_and_composite_with_mask (const cairo_traps_compositor_t *compositor,
if (unlikely (mask->status))
return mask->status;
+ if (mask->is_clear)
+ goto skip;
+
if (src != NULL || dst->content != CAIRO_CONTENT_ALPHA) {
compositor->composite (dst, op, src, mask,
extents->bounded.x + src_x,
@@ -369,8 +374,9 @@ clip_and_composite_with_mask (const cairo_traps_compositor_t *compositor,
extents->bounded.x, extents->bounded.y,
extents->bounded.width, extents->bounded.height);
}
- cairo_surface_destroy (mask);
+skip:
+ cairo_surface_destroy (mask);
return CAIRO_STATUS_SUCCESS;
}
@@ -468,6 +474,9 @@ clip_and_composite_source (const cairo_traps_compositor_t *compositor,
if (unlikely (mask->status))
return mask->status;
+ if (mask->is_clear)
+ goto skip;
+
if (dst->is_clear) {
compositor->composite (dst, CAIRO_OPERATOR_SOURCE, src, mask,
extents->bounded.x + src_x, extents->bounded.y + src_y,
@@ -482,6 +491,7 @@ clip_and_composite_source (const cairo_traps_compositor_t *compositor,
extents->bounded.width, extents->bounded.height);
}
+skip:
cairo_surface_destroy (mask);
return CAIRO_STATUS_SUCCESS;
diff --git a/util/cairo-script/csi-exec.c b/util/cairo-script/csi-exec.c
index 23e9c3659..d30b1c9c8 100644
--- a/util/cairo-script/csi-exec.c
+++ b/util/cairo-script/csi-exec.c
@@ -20,12 +20,22 @@ main (int argc, char **argv)
.surface_create = _surface_create
};
cairo_script_interpreter_t *csi;
- int status;
int i;
- csi = cairo_script_interpreter_create ();
- cairo_script_interpreter_install_hooks (csi, &hooks);
- for (i = 1; i < argc; i++)
+ for (i = 1; i < argc; i++) {
+ int status, line;
+
+ csi = cairo_script_interpreter_create ();
+ cairo_script_interpreter_install_hooks (csi, &hooks);
cairo_script_interpreter_run (csi, argv[i]);
- return cairo_script_interpreter_destroy (csi);
+ line = cairo_script_interpreter_get_line_number (csi);
+ status = cairo_script_interpreter_destroy (csi);
+ if (status) {
+ fprintf (stderr, "Error during replay of '%s', line %d: %d\n",
+ argv[i], line, status);
+ return 1;
+ }
+ }
+
+ return 0;
}