chiark / gitweb /
Re-work weight-adjustment code to work in two passes
authorBen Harris <bjh21@bjh21.me.uk>
Mon, 11 Oct 2021 22:08:57 +0000 (23:08 +0100)
committerBen Harris <bjh21@bjh21.me.uk>
Mon, 11 Oct 2021 22:08:57 +0000 (23:08 +0100)
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.

bedstead.c

index cebed0ee54371dcc48dfcca17d96b174891611ac..fc1b078997d58cfd86c18d47469bdfeb83f59cc8 100644 (file)
@@ -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