summaryrefslogtreecommitdiff
path: root/tools/gslite/gslt_font_api_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gslite/gslt_font_api_test.c')
-rw-r--r--tools/gslite/gslt_font_api_test.c268
1 files changed, 268 insertions, 0 deletions
diff --git a/tools/gslite/gslt_font_api_test.c b/tools/gslite/gslt_font_api_test.c
new file mode 100644
index 000000000..7425f64dc
--- /dev/null
+++ b/tools/gslite/gslt_font_api_test.c
@@ -0,0 +1,268 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_font_api_test.c 2461 2006-07-14 18:54:03Z giles $ */
+/* gslt OpenType font library example client */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gserror.h>
+
+#include "gslt.h"
+#include "gslt_font_api.h"
+
+/* these are not strictly needed */
+extern void gs_erasepage(gs_state *pgs);
+extern void gs_moveto(gs_state *pgs, double, double);
+extern void gs_output_page(gs_state *pgs, int, int);
+extern char gs_debug[];
+
+/*
+ * Read a file from disk into memory.
+ */
+
+int readfile(char *filename, char **datap, int *lengthp)
+{
+ FILE *fp;
+ int t, n;
+ char *p;
+
+ fp = fopen(filename, "rb");
+ if (!fp)
+ return gs_throw(-1, "cannot open font file");
+
+ t = fseek(fp, 0, 2);
+ if (t < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot seek in font file");
+ }
+
+ n = ftell(fp);
+ if (n < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot tell in font file");
+ }
+
+ t = fseek(fp, 0, 0);
+ if (t < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot seek in font file");
+ }
+
+ p = malloc(n);
+ if (!p)
+ {
+ fclose(fp);
+ return gs_throw(-1, "out of memory");
+ }
+
+ t = fread(p, 1, n, fp);
+ if (t != n)
+ {
+ free(p);
+ fclose(fp);
+ return gs_throw(-1, "cannot read font file data");
+ }
+
+ t = fclose(fp);
+ if (t < 0)
+ {
+ gs_throw(-1, "cannot close font file");
+ /* ... continue anyway */
+ }
+
+ *lengthp = n;
+ *datap = p;
+
+ return 0;
+}
+
+/*
+ * Test program.
+ */
+
+static int mymoveto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g moveto\n", x, y);
+ return 0;
+}
+
+static int mylineto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g lineto\n", x, y);
+ return 0;
+}
+
+static int mycurveto(void *ctx, float x0, float y0, float x1, float y1, float x2, float y2)
+{
+ x0 *= 1000; y0 *= 1000;
+ x1 *= 1000; y1 *= 1000;
+ x2 *= 1000; y2 *= 1000;
+ printf("%g %g %g %g %g %g curveto\n", x0, y0, x1, y1, x2, y2);
+ return 0;
+}
+
+static int myclosepath(void *ctx)
+{
+ printf("closepath\n");
+ return 0;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *pgs;
+ gs_font_dir *cache;
+ gslt_font_t *font;
+ gslt_outline_walker_t walk;
+ gslt_glyph_bitmap_t slot;
+ gslt_glyph_metrics_t mtx;
+ gs_matrix ctm;
+ int code;
+ char *s;
+ char *devicename;
+ int i, n, pid, eid, best;
+ char *buf;
+ int len;
+
+ char *text;
+
+ devicename = getenv("DEVICE");
+ if (!devicename)
+ devicename = "nullpage";
+
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, devicename);
+ pgs = gslt_init_state(mem, dev);
+
+// n = readfile("/Users/tor/Documents/msfonts/times.ttf", &buf, &len);
+ n = readfile("/usr/share/fonts/truetype/ttf-bitstream-vera/VeraIt.ttf", &buf, &len);
+ if (n < 0)
+ return gs_throw(1, "could not read font file");
+
+ gs_debug['k'] = 1; /* debug character cache machinery */
+
+ /*
+ * Set up ghostscript library
+ */
+
+ // gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "-");
+
+ // so we see what device calls are made
+ gs_erasepage(pgs);
+ gs_moveto(pgs, 5.0, 20.0);
+
+ /*
+ * Create a font cache
+ */
+
+ cache = gslt_new_font_cache(mem);
+ if (!cache)
+ return gs_throw(1, "could not create font cache");
+
+ /*
+ * Create the font and select an encoding
+ */
+
+ font = gslt_new_font(mem, cache, buf, len, 0);
+ if (!font)
+ return gs_throw(1, "could not create font");
+
+ n = gslt_count_font_encodings(font);
+ for (best = 0, i = 0; i < n; i++)
+ {
+ gslt_identify_font_encoding(font, i, &pid, &eid);
+ if (pid == 3 && eid == 0)
+ best = i;
+ }
+ gslt_select_font_encoding(font, best);
+
+ /*
+ * Test bitmap rendering.
+ */
+
+ text = "Pack my box with five dozen liquor jugs!";
+
+ ctm.xx = 48.0;
+ ctm.xy = 0.0;
+ ctm.yx = 0.0;
+ ctm.yy = 48.0;
+ ctm.tx = ctm.ty = 0.0;
+
+ for (s = text; *s; s++)
+ {
+ int gid = gslt_encode_font_char(font, *s);
+
+ code = gslt_measure_font_glyph(pgs, font, gid, &mtx);
+ if (code < 0)
+ {
+ printf("error in gslt_measure_font_glyph\n");
+ continue;
+ }
+
+ code = gslt_render_font_glyph(pgs, font, &ctm, gid, &slot);
+ if (code < 0)
+ {
+ printf("error in gslt_render_font_glyph\n");
+ continue;
+ }
+
+
+ printf("glyph %3d: v=%f,%f w=%f,%f ", gid, mtx.v[0], mtx.v[1], mtx.w[0], mtx.w[1]);
+ printf(" -> %dx%d+(%d,%d) w=%f,%f\n",
+ slot.w, slot.h,
+ slot.lsb,
+ slot.top,
+ slot.xadv,
+ slot.yadv);
+ }
+
+ /*
+ * Test outline extraction.
+ */
+
+ walk.user = NULL;
+ walk.moveto = mymoveto;
+ walk.lineto = mylineto;
+ walk.curveto = mycurveto;
+ walk.closepath = myclosepath;
+
+ code = gslt_outline_font_glyph(pgs, font, gslt_encode_font_char(font, 'e'), &walk);
+ if (code < 0)
+ printf("error in gslt_outline_font_glyph\n");
+
+ /*
+ * Clean up.
+ */
+
+ // show device and wait for keypress
+ gs_output_page(pgs, 1, 1);
+ getchar();
+
+ gslt_free_font(mem, font);
+ gslt_free_font_cache(mem, cache);
+ free(buf);
+ gslt_free_library(mem, dev, pgs);
+
+ return 0;
+}
+