summaryrefslogtreecommitdiff
path: root/pdf/pdf_xobject.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-05-07 11:30:05 +0100
committerRobin Watts <robin.watts@artifex.com>2012-05-08 15:14:57 +0100
commit636652daee46a9cf9836746135e3f9678db796ec (patch)
tree110e78a0ffcb4a873088c92864ff182d783fdbc3 /pdf/pdf_xobject.c
parent2433a4d16d114a0576e6a4ff9ca61ae4f29fdda0 (diff)
downloadmupdf-636652daee46a9cf9836746135e3f9678db796ec.tar.xz
Switch to reading content streams on the fly during interpretation.
Previously, before interpreting a pages content stream we would load it entirely into a buffer. Then we would interpret that buffer. This has a cost in memory use. Here, we update the code to read from a stream on the fly. This has required changes in various different parts of the code. Firstly, we have removed all use of the FILE lock - as stream reads can now safely be interrupted by resource (or object) reads from elsewhere in the file, the file lock becomes a very hard thing to maintain, and doesn't actually benefit us at all. The choices were to either use a recursive lock, or to remove it entirely; I opted for the latter. The file lock enum value remains as a placeholder for future use in extendable data streams. Secondly, we add a new 'concat' filter that concatenates a series of streams together into one, optionally putting whitespace between each stream (as the pdf parser requires this). Finally, we change page/xobject/pattern content streams to work on the fly, but we leave type3 glyphs using buffers (as presumably these will be run repeatedly).
Diffstat (limited to 'pdf/pdf_xobject.c')
-rw-r--r--pdf/pdf_xobject.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/pdf/pdf_xobject.c b/pdf/pdf_xobject.c
index ffa86184..1de0b20e 100644
--- a/pdf/pdf_xobject.c
+++ b/pdf/pdf_xobject.c
@@ -23,7 +23,8 @@ pdf_free_xobject_imp(fz_context *ctx, fz_storable *xobj_)
if (xobj->resources)
pdf_drop_obj(xobj->resources);
if (xobj->contents)
- fz_drop_buffer(ctx, xobj->contents);
+ //fz_drop_buffer(ctx, xobj->contents);
+ pdf_drop_obj(xobj->contents);
pdf_drop_obj(xobj->me);
fz_free(ctx, xobj);
}
@@ -33,7 +34,7 @@ pdf_xobject_size(pdf_xobject *xobj)
{
if (xobj == NULL)
return 0;
- return sizeof(*xobj) + (xobj->colorspace ? xobj->colorspace->size : 0) + (xobj->contents ? xobj->contents->len : 0);
+ return sizeof(*xobj) + (xobj->colorspace ? xobj->colorspace->size : 0);
}
pdf_xobject *
@@ -98,7 +99,7 @@ pdf_load_xobject(pdf_document *xref, pdf_obj *dict)
fz_try(ctx)
{
- form->contents = pdf_load_stream(xref, pdf_to_num(dict), pdf_to_gen(dict));
+ form->contents = pdf_keep_obj(dict);
}
fz_catch(ctx)
{