summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-09-15 13:53:15 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-09-15 13:53:15 +0100
commit1eaab086f36aeeacdcb12d377e1fd8746a2c7b79 (patch)
tree640921431767869181f68d30ed0e860ee8ed9758
parent47e16d0e565fcb579148285394bafd45b53ecaff (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.c24
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);