From 9f8e0724789744d81c5de0138e65284a9560e707 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 26 Feb 2018 16:31:06 +0100 Subject: Remove pdf_xobject wrapper struct. Just use the pdf_obj directly. Revise ap_iteration and split annot->dirty into separate flags. One flag for needs_new_ap, and one for has_new_ap (to be used by clients who may have cached a rendered annotation). --- source/pdf/pdf-annot.c | 28 +++--------- source/pdf/pdf-appearance.c | 67 ++++++++++----------------- source/pdf/pdf-form.c | 19 +------- source/pdf/pdf-interpret.c | 82 ++++++++++++--------------------- source/pdf/pdf-op-buffer.c | 2 +- source/pdf/pdf-op-filter.c | 4 +- source/pdf/pdf-op-run.c | 38 ++++++++-------- source/pdf/pdf-xobject.c | 108 ++++++++------------------------------------ 8 files changed, 100 insertions(+), 248 deletions(-) (limited to 'source') diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index 7046ff18..3325c828 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -358,7 +358,7 @@ pdf_resolve_link(fz_context *ctx, pdf_document *doc, const char *uri, float *xp, static void pdf_drop_annot_imp(fz_context *ctx, pdf_annot *annot) { - pdf_drop_xobject(ctx, annot->ap); + pdf_drop_obj(ctx, annot->ap); pdf_drop_obj(ctx, annot->obj); } @@ -496,11 +496,11 @@ pdf_load_annots(fz_context *ctx, pdf_page *page, pdf_obj *annots) n = pdf_dict_get(ctx, n, as); annot->ap = NULL; + annot->has_new_ap = 1; if (pdf_is_stream(ctx, n)) { - annot->ap = pdf_load_xobject(ctx, doc, n); - annot->ap_iteration = annot->ap->iteration; + annot->ap = pdf_keep_obj(ctx, n); } else fz_warn(ctx, "no appearance stream for annotation %d 0 R", pdf_to_num(ctx, annot->obj)); @@ -561,23 +561,7 @@ pdf_bound_annot(fz_context *ctx, pdf_annot *annot, fz_rect *rect) void pdf_dirty_annot(fz_context *ctx, pdf_annot *annot) { - if (annot) - { - annot->dirty = 1; - if (annot->page && annot->page->doc) - annot->page->doc->dirty = 1; - } -} - -void -pdf_clean_annot(fz_context *ctx, pdf_annot *annot) -{ - if (annot) - annot->dirty = 0; -} - -int -pdf_annot_is_dirty(fz_context *ctx, pdf_annot *annot) -{ - return annot ? annot->dirty: 0; + annot->needs_new_ap = 1; + if (annot->page && annot->page->doc) + annot->page->doc->dirty = 1; } diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index 2355637f..49e932c3 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -778,13 +778,13 @@ static fz_buffer *create_text_appearance(fz_context *ctx, pdf_document *doc, con return fzbuf; } -static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt) +static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_obj *form, int q, fz_matrix *mt) { int found = 0; pdf_lexbuf lbuf; fz_stream *str; - str = pdf_open_stream(ctx, form->obj); + str = pdf_open_stream(ctx, form); pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL); @@ -830,7 +830,7 @@ static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int if (found) { fz_rect bbox; - pdf_to_rect(ctx, pdf_dict_get(ctx, form->obj, PDF_NAME_BBox), &bbox); + pdf_to_rect(ctx, pdf_dict_get(ctx, form, PDF_NAME_BBox), &bbox); switch (q) { @@ -967,18 +967,16 @@ static void copy_resources(fz_context *ctx, pdf_obj *dst, pdf_obj *src) } } -static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect) +static pdf_obj *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect) { pdf_obj *ap = NULL; fz_matrix mat; int rot; pdf_obj *formobj = NULL; - pdf_xobject *form = NULL; fz_buffer *fzbuf = NULL; int create_form = 0; fz_var(formobj); - fz_var(form); fz_var(fzbuf); fz_try(ctx) { @@ -1010,9 +1008,7 @@ static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_ pdf_update_stream(ctx, doc, formobj, fzbuf, 0); } - form = pdf_load_xobject(ctx, doc, formobj); - - copy_resources(ctx, pdf_xobject_resources(ctx, form), pdf_get_inheritable(ctx, doc, obj, PDF_NAME_DR)); + copy_resources(ctx, pdf_xobject_resources(ctx, formobj), pdf_get_inheritable(ctx, doc, obj, PDF_NAME_DR)); } fz_always(ctx) { @@ -1020,14 +1016,13 @@ static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_ } fz_catch(ctx) { - pdf_drop_xobject(ctx, form); fz_rethrow(ctx); } - return form; + return pdf_keep_obj(ctx, formobj); } -static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf) +static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *fzbuf) { pdf_token tok; pdf_lexbuf lbuf; @@ -1048,7 +1043,7 @@ static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobjec int first = 1; newbuf = fz_new_buffer(ctx, 0); - str_outer = pdf_open_stream(ctx, form->obj); + str_outer = pdf_open_stream(ctx, form); len = fz_buffer_storage(ctx, fzbuf, &buf); str_inner = fz_open_memory(ctx, buf, len); @@ -1139,8 +1134,8 @@ static float get_border_width(fz_context *ctx, pdf_obj *obj) void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue) { text_widget_info info; - pdf_xobject *form = NULL; fz_buffer *fzbuf = NULL; + pdf_obj *form = NULL; fz_matrix tm; fz_rect rect, form_bbox; int has_tm; @@ -1149,8 +1144,8 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj memset(&info, 0, sizeof(info)); fz_var(info); - fz_var(form); fz_var(fzbuf); + fz_var(form); fz_var(text); fz_try(ctx) { @@ -1171,7 +1166,6 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj fz_always(ctx) { fz_free(ctx, text); - pdf_drop_xobject(ctx, form); fz_drop_buffer(ctx, fzbuf); font_info_fin(ctx, &info.font_rec); } @@ -1184,7 +1178,7 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { text_widget_info info; - pdf_xobject *form = NULL; + pdf_obj *form = NULL; fz_buffer *fzbuf = NULL; fz_matrix tm; fz_rect clip_rect; @@ -1368,7 +1362,7 @@ void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj * fz_free(ctx, opts); fz_free(ctx, vals); fz_free(ctx, sel_indices); - pdf_drop_xobject(ctx, form); + pdf_drop_obj(ctx, form); fz_drop_buffer(ctx, fzbuf); font_info_fin(ctx, &info.font_rec); } @@ -1381,7 +1375,7 @@ void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj * void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { text_widget_info info; - pdf_xobject *form = NULL; + pdf_obj *form = NULL; fz_buffer *fzbuf = NULL; fz_matrix tm; fz_rect rect, form_bbox; @@ -1418,7 +1412,7 @@ void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj } fz_always(ctx) { - pdf_drop_xobject(ctx, form); + pdf_drop_obj(ctx, form); fz_drop_buffer(ctx, fzbuf); font_info_fin(ctx, &info.font_rec); } @@ -1431,7 +1425,7 @@ void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { fz_rect rect = fz_empty_rect; - pdf_xobject *form = NULL; + pdf_obj *form = NULL; fz_buffer *fzbuf = NULL; pdf_obj *tobj = NULL; font_info font_rec; @@ -1524,7 +1518,7 @@ void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_ob { font_info_fin(ctx, &font_rec); fz_drop_buffer(ctx, fzbuf); - pdf_drop_xobject(ctx, form); + pdf_drop_obj(ctx, form); } fz_catch(ctx) { @@ -1586,7 +1580,6 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann { pdf_obj *obj = annot->obj; fz_device *dev = NULL; - pdf_xobject *xobj = NULL; fz_matrix page_ctm, inv_page_ctm; pdf_obj *resources; @@ -1641,14 +1634,8 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann fz_rethrow(ctx); /* Mark the appearance as changed - required for partial update */ - xobj = pdf_load_xobject(ctx, doc, ap_obj); - if (xobj) - { - xobj->iteration++; - pdf_drop_xobject(ctx, xobj); - } - - pdf_dirty_annot(ctx, annot); + annot->has_new_ap = 1; + annot->needs_new_ap = 0; } static fz_point * @@ -2149,7 +2136,7 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an /* Drop the cached xobject from the annotation structure to * force a redraw on next pdf_update_page call */ - pdf_drop_xobject(ctx, annot->ap); + pdf_drop_obj(ctx, annot->ap); annot->ap = NULL; } fz_always(ctx) @@ -2433,7 +2420,7 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot /* Drop the cached xobject from the annotation structure to * force a redraw on next pdf_update_page call */ - pdf_drop_xobject(ctx, annot->ap); + pdf_drop_obj(ctx, annot->ap); annot->ap = NULL; insert_signature_appearance_layers(ctx, doc, annot); @@ -2565,21 +2552,13 @@ pdf_update_annot(fz_context *ctx, pdf_annot *annot) if (!pdf_is_stream(ctx, n)) n = pdf_dict_get(ctx, n, as); - pdf_drop_xobject(ctx, annot->ap); + pdf_drop_obj(ctx, annot->ap); annot->ap = NULL; if (pdf_is_stream(ctx, n)) { - fz_try(ctx) - { - annot->ap = pdf_load_xobject(ctx, doc, n); - annot->ap_iteration = annot->ap->iteration; - } - fz_catch(ctx) - { - fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); - fz_warn(ctx, "ignoring broken annotation"); - } + annot->ap = pdf_keep_obj(ctx, n); } + annot->has_new_ap = 1; } } diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index bec1799a..f3d4e3c6 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -641,26 +641,9 @@ void pdf_update_page(fz_context *ctx, pdf_page *page) { pdf_annot *annot; - /* Mark all dirty annots as clean */ - for (annot = page->annots; annot; annot = annot->next) - pdf_clean_annot(ctx, annot); - - /* Flag all dirty annots */ for (annot = page->annots; annot; annot = annot->next) { - pdf_xobject *ap = pdf_keep_xobject(ctx, annot->ap); - int ap_iteration = annot->ap_iteration; - - fz_try(ctx) - { - pdf_update_annot(ctx, annot); - if ((ap != annot->ap || ap_iteration != annot->ap_iteration)) - pdf_dirty_annot(ctx, annot); - } - fz_always(ctx) - pdf_drop_xobject(ctx, ap); - fz_catch(ctx) - fz_rethrow(ctx); + pdf_update_annot(ctx, annot); } } diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c index 1c781b9e..c6833878 100644 --- a/source/pdf/pdf-interpret.c +++ b/source/pdf/pdf-interpret.c @@ -254,61 +254,46 @@ pdf_process_extgstate(fz_context *ctx, pdf_processor *proc, pdf_csi *csi, pdf_ob { if (pdf_is_dict(ctx, obj)) { - pdf_xobject *xobj; - pdf_obj *group, *s, *bc, *tr; + pdf_obj *xobj, *s, *bc, *tr; float softmask_bc[FZ_MAX_COLORS]; fz_colorspace *colorspace; int colorspace_n = 1; int k, luminosity; - fz_var(xobj); + xobj = pdf_dict_get(ctx, obj, PDF_NAME_G); - group = pdf_dict_get(ctx, obj, PDF_NAME_G); - xobj = pdf_load_xobject(ctx, csi->doc, group); + colorspace = pdf_xobject_colorspace(ctx, xobj); + if (colorspace) + colorspace_n = fz_colorspace_n(ctx, colorspace); - fz_try(ctx) - { - colorspace = pdf_xobject_colorspace(ctx, xobj); - if (colorspace) - colorspace_n = fz_colorspace_n(ctx, colorspace); + /* Default background color is black. */ + for (k = 0; k < colorspace_n; k++) + softmask_bc[k] = 0; + /* Which in CMYK means not all zeros! This should really be + * a test for subtractive color spaces, but this will have + * to do for now. */ + if (fz_colorspace_is_cmyk(ctx, colorspace)) + softmask_bc[3] = 1.0f; + fz_drop_colorspace(ctx, colorspace); - /* Default background color is black. */ + bc = pdf_dict_get(ctx, obj, PDF_NAME_BC); + if (pdf_is_array(ctx, bc)) + { for (k = 0; k < colorspace_n; k++) - softmask_bc[k] = 0; - /* Which in CMYK means not all zeros! This should really be - * a test for subtractive color spaces, but this will have - * to do for now. */ - if (fz_colorspace_is_cmyk(ctx, colorspace)) - softmask_bc[3] = 1.0f; - fz_drop_colorspace(ctx, colorspace); - - bc = pdf_dict_get(ctx, obj, PDF_NAME_BC); - if (pdf_is_array(ctx, bc)) - { - for (k = 0; k < colorspace_n; k++) - softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k)); - } + softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k)); + } - s = pdf_dict_get(ctx, obj, PDF_NAME_S); - if (pdf_name_eq(ctx, s, PDF_NAME_Luminosity)) - luminosity = 1; - else - luminosity = 0; + s = pdf_dict_get(ctx, obj, PDF_NAME_S); + if (pdf_name_eq(ctx, s, PDF_NAME_Luminosity)) + luminosity = 1; + else + luminosity = 0; - tr = pdf_dict_get(ctx, obj, PDF_NAME_TR); - if (tr && !pdf_name_eq(ctx, tr, PDF_NAME_Identity)) - fz_warn(ctx, "ignoring transfer function"); + tr = pdf_dict_get(ctx, obj, PDF_NAME_TR); + if (tr && !pdf_name_eq(ctx, tr, PDF_NAME_Identity)) + fz_warn(ctx, "ignoring transfer function"); - proc->op_gs_SMask(ctx, proc, xobj, csi->rdb, softmask_bc, luminosity); - } - fz_always(ctx) - { - pdf_drop_xobject(ctx, xobj); - } - fz_catch(ctx) - { - fz_rethrow(ctx); - } + proc->op_gs_SMask(ctx, proc, xobj, csi->rdb, softmask_bc, luminosity); } else if (pdf_is_name(ctx, obj) && pdf_name_eq(ctx, obj, PDF_NAME_None)) { @@ -344,16 +329,7 @@ pdf_process_Do(fz_context *ctx, pdf_processor *proc, pdf_csi *csi) if (pdf_name_eq(ctx, subtype, PDF_NAME_Form)) { if (proc->op_Do_form) - { - pdf_xobject *form = pdf_load_xobject(ctx, csi->doc, xobj); - - fz_try(ctx) - proc->op_Do_form(ctx, proc, csi->name, form, csi->rdb); - fz_always(ctx) - pdf_drop_xobject(ctx, form); - fz_catch(ctx) - fz_rethrow(ctx); - } + proc->op_Do_form(ctx, proc, csi->name, xobj, csi->rdb); } else if (pdf_name_eq(ctx, subtype, PDF_NAME_Image)) diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c index 95edea46..8774fd4f 100644 --- a/source/pdf/pdf-op-buffer.c +++ b/source/pdf/pdf-op-buffer.c @@ -727,7 +727,7 @@ pdf_out_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_imag } static void -pdf_out_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources) +pdf_out_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources) { fz_output *out = ((pdf_output_processor*)proc)->out; fz_write_printf(ctx, out, "/%s Do\n", name); diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c index 237287fe..58fd129f 100644 --- a/source/pdf/pdf-op-filter.c +++ b/source/pdf/pdf-op-filter.c @@ -785,7 +785,7 @@ pdf_filter_gs_ca(fz_context *ctx, pdf_processor *proc, float alpha) } static void -pdf_filter_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *smask, pdf_obj *page_resources, float *bc, int luminosity) +pdf_filter_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_obj *smask, pdf_obj *page_resources, float *bc, int luminosity) { pdf_filter_processor *p = (pdf_filter_processor*)proc; if (p->chain->op_gs_SMask) @@ -1400,7 +1400,7 @@ pdf_filter_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_i } static void -pdf_filter_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources) +pdf_filter_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources) { pdf_filter_processor *p = (pdf_filter_processor*)proc; filter_flush(ctx, p, FLUSH_ALL); diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index f16d228b..305cd774 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -13,7 +13,7 @@ typedef struct pdf_material_s pdf_material; typedef struct pdf_run_processor_s pdf_run_processor; -static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask); +static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_obj *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask); enum { @@ -58,7 +58,7 @@ struct pdf_gstate_s /* transparency */ int blendmode; - pdf_xobject *softmask; + pdf_obj *softmask; pdf_obj *softmask_resources; fz_matrix softmask_ctm; float softmask_bc[FZ_MAX_COLORS]; @@ -94,7 +94,7 @@ typedef struct softmask_save_s softmask_save; struct softmask_save_s { - pdf_xobject *softmask; + pdf_obj *softmask; pdf_obj *page_resources; fz_matrix ctm; }; @@ -103,7 +103,7 @@ static pdf_gstate * begin_softmask(fz_context *ctx, pdf_run_processor *pr, softmask_save *save) { pdf_gstate *gstate = pr->gstate + pr->gtop; - pdf_xobject *softmask = gstate->softmask; + pdf_obj *softmask = gstate->softmask; fz_rect mask_bbox; fz_matrix tos_save[2], save_ctm; fz_matrix mask_matrix; @@ -248,8 +248,8 @@ pdf_copy_pattern_gstate(fz_context *ctx, pdf_gstate *gs, const pdf_gstate *old) pdf_drop_font(ctx, gs->text.font); gs->text.font = pdf_keep_font(ctx, old->text.font); - pdf_drop_xobject(ctx, gs->softmask); - gs->softmask = pdf_keep_xobject(ctx, old->softmask); + pdf_drop_obj(ctx, gs->softmask); + gs->softmask = pdf_keep_obj(ctx, old->softmask); fz_drop_stroke_state(ctx, gs->stroke_state); gs->stroke_state = fz_keep_stroke_state(ctx, old->stroke_state); @@ -277,7 +277,7 @@ pdf_keep_gstate(fz_context *ctx, pdf_gstate *gs) if (gs->text.font) pdf_keep_font(ctx, gs->text.font); if (gs->softmask) - pdf_keep_xobject(ctx, gs->softmask); + pdf_keep_obj(ctx, gs->softmask); if (gs->softmask_resources) pdf_keep_obj(ctx, gs->softmask_resources); fz_keep_stroke_state(ctx, gs->stroke_state); @@ -289,7 +289,7 @@ pdf_drop_gstate(fz_context *ctx, pdf_gstate *gs) pdf_drop_material(ctx, &gs->stroke); pdf_drop_material(ctx, &gs->fill); pdf_drop_font(ctx, gs->text.font); - pdf_drop_xobject(ctx, gs->softmask); + pdf_drop_obj(ctx, gs->softmask); pdf_drop_obj(ctx, gs->softmask_resources); fz_drop_stroke_state(ctx, gs->stroke_state); } @@ -385,7 +385,7 @@ pdf_show_pattern(fz_context *ctx, pdf_run_processor *pr, pdf_pattern *pat, pdf_g /* don't apply soft masks to objects in the pattern as well */ if (gstate->softmask) { - pdf_drop_xobject(ctx, gstate->softmask); + pdf_drop_obj(ctx, gstate->softmask); gstate->softmask = NULL; } @@ -1190,7 +1190,7 @@ pdf_set_pattern(fz_context *ctx, pdf_run_processor *pr, int what, pdf_pattern *p } static void -pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask) +pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_obj *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask) { pdf_run_processor *pr = (pdf_run_processor *)proc; pdf_gstate *gstate = NULL; @@ -1211,7 +1211,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf fz_default_colorspaces *saved_def_cs = NULL; /* Avoid infinite recursion */ - if (xobj == NULL || pdf_mark_obj(ctx, xobj->obj)) + if (xobj == NULL || pdf_mark_obj(ctx, xobj)) return; fz_var(cleanup_state); @@ -1300,12 +1300,12 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf if (pr->default_cs != saved_def_cs) fz_set_default_colorspaces(ctx, pr->dev, pr->default_cs); - doc = pdf_get_bound_document(ctx, xobj->obj); + doc = pdf_get_bound_document(ctx, xobj); oldbot = pr->gbot; pr->gbot = pr->gtop; - pdf_process_contents(ctx, (pdf_processor*)pr, doc, resources, xobj->obj, NULL); + pdf_process_contents(ctx, (pdf_processor*)pr, doc, resources, xobj, NULL); } fz_always(ctx) { @@ -1378,7 +1378,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf while (oldtop < pr->gtop) pdf_grestore(ctx, pr); - pdf_unmark_obj(ctx, xobj->obj); + pdf_unmark_obj(ctx, xobj); } fz_catch(ctx) { @@ -1525,7 +1525,7 @@ static void pdf_run_gs_ca(fz_context *ctx, pdf_processor *proc, float alpha) gstate->fill.alpha = fz_clamp(alpha, 0, 1); } -static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *smask, pdf_obj *page_resources, float *bc, int luminosity) +static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_obj *smask, pdf_obj *page_resources, float *bc, int luminosity) { pdf_run_processor *pr = (pdf_run_processor *)proc; pdf_gstate *gstate = pdf_flush_text(ctx, pr); @@ -1533,7 +1533,7 @@ static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject * if (gstate->softmask) { - pdf_drop_xobject(ctx, gstate->softmask); + pdf_drop_obj(ctx, gstate->softmask); gstate->softmask = NULL; pdf_drop_obj(ctx, gstate->softmask_resources); gstate->softmask_resources = NULL; @@ -1546,7 +1546,7 @@ static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject * if (cs) cs_n = fz_colorspace_n(ctx, cs); gstate->softmask_ctm = gstate->ctm; - gstate->softmask = pdf_keep_xobject(ctx, smask); + gstate->softmask = pdf_keep_obj(ctx, smask); gstate->softmask_resources = pdf_keep_obj(ctx, page_resources); for (i = 0; i < cs_n; ++i) gstate->softmask_bc[i] = bc[i]; @@ -2000,7 +2000,7 @@ static void pdf_run_Do_image(fz_context *ctx, pdf_processor *proc, const char *n pdf_show_image(ctx, pr, image); } -static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources) +static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources) { pdf_run_xobject(ctx, (pdf_run_processor*)proc, xobj, page_resources, &fz_identity, 0); } @@ -2074,7 +2074,7 @@ pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc) pdf_drop_material(ctx, &pr->gstate[0].fill); pdf_drop_material(ctx, &pr->gstate[0].stroke); pdf_drop_font(ctx, pr->gstate[0].text.font); - pdf_drop_xobject(ctx, pr->gstate[0].softmask); + pdf_drop_obj(ctx, pr->gstate[0].softmask); fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state); while (pr->gstate[0].clip_depth--) diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c index bac856fd..975b3e76 100644 --- a/source/pdf/pdf-xobject.c +++ b/source/pdf/pdf-xobject.c @@ -1,71 +1,43 @@ #include "mupdf/fitz.h" #include "mupdf/pdf.h" -pdf_xobject * -pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj) -{ - return fz_keep_storable(ctx, &xobj->storable); -} - -void -pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj) -{ - fz_drop_storable(ctx, &xobj->storable); -} - -static void -pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_) -{ - pdf_xobject *xobj = (pdf_xobject *)xobj_; - pdf_drop_obj(ctx, xobj->obj); - fz_free(ctx, xobj); -} - -static size_t -pdf_xobject_size(pdf_xobject *xobj) -{ - if (xobj == NULL) - return 0; - return sizeof(*xobj); -} - pdf_obj * -pdf_xobject_resources(fz_context *ctx, pdf_xobject *xobj) +pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj) { - return pdf_dict_get(ctx, xobj->obj, PDF_NAME_Resources); + return pdf_dict_get(ctx, xobj, PDF_NAME_Resources); } fz_rect * -pdf_xobject_bbox(fz_context *ctx, pdf_xobject *xobj, fz_rect *bbox) +pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj, fz_rect *bbox) { - return pdf_to_rect(ctx, pdf_dict_get(ctx, xobj->obj, PDF_NAME_BBox), bbox); + return pdf_to_rect(ctx, pdf_dict_get(ctx, xobj, PDF_NAME_BBox), bbox); } fz_matrix * -pdf_xobject_matrix(fz_context *ctx, pdf_xobject *xobj, fz_matrix *matrix) +pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj, fz_matrix *matrix) { - return pdf_to_matrix(ctx, pdf_dict_get(ctx, xobj->obj, PDF_NAME_Matrix), matrix); + return pdf_to_matrix(ctx, pdf_dict_get(ctx, xobj, PDF_NAME_Matrix), matrix); } -int pdf_xobject_isolated(fz_context *ctx, pdf_xobject *xobj) +int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj) { - pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group); + pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group); if (group) return pdf_to_bool(ctx, pdf_dict_get(ctx, group, PDF_NAME_I)); return 0; } -int pdf_xobject_knockout(fz_context *ctx, pdf_xobject *xobj) +int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj) { - pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group); + pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group); if (group) return pdf_to_bool(ctx, pdf_dict_get(ctx, group, PDF_NAME_K)); return 0; } -int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj) +int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj) { - pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group); + pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group); if (group) if (pdf_name_eq(ctx, pdf_dict_get(ctx, group, PDF_NAME_S), PDF_NAME_Transparency)) return 1; @@ -73,9 +45,9 @@ int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj) } fz_colorspace * -pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj) +pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj) { - pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group); + pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group); if (group) { pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME_CS); @@ -92,43 +64,15 @@ pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj) return NULL; } -pdf_xobject * -pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict) -{ - pdf_xobject *form; - - if (!pdf_is_stream(ctx, dict)) - fz_throw(ctx, FZ_ERROR_SYNTAX, "XObject must be a stream"); - - if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL) - return form; - - form = fz_malloc_struct(ctx, pdf_xobject); - FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp); - form->obj = NULL; - form->iteration = 0; - - /* Store item immediately, to avoid possible recursion if objects refer back to this one */ - pdf_store_item(ctx, dict, form, pdf_xobject_size(form)); - - form->obj = pdf_keep_obj(ctx, dict); - - return form; -} - pdf_obj * pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) { - int idict_num; - pdf_obj *idict = NULL; + pdf_obj *form = NULL; pdf_obj *dict = NULL; - pdf_xobject *form = NULL; pdf_obj *res = NULL; pdf_obj *procset; - fz_var(idict); fz_var(dict); - fz_var(form); fz_var(res); fz_try(ctx) @@ -150,36 +94,22 @@ pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const f pdf_dict_put(ctx, dict, PDF_NAME_Subtype, PDF_NAME_Form); pdf_dict_put(ctx, dict, PDF_NAME_Type, PDF_NAME_XObject); - form = fz_malloc_struct(ctx, pdf_xobject); - FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp); - form->obj = NULL; - form->iteration = 0; - - idict_num = pdf_create_object(ctx, doc); - pdf_update_object(ctx, doc, idict_num, dict); - idict = pdf_new_indirect(ctx, doc, idict_num, 0); - - pdf_store_item(ctx, idict, form, pdf_xobject_size(form)); - - form->obj = pdf_keep_obj(ctx, idict); + form = pdf_add_object(ctx, doc, dict); } fz_always(ctx) { pdf_drop_obj(ctx, dict); pdf_drop_obj(ctx, res); - pdf_drop_xobject(ctx, form); } fz_catch(ctx) { - pdf_drop_obj(ctx, idict); fz_rethrow(ctx); } - return idict; + return form; } -void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer) +void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *buffer) { - pdf_update_stream(ctx, doc, form->obj, buffer, 0); - form->iteration ++; + pdf_update_stream(ctx, doc, form, buffer, 0); } -- cgit v1.2.3