diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-11-16 10:46:23 +0100 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-11-16 10:46:23 +0100 |
commit | d4de3f89649314eb58f779763ee99b62688ff3ec (patch) | |
tree | 21d81bbe5a49df69c428e4e35b242e0ff07e27d8 | |
parent | 3b425b8bf0c58e25da576ed86496171ea19240f9 (diff) | |
download | mupdf-d4de3f89649314eb58f779763ee99b62688ff3ec.tar.xz |
changed order of child nodes in over/mask
-rw-r--r-- | base/rect.c | 8 | ||||
-rw-r--r-- | include/fitz/base.h | 2 | ||||
-rw-r--r-- | include/fitz/render.h | 3 | ||||
-rw-r--r-- | include/fitz/tree.h | 3 | ||||
-rw-r--r-- | mupdf/font.c | 25 | ||||
-rw-r--r-- | mupdf/xobject.c | 17 | ||||
-rw-r--r-- | render/render.c | 100 | ||||
-rw-r--r-- | render/rendertext.c | 2 | ||||
-rw-r--r-- | test/pdfrip.c | 8 | ||||
-rw-r--r-- | tree/debug.c | 10 | ||||
-rw-r--r-- | tree/node1.c | 7 | ||||
-rw-r--r-- | tree/node2.c | 14 | ||||
-rw-r--r-- | tree/tree.c | 7 |
13 files changed, 99 insertions, 107 deletions
diff --git a/base/rect.c b/base/rect.c index a40701cc..6df6749a 100644 --- a/base/rect.c +++ b/base/rect.c @@ -44,10 +44,10 @@ fz_irect fz_roundrect(fz_rect f) { fz_irect i; - i.min.x = fz_floor(f.min.x);// - 1; - i.min.y = fz_floor(f.min.y);// - 1; - i.max.x = fz_ceil(f.max.x);// + 1; - i.max.y = fz_ceil(f.max.y);// + 1; + i.min.x = fz_floor(f.min.x); + i.min.y = fz_floor(f.min.y); + i.max.x = fz_ceil(f.max.x); + i.max.y = fz_ceil(f.max.y); return i; } diff --git a/include/fitz/base.h b/include/fitz/base.h index 4741f297..da0132d4 100644 --- a/include/fitz/base.h +++ b/include/fitz/base.h @@ -37,7 +37,7 @@ extern fz_error fz_koutofmem; #ifdef WIN32 #define fz_throw(...) fz_throw0(__FUNCTION__, __FILE__, __LINE__, __VA_ARGS__) -#elif _ISOC99_SOURCE +#elif HAVE_C99 #define fz_throw(...) fz_throw0(__func__, __FILE__, __LINE__, __VA_ARGS__) #else #define fz_throw fz_throw1 diff --git a/include/fitz/render.h b/include/fitz/render.h index 53030a9c..05b7daaf 100644 --- a/include/fitz/render.h +++ b/include/fitz/render.h @@ -1,14 +1,11 @@ typedef struct fz_renderer_s fz_renderer; -enum { FZ_RNONE, FZ_ROVER, FZ_RMASK }; - struct fz_renderer_s { fz_colorspace *model; fz_glyphcache *cache; fz_gel *gel; fz_ael *ael; - int mode; fz_irect clip; fz_pixmap *tmp; fz_pixmap *acc; diff --git a/include/fitz/tree.h b/include/fitz/tree.h index eebf2c38..57175619 100644 --- a/include/fitz/tree.h +++ b/include/fitz/tree.h @@ -76,7 +76,8 @@ struct fz_node_s { fz_nodekind kind; fz_node *parent; - fz_node *child; + fz_node *first; + fz_node *last; fz_node *next; }; diff --git a/mupdf/font.c b/mupdf/font.c index 7ad43cfc..231cfc1f 100644 --- a/mupdf/font.c +++ b/mupdf/font.c @@ -725,6 +725,31 @@ printf(" cidtogidmap %d\n", len / 2); } /* + * ToUnicode + */ + + if (fz_dictgets(dict, "ToUnicode")) + printf(" load tounicode for cid-font"); + + if (!strcmp(collection, "Adobe-CNS1")) + error = pdf_loadsystemcmap(&font->tounicode, "Adobe-CNS1-UCS2"); + else if (!strcmp(collection, "Adobe-GB1")) + error = pdf_loadsystemcmap(&font->tounicode, "Adobe-GB1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan1")) + error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan2")) + error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan2-UCS2"); + else if (!strcmp(collection, "Adobe-Korea1")) + error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Korea1-UCS2"); + else + { + printf(" unknown character collection\n"); + error = nil; + } + if (error) + goto cleanup; + + /* * Horizontal */ diff --git a/mupdf/xobject.c b/mupdf/xobject.c index cc05502f..e0a20496 100644 --- a/mupdf/xobject.c +++ b/mupdf/xobject.c @@ -19,12 +19,17 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) form->bbox.max.y = fz_toreal(fz_arrayget(obj, 3)); obj = fz_dictgets(dict, "Matrix"); - 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)); + 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)); + } + else + form->matrix = fz_identity(); form->resources = nil; obj = fz_dictgets(dict, "Resources"); diff --git a/render/render.c b/render/render.c index 9c28e689..63165813 100644 --- a/render/render.c +++ b/render/render.c @@ -22,7 +22,6 @@ fz_newrenderer(fz_renderer **gcp, fz_colorspace *processcolormodel, int gcmem) gc->cache = nil; gc->gel = nil; gc->ael = nil; - gc->mode = FZ_RNONE; gc->tmp = nil; gc->acc = nil; @@ -76,8 +75,6 @@ fz_rendercolor(fz_renderer *gc, fz_colornode *color, fz_matrix ctm) float rgb[3]; unsigned char *p; -printf("render color\n"); - assert(gc->model); fz_convertcolor(color->cs, color->samples, gc->model, rgb); @@ -110,76 +107,47 @@ printf("render color\n"); return nil; } -static fz_error * -fz_renderoverchild(fz_renderer *gc, fz_node *node, fz_matrix ctm) -{ - fz_error *error; - - if (node->next) - { - error = fz_renderoverchild(gc, node->next, ctm); - if (error) - return error; - } - - gc->tmp = nil; - error = fz_rendernode(gc, node, ctm); - if (error) - return error; - - if (gc->tmp) - { - fz_blendover(gc->tmp, gc->acc); - fz_droppixmap(gc->tmp); - gc->tmp = nil; - } - - return nil; -} - fz_error * fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm) { fz_error *error; - fz_pixmap *oldacc = nil; - int oldmode; - - int x = gc->clip.min.x; - int y = gc->clip.min.y; - int w = gc->clip.max.x - gc->clip.min.x; - int h = gc->clip.max.y - gc->clip.min.y; + fz_node *child; + int cluster = 0;; - /* uh-oh! we have a new over cluster */ - if (gc->mode != FZ_ROVER) + if (!gc->acc) { -printf("begin over accumulator\n"); - oldacc = gc->acc; + int x = gc->clip.min.x; + int y = gc->clip.min.y; + int w = gc->clip.max.x - gc->clip.min.x; + int h = gc->clip.max.y - gc->clip.min.y; + error = fz_newpixmap(&gc->acc, x, y, w, h, gc->model ? 4 : 1); if (error) return error; - fz_clearpixmap(gc->acc); - } - oldmode = gc->mode; - gc->mode = FZ_ROVER; + fz_clearpixmap(gc->acc); - gc->tmp = nil; + cluster = 1; + } - if (over->super.child) + for (child = over->super.first; child; child = child->next) { - error = fz_renderoverchild(gc, over->super.child, ctm); + error = fz_rendernode(gc, child, ctm); if (error) return error; - } - gc->mode = oldmode; + if (gc->tmp) + { + fz_blendover(gc->tmp, gc->acc); + fz_droppixmap(gc->tmp); + gc->tmp = nil; + } + } - /* uh-oh! end of over cluster */ - if (gc->mode != FZ_ROVER) + if (cluster) { -printf("end over accumulator\n"); gc->tmp = gc->acc; - gc->acc = oldacc; + gc->acc = nil; } return nil; @@ -194,15 +162,14 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm) fz_pixmap *shapepix; fz_node *color; fz_node *shape; - int oldmode; fz_irect newclip; fz_irect oldclip; int x, y, w, h; - color = mask->super.child; - shape = color->next; + shape = mask->super.first; + color = shape->next; - if (gc->mode == FZ_ROVER) + if (gc->acc) { if (fz_ispathnode(shape) && fz_iscolornode(color)) return fz_rendercolorpath(gc, (fz_pathnode*)shape, (fz_colornode*)color, ctm); @@ -212,18 +179,12 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm) puts("could optimize image mask!"); } -printf("begin mask\n"); - oldacc = gc->acc; - oldmode = gc->mode; oldclip = gc->clip; - newclip = fz_roundrect(fz_boundnode(shape, ctm)); newclip = fz_intersectirects(newclip, gc->clip); - printf("mask bbox [%d %d %d %d]\n", newclip.min.x, newclip.min.y, newclip.max.x, newclip.max.y); gc->acc = nil; - gc->mode = FZ_RMASK; gc->clip = newclip; gc->tmp = nil; @@ -238,8 +199,6 @@ printf("begin mask\n"); return error; shapepix = gc->tmp; -if (!shapepix) return nil; - x = gc->clip.min.x; y = gc->clip.min.y; w = gc->clip.max.x - gc->clip.min.x; @@ -249,17 +208,16 @@ if (!shapepix) return nil; if (error) return error; + fz_clearpixmap(gc->tmp); + fz_blendmask(gc->tmp, colorpix, shapepix); fz_droppixmap(shapepix); fz_droppixmap(colorpix); gc->acc = oldacc; - gc->mode = oldmode; gc->clip = oldclip; -printf("end mask\n"); - return nil; } @@ -267,7 +225,7 @@ fz_error * fz_rendertransform(fz_renderer *gc, fz_transformnode *transform, fz_matrix ctm) { ctm = fz_concat(transform->m, ctm); - return fz_rendernode(gc, transform->super.child, ctm); + return fz_rendernode(gc, transform->super.first, ctm); } fz_error * @@ -308,8 +266,6 @@ fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, f gc->clip = bbox; -printf("render tree\n"); - error = fz_rendernode(gc, tree->root, ctm); if (error) return error; diff --git a/render/rendertext.c b/render/rendertext.c index 98985f4d..16345ce6 100644 --- a/render/rendertext.c +++ b/render/rendertext.c @@ -72,6 +72,8 @@ fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm) if (error) return error; + fz_clearpixmap(gc->tmp); + tm = text->trm; for (i = 0; i < text->len; i++) diff --git a/test/pdfrip.c b/test/pdfrip.c index b04ccf3e..45577b82 100644 --- a/test/pdfrip.c +++ b/test/pdfrip.c @@ -81,7 +81,7 @@ void dumptext(fz_node *node) dy = old.y - p.y; old = p; - if (fabs(dy) > 1.3) + if (fabs(dy) > 1.6) puts("\n"); else if (fabs(dy) > 0.1) putchar('\n'); @@ -91,7 +91,9 @@ void dumptext(fz_node *node) h = fz_gethmtx(text->font, cid); old.x += h.w / 1000.0; - if (font->ncidtoucs) + if (font->tounicode) + ucs = fz_lookupcid(font->tounicode, cid); + else if (font->ncidtoucs) ucs = font->cidtoucs[cid]; else ucs = cid; @@ -100,7 +102,7 @@ void dumptext(fz_node *node) } } - for (node = node->child; node; node = node->next) + for (node = node->first; node; node = node->next) dumptext(node); } diff --git a/tree/debug.c b/tree/debug.c index 58cb35a1..2f112b9c 100644 --- a/tree/debug.c +++ b/tree/debug.c @@ -16,7 +16,7 @@ static void lispmeta(fz_metanode *node, int level) if (node->name) { fz_debugobj(node->name); } if (node->dict) { printf("\n"); fz_debugobj(node->dict); } printf("\n"); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) lispnode(child, level + 1); indent(level); printf(")\n"); @@ -27,7 +27,7 @@ static void lispover(fz_overnode *node, int level) fz_node *child; indent(level); printf("(over\n"); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) lispnode(child, level + 1); indent(level); printf(")\n"); @@ -38,7 +38,7 @@ static void lispmask(fz_masknode *node, int level) fz_node *child; indent(level); printf("(mask\n"); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) lispnode(child, level + 1); indent(level); printf(")\n"); @@ -49,7 +49,7 @@ static void lispblend(fz_blendnode *node, int level) fz_node *child; indent(level); printf("(blend-%d\n", node->mode); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) lispnode(child, level + 1); indent(level); printf(")\n"); @@ -62,7 +62,7 @@ static void lisptransform(fz_transformnode *node, int level) node->m.a, node->m.b, node->m.c, node->m.d, node->m.e, node->m.f); - lispnode(node->super.child, level + 1); + lispnode(node->super.first, level + 1); indent(level); printf(")\n"); } diff --git a/tree/node1.c b/tree/node1.c index eb29391f..19244721 100644 --- a/tree/node1.c +++ b/tree/node1.c @@ -23,15 +23,16 @@ fz_initnode(fz_node *node, fz_nodekind kind) { node->kind = kind; node->parent = nil; - node->child = nil; + node->first = nil; + node->last = nil; node->next = nil; } void fz_dropnode(fz_node *node) { - if (node->child) - fz_dropnode(node->child); + if (node->first) + fz_dropnode(node->first); if (node->next) fz_dropnode(node->next); diff --git a/tree/node2.c b/tree/node2.c index 542b1590..1374a30f 100644 --- a/tree/node2.c +++ b/tree/node2.c @@ -27,7 +27,7 @@ fz_boundovernode(fz_overnode *node, fz_matrix ctm) bbox = fz_infiniterect(); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) { r = fz_boundnode(child, ctm); if (r.max.x >= r.min.x) @@ -69,7 +69,7 @@ fz_boundmasknode(fz_masknode *node, fz_matrix ctm) bbox = fz_infiniterect(); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) { r = fz_boundnode(child, ctm); if (r.max.x >= r.min.x) @@ -116,7 +116,7 @@ fz_boundblendnode(fz_blendnode *node, fz_matrix ctm) bbox = fz_infiniterect(); - for (child = node->super.child; child; child = child->next) + for (child = node->super.first; child; child = child->next) { r = fz_boundnode(child, ctm); if (r.max.x >= r.min.x) @@ -154,9 +154,9 @@ fz_newtransformnode(fz_node **nodep, fz_matrix m) fz_rect fz_boundtransformnode(fz_transformnode *node, fz_matrix ctm) { - if (!node->super.child) + if (!node->super.first) return fz_infiniterect(); - return fz_boundnode(node->super.child, fz_concat(node->m, ctm)); + return fz_boundnode(node->super.first, fz_concat(node->m, ctm)); } /* @@ -197,9 +197,9 @@ fz_dropmetanode(fz_metanode *node) fz_rect fz_boundmetanode(fz_metanode *node, fz_matrix ctm) { - if (!node->super.child) + if (!node->super.first) return fz_infiniterect(); - return fz_boundnode(node->super.child, ctm); + return fz_boundnode(node->super.first, ctm); } /* diff --git a/tree/tree.c b/tree/tree.c index 469f352d..0c7cefb1 100644 --- a/tree/tree.c +++ b/tree/tree.c @@ -52,7 +52,10 @@ fz_insertnode(fz_node *parent, fz_node *child) fz_ismetanode(parent)); child->parent = parent; - child->next = parent->child; - parent->child = child; + if (!parent->first) + parent->first = child; + else + parent->last->next = child; + parent->last = child; } |