diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-15 13:53:15 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-15 13:53:15 +0100 |
commit | 1eaab086f36aeeacdcb12d377e1fd8746a2c7b79 (patch) | |
tree | 640921431767869181f68d30ed0e860ee8ed9758 | |
parent | 47e16d0e565fcb579148285394bafd45b53ecaff (diff) |
ps: Set transparency for stencil_masks
Fixes crash in a8-mask.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/cairo-ps-surface.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index e9ed9396..781da67a 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -2194,6 +2194,7 @@ _cairo_ps_surface_emit_image (cairo_ps_surface_t *surface, if (stencil_mask) { use_mask = FALSE; color = CAIRO_IMAGE_IS_MONOCHROME; + transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; } else { transparency = _cairo_image_analyze_transparency (image); @@ -2227,27 +2228,22 @@ _cairo_ps_surface_emit_image (cairo_ps_surface_t *surface, * pixel with (bit 7 first). The row is padded to byte * boundaries. The image data is 3 bytes per pixel RGB format. */ switch (color) { - case CAIRO_IMAGE_IS_COLOR: + default: case CAIRO_IMAGE_UNKNOWN_COLOR: - if (use_mask) - data_size = ps_image->height * ((ps_image->width + 7)/8 + 3*ps_image->width); - else - data_size = ps_image->height * ps_image->width * 3; + ASSERT_NOT_REACHED; + case CAIRO_IMAGE_IS_COLOR: + data_size = ps_image->width * 3; break; - case CAIRO_IMAGE_IS_GRAYSCALE: - if (use_mask) - data_size = ps_image->height * ((ps_image->width + 7)/8 + ps_image->width); - else - data_size = ps_image->height * ps_image->width; + data_size = ps_image->width; break; case CAIRO_IMAGE_IS_MONOCHROME: - if (use_mask) - data_size = ps_image->height * ((ps_image->width + 7)/8) * 2; - else - data_size = ps_image->height * ((ps_image->width + 7)/8); + data_size = (ps_image->width + 7)/8; break; } + if (use_mask) + data_size += (ps_image->width + 7)/8; + data_size *= ps_image->height; data = malloc (data_size); if (unlikely (data == NULL)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); |