summaryrefslogtreecommitdiff
path: root/source/fitz/draw-device.c
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2016-10-29 15:53:58 +0800
committerSebastian Rasmussen <sebras@gmail.com>2016-12-14 20:36:25 +0100
commitd53ab7a97c018aaa0e0adcaabcebcc72c080f724 (patch)
treee0627cf3dcfb6c286bfadf9dedc40547875083e6 /source/fitz/draw-device.c
parent5ad76a1961559904bbb9312d92dd15c3ed0c67b5 (diff)
downloadmupdf-d53ab7a97c018aaa0e0adcaabcebcc72c080f724.tar.xz
Let pixmap colorspace conversion create new pixmap.
This moves dropping the converted pixmap into fz_convert_pixmap(), which relieves every caller from doing so. Moreover resolution, position and interpolation are kept.
Diffstat (limited to 'source/fitz/draw-device.c')
-rw-r--r--source/fitz/draw-device.c74
1 files changed, 28 insertions, 46 deletions
diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c
index 28e64839..c15a5296 100644
--- a/source/fitz/draw-device.c
+++ b/source/fitz/draw-device.c
@@ -1235,10 +1235,7 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
{
fz_draw_device *dev = (fz_draw_device*)devp;
fz_matrix local_ctm = concat(in_ctm, &dev->transform);
- fz_pixmap *converted = NULL;
- fz_pixmap *scaled = NULL;
fz_pixmap *pixmap;
- fz_pixmap *orig_pixmap;
int after;
int dx, dy;
fz_draw_state *state = &dev->stack[dev->top];
@@ -1249,8 +1246,6 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
fz_intersect_irect(fz_pixmap_bbox(ctx, state->dest, &clip), &state->scissor);
- fz_var(scaled);
-
if (image->w == 0 || image->h == 0)
return;
@@ -1290,12 +1285,13 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
}
pixmap = fz_get_pixmap_from_image(ctx, image, &src_area, &local_ctm, &dx, &dy);
- orig_pixmap = pixmap;
/* convert images with more components (cmyk->rgb) before scaling */
/* convert images with fewer components (gray->rgb) after scaling */
/* convert images with expensive colorspace transforms after scaling */
+ fz_var(pixmap);
+
fz_try(ctx)
{
if (state->blendmode & FZ_BLEND_KNOCKOUT)
@@ -1307,17 +1303,15 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
if (pixmap->colorspace != model && !after)
{
- fz_irect bbox;
- fz_pixmap_bbox(ctx, pixmap, &bbox);
- converted = fz_new_pixmap_with_bbox(ctx, model, &bbox, (model ? pixmap->alpha : 1));
- fz_convert_pixmap(ctx, converted, pixmap);
+ fz_pixmap *converted = fz_convert_pixmap(ctx, pixmap, model, 1);
+ fz_drop_pixmap(ctx, pixmap);
pixmap = converted;
}
if (!(devp->hints & FZ_DONT_INTERPOLATE_IMAGES) && ctx->tuning->image_scale(ctx->tuning->image_scale_arg, dx, dy, pixmap->w, pixmap->h))
{
int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
- scaled = fz_transform_pixmap(ctx, dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
+ fz_pixmap *scaled = fz_transform_pixmap(ctx, dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
if (!scaled)
{
if (dx < 1)
@@ -1327,7 +1321,10 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
scaled = fz_scale_pixmap_cached(ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
}
if (scaled)
+ {
+ fz_drop_pixmap(ctx, pixmap);
pixmap = scaled;
+ }
}
if (pixmap->colorspace != model)
@@ -1341,10 +1338,8 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
else
#endif
{
- fz_irect bbox;
- fz_pixmap_bbox(ctx, pixmap, &bbox);
- converted = fz_new_pixmap_with_bbox(ctx, model, &bbox, pixmap->alpha);
- fz_convert_pixmap(ctx, converted, pixmap);
+ fz_pixmap *converted = fz_convert_pixmap(ctx, pixmap, model, 1);
+ fz_drop_pixmap(ctx, pixmap);
pixmap = converted;
}
}
@@ -1355,15 +1350,9 @@ fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_m
fz_knockout_end(ctx, dev);
}
fz_always(ctx)
- {
- fz_drop_pixmap(ctx, scaled);
- fz_drop_pixmap(ctx, converted);
- fz_drop_pixmap(ctx, orig_pixmap);
- }
+ fz_drop_pixmap(ctx, pixmap);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
static void
@@ -1376,7 +1365,6 @@ fz_draw_fill_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
float colorfv[FZ_MAX_COLORS];
fz_pixmap *scaled = NULL;
fz_pixmap *pixmap;
- fz_pixmap *orig_pixmap;
int dx, dy;
int i, n;
fz_draw_state *state = &dev->stack[dev->top];
@@ -1430,7 +1418,8 @@ fz_draw_fill_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
}
pixmap = fz_get_pixmap_from_image(ctx, image, &src_area, &local_ctm, &dx, &dy);
- orig_pixmap = pixmap;
+
+ fz_var(pixmap);
fz_try(ctx)
{
@@ -1450,7 +1439,10 @@ fz_draw_fill_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
scaled = fz_scale_pixmap_cached(ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
}
if (scaled)
+ {
+ fz_drop_pixmap(ctx, pixmap);
pixmap = scaled;
+ }
}
n = fz_colorspace_n(ctx, model);
@@ -1471,14 +1463,9 @@ fz_draw_fill_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
fz_knockout_end(ctx, dev);
}
fz_always(ctx)
- {
- fz_drop_pixmap(ctx, scaled);
- fz_drop_pixmap(ctx, orig_pixmap);
- }
+ fz_drop_pixmap(ctx, pixmap);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
static void
@@ -1492,7 +1479,6 @@ fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
fz_pixmap *shape = NULL;
fz_pixmap *scaled = NULL;
fz_pixmap *pixmap = NULL;
- fz_pixmap *orig_pixmap = NULL;
int dx, dy;
fz_draw_state *state = push_stack(ctx, dev);
fz_colorspace *model = state->dest->colorspace;
@@ -1503,12 +1489,6 @@ fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
fz_pixmap_bbox(ctx, state->dest, &clip);
fz_intersect_irect(&clip, &state->scissor);
- fz_var(mask);
- fz_var(dest);
- fz_var(shape);
- fz_var(pixmap);
- fz_var(orig_pixmap);
-
if (image->w == 0 || image->h == 0)
{
#ifdef DUMP_GROUP_BLENDS
@@ -1534,11 +1514,15 @@ fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
fz_intersect_irect(&bbox, fz_irect_from_rect(&bbox2, &tscissor));
}
+ pixmap = fz_get_pixmap_from_image(ctx, image, NULL, &local_ctm, &dx, &dy);
+
+ fz_var(mask);
+ fz_var(dest);
+ fz_var(shape);
+ fz_var(pixmap);
+
fz_try(ctx)
{
- pixmap = fz_get_pixmap_from_image(ctx, image, NULL, &local_ctm, &dx, &dy);
- orig_pixmap = pixmap;
-
state[1].mask = mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox, 1);
fz_clear_pixmap(ctx, mask);
@@ -1573,7 +1557,10 @@ fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
scaled = fz_scale_pixmap_cached(ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
}
if (scaled)
+ {
+ fz_drop_pixmap(ctx, pixmap);
pixmap = scaled;
+ }
}
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
@@ -1592,14 +1579,9 @@ fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const
#endif
}
fz_always(ctx)
- {
- fz_drop_pixmap(ctx, scaled);
- fz_drop_pixmap(ctx, orig_pixmap);
- }
+ fz_drop_pixmap(ctx, pixmap);
fz_catch(ctx)
- {
emergency_pop_stack(ctx, dev, state);
- }
}
static void