summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-colorspace.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2017-06-29 12:24:00 +0100
committerRobin Watts <robin.watts@artifex.com>2017-07-04 11:01:00 +0100
commitb9076389f1ede0479d7e48676c60f4c0cc0d6c9a (patch)
tree6d32e662dcfc681d2bd9b091b99ee317d417e96f /source/pdf/pdf-colorspace.c
parentc87bc4ed995b8dcf50277169fbd00cf6e0a640c8 (diff)
downloadmupdf-b9076389f1ede0479d7e48676c60f4c0cc0d6c9a.tar.xz
Remove is_static from fz_new{,_icc}_colorspace.
No longer required, and causes leaks. Also, fix some reference counting problems with colorspaces.
Diffstat (limited to 'source/pdf/pdf-colorspace.c')
-rw-r--r--source/pdf/pdf-colorspace.c60
1 files changed, 31 insertions, 29 deletions
diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c
index 9b840cc9..a200ce6b 100644
--- a/source/pdf/pdf-colorspace.c
+++ b/source/pdf/pdf-colorspace.c
@@ -59,7 +59,7 @@ load_icc_based(fz_context *ctx, pdf_obj *dict, int alt)
if (fz_get_cmm_engine(ctx))
{
buffer = pdf_load_stream(ctx, dict);
- cs = fz_new_icc_colorspace(ctx, 0, n, buffer, NULL);
+ cs = fz_new_icc_colorspace(ctx, n, buffer, NULL);
}
}
fz_always(ctx)
@@ -105,13 +105,13 @@ load_icc_based(fz_context *ctx, pdf_obj *dict, int alt)
switch (n)
{
case 1:
- cs = fz_device_gray(ctx);
+ cs = fz_keep_colorspace(ctx, fz_device_gray(ctx));
break;
case 3:
- cs = fz_device_rgb(ctx);
+ cs = fz_keep_colorspace(ctx, fz_device_rgb(ctx));
break;
case 4:
- cs = fz_device_cmyk(ctx);
+ cs = fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
break;
default: fz_throw(ctx, FZ_ERROR_SYNTAX, "ICCBased must have 1, 3 or 4 components");
}
@@ -193,13 +193,14 @@ load_separation(fz_context *ctx, pdf_obj *array)
sep->base = fz_keep_colorspace(ctx, base); /* We drop it during the sep free... */
sep->tint = tint;
- cs = fz_new_colorspace(ctx, n == 1 ? "Separation" : "DeviceN", 0, n, 1,
+ cs = fz_new_colorspace(ctx, n == 1 ? "Separation" : "DeviceN", n, 1,
fz_colorspace_is_icc(ctx, fz_device_rgb(ctx)) ? separation_to_alt : separation_to_rgb, NULL, base_separation, NULL, free_separation, sep,
sizeof(struct separation) + (base ? base->size : 0) + pdf_function_size(ctx, tint));
}
+ fz_always(ctx)
+ fz_drop_colorspace(ctx, base);
fz_catch(ctx)
{
- fz_drop_colorspace(ctx, base);
pdf_drop_function(ctx, tint);
fz_free(ctx, sep);
fz_rethrow(ctx);
@@ -274,9 +275,10 @@ load_indexed(fz_context *ctx, pdf_obj *array)
cs = fz_new_indexed_colorspace(ctx, base, high, lookup);
}
+ fz_always(ctx)
+ fz_drop_colorspace(ctx, base);
fz_catch(ctx)
{
- fz_drop_colorspace(ctx, base);
fz_free(ctx, lookup);
fz_rethrow(ctx);
}
@@ -341,7 +343,7 @@ pdf_load_cal_gray(fz_context *ctx, pdf_obj *dict)
float gamma[3] = { 1, 1, 1 };
if (dict == NULL)
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
fz_try(ctx)
{
@@ -349,7 +351,7 @@ pdf_load_cal_gray(fz_context *ctx, pdf_obj *dict)
gamma[2] = gamma[1] = gamma[0];
}
fz_catch(ctx)
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
return fz_new_cal_colorspace(ctx, wp, bp, gamma, NULL);
}
@@ -364,7 +366,7 @@ pdf_load_cal_rgb(fz_context *ctx, pdf_obj *dict)
int i;
if (dict == NULL)
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
fz_try(ctx)
{
@@ -378,7 +380,7 @@ pdf_load_cal_rgb(fz_context *ctx, pdf_obj *dict)
}
}
fz_catch(ctx)
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
return fz_new_cal_colorspace(ctx, wp, bp, gamma, matrix);
}
@@ -393,19 +395,19 @@ pdf_load_colorspace_imp(fz_context *ctx, pdf_obj *obj)
if (pdf_is_name(ctx, obj))
{
if (pdf_name_eq(ctx, obj, PDF_NAME_Pattern))
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_G))
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_RGB))
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_CMYK))
- return fz_device_cmyk(ctx);
+ return fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_DeviceGray))
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_DeviceRGB))
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
else if (pdf_name_eq(ctx, obj, PDF_NAME_DeviceCMYK))
- return fz_device_cmyk(ctx);
+ return fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
else
fz_throw(ctx, FZ_ERROR_SYNTAX, "unknown colorspace: %s", pdf_to_name(ctx, obj));
}
@@ -418,35 +420,35 @@ pdf_load_colorspace_imp(fz_context *ctx, pdf_obj *obj)
{
/* load base colorspace instead */
if (pdf_name_eq(ctx, name, PDF_NAME_G))
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_RGB))
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_CMYK))
- return fz_device_cmyk(ctx);
+ return fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_DeviceGray))
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_DeviceRGB))
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_DeviceCMYK))
- return fz_device_cmyk(ctx);
+ return fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_CalGray))
{
if (fz_get_cmm_engine(ctx))
return pdf_load_cal_gray(ctx, pdf_array_get(ctx, obj, 1));
else
- return fz_device_gray(ctx);
+ return fz_keep_colorspace(ctx, fz_device_gray(ctx));
}
else if (pdf_name_eq(ctx, name, PDF_NAME_CalRGB))
{
if (fz_get_cmm_engine(ctx))
return pdf_load_cal_rgb(ctx, pdf_array_get(ctx, obj, 1));
else
- return fz_device_rgb(ctx);
+ return fz_keep_colorspace(ctx, fz_device_rgb(ctx));
}
else if (pdf_name_eq(ctx, name, PDF_NAME_CalCMYK))
- return fz_device_cmyk(ctx);
+ return fz_keep_colorspace(ctx, fz_device_cmyk(ctx));
else if (pdf_name_eq(ctx, name, PDF_NAME_Lab))
- return fz_device_lab(ctx);
+ return fz_keep_colorspace(ctx, fz_device_lab(ctx));
else
{
fz_colorspace *cs;
@@ -474,7 +476,7 @@ pdf_load_colorspace_imp(fz_context *ctx, pdf_obj *obj)
pobj = pdf_array_get(ctx, obj, 1);
if (!pobj)
{
- cs = fz_device_gray(ctx);
+ cs = fz_keep_colorspace(ctx, fz_device_gray(ctx));
break;
}