From 8f029444371c2e8c8e3505c231bfe8894cf26aa7 Mon Sep 17 00:00:00 2001
From: Kuba Sunderland-Ober <kuba@mareimbrium.org>
Date: Mon, 24 Jun 2024 19:44:06 +0000
Subject: [PATCH] Optimize the newstroke font representation

Remove redundant strokes that start where the last stroke ended.
---
 common/newstroke_font.cpp   | 46 ++++++++++++++++++-------------------
 tools/newstroke/fontconv.py |  3 +--
 2 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/common/newstroke_font.cpp b/common/newstroke_font.cpp
index 2e7406f948..07aeeb7eef 100644
--- a/common/newstroke_font.cpp
+++ b/common/newstroke_font.cpp
@@ -384,7 +384,7 @@ const char* const newstroke_font[] =
     "I\\W[WPVNTMPMNN RWZU[P[NZMXMVNTPSUSWR RMGWG",
     "I[MUWU RK[RFY[ RN>O@QASAU@V>",
     "I\\W[WPVNTMPMNN RWZU[P[NZMXMVNTPSUSWR RNEOGQHSHUGVE",
-    "I[MUWU RK[RFY[ RY[W]V_WaYb[b",
+    "I[MUWU RK[RFY[W]V_WaYb[b",
     "I\\W[WPVNTMPMNN RWZU[P[NZMXMVNTPSUSWR RW[U]T_UaWbYb",
     "F[WYVZS[Q[NZLXKVJRJOKKLINGQFSFVGWH RT>QA",
     "HZVZT[P[NZMYLWLQMONNPMTMVN RTEQH",
@@ -552,11 +552,11 @@ const char* const newstroke_font[] =
     "IZVZT[P[NZMXMWNUPTSTUSVQVPUNSMPMNN",
     "H[W[L[SPLFWF",
     "JYWbUbSaR_RIQGOFMGLIMKOLQKRI",
-    "MYOMWM RRFRXSZU[W[ RW[W_VaTbRb",
+    "MYOMWM RRFRXSZU[W[W_VaTbRb",
     "HZR[RF RKKKILGNFXF",
     "MYOMWM RWFUFSGRIRXSZU[W[",
     "JZLFXF RR[RF RR[R_SaUbWb",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@",
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@",
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG", /* U+1B0 U_SMALL HORN */
     "F^ZFUFUJWKYMZPZUYXWZT[P[MZKXJUJPKMMKOJOFJF",
     "G]LFLWMYNZP[T[VZXXYVYIXGWF",
@@ -673,8 +673,8 @@ const char* const newstroke_font[] =
     "IbWFWXXZZ[\\[^Z_X^V\\UZVV^ RWNUMQMONNOMQMWNYOZQ[T[VZWX",
     "G]NFLGKIKKLMMNOO RVFXGYIYKXMWNUO ROOUOWPXQYSYWXYWZU[O[MZLYKWKSLQMPOO",
     "J[MJMMNORQVOWMWJ RPQTQVRWTWXVZT[P[NZMXMTNRPQ",
-    "H\\KFYFK[Y[ RY[Y_XaVbTb",
-    "IZLMWML[W[ RW[W_VaTbRb",
+    "H\\KFYFK[Y[Y_XaVbTb",
+    "IZLMWML[W[W_VaTbRb",
     "I[MUWU RK[RFY[ RR?Q@RAS@R?RA",
     "I\\W[WPVNTMPMNN RWZU[P[NZMXMVNTPSUSWR RRFQGRHSGRFRH",
     "H[MPTP RW[M[MFWF RR\\T]U_TaRbOb",
@@ -751,9 +751,9 @@ const char* const newstroke_font[] =
     "GZLFLXMZO[ RLMVMOVRVTWUXVZV^U`TaRbObMa",
     "D`[M[[ R[YZZX[U[SZRXRM RRXQZO[L[JZIXIM",
     "D`[M[[ R[YZZX[U[SZRXRM RRXQZO[L[JZIXIM R[[[b", /* U+270 +M_SMALL LEG */
-    "D`I[IM RIOJNLMOMQNRPR[ RRPSNUMXMZN[P[[ R[[[_ZaXbVb",
+    "D`I[IM RIOJNLMOMQNRPR[ RRPSNUMXMZN[P[[[_ZaXbVb",
     "I\\NMN[ RNOONQMTMVNWPW[ RN[N_MaKbIb",
