From f84a189d5f94250e46d2cbd1a75aba00130e2dd6 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 21 Jan 2015 16:42:45 +0100 Subject: Add ctx parameter and remove embedded contexts for API regularity. Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap. --- source/pdf/pdf-shade.c | 200 +++++++++++++++++++++++-------------------------- 1 file changed, 93 insertions(+), 107 deletions(-) (limited to 'source/pdf/pdf-shade.c') diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c index c5009059..4203d1b0 100644 --- a/source/pdf/pdf-shade.c +++ b/source/pdf/pdf-shade.c @@ -47,28 +47,27 @@ pdf_sample_shade_function(fz_context *ctx, fz_shade *shade, int funcs, fz_functi /* Type 1-3 -- Function-based, linear and radial shadings */ static void -pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, fz_function *func) +pdf_load_function_based_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, fz_function *func) { pdf_obj *obj; float x0, y0, x1, y1; float fv[2]; fz_matrix matrix; int xx, yy; - fz_context *ctx = doc->ctx; float *p; x0 = y0 = 0; x1 = y1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - x0 = pdf_to_real(pdf_array_get(obj, 0)); - x1 = pdf_to_real(pdf_array_get(obj, 1)); - y0 = pdf_to_real(pdf_array_get(obj, 2)); - y1 = pdf_to_real(pdf_array_get(obj, 3)); + x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); } - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &matrix); else @@ -98,34 +97,33 @@ pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dic } static void -pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func) +pdf_load_linear_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { pdf_obj *obj; float d0, d1; int e0, e1; - fz_context *ctx = doc->ctx; - obj = pdf_dict_gets(dict, "Coords"); - shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 3)); + obj = pdf_dict_gets(ctx, dict, "Coords"); + shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); d0 = 0; d1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - d0 = pdf_to_real(pdf_array_get(obj, 0)); - d1 = pdf_to_real(pdf_array_get(obj, 1)); + d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); } e0 = e1 = 0; - obj = pdf_dict_gets(dict, "Extend"); + obj = pdf_dict_gets(ctx, dict, "Extend"); if (obj) { - e0 = pdf_to_bool(pdf_array_get(obj, 0)); - e1 = pdf_to_bool(pdf_array_get(obj, 1)); + e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0)); + e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1)); } pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1); @@ -135,36 +133,35 @@ pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int f } static void -pdf_load_radial_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func) +pdf_load_radial_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { pdf_obj *obj; float d0, d1; int e0, e1; - fz_context *ctx = doc->ctx; - obj = pdf_dict_gets(dict, "Coords"); - shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.l_or_r.coords[0][2] = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 3)); - shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 4)); - shade->u.l_or_r.coords[1][2] = pdf_to_real(pdf_array_get(obj, 5)); + obj = pdf_dict_gets(ctx, dict, "Coords"); + shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.l_or_r.coords[0][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); + shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4)); + shade->u.l_or_r.coords[1][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5)); d0 = 0; d1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - d0 = pdf_to_real(pdf_array_get(obj, 0)); - d1 = pdf_to_real(pdf_array_get(obj, 1)); + d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); } e0 = e1 = 0; - obj = pdf_dict_gets(dict, "Extend"); + obj = pdf_dict_gets(ctx, dict, "Extend"); if (obj) { - e0 = pdf_to_bool(pdf_array_get(obj, 0)); - e1 = pdf_to_bool(pdf_array_get(obj, 1)); + e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0)); + e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1)); } pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1); @@ -188,9 +185,8 @@ struct mesh_params }; static void -pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) +pdf_load_mesh_params(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict) { - fz_context *ctx = doc->ctx; pdf_obj *obj; int i, n; @@ -202,23 +198,23 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) shade->u.m.c1[i] = 1; } - shade->u.m.vprow = pdf_to_int(pdf_dict_gets(dict, "VerticesPerRow")); - shade->u.m.bpflag = pdf_to_int(pdf_dict_gets(dict, "BitsPerFlag")); - shade->u.m.bpcoord = pdf_to_int(pdf_dict_gets(dict, "BitsPerCoordinate")); - shade->u.m.bpcomp = pdf_to_int(pdf_dict_gets(dict, "BitsPerComponent")); + shade->u.m.vprow = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "VerticesPerRow")); + shade->u.m.bpflag = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerFlag")); + shade->u.m.bpcoord = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerCoordinate")); + shade->u.m.bpcomp = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerComponent")); - obj = pdf_dict_gets(dict, "Decode"); - if (pdf_array_len(obj) >= 6) + obj = pdf_dict_gets(ctx, dict, "Decode"); + if (pdf_array_len(ctx, obj) >= 6) { - n = (pdf_array_len(obj) - 4) / 2; - shade->u.m.x0 = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.m.x1 = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.m.y0 = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.m.y1 = pdf_to_real(pdf_array_get(obj, 3)); + n = (pdf_array_len(ctx, obj) - 4) / 2; + shade->u.m.x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.m.x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.m.y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.m.y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); for (i = 0; i < n; i++) { - shade->u.m.c0[i] = pdf_to_real(pdf_array_get(obj, 4 + i * 2)); - shade->u.m.c1[i] = pdf_to_real(pdf_array_get(obj, 5 + i * 2)); + shade->u.m.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4 + i * 2)); + shade->u.m.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5 + i * 2)); } } @@ -252,67 +248,59 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) } static void -pdf_load_type4_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type4_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } static void -pdf_load_type5_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type5_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } /* Type 6 & 7 -- Patch mesh shadings */ static void -pdf_load_type6_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type6_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } static void -pdf_load_type7_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type7_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } /* Load all of the shading dictionary parameters, then switch on the shading type. */ static fz_shade * -pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transform) +pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *transform) { fz_shade *shade = NULL; fz_function *func[FZ_MAX_COLORS] = { NULL }; @@ -320,7 +308,6 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo int funcs = 0; int type = 0; int i, in, out; - fz_context *ctx = doc->ctx; fz_var(shade); fz_var(func); @@ -341,28 +328,28 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo funcs = 0; - obj = pdf_dict_gets(dict, "ShadingType"); - type = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "ShadingType"); + type = pdf_to_int(ctx, obj); - obj = pdf_dict_gets(dict, "ColorSpace"); + obj = pdf_dict_gets(ctx, dict, "ColorSpace"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "shading colorspace is missing"); - shade->colorspace = pdf_load_colorspace(doc, obj); + shade->colorspace = pdf_load_colorspace(ctx, doc, obj); - obj = pdf_dict_gets(dict, "Background"); + obj = pdf_dict_gets(ctx, dict, "Background"); if (obj) { shade->use_background = 1; for (i = 0; i < shade->colorspace->n; i++) - shade->background[i] = pdf_to_real(pdf_array_get(obj, i)); + shade->background[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } - obj = pdf_dict_gets(dict, "BBox"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "BBox"); + if (pdf_is_array(ctx, obj)) pdf_to_rect(ctx, obj, &shade->bbox); - obj = pdf_dict_gets(dict, "Function"); - if (pdf_is_dict(obj)) + obj = pdf_dict_gets(ctx, dict, "Function"); + if (pdf_is_dict(ctx, obj)) { funcs = 1; @@ -372,13 +359,13 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo in = 1; out = shade->colorspace->n; - func[0] = pdf_load_function(doc, obj, in, out); + func[0] = pdf_load_function(ctx, doc, obj, in, out); if (!func[0]) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - funcs = pdf_array_len(obj); + funcs = pdf_array_len(ctx, obj); if (funcs != 1 && funcs != shade->colorspace->n) { funcs = 0; @@ -398,27 +385,27 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo for (i = 0; i < funcs; i++) { - func[i] = pdf_load_function(doc, pdf_array_get(obj, i), in, out); + func[i] = pdf_load_function(ctx, doc, pdf_array_get(ctx, obj, i), in, out); if (!func[i]) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } } else if (type < 4) { /* Functions are compulsory for types 1,2,3 */ - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } shade->type = type; switch (type) { - case 1: pdf_load_function_based_shading(shade, doc, dict, func[0]); break; - case 2: pdf_load_linear_shading(shade, doc, dict, funcs, func); break; - case 3: pdf_load_radial_shading(shade, doc, dict, funcs, func); break; - case 4: pdf_load_type4_shade(shade, doc, dict, funcs, func); break; - case 5: pdf_load_type5_shade(shade, doc, dict, funcs, func); break; - case 6: pdf_load_type6_shade(shade, doc, dict, funcs, func); break; - case 7: pdf_load_type7_shade(shade, doc, dict, funcs, func); break; + case 1: pdf_load_function_based_shading(ctx, doc, shade, dict, func[0]); break; + case 2: pdf_load_linear_shading(ctx, doc, shade, dict, funcs, func); break; + case 3: pdf_load_radial_shading(ctx, doc, shade, dict, funcs, func); break; + case 4: pdf_load_type4_shade(ctx, doc, shade, dict, funcs, func); break; + case 5: pdf_load_type5_shade(ctx, doc, shade, dict, funcs, func); break; + case 6: pdf_load_type6_shade(ctx, doc, shade, dict, funcs, func); break; + case 7: pdf_load_type7_shade(ctx, doc, shade, dict, funcs, func); break; default: fz_throw(ctx, FZ_ERROR_GENERIC, "unknown shading type: %d", type); } @@ -433,7 +420,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo { fz_drop_shade(ctx, shade); - fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return shade; } @@ -449,11 +436,10 @@ fz_shade_size(fz_shade *s) } fz_shade * -pdf_load_shading(pdf_document *doc, pdf_obj *dict) +pdf_load_shading(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { fz_matrix mat; pdf_obj *obj; - fz_context *ctx = doc->ctx; fz_shade *shade; if ((shade = pdf_find_item(ctx, fz_drop_shade_imp, dict)) != NULL) @@ -462,34 +448,34 @@ pdf_load_shading(pdf_document *doc, pdf_obj *dict) } /* Type 2 pattern dictionary */ - if (pdf_dict_gets(dict, "PatternType")) + if (pdf_dict_gets(ctx, dict, "PatternType")) { - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &mat); else mat = fz_identity; - obj = pdf_dict_gets(dict, "ExtGState"); + obj = pdf_dict_gets(ctx, dict, "ExtGState"); if (obj) { - if (pdf_dict_gets(obj, "CA") || pdf_dict_gets(obj, "ca")) + if (pdf_dict_gets(ctx, obj, "CA") || pdf_dict_gets(ctx, obj, "ca")) { fz_warn(ctx, "shading with alpha not supported"); } } - obj = pdf_dict_gets(dict, "Shading"); + obj = pdf_dict_gets(ctx, dict, "Shading"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing shading dictionary"); - shade = pdf_load_shading_dict(doc, obj, &mat); + shade = pdf_load_shading_dict(ctx, doc, obj, &mat); } /* Naked shading dictionary */ else { - shade = pdf_load_shading_dict(doc, dict, &fz_identity); + shade = pdf_load_shading_dict(ctx, doc, dict, &fz_identity); } pdf_store_item(ctx, dict, shade, fz_shade_size(shade)); -- cgit v1.2.3