summaryrefslogtreecommitdiff
path: root/source
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 /source
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.
Diffstat (limited to 'source')
-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
7 files changed, 23 insertions, 35 deletions
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
}
}