From a1feb3abb2821a0f8e00d146e6426ecdb9922b94 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 22 Aug 2018 11:58:23 +0200 Subject: Remove the old 'nested depth' tracking. This was used to prevent infinite cycles in the Type3 font CharProcs, but the previous commits forbids all cycles in order to prevent memory leaks due to cyclic reference counts. --- include/mupdf/fitz/glyph-cache.h | 4 ++-- include/mupdf/pdf/font.h | 6 +++--- include/mupdf/pdf/interpret.h | 6 +----- source/fitz/font-imp.h | 2 +- source/fitz/font.c | 8 ++++---- source/pdf/pdf-font.c | 4 ++-- source/pdf/pdf-interpret.c | 8 ++++---- source/pdf/pdf-op-run.c | 17 ++++------------- source/pdf/pdf-run.c | 11 ++++------- source/pdf/pdf-type3.c | 8 ++++---- 10 files changed, 29 insertions(+), 45 deletions(-) diff --git a/include/mupdf/fitz/glyph-cache.h b/include/mupdf/fitz/glyph-cache.h index caedf117..07d84589 100644 --- a/include/mupdf/fitz/glyph-cache.h +++ b/include/mupdf/fitz/glyph-cache.h @@ -8,8 +8,8 @@ void fz_purge_glyph_cache(fz_context *ctx); fz_pixmap *fz_render_glyph_pixmap(fz_context *ctx, fz_font*, int, fz_matrix *, const fz_irect *scissor, int aa); -void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate, int nested_depth, fz_default_colorspaces *def_cs); -void fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth); +void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate, fz_default_colorspaces *def_cs); +void fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid); void fz_dump_glyph_cache_stats(fz_context *ctx); float fz_subpixel_adjust(fz_context *ctx, fz_matrix *ctm, fz_matrix *subpix_ctm, unsigned char *qe, unsigned char *qf); diff --git a/include/mupdf/pdf/font.h b/include/mupdf/pdf/font.h index b0f0cdb7..812377e5 100644 --- a/include/mupdf/pdf/font.h +++ b/include/mupdf/pdf/font.h @@ -115,8 +115,8 @@ int pdf_font_cid_to_gid(fz_context *ctx, pdf_font_desc *fontdesc, int cid); const unsigned char *pdf_lookup_substitute_font(fz_context *ctx, int mono, int serif, int bold, int italic, int *len); pdf_font_desc *pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *obj); -void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth); -pdf_font_desc *pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *obj, int nested_depth); +void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc); +pdf_font_desc *pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *obj); pdf_font_desc *pdf_load_hail_mary_font(fz_context *ctx, pdf_document *doc); pdf_font_desc *pdf_new_font_desc(fz_context *ctx); @@ -125,7 +125,7 @@ void pdf_drop_font(fz_context *ctx, pdf_font_desc *font); void pdf_print_font(fz_context *ctx, fz_output *out, pdf_font_desc *fontdesc); -void pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, int nested_depth, fz_default_colorspaces *default_cs); +void pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, fz_default_colorspaces *default_cs); pdf_obj *pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font, int encoding); pdf_obj *pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font); diff --git a/include/mupdf/pdf/interpret.h b/include/mupdf/pdf/interpret.h index 554ce4c7..e16b94af 100644 --- a/include/mupdf/pdf/interpret.h +++ b/include/mupdf/pdf/interpret.h @@ -179,12 +179,8 @@ struct pdf_csi_s defined within the PDF reference manual, and others are possible. gstate: The initial graphics state. - - nested: The nested depth of this interpreter. This should be - 0 for an initial call, and will be incremented in nested calls - due to Type 3 fonts. */ -pdf_processor *pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char *usage, pdf_gstate *gstate, int nested, fz_default_colorspaces *default_cs); +pdf_processor *pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char *usage, pdf_gstate *gstate, fz_default_colorspaces *default_cs); /* pdf_new_buffer_processor: Create a buffer processor. This diff --git a/source/fitz/font-imp.h b/source/fitz/font-imp.h index 383d7d21..9a167792 100644 --- a/source/fitz/font-imp.h +++ b/source/fitz/font-imp.h @@ -19,7 +19,7 @@ struct fz_font_s float *t3widths; /* has 256 entries if used */ unsigned short *t3flags; /* has 256 entries if used */ void *t3doc; /* a pdf_document for the callback */ - void (*t3run)(fz_context *ctx, void *doc, void *resources, fz_buffer *contents, struct fz_device_s *dev, fz_matrix ctm, void *gstate, int nested_depth, fz_default_colorspaces *default_cs); + void (*t3run)(fz_context *ctx, void *doc, void *resources, fz_buffer *contents, struct fz_device_s *dev, fz_matrix ctm, void *gstate, fz_default_colorspaces *default_cs); void (*t3freeres)(fz_context *ctx, void *doc, void *resources); fz_rect bbox; /* font bbox is used only for t3 fonts */ diff --git a/source/fitz/font.c b/source/fitz/font.c index 97c5347e..f9609aec 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1325,7 +1325,7 @@ fz_bound_t3_glyph(fz_context *ctx, fz_font *font, int gid) } void -fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) +fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid) { fz_buffer *contents; fz_device *dev; @@ -1351,7 +1351,7 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) FZ_DEVFLAG_LINEWIDTH_UNDEFINED; fz_try(ctx) { - font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, fz_identity, NULL, 0, NULL); + font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, fz_identity, NULL, NULL); fz_close_device(ctx, dev); font->t3flags[gid] = dev->flags; d1_rect = dev->d1_rect; @@ -1492,7 +1492,7 @@ fz_render_t3_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix trm, fz_co } void -fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate, int nested_depth, fz_default_colorspaces *def_cs) +fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate, fz_default_colorspaces *def_cs) { fz_matrix ctm; void *contents; @@ -1518,7 +1518,7 @@ fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gi } ctm = fz_concat(font->t3matrix, trm); - font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, ctm, gstate, nested_depth, def_cs); + font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, ctm, gstate, def_cs); } fz_rect diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index 001f999b..3dae9884 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -1379,7 +1379,7 @@ pdf_make_width_table(fz_context *ctx, pdf_font_desc *fontdesc) } pdf_font_desc * -pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth) +pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) { pdf_obj *subtype; pdf_obj *dfonts; @@ -1437,7 +1437,7 @@ pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, i /* Load CharProcs */ if (type3) - pdf_load_type3_glyphs(ctx, doc, fontdesc, nested_depth); + pdf_load_type3_glyphs(ctx, doc, fontdesc); pdf_store_item(ctx, dict, fontdesc, fontdesc->size); } diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c index 55416b90..e4e34ee9 100644 --- a/source/pdf/pdf-interpret.c +++ b/source/pdf/pdf-interpret.c @@ -64,13 +64,13 @@ pdf_clear_stack(fz_context *ctx, pdf_csi *csi) } static pdf_font_desc * -load_font_or_hail_mary(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *font, int depth, fz_cookie *cookie) +load_font_or_hail_mary(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *font, fz_cookie *cookie) { pdf_font_desc *desc; fz_try(ctx) { - desc = pdf_load_font(ctx, doc, rdb, font, depth); + desc = pdf_load_font(ctx, doc, rdb, font); } fz_catch(ctx) { @@ -192,7 +192,7 @@ pdf_process_extgstate(fz_context *ctx, pdf_processor *proc, pdf_csi *csi, pdf_ob { pdf_obj *font_ref = pdf_array_get(ctx, obj, 0); pdf_obj *font_size = pdf_array_get(ctx, obj, 1); - pdf_font_desc *font = load_font_or_hail_mary(ctx, csi->doc, csi->rdb, font_ref, 0, csi->cookie); + pdf_font_desc *font = load_font_or_hail_mary(ctx, csi->doc, csi->rdb, font_ref, csi->cookie); fz_try(ctx) proc->op_Tf(ctx, proc, "ExtGState", font, pdf_to_real(ctx, font_size)); fz_always(ctx) @@ -657,7 +657,7 @@ pdf_process_keyword(fz_context *ctx, pdf_processor *proc, pdf_csi *csi, fz_strea fontobj = pdf_dict_gets(ctx, fontres, csi->name); if (!fontobj) fz_throw(ctx, FZ_ERROR_SYNTAX, "cannot find Font resource '%s'", csi->name); - font = load_font_or_hail_mary(ctx, csi->doc, csi->rdb, fontobj, 0, csi->cookie); + font = load_font_or_hail_mary(ctx, csi->doc, csi->rdb, fontobj, csi->cookie); fz_try(ctx) proc->op_Tf(ctx, proc, csi->name, font, s[0]); fz_always(ctx) diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index 041a617a..aa7bc985 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -72,8 +72,6 @@ struct pdf_run_processor_s fz_default_colorspaces *default_cs; - int nested_depth; - /* path object state */ fz_path *path; int clip; @@ -903,9 +901,8 @@ pdf_show_char(fz_context *ctx, pdf_run_processor *pr, int cid) gid = pdf_tos_make_trm(ctx, &pr->tos, &gstate->text, fontdesc, cid, &trm); - /* If we are a type3 font within a type 3 font, or are otherwise - * uncachable, then render direct. */ - render_direct = (!fz_font_ft_face(ctx, fontdesc->font) && pr->nested_depth > 0) || !fz_glyph_cacheable(ctx, fontdesc->font, gid); + /* If we are uncachable, then render direct. */ + render_direct = !fz_glyph_cacheable(ctx, fontdesc->font, gid); /* flush buffered text if rendermode has changed */ if (!pr->tos.text || gstate->text.render != pr->tos.text_mode || render_direct) @@ -920,7 +917,7 @@ pdf_show_char(fz_context *ctx, pdf_run_processor *pr, int cid) * type3 glyphs that seem to inherit current graphics * attributes, or type 3 glyphs within type3 glyphs). */ fz_matrix composed = fz_concat(trm, gstate->ctm); - fz_render_t3_glyph_direct(ctx, pr->dev, fontdesc->font, gid, composed, gstate, pr->nested_depth, pr->default_cs); + fz_render_t3_glyph_direct(ctx, pr->dev, fontdesc->font, gid, composed, gstate, pr->default_cs); /* Render text invisibly so that it can still be extracted. */ pr->tos.text_mode = 3; } @@ -1831,16 +1828,12 @@ static void pdf_run_dquote(fz_context *ctx, pdf_processor *proc, float aw, float static void pdf_run_d0(fz_context *ctx, pdf_processor *proc, float wx, float wy) { pdf_run_processor *pr = (pdf_run_processor *)proc; - if (pr->nested_depth > 1) - return; pr->dev->flags |= FZ_DEVFLAG_COLOR; } static void pdf_run_d1(fz_context *ctx, pdf_processor *proc, float wx, float wy, float llx, float lly, float urx, float ury) { pdf_run_processor *pr = (pdf_run_processor *)proc; - if (pr->nested_depth > 1) - return; pr->dev->flags |= FZ_DEVFLAG_MASK | FZ_DEVFLAG_BBOX_DEFINED; pr->dev->flags &= ~(FZ_DEVFLAG_FILLCOLOR_UNDEFINED | FZ_DEVFLAG_STROKECOLOR_UNDEFINED | @@ -2081,7 +2074,7 @@ pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc) } pdf_processor * -pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char *usage, pdf_gstate *gstate, int nested, fz_default_colorspaces *default_cs) +pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char *usage, pdf_gstate *gstate, fz_default_colorspaces *default_cs) { pdf_run_processor *proc = pdf_new_processor(ctx, sizeof *proc); { @@ -2215,8 +2208,6 @@ pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char proc->default_cs = fz_keep_default_colorspaces(ctx, default_cs); - proc->nested_depth = nested; - proc->path = NULL; proc->clip = 0; proc->clip_even_odd = 0; diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c index c9e56622..4d607cc7 100644 --- a/source/pdf/pdf-run.c +++ b/source/pdf/pdf-run.c @@ -33,7 +33,7 @@ pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf fz_try(ctx) { - proc = pdf_new_run_processor(ctx, dev, ctm, usage, NULL, 0, default_cs); + proc = pdf_new_run_processor(ctx, dev, ctm, usage, NULL, default_cs); pdf_process_annot(ctx, proc, doc, page, annot, cookie); pdf_close_processor(ctx, proc); } @@ -96,7 +96,7 @@ pdf_run_page_contents_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *p colorspace = NULL; } - proc = pdf_new_run_processor(ctx, dev, ctm, usage, NULL, 0, default_cs); + proc = pdf_new_run_processor(ctx, dev, ctm, usage, NULL, default_cs); pdf_process_contents(ctx, proc, doc, resources, contents, cookie); pdf_close_processor(ctx, proc); } @@ -227,14 +227,11 @@ pdf_run_page(fz_context *ctx, pdf_page *page, fz_device *dev, fz_matrix ctm, fz_ } void -pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, int nested_depth, fz_default_colorspaces *default_cs) +pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, fz_default_colorspaces *default_cs) { pdf_processor *proc; - if (nested_depth > 10) - fz_throw(ctx, FZ_ERROR_GENERIC, "Too many nestings of Type3 glyphs"); - - proc = pdf_new_run_processor(ctx, dev, ctm, "View", gstate, nested_depth+1, default_cs); + proc = pdf_new_run_processor(ctx, dev, ctm, "View", gstate, default_cs); fz_try(ctx) { pdf_process_glyph(ctx, proc, doc, resources, contents); diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c index d94cfb5b..27906c58 100644 --- a/source/pdf/pdf-type3.c +++ b/source/pdf/pdf-type3.c @@ -4,9 +4,9 @@ #include "../fitz/font-imp.h" static void -pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, int nested_depth, fz_default_colorspaces *default_cs) +pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate, fz_default_colorspaces *default_cs) { - pdf_run_glyph(ctx, doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth, default_cs); + pdf_run_glyph(ctx, doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, default_cs); } static void @@ -190,7 +190,7 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d return fontdesc; } -void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth) +void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc) { int i; @@ -200,7 +200,7 @@ void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fo { if (fontdesc->font->t3procs[i]) { - fz_prepare_t3_glyph(ctx, fontdesc->font, i, nested_depth); + fz_prepare_t3_glyph(ctx, fontdesc->font, i); fontdesc->size += 0; // TODO: display list size calculation } } -- cgit v1.2.3