summaryrefslogtreecommitdiffstats
path: root/src/testuta.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testuta.c')
-rw-r--r--src/testuta.c234
1 files changed, 234 insertions, 0 deletions
diff --git a/src/testuta.c b/src/testuta.c
new file mode 100644
index 0000000..e1d999f
--- /dev/null
+++ b/src/testuta.c
@@ -0,0 +1,234 @@
+/* Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 1998 Raph Levien
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "art_config.h"
+#include "art_misc.h"
+#include "art_uta.h"
+#include "art_vpath.h"
+#include "art_uta_vpath.h"
+#include "art_rect.h"
+#include "art_rect_uta.h"
+#include "art_uta_rect.h"
+
+#undef LIBART_COMPILATION
+#include "libart-features.h"
+
+#define TEST_UTA
+#define noTEST_UTA_SPEED
+
+#define XOFF 50
+#define YOFF 700
+
+static void
+print_uta_ps (ArtUta *uta)
+{
+ int x, y;
+ int x0, y0, x1, y1;
+ int width = uta->width;
+ ArtUtaBbox ub;
+
+ for (y = 0; y < uta->height; y++)
+ for (x = 0; x < width; x++)
+ {
+ ub = uta->utiles[y * width + x];
+ if (ub != 0)
+ {
+ x0 = (uta->x0 + x) * ART_UTILE_SIZE + ART_UTA_BBOX_X0(ub);
+ x1 = (uta->x0 + x) * ART_UTILE_SIZE + ART_UTA_BBOX_X1(ub);
+ y0 = (uta->y0 + y) * ART_UTILE_SIZE + ART_UTA_BBOX_Y0(ub);
+ y1 = (uta->y0 + y) * ART_UTILE_SIZE + ART_UTA_BBOX_Y1(ub);
+ printf ("%% tile %d, %d: %d %d %d %d\n",
+ x, y,
+ ART_UTA_BBOX_X0(ub),
+ ART_UTA_BBOX_Y0(ub),
+ ART_UTA_BBOX_X1(ub),
+ ART_UTA_BBOX_Y1(ub));
+ printf ("%d %d moveto %d %d lineto %d %d lineto %d %d lineto closepath fill\n",
+ XOFF + x0, YOFF - y0, XOFF + x1, YOFF - y0,
+ XOFF + x1, YOFF - y1, XOFF + x0, YOFF - y1);
+ }
+ }
+}
+
+static void
+print_rbuf_ps (int *rbuf, int width, int height)
+{
+ int x, y;
+
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++)
+ if (1 && rbuf[y * width + x] != 0)
+ printf ("%d %d moveto (%d) show\n", x * ART_UTILE_SIZE, y * ART_UTILE_SIZE,
+ rbuf[y * width + x]);
+}
+
+#if 0
+void
+randline (ArtUta *uta, int *rbuf, int rbuf_rowstride)
+{
+ double x0, y0, x1, y1;
+
+ x0 = rand () * (500.0 / RAND_MAX);
+ y0 = rand () * (500.0 / RAND_MAX);
+ x1 = rand () * (500.0 / RAND_MAX);
+ y1 = rand () * (500.0 / RAND_MAX);
+
+ printf ("%g %g moveto %g %g lineto stroke\n", x0, y0, x1, y1);
+ art_uta_add_line (uta, x0, y0, x1, y1, rbuf, rbuf_rowstride);
+}
+#endif
+
+static void
+print_ps_vpath (ArtVpath *vpath)
+{
+ int i;
+
+ for (i = 0; vpath[i].code != ART_END; i++)
+ {
+ switch (vpath[i].code)
+ {
+ case ART_MOVETO:
+ printf ("%g %g moveto\n", XOFF + vpath[i].x, YOFF - vpath[i].y);
+ break;
+ case ART_LINETO:
+ printf ("%g %g lineto\n", XOFF + vpath[i].x, YOFF - vpath[i].y);
+ break;
+ default:
+ break;
+ }
+ }
+ printf ("stroke\n");
+}
+
+static ArtVpath *
+randstar (int n)
+{
+ ArtVpath *vec;
+ int i;
+ double r, th;
+
+ vec = art_new (ArtVpath, n + 2);
+ for (i = 0; i < n; i++)
+ {
+ vec[i].code = i ? ART_LINETO : ART_MOVETO;
+ r = rand () * (250.0 / RAND_MAX);
+ th = i * 2 * M_PI / n;
+ vec[i].x = 250 + r * cos (th);
+ vec[i].y = 250 - r * sin (th);
+ }
+ vec[i].code = ART_LINETO;
+ vec[i].x = vec[0].x;
+ vec[i].y = vec[0].y;
+ i++;
+ vec[i].code = ART_END;
+ vec[i].x = 0;
+ vec[i].y = 0;
+ return vec;
+}
+
+int
+main (int argc, char **argv)
+{
+ ArtUta *uta;
+ int i;
+ int *rbuf;
+ ArtVpath *vec;
+ ArtIRect *rects;
+ int n_rects;
+
+ if (argc == 2)
+ srand (atoi (argv[1]));
+
+#ifdef TEST_UTA
+ printf ("%%!PS-Adobe\n");
+ printf ("%% libart version: %d.%d.%d\n",
+ libart_major_version, libart_minor_version, libart_micro_version);
+ printf ("/Helvetica findfont 12 scalefont setfont\n");
+ printf ("0.5 setlinewidth\n");
+
+ printf ("0.5 setgray\n");
+ for (i = 0; i < 500; i += ART_UTILE_SIZE)
+ {
+ printf ("%d %d moveto %d %d lineto stroke\n",
+ XOFF, YOFF - i, XOFF + 500, YOFF - i);
+ printf ("%d %d moveto %d %d lineto stroke\n",
+ XOFF + i, YOFF, XOFF + i, YOFF - 500);
+ }
+
+ printf ("/a {\n");
+
+#if 1
+ vec = randstar (50);
+ print_ps_vpath (vec);
+ uta = art_uta_from_vpath (vec);
+#ifdef TEST_UTA_RECT
+ {
+ ArtIRect bbox = {5, 5, 450, 450};
+ uta = art_uta_from_irect (&bbox);
+ }
+#endif
+ rbuf = NULL;
+#else
+ uta = art_uta_new_coords (0, 0, 500, 500);
+
+ rbuf = malloc (sizeof(int) * (500 >> ART_UTILE_SHIFT) * (500 >> ART_UTILE_SHIFT));
+ for (i = 0; i < 10; i++)
+ randline (uta, rbuf, 500 >> ART_UTILE_SHIFT);
+#endif
+
+ printf ("} def 1 0.5 0.5 setrgbcolor\n");
+
+ print_uta_ps (uta);
+
+ printf ("0 0 0.5 setrgbcolor\n");
+
+ if (rbuf)
+ print_rbuf_ps (rbuf, 500 >> ART_UTILE_SHIFT, 500 >> ART_UTILE_SHIFT);
+
+ printf ("0 setgray a\n");
+
+ rects = art_rect_list_from_uta (uta, 256, 64, &n_rects);
+
+ printf ("%% %d rectangles:\n0 0 1 setrgbcolor\n", n_rects);
+
+ for (i = 0; i < n_rects; i++)
+ printf ("%d %d moveto %d %d lineto %d %d lineto %d %d lineto closepath stroke\n",
+ XOFF + rects[i].x0, YOFF - rects[i].y0,
+ XOFF + rects[i].x1, YOFF - rects[i].y0,
+ XOFF + rects[i].x1, YOFF - rects[i].y1,
+ XOFF + rects[i].x0, YOFF - rects[i].y1);
+
+ printf ("showpage\n");
+#endif
+
+#ifdef TEST_UTA_SPEED
+ for (i = 0; i < 1000; i++)
+ {
+ vec = randstar (50);
+ uta = art_uta_from_vpath (vec);
+ art_free (vec);
+ art_uta_free (uta);
+ }
+#endif
+
+ return 0;
+}