diff options
Diffstat (limited to 'xps/xpsopacity.c')
-rw-r--r-- | xps/xpsopacity.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/xps/xpsopacity.c b/xps/xpsopacity.c index 047e213d..51a356e3 100644 --- a/xps/xpsopacity.c +++ b/xps/xpsopacity.c @@ -36,12 +36,36 @@ xps_begin_opacity(xps_context *ctx, fz_matrix ctm, char *base_uri, xps_resource if (opacity_att) opacity = atof(opacity_att); + if (opacity_mask_tag && !strcmp(xps_tag(opacity_mask_tag), "SolidColorBrush")) + { + char *scb_opacity_att = xps_att(opacity_mask_tag, "Opacity"); + char *scb_color_att = xps_att(opacity_mask_tag, "Color"); + if (scb_opacity_att) + opacity = opacity * atof(scb_opacity_att); + if (scb_color_att) + { + fz_colorspace *colorspace; + float samples[32]; + xps_parse_color(ctx, base_uri, scb_color_att, &colorspace, samples); + opacity = opacity * samples[0]; + } + opacity_mask_tag = NULL; + } + xps_bounds_in_user_space(ctx, &bbox); - ctx->dev->beginmask(ctx->dev->user, bbox, 0, fz_devicegray, &opacity); + if (ctx->opacity_top + 1 < nelem(ctx->opacity)) + { + ctx->opacity[ctx->opacity_top + 1] = ctx->opacity[ctx->opacity_top] * opacity; + ctx->opacity_top++; + } + if (opacity_mask_tag) + { + ctx->dev->beginmask(ctx->dev->user, bbox, 0, NULL, NULL); xps_parse_brush(ctx, ctm, base_uri, dict, opacity_mask_tag); - ctx->dev->endmask(ctx->dev->user); + ctx->dev->endmask(ctx->dev->user); + } } void @@ -51,5 +75,12 @@ xps_end_opacity(xps_context *ctx, char *base_uri, xps_resource *dict, if (!opacity_att && !opacity_mask_tag) return; - ctx->dev->popclip(ctx->dev->user); + if (ctx->opacity_top > 0) + ctx->opacity_top--; + + if (opacity_mask_tag) + { + if (strcmp(xps_tag(opacity_mask_tag), "SolidColorBrush")) + ctx->dev->popclip(ctx->dev->user); + } } |