From a90b986fd6de1299032ec7f5b19745b615e97f6a Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Sun, 2 Jul 2017 17:34:52 +0100 Subject: [PATCH] Scale the co-ordinate system used for drawing glyphs. We now draw in units of half a design unit (1/2000 em), and then scale to normal design units when outputting paths. This allows for the future possibility of producing fractional co-ordinates. --- bedstead.c | 68 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/bedstead.c b/bedstead.c index 6bb7558..c21a520 100644 --- a/bedstead.c +++ b/bedstead.c @@ -150,9 +150,14 @@ struct param *param = &default_param; #define XPIX (param->xpix) #define YPIX 100 +/* We work internally in smaller units, though. */ +#define SCALE 2 +#define XPIX_S (XPIX * SCALE) +#define YPIX_S (YPIX * SCALE) + /* Position of diagonal lines within pixels */ -#define XQTR (XPIX/4) -#define YQTR (YPIX/4) +#define XQTR_S (XPIX_S/4) +#define YQTR_S (YPIX_S/4) void doprologue(void); void dochar(char const data[YSIZE], unsigned flags); @@ -1712,8 +1717,9 @@ emit_path() if (!started) printf("Fore\nSplineSet\n"); started = 1; do { - printf(" %d %d %s 1\n", - p->v.x, p->v.y - 3*YPIX, + printf(" %.0f %.0f %s 1\n", + (double)p->v.x / SCALE, + (double)p->v.y / SCALE - 3*YPIX, p == &points[i] && p->next ? "m" : "l"); p1 = p->next; p->prev = p->next = NULL; @@ -1727,49 +1733,51 @@ emit_path() static void blackpixel(int x, int y, int bl, int br, int tr, int tl) { - x *= XPIX; y *= YPIX; + x *= XPIX_S; y *= YPIX_S; if (bl) moveto(x, y); - else { moveto(x+XQTR, y); lineto(x, y+YQTR); } - if (tl) lineto(x, y+YPIX); - else { lineto(x, y+YPIX-YQTR); lineto(x+XQTR, y+YPIX); } - if (tr) lineto(x+XPIX, y+YPIX); - else { lineto(x+XPIX-XQTR, y+YPIX); lineto(x+XPIX, y+YPIX-YQTR); } - if (br) lineto(x+XPIX, y); - else { lineto(x+XPIX, y+YQTR); lineto(x+XPIX-XQTR, y); } + else { moveto(x+XQTR_S, y); lineto(x, y+YQTR_S); } + if (tl) lineto(x, y+YPIX_S); + else { lineto(x, y+YPIX_S-YQTR_S); lineto(x+XQTR_S, y+YPIX_S); } + if (tr) lineto(x+XPIX_S, y+YPIX_S); + else { lineto(x+XPIX_S-XQTR_S, y+YPIX_S); + lineto(x+XPIX_S, y+YPIX_S-YQTR_S); } + if (br) lineto(x+XPIX_S, y); + else { lineto(x+XPIX_S, y+YQTR_S); lineto(x+XPIX_S-XQTR_S, y); } closepath(); } static void whitepixel(int x, int y, int bl, int br, int tr, int tl) { - x *= XPIX; y *= YPIX; + x *= XPIX_S; y *= YPIX_S; if (bl) { - moveto(x, y); lineto(x, y+YPIX-YQTR); - if (br) { lineto(x+XPIX/2, y+YPIX/2-YQTR); lineto(x+XQTR, y); } - else lineto(x+XPIX-XQTR, y); + moveto(x, y); lineto(x, y+YPIX_S-YQTR_S); + if (br) { lineto(x+XPIX_S/2, y+YPIX_S/2-YQTR_S); + lineto(x+XQTR_S, y); } + else lineto(x+XPIX_S-XQTR_S, y); closepath(); } if (tl) { - moveto(x, y+YPIX); lineto(x+XPIX-XQTR, y+YPIX); - if (bl) { lineto(x+XPIX/2-XQTR, y+YPIX/2); - lineto(x, y+YPIX-YQTR); } - else lineto(x, y+YQTR); + moveto(x, y+YPIX_S); lineto(x+XPIX_S-XQTR_S, y+YPIX_S); + if (bl) { lineto(x+XPIX_S/2-XQTR_S, y+YPIX_S/2); + lineto(x, y+YPIX_S-YQTR_S); } + else lineto(x, y+YQTR_S); closepath(); } if (tr) { - moveto(x+XPIX, y+YPIX); lineto(x+XPIX, y+YQTR); - if (tl) { lineto(x+XPIX/2, y+YPIX/2+YQTR); - lineto(x+XPIX-XQTR, y+YPIX); } - else lineto(x+XQTR, y+YPIX); + moveto(x+XPIX_S, y+YPIX_S); lineto(x+XPIX_S, y+YQTR_S); + if (tl) { lineto(x+XPIX_S/2, y+YPIX_S/2+YQTR_S); + lineto(x+XPIX_S-XQTR_S, y+YPIX_S); } + else lineto(x+XQTR_S, y+YPIX_S); closepath(); } if (br) { - moveto(x+XPIX, y); lineto(x+XQTR, y); - if (tr) { lineto(x+XPIX/2+XQTR, y+YPIX/2); - lineto(x+XPIX, y+YQTR); } - else lineto(x+XPIX, y+YPIX-YQTR); + moveto(x+XPIX_S, y); lineto(x+XQTR_S, y); + if (tr) { lineto(x+XPIX_S/2+XQTR_S, y+YPIX_S/2); + lineto(x+XPIX_S, y+YQTR_S); } + else lineto(x+XPIX_S, y+YPIX_S-YQTR_S); closepath(); } } @@ -1829,8 +1837,8 @@ dochar(char const data[YSIZE], unsigned flags) static void tile(int x0, int y0, int x1, int y1) { - x0 *= XPIX; y0 *= YPIX; - x1 *= XPIX; y1 *= YPIX; + x0 *= XPIX_S; y0 *= YPIX_S; + x1 *= XPIX_S; y1 *= YPIX_S; moveto(x0, y0); lineto(x0, y1); lineto(x1, y1); lineto(x1, y0); closepath(); } -- 2.30.2