-    "I\\NMN[ RNOONQMTMVNWPW[ RW[W_XaZb\\b",
+    "I\\NMN[ RNOONQMTMVNWPW[W_XaZb\\b",
     "H[M[MMV[VM",
     "H[LTWT RP[NZMYLWLQMONNPMSMUNVOWQWWVYUZS[P[",
     "E]RTXT RRMR[ RZMMMKNJOIQIWJYKZM[Z[",
@@ -782,7 +782,7 @@ const char* const newstroke_font[] =
     "G]Z[VMRWNMJ[",
     "JZW[RM RM[RMTHUGWF",
     "KYRTR[ RMMRTWM",
-    "IZLMWML[W[ RW[W_XaZb\\b", /* U+290 Z_SMALL !HOOK */
+    "IZLMWML[W[W_XaZb\\b", /* U+290 Z_SMALL !HOOK */
     "IZLMWML[T[VZWXVVTURVN^",
     "JZMMVMOVRVTWUXVZV^U`TaRbObMa",
     "JZMMVMOVRVTWUXVZV^U`TaRbPbNaM_N]P\\R]Uc",
@@ -1292,8 +1292,8 @@ const char* const newstroke_font[] =
     "KZLIMGOFRFUGXG",
     ":j>R?PAOCPDR RC^D\\F[H\\I^ RCFDDFCHDIF ROcPaR`TaUc ROAP?R>T?UA R[^\\\\^[`\\a^ R[F\\D^C`DaF R`RaPcOePfR",
     ":jDQ>Q RH[D_ RHGDC RR_Re RRCR= R\\[`_ R\\G`C R`QfQ",
-    "G]LFL[XFX[ RX[[[Ub RN>O@QASAU@V>",
-    "H\\MMM[WMW[ RW[Z[Tb RNEOGQHSHUGVE",
+    "G]LFL[XFX[[[Ub RN>O@QASAU@V>",
+    "H\\MMM[WMW[Z[Tb RNEOGQHSHUGVE",
     "H]MFM[S[VZXXYVYSXQVOSNMN RJIPI",
     "IZKMQM RNFN[S[UZVXVUUSSRNR",
     "G\\L[LFTFVGWHXJXMWOVPTQLQ RTMXS",
@@ -1317,7 +1317,7 @@ const char* const newstroke_font[] =
     "E\\X[OO RXFLR RGFLFL[", /* U+4A0 K_CAP_BASHKIR  */
     "HZPSV[ RVMNU RJMNMN[",
     "G]L[LF RLPXP RX[XF RX[Z[Z`",
-    "H[MTVT RMMM[ RVMV[ RV[X[X`",
+    "H[MTVT RMMM[ RVMV[X[X`",
     "GeL[LF RLPXP RX[XFcF",
     "H`MTVT RMMM[ RV[VM^M",
     "GhL[LFXFX[ RXM^MaNcPdSd\\c_aa^b\\b",
@@ -1327,7 +1327,7 @@ const char* const newstroke_font[] =
     "F[WYVZS[Q[NZLXKVJRJOKKLINGQFSFVGWH RR\\T]U_TaRbOb",
     "HZVZT[P[NZMYLWLQMONNPMTMVN RR\\T]U_TaRbOb",
     "JZLFXF RR[RF RR[T[T`",
-    "KYMMWM RRMR[ RR[T[T`",
+    "KYMMWM RRMR[T[T`",
     "I[RQR[ RKFRQYF",
     "JZR[Rb RMMR[WM",
     "I[RQR[ RKFRQYF RNUVU", /* U+4B0 Y_CAP STROKE_H */
@@ -1354,13 +1354,13 @@ const char* const newstroke_font[] =
     "F\\W[WFTFQGOINLLXKZI[H[ RW[Z[Tb",
     "I[V[VMSMQNPPOXNZL[ RV[Y[Sb",
     "G]L[LF RLPXP RX[XF RX[X_WaUbSb",
-    "H[MTVT RMMM[ RVMV[ RV[V_UaSbQb",
+    "H[MTVT RMMM[ RVMV[V_UaSbQb",
     "G]L[LF RLPXP RX[XF RX[[[Ub",
-    "H[MTVT RMMM[ RVMV[ RV[Y[Sb",
+    "H[MTVT RMMM[ RVMV[Y[Sb",
     "H\\WFW[ RLFLNMPNQPRWR RW[U[U`",
     "J\\VMV[ RNMNROTQUVU RV[T[T`",
