らんだむな記憶

blogというものを体験してみようか!的なー

fontforgeデバッグ(4)

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に起票してみたけど、なんか間違ってたら恥さらしだな。と思ってしまうのは日本的な文化の賜物だろうか。