summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-11-16 10:46:23 +0100
committerTor Andersson <tor@ghostscript.com>2004-11-16 10:46:23 +0100
commitd4de3f89649314eb58f779763ee99b62688ff3ec (patch)
tree21d81bbe5a49df69c428e4e35b242e0ff07e27d8
parent3b425b8bf0c58e25da576ed86496171ea19240f9 (diff)
downloadmupdf-d4de3f89649314eb58f779763ee99b62688ff3ec.tar.xz
changed order of child nodes in over/mask
-rw-r--r--base/rect.c8
-rw-r--r--include/fitz/base.h2
-rw-r--r--include/fitz/render.h3
-rw-r--r--include/fitz/tree.h3
-rw-r--r--mupdf/font.c25
-rw-r--r--mupdf/xobject.c17
-rw-r--r--render/render.c100
-rw-r--r--render/rendertext.c2
-rw-r--r--test/pdfrip.c8
-rw-r--r--tree/debug.c10
-rw-r--r--tree/node1.c7
-rw-r--r--tree/node2.c14
-rw-r--r--tree/tree.c7
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;
}