summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-08-22 11:58:23 +0200
committerSebastian Rasmussen <sebras@gmail.com>2018-08-22 19:38:10 +0800
commita1feb3abb2821a0f8e00d146e6426ecdb9922b94 (patch)
tree1db9ccd42ad4b8b01155a687b6759aa6e7322147
parent61574870c0fbe0bb76ea143f8b1ff38800fcdec7 (diff)
downloadmupdf-a1feb3abb2821a0f8e00d146e6426ecdb9922b94.tar.xz
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.
-rw-r--r--include/mupdf/fitz/glyph-cache.h4
-rw-r--r--include/mupdf/pdf/font.h6
-rw-r--r--include/mupdf/pdf/interpret.h6
-rw-r--r--source/fitz/font-imp.h2
-rw-r--r--source/fitz/font.c8
-rw-r--r--source/pdf/pdf-font.c4
-rw-r--r--source/pdf/pdf-interpret.c8
-rw-r--r--source/pdf/pdf-op-run.c17
-rw-r--r--source/pdf/pdf-run.c11
-rw-r--r--source/pdf/pdf-type3.c8
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
}
}