-    "F^K[KFRUYFY[ RY[\\[Vb",
-    "G]L[LMRXXMX[ RX[[[Ub",
+    "F^K[KFRUYFY[\\[Vb",
+    "G]L[LMRXXMX[[[Ub",
     "MWR[RF",
     "I[MUWU RK[RFY[ RN>O@QASAU@V>", /* U+4D0 A_CAP BREVE */
     "I\\W[WPVNTMPMNN RWZU[P[NZMXMVNTPSUSWR RNEOGQHSHUGVE",
@@ -8088,7 +8088,7 @@ const char* const newstroke_font[] =
     "H[P[NZMYLWLQMONNPMSMUNVOWQWWVYUZS[P[ RUNWMXKWIVH RPESH",
     "G]PFTFVGXIYMYTXXVZT[P[NZLXKTKMLINGPF RVGXFYDXBWA RRAT?U=T;R:P:",
     "H[P[NZMYLWLQMONNPMSMUNVOWQWWVYUZS[P[ RUNWMXKWIVH RRHTFUDTBRAPA",
-    "G]PFTFVGXIYMYTXXVZT[P[NZLXKTKMLINGPF RVGXFYDXBWA RWAVBTCPANBMC", /* U+1EE0 O_CAP HORN */
+    "G]PFTFVGXIYMYTXXVZT[P[NZLXKTKMLINGPF RVGXFYDXBWAVBTCPANBMC", /* U+1EE0 O_CAP HORN */
     "H[P[NZMYLWLQMONNPMSMUNVOWQWWVYUZS[P[ RUNWMXKWIVH RWHVITJPHNIMJ",
     "G]PFTFVGXIYMYTXXVZT[P[NZLXKTKMLINGPF RVGXFYDXBWA RRbSaR`QaRbR`",
     "H[P[NZMYLWLQMONNPMSMUNVOWQWWVYUZS[P[ RUNWMXKWIVH RRbSaR`QaRbR`",
@@ -8096,15 +8096,15 @@ const char* const newstroke_font[] =
     "H[VMV[ RMMMXNZP[S[UZVY RRbSaR`QaRbR`",
     "G]LFLWMYNZP[T[VZWYXWXF RRAT?U=T;R:P:",
     "H[VMV[ RMMMXNZP[S[UZVY RRHTFUDTBRAPA",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@ RT>QA",
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@ RT>QA",
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG RTEQH",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@ RP>SA",
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@ RP>SA",
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG RPESH",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@ RRAT?U=T;R:P:",
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@ RRAT?U=T;R:P:",
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG RRHTFUDTBRAPA",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@ RWAVBTCPANBMC",
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@ RWAVBTCPANBMC",
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG RWHVITJPHNIMJ",
-    "G]LFLWMYNZP[T[VZWYXWXF RXFZE[CZAY@ RRbSaR`QaRbR`", /* U+1EF0 U_CAP HORN */
+    "G]LFLWMYNZP[T[VZWYXWXFZE[CZAY@ RRbSaR`QaRbR`", /* U+1EF0 U_CAP HORN */
     "H[VMV[ RMMMXNZP[S[UZVY RVMXLYJXHWG RRbSaR`QaRbR`",
     "I[RQR[ RKFRQYF RP>SA",
     "JZMMR[ RWMR[P`OaMb RPESH",
@@ -9300,7 +9300,7 @@ const char* const newstroke_font[] =
     "E_I[V[VK RN[NK[K",
     "E_JKZK RJSRKZSR[JS",
     "E_Z[J[ RZSR[JSRKZS", /* U+2390 *OPEN_H  */
-    "E_JKZK RJSRKZSR[JS RJSZS",
+    "E_JKZK RJSRKZSR[JSZS",
     "E_Z[J[ RZSR[JSRKZS RJSZS",
     "E_JVLV RJPZP RQVSV RXVZV",
     "BbL[FQLGXG^QX[L[",
diff --git a/tools/newstroke/fontconv.py b/tools/newstroke/fontconv.py
index 1aca5d1fc5..e272e047c0 100644
--- a/tools/newstroke/fontconv.py
+++ b/tools/newstroke/fontconv.py
@@ -10,8 +10,7 @@ from typing import Any, NamedTuple
 import re
 import sys
 
-# fontconv.awk only performed duplicate removal within a source glyph
-global_duplicate_point_removal = False
+global_duplicate_point_removal = True
 
 input_fonts = ['symbol', 'font', 'hiragana',
                'katakana', 'half_full', 'CJK_symbol',