From: Ben Harris Date: Mon, 11 Oct 2021 22:08:57 +0000 (+0100) Subject: Re-work weight-adjustment code to work in two passes X-Git-Tag: bedstead-002.003~15 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~bjharris/git?a=commitdiff_plain;h=726fa5a495741dfbce8d176a4ff6157f5906b087;p=bedstead-debian.git Re-work weight-adjustment code to work in two passes It now records how it wants to move each point and them actually moves the points in a second pass. This avoids a problem where moving one point would cause the loop not to correctly recognise the types of adjacent points in the path. This in particular affected glyphs with sharp upper corners (like &) with weights >= 50. --- diff --git a/bedstead.c b/bedstead.c index cebed0e..fc1b078 100644 --- a/bedstead.c +++ b/bedstead.c @@ -2750,27 +2750,36 @@ adjust_weight() { int i; point *p; + struct vec moves[MAXPOINTS]; for (i = 0; i < nextpoint; i++) { p = &points[i]; if (p->next == NULL) continue; assert(p->prev != NULL); + moves[i].x = moves[i].y = 0; /* Move left-edge points horizontally */ if (p->prev->v.y <= p->v.y && p->v.y <= p->next->v.y) - p->v.x -= weight->weight; + moves[i].x -= weight->weight; /* Move top inner corner points along NE/SW diagonal */ if (p->prev->v.y < p->v.y && p->v.y > p->next->v.y && p->prev->v.x > p->v.x && p->v.x > p->next->v.x) { - p->v.x -= weight->weight/2; - p->v.y -= weight->weight/2; + moves[i].x -= weight->weight/2; + moves[i].y -= weight->weight/2; } /* Move bottom inner corner points along NW/SE diagonal */ if (p->prev->v.y > p->v.y && p->v.y < p->next->v.y && p->prev->v.x < p->v.x && p->v.x < p->next->v.x) { - p->v.x -= weight->weight/2; - p->v.y += weight->weight/2; + moves[i].x -= weight->weight/2; + moves[i].y += weight->weight/2; } } + for (i = 0; i < nextpoint; i++) { + p = &points[i]; + if (p->next == NULL) continue; + assert(p->prev != NULL); + p->v.x += moves[i].x; + p->v.y += moves[i].y; + } } static void