diff options
author | Andrea Canciani <ranma42@gmail.com> | 2010-12-07 18:21:35 +0100 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2011-01-01 13:05:12 +0100 |
commit | f3c34887bd59377f003e790a4039a3074ca01f7d (patch) | |
tree | 6c6bd86421f77efd4885b78b17991f572a4422ed /src/cairo-gstate.c | |
parent | ed24deaa2eaefb5e11ff900d4466474592f66d33 (diff) | |
download | cairo-f3c34887bd59377f003e790a4039a3074ca01f7d.tar.gz |
gstate: Disallow incomplete mesh gradient sources
Mesh gradients are constructed using multiple commands, bracketed by
explicit begin/end pairs. Using a mesh gradient inside a begin/end
pair is not allowed.
Diffstat (limited to 'src/cairo-gstate.c')
-rw-r--r-- | src/cairo-gstate.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index 7c54dcb33..efb826703 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -1020,6 +1020,20 @@ _reduce_op (cairo_gstate_t *gstate) return op; } +static cairo_status_t +_cairo_gstate_get_pattern_status (const cairo_pattern_t *pattern) +{ + if (unlikely (pattern->type == CAIRO_PATTERN_TYPE_MESH && + ((const cairo_mesh_pattern_t *) pattern)->current_patch)) + { + /* If current patch != NULL, the pattern is under construction + * and cannot be used as a source */ + return CAIRO_STATUS_INVALID_MESH_CONSTRUCTION; + } + + return pattern->status; +} + cairo_status_t _cairo_gstate_paint (cairo_gstate_t *gstate) { @@ -1029,8 +1043,9 @@ _cairo_gstate_paint (cairo_gstate_t *gstate) cairo_status_t status; cairo_operator_t op; - if (unlikely (gstate->source->status)) - return gstate->source->status; + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; if (gstate->op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; @@ -1064,11 +1079,13 @@ _cairo_gstate_mask (cairo_gstate_t *gstate, cairo_clip_t clip; cairo_status_t status; - if (unlikely (mask->status)) - return mask->status; + status = _cairo_gstate_get_pattern_status (mask); + if (unlikely (status)) + return status; - if (unlikely (gstate->source->status)) - return gstate->source->status; + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; if (gstate->op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; @@ -1140,8 +1157,9 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) cairo_clip_t clip; cairo_status_t status; - if (unlikely (gstate->source->status)) - return gstate->source->status; + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; if (gstate->op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; @@ -1242,8 +1260,9 @@ _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path) cairo_clip_t clip; cairo_status_t status; - if (unlikely (gstate->source->status)) - return gstate->source->status; + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; if (gstate->op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; @@ -1909,8 +1928,9 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate, cairo_status_t status; cairo_clip_t clip; - if (unlikely (gstate->source->status)) - return gstate->source->status; + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; if (gstate->op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; |