summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pdf/mupdf-internal.h2
-rw-r--r--pdf/pdf_colorspace.c2
-rw-r--r--pdf/pdf_function.c15
-rw-r--r--pdf/pdf_shade.c18
4 files changed, 26 insertions, 11 deletions
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
index b7fc4291..be7e23a2 100644
--- a/pdf/mupdf-internal.h
+++ b/pdf/mupdf-internal.h
@@ -256,7 +256,7 @@ void pdf_print_crypt(pdf_crypt *crypt);
typedef struct pdf_function_s pdf_function;
-pdf_function *pdf_load_function(pdf_document *doc, pdf_obj *ref);
+pdf_function *pdf_load_function(pdf_document *doc, pdf_obj *ref, int in, int out);
void pdf_eval_function(fz_context *ctx, pdf_function *func, float *in, int inlen, float *out, int outlen);
pdf_function *pdf_keep_function(fz_context *ctx, pdf_function *func);
void pdf_drop_function(fz_context *ctx, pdf_function *func);
diff --git a/pdf/pdf_colorspace.c b/pdf/pdf_colorspace.c
index 13323ce3..7a3835dd 100644
--- a/pdf/pdf_colorspace.c
+++ b/pdf/pdf_colorspace.c
@@ -119,7 +119,7 @@ load_separation(pdf_document *xref, pdf_obj *array)
fz_try(ctx)
{
- tint = pdf_load_function(xref, tintobj);
+ tint = pdf_load_function(xref, tintobj, n, base->n);
/* RJW: fz_drop_colorspace(ctx, base);
* "cannot load tint function (%d %d R)", pdf_to_num(tintobj), pdf_to_gen(tintobj) */
diff --git a/pdf/pdf_function.c b/pdf/pdf_function.c
index 2152ae05..978f2473 100644
--- a/pdf/pdf_function.c
+++ b/pdf/pdf_function.c
@@ -1229,7 +1229,7 @@ load_stitching_func(pdf_function *func, pdf_document *xref, pdf_obj *dict)
for (i = 0; i < k; i++)
{
sub = pdf_array_get(obj, i);
- funcs[i] = pdf_load_function(xref, sub);
+ funcs[i] = pdf_load_function(xref, sub, 1, func->n);
/* RJW: "cannot load sub function %d (%d %d R)", i, pdf_to_num(sub), pdf_to_gen(sub) */
if (funcs[i]->m != 1 || funcs[i]->n != funcs[0]->n)
fz_throw(ctx, "sub function %d /Domain or /Range mismatch", i);
@@ -1237,9 +1237,7 @@ load_stitching_func(pdf_function *func, pdf_document *xref, pdf_obj *dict)
func->u.st.k ++;
}
- if (!func->n)
- func->n = funcs[0]->n;
- else if (func->n != funcs[0]->n)
+ if (func->n != funcs[0]->n)
fz_throw(ctx, "sub function /Domain or /Range mismatch");
}
@@ -1371,7 +1369,7 @@ pdf_function_size(pdf_function *func)
}
pdf_function *
-pdf_load_function(pdf_document *xref, pdf_obj *dict)
+pdf_load_function(pdf_document *xref, pdf_obj *dict, int in, int out)
{
fz_context *ctx = xref->ctx;
pdf_function *func;
@@ -1414,9 +1412,14 @@ pdf_load_function(pdf_document *xref, pdf_obj *dict)
else
{
func->has_range = 0;
- func->n = 0;
+ func->n = out;
}
+ if (func->m != in)
+ fz_warn(ctx, "too few/many function inputs");
+ if (func->n != out)
+ fz_warn(ctx, "too few/many function outputs");
+
fz_try(ctx)
{
switch(func->type)
diff --git a/pdf/pdf_shade.c b/pdf/pdf_shade.c
index 2d9e74b8..9e056c14 100644
--- a/pdf/pdf_shade.c
+++ b/pdf/pdf_shade.c
@@ -984,7 +984,7 @@ pdf_load_shading_dict(pdf_document *xref, pdf_obj *dict, fz_matrix transform)
pdf_obj *obj;
int funcs = 0;
int type = 0;
- int i;
+ int i, in, out;
fz_context *ctx = xref->ctx;
fz_var(shade);
@@ -1040,7 +1040,13 @@ pdf_load_shading_dict(pdf_document *xref, pdf_obj *dict, fz_matrix transform)
{
funcs = 1;
- func[0] = pdf_load_function(xref, obj);
+ if (type == 1)
+ in = 2;
+ else
+ in = 1;
+ out = shade->colorspace->n;
+
+ func[0] = pdf_load_function(xref, obj, in, out);
if (!func[0])
fz_throw(ctx, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
}
@@ -1050,9 +1056,15 @@ pdf_load_shading_dict(pdf_document *xref, pdf_obj *dict, fz_matrix transform)
if (funcs != 1 && funcs != shade->colorspace->n)
fz_throw(ctx, "incorrect number of shading functions");
+ if (type == 1)
+ in = 2;
+ else
+ in = 1;
+ out = 1;
+
for (i = 0; i < funcs; i++)
{
- func[i] = pdf_load_function(xref, pdf_array_get(obj, i));
+ func[i] = pdf_load_function(xref, pdf_array_get(obj, i), in, out);
if (!func[i])
fz_throw(ctx, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
}