summaryrefslogtreecommitdiff
path: root/tests/tiger.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-09-27 02:15:04 +0200
committerTor Andersson <tor@ghostscript.com>2004-09-27 02:15:04 +0200
commit6ddde92a3a45e970b05770633dc6a337d5d013c5 (patch)
tree1dec4612d7469839478e72d16d30a0da5755243c /tests/tiger.c
downloadmupdf-6ddde92a3a45e970b05770633dc6a337d5d013c5.tar.xz
Initial import
Diffstat (limited to 'tests/tiger.c')
-rw-r--r--tests/tiger.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/tests/tiger.c b/tests/tiger.c
new file mode 100644
index 00000000..11d84013
--- /dev/null
+++ b/tests/tiger.c
@@ -0,0 +1,213 @@
+#include <fitz.h>
+
+static struct { char c; double f[6]; } cmd[] = {
+#include "tiger.h"
+};
+
+static fz_pathbuilder *pbuild;
+static fz_textbuilder *tbuild;
+static fz_tree *tree;
+
+static fz_stroke stroke = { 0, 0, 1.0, 10.0 };
+static float frgb[3] = { 0, 0, 0 };
+static float srgb[3] = { 0, 0, 0 };
+static fz_node *gstack[32];
+static int gtop = 0;
+
+void gsave(void)
+{
+ gstack[gtop++] = tree->head;
+}
+
+void grestore(void)
+{
+ tree->head = gstack[--gtop];
+}
+
+void dostroke(void)
+{
+ fz_node *path;
+ fz_node *solid;
+ fz_node *mask;
+
+ fz_makepath(&path, pbuild, FZ_PSTROKE, &stroke, nil);
+ fz_newsolid(&solid, 1.0f, srgb[0], srgb[1], srgb[2]);
+ fz_newblend(&mask, FZ_BMASK);
+
+ fz_insertnode(mask, path);
+ fz_insertnode(mask, solid);
+ fz_insertnode(tree->head, mask);
+}
+
+void dofill(void)
+{
+ fz_node *path;
+ fz_node *solid;
+ fz_node *mask;
+
+ fz_makepath(&path, pbuild, FZ_PFILL, nil, nil);
+ fz_newsolid(&solid, 1.0f, frgb[0], frgb[1], frgb[2]);
+ fz_newblend(&mask, FZ_BMASK);
+
+ fz_insertnode(mask, path);
+ fz_insertnode(mask, solid);
+ fz_insertnode(tree->head, mask);
+}
+
+void doxform(fz_matrix ctm)
+{
+ fz_node *xform;
+ fz_node *over;
+
+ fz_newtransform(&xform, ctm);
+ fz_newblend(&over, FZ_BOVER);
+
+ fz_insertnode(xform, over);
+ fz_insertnode(tree->head, xform);
+
+ tree->head = over;
+}
+
+int main(int argc, char **argv)
+{
+ fz_node *node;
+ fz_matrix ctm;
+ fz_rect r;
+ int i;
+
+ fz_newpathbuilder(&pbuild);
+ fz_newtextbuilder(&tbuild);
+ fz_newtree(&tree);
+
+ fz_newblend(&node, FZ_BOVER);
+ tree->root = tree->head = node;
+
+ fz_newsolid(&node, 1, .8, .8, .8);
+ fz_insertnode(tree->head, node);
+
+ for (i = 0; cmd[i].c != '!'; i++)
+ {
+ switch (cmd[i].c)
+ {
+ case 'q':
+ gsave();
+ break;
+ case 'Q':
+ grestore();
+ break;
+
+ /* 'cm' -> 'T' ... insert xform node */
+ case 'T':
+ ctm.xx = cmd[i].f[0];
+ ctm.xy = cmd[i].f[1];
+ ctm.yx = cmd[i].f[2];
+ ctm.yy = cmd[i].f[3];
+ ctm.tx = cmd[i].f[4];
+ ctm.ty = cmd[i].f[5];
+ doxform(ctm);
+ break;
+
+ /* current color */
+ case 'g':
+ frgb[1] = cmd[i].f[0];
+ frgb[2] = cmd[i].f[0];
+ frgb[3] = cmd[i].f[0];
+ break;
+ case 'G':
+ srgb[1] = cmd[i].f[0];
+ srgb[2] = cmd[i].f[0];
+ srgb[3] = cmd[i].f[0];
+ break;
+ case 'r':
+ frgb[1] = cmd[i].f[0];
+ frgb[2] = cmd[i].f[1];
+ frgb[3] = cmd[i].f[2];
+ break;
+ case 'R':
+ srgb[1] = cmd[i].f[0];
+ srgb[2] = cmd[i].f[1];
+ srgb[3] = cmd[i].f[2];
+ break;
+ case 'a':
+ frgb[0] = cmd[i].f[0];
+ break;
+ case 'A':
+ srgb[0] = cmd[i].f[0];
+ break;
+
+ /* line attrs */
+ case 'w': stroke.linewidth = cmd[i].f[0]; break;
+ case 'J': stroke.linecap = cmd[i].f[0]; break;
+ case 'j': stroke.linejoin = cmd[i].f[0]; break;
+ case 'M': stroke.miterlimit = cmd[i].f[0]; break;
+ case 'i': break;
+
+ /* path construction */
+ case 'm':
+ fz_moveto(pbuild, cmd[i].f[0], cmd[i].f[1]);
+ break;
+ case 'l':
+ fz_lineto(pbuild, cmd[i].f[0], cmd[i].f[1]);
+ break;
+ case 'c':
+ fz_curveto(pbuild,
+ cmd[i].f[0], cmd[i].f[1],
+ cmd[i].f[2], cmd[i].f[3],
+ cmd[i].f[4], cmd[i].f[5]);
+ break;
+ case 'v':
+ fz_curvetov(pbuild,
+ cmd[i].f[0], cmd[i].f[1],
+ cmd[i].f[2], cmd[i].f[3]);
+ break;
+ case 'y':
+ fz_curvetoy(pbuild,
+ cmd[i].f[0], cmd[i].f[1],
+ cmd[i].f[2], cmd[i].f[3]);
+ break;
+ case 'h':
+ fz_closepath(pbuild);
+ break;
+
+ /* insert path nodes */
+ case 's':
+ fz_closepath(pbuild);
+ case 'S':
+ dostroke();
+ break;
+
+ case 'f':
+ dofill();
+ break;
+ }
+ }
+
+ r = fz_boundtree(tree, fz_scale(1, -1));
+ printf("/* [%g %g %g %g] */\n", r.min.x, r.min.y, r.max.x, r.max.y);
+ fz_debugtree(tree);
+
+ r.min.x -= 10;
+ r.min.y -= 10;
+ r.max.x += 10;
+ r.max.y += 10;
+
+#if 0
+ {
+ fz_pixmap *img;
+ img = fz_newpixmap(r.min.x, r.min.y,
+ r.max.x - r.min.x, r.max.y - r.min.y);
+ fz_clearpixmap(img);
+
+ fz_rendernode(tree, tree->root, fz_scale(1, -1), img);
+
+ f = fopen("o.ppm", "w");
+ fz_savepixmap(img, f);
+ fclose(f);
+
+ fz_freepixmap(img);
+ }
+#endif
+
+ return 0;
+}
+