SplinePoint構造体はsplinefont.hで宣言されているが、nonprevcpなどにはビットフィールド使ってるな...。
なんかやめてー(><。)という気持ちになってしまう。
まぁ、それはさて置き、丸める前後でハンドル長が0の場合に初めて no{next,prev}cpがtrueとなるように条件を変更したら問題は解消するみたい。それでいいのかちょっとよく分からんけど。
$ git diff diff --git a/fontforge/splinechar.c b/fontforge/splinechar.c index c242218..dd98bfd 100644 --- a/fontforge/splinechar.c +++ b/fontforge/splinechar.c @@ -707,6 +707,9 @@ return; void SplinePointRound(SplinePoint *sp,real factor) { BasePoint noff, poff; + BasePoint origme = sp->me; + BasePoint orignextcp = sp->nextcp; + BasePoint origprevcp = sp->prevcp; if ( sp->prev!=NULL && sp->next!=NULL && sp->next->order2 && sp->ttfindex == 0xffff ) { @@ -738,9 +741,9 @@ void SplinePointRound(SplinePoint *sp,real factor) { sp->next->to->prevcp = sp->nextcp; if ( sp->prev!=NULL && sp->prev->order2 ) sp->prev->from->nextcp = sp->prevcp; - if ( sp->nextcp.x==sp->me.x && sp->nextcp.y==sp->me.y ) + if ( sp->nextcp.x==sp->me.x && sp->nextcp.y==sp->me.y && orignextcp.x==origme.x && orignextcp.y==origme.y ) sp->nonextcp = true; - if ( sp->prevcp.x==sp->me.x && sp->prevcp.y==sp->me.y ) + if ( sp->prevcp.x==sp->me.x && sp->prevcp.y==sp->me.y && origprevcp.x==origme.x && origprevcp.y==origme.y ) sp->noprevcp = true; }
一応fontforgeのIssuesに起票してみたけど、なんか間違ってたら恥さらしだな。と思ってしまうのは日本的な文化の賜物だろうか。