summaryrefslogtreecommitdiff
path: root/src/cairo-gstate.c
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2010-12-07 18:21:35 +0100
committerAndrea Canciani <ranma42@gmail.com>2011-01-01 13:05:12 +0100
commitf3c34887bd59377f003e790a4039a3074ca01f7d (patch)
tree6c6bd86421f77efd4885b78b17991f572a4422ed /src/cairo-gstate.c
parented24deaa2eaefb5e11ff900d4466474592f66d33 (diff)
downloadcairo-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.c44
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;