From e3eae733ee8699f3b3b4d9a61a08f62ac1429fa9 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Sat, 2 Nov 2024 19:25:41 +0000 Subject: [PATCH] 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. --- bedstead.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 -- 2.30.2