summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@hotmail.com>2009-06-23 00:15:32 +0200
committerSebastian Rasmussen <sebras@hotmail.com>2009-06-23 00:15:32 +0200
commit44eb22213b1b5573e645a3b464df076a6f667420 (patch)
tree2567576b54b844408a702635e300df90c8f38346
parentfa6ce36dde8afa764bf71f84b04237edba1fb4ff (diff)
downloadmupdf-44eb22213b1b5573e645a3b464df076a6f667420.tar.xz
Handle JBIG2 stream global segment dictionary entry.
-rw-r--r--fitz/fitz_stream.h2
-rw-r--r--mupdf/mupdf.h2
-rw-r--r--mupdf/pdf_image.c2
-rw-r--r--mupdf/pdf_stream.c42
4 files changed, 37 insertions, 11 deletions
diff --git a/fitz/fitz_stream.h b/fitz/fitz_stream.h
index cbd80109..cbead237 100644
--- a/fitz/fitz_stream.h
+++ b/fitz/fitz_stream.h
@@ -268,6 +268,8 @@ fz_error fz_newpredicte(fz_filter **filterp, fz_obj *param);
fz_error fz_newjbig2d(fz_filter **filterp, fz_obj *param);
fz_error fz_newjpxd(fz_filter **filterp, fz_obj *param);
+fz_error fz_setjbig2dglobalstream(fz_filter *filter, unsigned char *buf, int len);
+
/*
* Basic crypto functions.
* Independent of the rest of fitz.
diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h
index 95df9f24..9100edee 100644
--- a/mupdf/mupdf.h
+++ b/mupdf/mupdf.h
@@ -148,7 +148,7 @@ fz_error pdf_loadindirect(fz_obj **objp, pdf_xref *, fz_obj *ref);
fz_error pdf_resolve(fz_obj **reforobj, pdf_xref *);
int pdf_isstream(pdf_xref *xref, int oid, int gen);
-fz_error pdf_buildinlinefilter(fz_filter **filterp, fz_obj *stmobj);
+fz_error pdf_buildinlinefilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj);
fz_error pdf_loadrawstream(fz_buffer **bufp, pdf_xref *xref, int oid, int gen);
fz_error pdf_loadstream(fz_buffer **bufp, pdf_xref *xref, int oid, int gen);
fz_error pdf_openrawstream(fz_stream **stmp, pdf_xref *, int oid, int gen);
diff --git a/mupdf/pdf_image.c b/mupdf/pdf_image.c
index c632eee8..83de575d 100644
--- a/mupdf/pdf_image.c
+++ b/mupdf/pdf_image.c
@@ -142,7 +142,7 @@ pdf_loadinlineimage(pdf_image **imgp, pdf_xref *xref,
{
fz_stream *tempfile;
- error = pdf_buildinlinefilter(&filter, dict);
+ error = pdf_buildinlinefilter(&filter, xref, dict);
if (error)
return error;
diff --git a/mupdf/pdf_stream.c b/mupdf/pdf_stream.c
index 77ff809a..e05bed65 100644
--- a/mupdf/pdf_stream.c
+++ b/mupdf/pdf_stream.c
@@ -26,7 +26,7 @@ pdf_isstream(pdf_xref *xref, int oid, int gen)
* Create a filter given a name and param dictionary.
*/
static fz_error
-buildonefilter(fz_filter **fp, fz_obj *f, fz_obj *p)
+buildonefilter(fz_filter **fp, pdf_xref *xref, fz_obj *f, fz_obj *p)
{
fz_filter *decompress;
fz_filter *predict;
@@ -111,7 +111,31 @@ buildonefilter(fz_filter **fp, fz_obj *f, fz_obj *p)
#ifdef HAVE_JBIG2DEC
else if (!strcmp(s, "JBIG2Decode"))
{
- /* TODO: extract and feed JBIG2Global */
+ if (fz_isdict(p))
+ {
+ fz_obj *obj = fz_dictgets(p, "JBIG2Globals");
+ if (obj)
+ {
+ fz_buffer *globals;
+
+ error = fz_newjbig2d(fp, p);
+ if (error)
+ return fz_rethrow(error, "cannot create jbig2 filter");
+
+ error = pdf_loadstream(&globals, xref, fz_tonum(obj), fz_togen(obj));
+ if (error)
+ return fz_rethrow(error, "cannot load jbig2 global segments");
+
+ error = fz_setjbig2dglobalstream(*fp, globals->rp, globals->wp - globals->rp);
+ if (error)
+ return fz_rethrow(error, "cannot apply jbig2 global segments");
+
+ fz_dropbuffer(globals);
+
+ return fz_okay;
+ }
+ }
+
error = fz_newjbig2d(fp, p);
}
#endif
@@ -137,7 +161,7 @@ buildonefilter(fz_filter **fp, fz_obj *f, fz_obj *p)
* Assume ownership of head.
*/
static fz_error
-buildfilterchain(fz_filter **filterp, fz_filter *head, fz_obj *fs, fz_obj *ps)
+buildfilterchain(fz_filter **filterp, pdf_xref *xref, fz_filter *head, fz_obj *fs, fz_obj *ps)
{
fz_error error;
fz_filter *newhead;
@@ -154,7 +178,7 @@ buildfilterchain(fz_filter **filterp, fz_filter *head, fz_obj *fs, fz_obj *ps)
else
p = nil;
- error = buildonefilter(&tail, f, p);
+ error = buildonefilter(&tail, xref, f, p);
if (error)
return fz_rethrow(error, "cannot create filter");
@@ -240,7 +264,7 @@ buildrawfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, int
* constraining to stream length, and without decryption.
*/
fz_error
-pdf_buildinlinefilter(fz_filter **filterp, fz_obj *stmobj)
+pdf_buildinlinefilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj)
{
fz_error error;
fz_obj *filters;
@@ -252,9 +276,9 @@ pdf_buildinlinefilter(fz_filter **filterp, fz_obj *stmobj)
if (filters)
{
if (fz_isname(filters))
- error = buildonefilter(filterp, filters, params);
+ error = buildonefilter(filterp, xref, filters, params);
else
- error = buildfilterchain(filterp, nil, filters, params);
+ error = buildfilterchain(filterp, xref, nil, filters, params);
}
else
error = fz_newnullfilter(filterp, -1);
@@ -304,7 +328,7 @@ pdf_buildfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, in
if (fz_isname(filters))
{
- error = buildonefilter(&tmp, filters, params);
+ error = buildonefilter(&tmp, xref, filters, params);
if (error)
{
error = fz_rethrow(error, "cannot create filter");
@@ -322,7 +346,7 @@ pdf_buildfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, in
}
else
{
- error = buildfilterchain(&pipe, base, filters, params);
+ error = buildfilterchain(&pipe, xref, base, filters, params);
if (error)
{
error = fz_rethrow(error, "cannot create filter chain");