diff options
-rw-r--r-- | TODO | 24 | ||||
-rw-r--r-- | include/mupdf/syntax.h | 3 | ||||
-rw-r--r-- | mupdf/build.c | 20 | ||||
-rw-r--r-- | mupdf/page.c | 7 | ||||
-rw-r--r-- | mupdf/parse.c | 26 | ||||
-rw-r--r-- | mupdf/pattern.c | 16 | ||||
-rw-r--r-- | mupdf/type3.c | 13 | ||||
-rw-r--r-- | mupdf/xobject.c | 14 | ||||
-rw-r--r-- | object/parse.c | 1 | ||||
-rw-r--r-- | render/rastppc.c | 2 |
10 files changed, 71 insertions, 55 deletions
@@ -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 } |