chiark / gitweb /
Scale the co-ordinate system used for drawing glyphs.
authorBen Harris <bjh21@bjh21.me.uk>
Sun, 2 Jul 2017 16:34:52 +0000 (17:34 +0100)
committerBen Harris <bjh21@bjh21.me.uk>
Sun, 2 Jul 2017 16:34:52 +0000 (17:34 +0100)
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

index 6bb755885cb8bf89860b575956aafd485e673244..c21a5209caba50aeab0f8064e8823bbcf7db940a 100644 (file)
@@ -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();
 }