From: Ben Harris Date: Sat, 2 Nov 2024 19:25:41 +0000 (+0000) Subject: Combine successive rlineto operators X-Git-Tag: bedstead-3.246~65 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~bjharris/git?a=commitdiff_plain;h=e3eae733ee8699f3b3b4d9a61a08f62ac1429fa9;p=bedstead.git Combine successive rlineto operators 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. --- diff --git a/bedstead.c b/bedstead.c index c1ee06a..2b80a3b 100644 --- a/bedstead.c +++ b/bedstead.c @@ -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