summaryrefslogtreecommitdiff
path: root/source/fitz/list-device.c
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2017-06-23 12:23:36 -0700
committerRobin Watts <robin.watts@artifex.com>2017-07-17 19:32:06 +0100
commit63713f22ae830142dfe0d3896948ec53c4705ace (patch)
treefe8334e262f4507dc2cd2a3ee6d6239bb2c44b40 /source/fitz/list-device.c
parent28bfd69eb4101a2197920da6cbc21f491d8cb288 (diff)
downloadmupdf-63713f22ae830142dfe0d3896948ec53c4705ace.tar.xz
Add colorspace handling to transparency groups
Also force softmasks to be isolated groups.
Diffstat (limited to 'source/fitz/list-device.c')
-rw-r--r--source/fitz/list-device.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c
index 4d2f0c00..03f163a5 100644
--- a/source/fitz/list-device.c
+++ b/source/fitz/list-device.c
@@ -1098,29 +1098,40 @@ fz_list_end_mask(fz_context *ctx, fz_device *dev)
}
static void
-fz_list_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
+fz_list_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *rect, fz_colorspace *colorspace, int isolated, int knockout, int blendmode, float alpha)
{
int flags;
+ colorspace = fz_keep_colorspace(ctx, colorspace);
+
flags = (blendmode<<2);
if (isolated)
flags |= ISOLATED;
if (knockout)
flags |= KNOCKOUT;
- fz_append_display_node(
- ctx,
- dev,
- FZ_CMD_BEGIN_GROUP,
- flags,
- rect,
- NULL, /* path */
- NULL, /* color */
- NULL, /* colorspace */
- &alpha, /* alpha */
- NULL, /* ctm */
- NULL, /* stroke */
- NULL, /* private_data */
- 0); /* private_data_len */
+
+ fz_try(ctx)
+ {
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_GROUP,
+ flags,
+ rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ &alpha, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ &colorspace, /* private_data */
+ sizeof(colorspace)); /* private_data_len */
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_colorspace(ctx, colorspace);
+ fz_rethrow(ctx);
+ }
}
static void
@@ -1394,6 +1405,9 @@ fz_drop_display_list_imp(fz_context *ctx, fz_storable *list_)
case FZ_CMD_CLIP_IMAGE_MASK:
fz_drop_image(ctx, *(fz_image **)node);
break;
+ case FZ_CMD_BEGIN_GROUP:
+ fz_drop_colorspace(ctx, *(fz_colorspace **)node);
+ break;
case FZ_CMD_DEFAULT_COLORSPACES:
fz_drop_default_colorspaces(ctx, *(fz_default_colorspaces **)node);
break;
@@ -1732,7 +1746,7 @@ visible:
fz_end_mask(ctx, dev);
break;
case FZ_CMD_BEGIN_GROUP:
- fz_begin_group(ctx, dev, &trans_rect, (n.flags & ISOLATED) != 0, (n.flags & KNOCKOUT) != 0, (n.flags>>2), alpha);
+ fz_begin_group(ctx, dev, &trans_rect, *(fz_colorspace **)node, (n.flags & ISOLATED) != 0, (n.flags & KNOCKOUT) != 0, (n.flags>>2), alpha);
break;
case FZ_CMD_END_GROUP:
fz_end_group(ctx, dev);