summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO24
-rw-r--r--include/mupdf/syntax.h3
-rw-r--r--mupdf/build.c20
-rw-r--r--mupdf/page.c7
-rw-r--r--mupdf/parse.c26
-rw-r--r--mupdf/pattern.c16
-rw-r--r--mupdf/type3.c13
-rw-r--r--mupdf/xobject.c14
-rw-r--r--object/parse.c1
-rw-r--r--render/rastppc.c2
10 files changed, 71 insertions, 55 deletions
diff --git a/TODO b/TODO
index 2cf21011..85462d64 100644
--- a/TODO
+++ b/TODO
@@ -1,20 +1,22 @@
immediate plan:
- 1 - pdf_resolve remake
- 2 - refcount resources
- 3 - put image load/scale into rastfuncs
- 4 - altivec optimize
- 5 - gtk+pdf
- 6 - page labels + dests + outline + annots
- 7 - global font/cmap cache
+ - refcount resources
+ - put image load/scale into rastfuncs
+ - altivec optimize
+ - gtk+pdf
+ - page labels + dests + outline + annots
+ - global font/cmap cache
+ - design gui for editor
+ - talk to keithp about fontconfig cid-font + cmap support
+ - go through spec and check all features!
+ - font and cmap config (where to load cmap and which cid fonts)
---
colorspace conversions (v2)
- - cal*
- - iccbased
- - how to normalize Lab components to 0..1
- fast color cubes
- - how to cache colorspace cubes (what key?)
+ - proper colorspace conversions
+ - gamut compression
+ - extended render intents
image rendering (v2)
- tiles
diff --git a/include/mupdf/syntax.h b/include/mupdf/syntax.h
index a56c5f18..786147bd 100644
--- a/include/mupdf/syntax.h
+++ b/include/mupdf/syntax.h
@@ -25,6 +25,9 @@ fz_error *pdf_parsedict(fz_obj **op, fz_file *f, char *buf, int cap);
fz_error *pdf_parsestmobj(fz_obj **op, fz_file *f, char *buf, int cap);
fz_error *pdf_parseindobj(fz_obj **op, fz_file *f, char *buf, int cap, int *oid, int *gid, int *stmofs);
+fz_rect pdf_torect(fz_obj *array);
+fz_matrix pdf_tomatrix(fz_obj *array);
+
/*
* Encryption
*/
diff --git a/mupdf/build.c b/mupdf/build.c
index fe5ab95b..18a1d053 100644
--- a/mupdf/build.c
+++ b/mupdf/build.c
@@ -258,11 +258,14 @@ addpatternshape(pdf_gstate *gs, fz_node *shape,
fz_node *xform;
fz_node *over;
fz_node *mask;
+ fz_node *meta;
fz_node *link;
fz_matrix ctm;
fz_matrix inv;
fz_matrix ptm;
fz_rect bbox;
+ fz_obj *name;
+ fz_obj *dict;
int x, y, x0, y0, x1, y1;
/* patterns are painted in user space */
@@ -276,11 +279,26 @@ addpatternshape(pdf_gstate *gs, fz_node *shape,
error = fz_newtransformnode(&xform, ptm);
if (error) return error;
+ error = fz_newname(&name, "Pattern");
+ if (error) return error;
+
+ error = fz_packobj(&dict, "<< /Tree %p /XStep %f /YStep %f "
+ " /Matrix[%f %f %f %f %f %f] >>",
+ pat->tree, pat->xstep, pat->ystep,
+ pat->matrix.a, pat->matrix.b,
+ pat->matrix.c, pat->matrix.d,
+ pat->matrix.e, pat->matrix.f);
+ if (error) return error;
+
+ error = fz_newmetanode(&meta, name, dict);
+ if (error) return error;
+
error = fz_newovernode(&over);
if (error) return error;
fz_insertnodelast(mask, shape);
- fz_insertnodelast(mask, xform);
+ fz_insertnodelast(mask, meta);
+ fz_insertnodelast(meta, xform);
fz_insertnodelast(xform, over);
/* get bbox of shape in pattern space for stamping */
diff --git a/mupdf/page.c b/mupdf/page.c
index 57d78110..82d2ea5a 100644
--- a/mupdf/page.c
+++ b/mupdf/page.c
@@ -31,8 +31,6 @@ runmany(pdf_csi *csi, pdf_xref *xref, fz_obj *rdb, fz_obj *list)
int n;
int i;
-printf("joining content stream\n");
-
error = fz_newbuffer(&big, 32 * 1024);
if (error)
return error;
@@ -144,10 +142,7 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "MediaBox");
if (!fz_isarray(obj))
return fz_throw("syntaxerror: Page missing MediaBox");
- bbox.min.x = fz_toreal(fz_arrayget(obj, 0));
- bbox.min.y = fz_toreal(fz_arrayget(obj, 1));
- bbox.max.x = fz_toreal(fz_arrayget(obj, 2));
- bbox.max.y = fz_toreal(fz_arrayget(obj, 3));
+ bbox = pdf_torect(obj);
obj = fz_dictgets(dict, "Rotate");
if (fz_isint(obj))
diff --git a/mupdf/parse.c b/mupdf/parse.c
index 06ae3954..32d8b698 100644
--- a/mupdf/parse.c
+++ b/mupdf/parse.c
@@ -1,6 +1,32 @@
#include <fitz.h>
#include <mupdf.h>
+fz_rect pdf_torect(fz_obj *array)
+{
+ fz_rect r;
+ float a = fz_toreal(fz_arrayget(array, 0));
+ float b = fz_toreal(fz_arrayget(array, 1));
+ float c = fz_toreal(fz_arrayget(array, 2));
+ float d = fz_toreal(fz_arrayget(array, 3));
+ r.min.x = MIN(a, c);
+ r.min.y = MIN(b, d);
+ r.max.x = MAX(a, c);
+ r.max.y = MAX(b, d);
+ return r;
+}
+
+fz_matrix pdf_tomatrix(fz_obj *array)
+{
+ fz_matrix m;
+ m.a = fz_toreal(fz_arrayget(array, 0));
+ m.b = fz_toreal(fz_arrayget(array, 1));
+ m.c = fz_toreal(fz_arrayget(array, 2));
+ m.d = fz_toreal(fz_arrayget(array, 3));
+ m.e = fz_toreal(fz_arrayget(array, 4));
+ m.f = fz_toreal(fz_arrayget(array, 5));
+ return m;
+}
+
fz_error *
pdf_parsearray(fz_obj **op, fz_file *file, char *buf, int cap)
{
diff --git a/mupdf/pattern.c b/mupdf/pattern.c
index cc8e9929..ebe5f96c 100644
--- a/mupdf/pattern.c
+++ b/mupdf/pattern.c
@@ -30,25 +30,13 @@ printf("loading pattern %d %d\n", fz_tonum(stmref), fz_togen(stmref));
pat->ystep = fz_toreal(fz_dictgets(dict, "YStep"));
obj = fz_dictgets(dict, "BBox");
- pat->bbox.min.x = fz_toreal(fz_arrayget(obj, 0));
- pat->bbox.min.y = fz_toreal(fz_arrayget(obj, 1));
- pat->bbox.max.x = fz_toreal(fz_arrayget(obj, 2));
- pat->bbox.max.y = fz_toreal(fz_arrayget(obj, 3));
+ pat->bbox = pdf_torect(obj);
obj = fz_dictgets(dict, "Matrix");
if (obj)
- {
- pat->matrix.a = fz_toreal(fz_arrayget(obj, 0));
- pat->matrix.b = fz_toreal(fz_arrayget(obj, 1));
- pat->matrix.c = fz_toreal(fz_arrayget(obj, 2));
- pat->matrix.d = fz_toreal(fz_arrayget(obj, 3));
- pat->matrix.e = fz_toreal(fz_arrayget(obj, 4));
- pat->matrix.f = fz_toreal(fz_arrayget(obj, 5));
- }
+ pat->matrix = pdf_tomatrix(obj);
else
- {
pat->matrix = fz_identity();
- }
printf(" mask %d\n", pat->ismask);
printf(" xstep %g\n", pat->xstep);
diff --git a/mupdf/type3.c b/mupdf/type3.c
index 5e89941b..bda9e06a 100644
--- a/mupdf/type3.c
+++ b/mupdf/type3.c
@@ -115,18 +115,11 @@ pdf_loadtype3font(pdf_font **fontp, pdf_xref *xref, fz_obj *dict)
font->super.drop = (void(*)(fz_font*)) t3dropfont;
obj = fz_dictgets(dict, "FontMatrix");
- font->matrix.a = fz_toreal(fz_arrayget(obj, 0));
- font->matrix.b = fz_toreal(fz_arrayget(obj, 1));
- font->matrix.c = fz_toreal(fz_arrayget(obj, 2));
- font->matrix.d = fz_toreal(fz_arrayget(obj, 3));
- font->matrix.e = fz_toreal(fz_arrayget(obj, 4));
- font->matrix.f = fz_toreal(fz_arrayget(obj, 5));
+ font->matrix = pdf_tomatrix(obj);
obj = fz_dictgets(dict, "FontBBox");
- bbox.min.x = fz_toreal(fz_arrayget(obj, 0));
- bbox.min.y = fz_toreal(fz_arrayget(obj, 1));
- bbox.max.x = fz_toreal(fz_arrayget(obj, 2));
- bbox.max.y = fz_toreal(fz_arrayget(obj, 3));
+ bbox = pdf_torect(obj);
+
bbox = fz_transformaabb(font->matrix, bbox);
bbox.min.x = fz_floor(bbox.min.x * 1000);
bbox.min.y = fz_floor(bbox.min.y * 1000);
diff --git a/mupdf/xobject.c b/mupdf/xobject.c
index e0a20496..b4014865 100644
--- a/mupdf/xobject.c
+++ b/mupdf/xobject.c
@@ -13,21 +13,11 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
return fz_outofmem;
obj = fz_dictgets(dict, "BBox");
- form->bbox.min.x = fz_toreal(fz_arrayget(obj, 0));
- form->bbox.min.y = fz_toreal(fz_arrayget(obj, 1));
- form->bbox.max.x = fz_toreal(fz_arrayget(obj, 2));
- form->bbox.max.y = fz_toreal(fz_arrayget(obj, 3));
+ form->bbox = pdf_torect(obj);
obj = fz_dictgets(dict, "Matrix");
if (obj)
- {
- form->matrix.a = fz_toreal(fz_arrayget(obj, 0));
- form->matrix.b = fz_toreal(fz_arrayget(obj, 1));
- form->matrix.c = fz_toreal(fz_arrayget(obj, 2));
- form->matrix.d = fz_toreal(fz_arrayget(obj, 3));
- form->matrix.e = fz_toreal(fz_arrayget(obj, 4));
- form->matrix.f = fz_toreal(fz_arrayget(obj, 5));
- }
+ form->matrix = pdf_tomatrix(obj);
else
form->matrix = fz_identity();
diff --git a/object/parse.c b/object/parse.c
index 20d531c4..c3f3d3dc 100644
--- a/object/parse.c
+++ b/object/parse.c
@@ -309,6 +309,7 @@ static fz_error *parseobj(fz_obj **obj, char **sp, struct vap *v)
s ++;
switch (*s)
{
+ case 'p': error = fz_newpointer(obj, va_arg(v->ap, void*)); break;
case 'o': *obj = fz_keepobj(va_arg(v->ap, fz_obj*)); break;
case 'b': error = fz_newbool(obj, va_arg(v->ap, int)); break;
case 'i': error = fz_newint(obj, va_arg(v->ap, int)); break;
diff --git a/render/rastppc.c b/render/rastppc.c
index 276ee2d7..b693b2d7 100644
--- a/render/rastppc.c
+++ b/render/rastppc.c
@@ -15,7 +15,7 @@ fz_accelrastfuncs(fz_rastfuncs *tab)
# ifdef HAVE_ALTIVEC
if (fz_cpuflags & HAVE_ALTIVEC)
{
- puts("installed altivec rastfuncs");
+ /* ... */
}
# endif
}