diff options
Diffstat (limited to 'mupdf/pdf_xobject.c')
-rw-r--r-- | mupdf/pdf_xobject.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/mupdf/pdf_xobject.c b/mupdf/pdf_xobject.c new file mode 100644 index 00000000..473a1485 --- /dev/null +++ b/mupdf/pdf_xobject.c @@ -0,0 +1,102 @@ +#include <fitz.h> +#include <mupdf.h> + +fz_error * +pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) +{ + fz_error *error; + pdf_xobject *form; + fz_obj *obj; + + if ((*formp = pdf_finditem(xref->store, PDF_KXOBJECT, ref))) + { + pdf_keepxobject(*formp); + return nil; + } + + form = fz_malloc(sizeof(pdf_xobject)); + if (!form) + return fz_outofmem; + + form->refs = 1; + form->resources = nil; + form->contents = nil; + + pdf_logrsrc("load xobject %d %d (%p) {\n", fz_tonum(ref), fz_togen(ref), form); + + obj = fz_dictgets(dict, "BBox"); + form->bbox = pdf_torect(obj); + + pdf_logrsrc("bbox [%g %g %g %g]\n", + form->bbox.min.x, form->bbox.min.y, + form->bbox.max.x, form->bbox.max.y); + + obj = fz_dictgets(dict, "Matrix"); + if (obj) + form->matrix = pdf_tomatrix(obj); + else + form->matrix = fz_identity(); + + pdf_logrsrc("matrix [%g %g %g %g %g %g]\n", + form->matrix.a, form->matrix.b, + form->matrix.c, form->matrix.d, + form->matrix.e, form->matrix.f); + + obj = fz_dictgets(dict, "Resources"); + if (obj) + { + error = pdf_resolve(&obj, xref); + if (error) + { + pdf_dropxobject(form); + return error; + } + error = pdf_loadresources(&form->resources, xref, obj); + fz_dropobj(obj); + if (error) + { + pdf_dropxobject(form); + return error; + } + } + + error = pdf_loadstream(&form->contents, xref, fz_tonum(ref), fz_togen(ref)); + if (error) + { + pdf_dropxobject(form); + return error; + } + + pdf_logrsrc("stream %d bytes\n", form->contents->wp - form->contents->rp); + + pdf_logrsrc("}\n"); + + error = pdf_storeitem(xref->store, PDF_KXOBJECT, ref, form); + if (error) + { + pdf_dropxobject(form); + return error; + } + + *formp = form; + return nil; +} + +pdf_xobject * +pdf_keepxobject(pdf_xobject *xobj) +{ + xobj->refs ++; + return xobj; +} + +void +pdf_dropxobject(pdf_xobject *xobj) +{ + if (--xobj->refs == 0) + { + if (xobj->contents) fz_dropbuffer(xobj->contents); + if (xobj->resources) fz_dropobj(xobj->resources); + fz_free(xobj); + } +} + |