From 63f3c4c3175f097de399155adab8560bde374758 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 10 Nov 2023 10:19:48 -0700 Subject: [PATCH] README --- README.md | 67 +++++++++++----------------------------------- images/kern.png | Bin 753 -> 2133 bytes images/kerned.pdf | Bin 0 -> 8071 bytes images/kerned.png | Bin 11830 -> 0 bytes 4 files changed, 16 insertions(+), 51 deletions(-) create mode 100644 images/kerned.pdf delete mode 100644 images/kerned.png diff --git a/README.md b/README.md index 94cf139..91571f2 100644 --- a/README.md +++ b/README.md @@ -21,49 +21,13 @@ $ python3 kern_pair.py FontFile.ttf PairString ## Example ``` -$ python3 kern_pair.py Roboto-Regular.ttf --dict /usr/share/dict/words +$ python3 kern_pair.py Roboto-Regular.ttf --dict /usr/share/dict/words -l fi 0 -4 -lt 4 0 -rb 4 0 -rk 4 0 -dy 4 0 -rh 4 0 -yb 4 0 -dv 4 0 -Ti -4 0 -dt 5 0 -yh 4 0 -Ap 4 0 -Ly -1 -6 -kp 4 0 -ET -3 1 -PA -3 -7 -RT 0 -4 -FA -3 -8 -Ut 4 0 -kj 6 0 -LT -9 -13 -IX -3 1 -Aj 5 0 -GT -4 0 -Mt 4 0 -Lj 4 0 -YU -1 -5 -Ht 4 0 -Kj 6 0 -hT -7 0 -TJ -7 -12 -cT -6 0 -vb 4 0 -rZ -5 0 -oT -8 0 -vh 4 0 -Jt 4 0 -Kp 4 -1 -FJ -9 -13 -Rj 4 0 -HX -3 1 -VJ -5 0 +yt 4 0 +Te -9 -5 +To -9 -5 +TA -8 -4 +DT -5 -1 ``` The first value is the pair of letter to kern. The second value is, in percent @@ -76,23 +40,24 @@ The `-l` or `--letters-only` makes the tool only consider kerning between two letters (ie. no punctuation). The tool also ignores digits, since they typically have a fixed width and no kerning by design. -To inspect the pairs reported, you can use the `kern_pair.py` tool: +A file `kerned.pdf` is always generated, with each page showcasing one pair +the tool thinks would need adjustment: [kerned.pdf](/images/kerned.pdf) + +To inspect the pairs reported, you can use the `kern_pair.py` tool again: ``` -$ python3 kern_pair.py Roboto-Regular.ttf LT -LT autokern: -9 (-184 units) existing kern: -13 (-275 units) -Saving kern.png and kerned.png +$ python3 kern_pair.py Roboto-Regular.ttf To +To autokern: -9 (-184 units) existing kern: -5 (-99 units) +Saving kern.png ``` -In this case the tool thinks the pair "LT" is over-kerned in Roboto. +In this case the tool thinks the pair "To" is not kerned enough in Roboto. Obviously that's up to taste. But here's the two files `kern.png` -and `kerned.png` generated by the tool: +and `kerned.pdf` generated by the tool: ![kern.png](/images/kern.png) -![kerned.png](/images/kerned.png) - In the `kern.png` image, the first line is with no kerning. The second line is the tool's suggestion, and the third line is the existing font -kerning. The `kerned.png`, the pair is showcased between lower, and upper, +kerning. The `kerned.pdf`, the pair is showcased between lower, and upper, letters. The three rows, similarly, show no-kerning, tool's suggestion, and existing kern. diff --git a/images/kern.png b/images/kern.png index f39d7461c6cf9dc43e2f76a188a2ca3ee70eeced..69a1fa5aac6d777e706d91b68ecce2607099bd31 100644 GIT binary patch literal 2133 zcma)8dpy&7A7AwpDdb3DMvtvr9@1=Xb9;)6lW@cl3Ay|>9V40CPC3tUa&OG7&5T@{ z>S(9T-Ebr$XK2=9gu`Nyd)q|hS;zU~`J;25{`$VZ@7MeF`Mkg1&+GO6e$(7s(DHKX zav%^$-pSG4UAmG%pdAlnr2u42Z{$dqoq=c2_MoklEOr|RB&*1Fj!pK6>_bY*`!j`5}Zsu0nPZUnkKi z!M#F+;_dte2GPCc)Z0s3KRj#k$;|%Pnxh^JTh;HM3_aqVv*WJ>uxxy% ztFC*amr+9X(E1fm$ zn3BTpDpgH9S%Z0BTe=P#n79NaZbcavPA8Y?2*b|k9t%P8E9cFKdt?~4l9bD*90o%+ z2`ch!cg@U6IQhYazG@J?@qlT*r^e@4gL_K{Rv1duR1Eo>q$@ zWe^|UUG51R0jC!u7>XITh!M$8WkPn}zRq9BINO_(8=oZ2V*a6KJ?9))XkChZITx(K zc1Q;EJ8XmTIN6xjA;Jo&S8IS58GSpV_2#ilEE&PuN& zp28p#6%-kI6H&h}Rb%@HmYzra&ill)dX~mdI9A-{6|0PDCj2N|IUDPzd+j&@&%~Cf z@i;9FR*{eUs+(RcQzi0^)hQ(n26CP4mIDMK(Q-a#Jr=KJ1DLrec=lTB_{$D27#5Kj z0?SB?!uj!$vp()T>F7%@;Hp;ZmoJ)IM`W& z-m2WztB0?SP%7BrYa_orTcYQFAAU3qG*t^lkBYRI>G_oE{aH+! z^LqVCmH!*&QS2z^9A7e_7_dM<{_}SCwdfwo%o|BefhCvoEHiuNO%SUakB65BqvDGw z70&3CsNCF{HvtYk_}7%j#*j4($dF64#?&~Y*NZsD5I(?kM%Sqsafx9LY&?vjgn&E) zo;ste)!^II>q0mJ(g?7f(RA;Ny0T<~F9M*I=c@g4yIr?Q5P-VcOWNk4gPG)+zoK#$ z`%}q;U_>Ad%FiUtIGREMRCU{4Wdwxp>Wd{4L^{VaP7%$x#BkPc_+YKGJ~ZeS87g&a zgQ=39Lk#+s22Jd9BomJRY?VFy(8{^`+EORDDU%pl`FMol3V=dY9-HpQdlWYhX3vTXZ8a*t2|vC zLn`LHy}Q@9DUhKp&>$}{Jt_S;!>yY)UUE#!dtjvZKxS75_YMZLtfdb>6)Ro0S+4Y< z@UzHvl|84gCds+i%WmjQno1h1m#E(Qr^LMM)!!m*|LRU#fumYSwStezO%6W4zP{%7 z)4!jOzP#B#fBqWla??kjUcbD(@OXXk$I>&8%kIyAB_*<&bm$|x`{Datao7K;eSMg9 zdJ?1bv3<7ds~@G^p2Qd&+YEC3%B1OkAFBkdp%yd}v$j~>c+JGD2j;zZrD4u%Gi#)8 zZN8BkmVDi`Hy>&>X@LiF>g=ll%XYCrLd|UTLej$nmyVvJd}p#=c=mq0!5jz-3Zu|B z_tH#%EIF2RFx~W<*~*PkrmG*~(u+^rWc5OyQr@o6uFz#&xna(lVWh*K4A$>nUfaWU RtO=BsJzf1=);T3K0RWr^NO}MO diff --git a/images/kerned.pdf b/images/kerned.pdf new file mode 100644 index 0000000000000000000000000000000000000000..628a8566c1d98967bfb3e84c9febdd5bf9fc65c0 GIT binary patch literal 8071 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 BNsIsh literal 0 HcmV?d00001 diff --git a/images/kerned.png b/images/kerned.png deleted file mode 100644 index 41946fbccd26491a1d86dfcb613861b9d3eccb5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11830 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 F{{TJ!9Sr~g