diff options
-rw-r--r-- | pdf/mupdf-internal.h | 2 | ||||
-rw-r--r-- | pdf/pdf_colorspace.c | 2 | ||||
-rw-r--r-- | pdf/pdf_function.c | 15 | ||||
-rw-r--r-- | pdf/pdf_shade.c | 18 |
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)); } |