chiark / gitweb /
Combine successive rlineto operators
authorBen Harris <bjh21@bjh21.me.uk>
Sat, 2 Nov 2024 19:25:41 +0000 (19:25 +0000)
committerBen Harris <bjh21@bjh21.me.uk>
Thu, 14 Nov 2024 22:27:18 +0000 (22:27 +0000)
In a Type 2 charstring, an rlineto operator can take up to 24 pairs of
co-ordinates, so most contours need only one rmoveto and one rlineto.

bedstead.c

index c1ee06a9434b27a87e7bf27d0136f3e0143268de..2b80a3b401ceff1c10ed645cd722c79a1cbdeff6 100644 (file)
@@ -3570,18 +3570,22 @@ static void
 emit_contour(point *p0)
 {
        point *p = p0, *p1;
+       int stacksize = 0;
 
        if (p->prev) p->prev->next = NULL; /* Break the loop. */
        do {
+               stacksize += 2;
                printf(" %g %g %s\n",
                       (double)(p->v.x - cur.x) / XSCALE,
                       (double)(p->v.y - cur.y) / YSCALE,
-                      p == p0 && p->next ? "rmoveto" : "rlineto");
+                      p == p0 ? "rmoveto" : stacksize >= 48 ? "rlineto" : "");
+               stacksize %= 48;
                cur = p->v;
                p1 = p->next;
                p->prev = p->next = NULL;
                p = p1;
        } while (p);
+       if (stacksize != 0) printf("rlineto\n");
 }
 
 static void