<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua - tag - fontforge</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/tag/fontforge/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/tag/fontforge" />
  <id>https://sachachua.com/blog/tag/fontforge/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2020-06-08T03:01:59Z</updated>
<entry>
		<title type="html">Having fun kerning using Org Mode and FontForge</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2020/06/having-fun-kerning-using-org-mode-and-fontforge/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2020-06-08T07:33:51Z</updated>
    <published>2020-06-08T03:01:59Z</published>
    <category term="emacs" />
<category term="org" />
		<id>https://sachachua.com/blog/?p=29577</id>
		<content type="html"><![CDATA[
<p>It turns out that working with font bearings and kerning tables using Org Mode makes lots of things so much easier. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1366" height="726" src="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_00-01-05.png" alt="" class="wp-image-29578" srcset="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_00-01-05.png 1366w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_00-01-05-640x340.png 640w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_00-01-05-280x149.png 280w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_00-01-05-768x408.png 768w" sizes="(max-width: 1366px) 100vw, 1366px"><figcaption>Bearings in the top left, kerning matrix in the top right</figcaption></figure>



<p>
While trying to figure out kerning, I came across this issue that described how you sometimes need a <a href="https://www.dafont.com/forum/read/405813/the-kerning-is-set-in-a-way-that-doesn-t-work-at-dafont-we-use-the-gd-library-of-php">character-pair kern table instead of just class-based kerning</a>. Since I had figured out character-based kerning before I figured out class-based kerning, it was easy to restore my Python code that takes the same kerning matrix and generates character pairs. Here's what that code looks like.
</p>



<div class="org-src-container">
<pre class="src src-python" id="orge5e9368"><code><span class="org-keyword">def</span> <span class="org-function-name">kern_by_char</span>(font, kerning_matrix):</code>
<code>  <span class="org-comment-delimiter"># </span><span class="org-comment">Add kerning by character as backup</span></code>
<code>  font.addLookupSubtable(<span class="org-string">"kern"</span>, <span class="org-string">"kern-2"</span>)</code>
<code>  <span class="org-variable-name">offsets</span> = np.asarray(kerning_matrix)</code>
<code>  <span class="org-variable-name">classes_right</span> = [<span class="org-constant">None</span> <span class="org-keyword">if</span> (x == <span class="org-string">""</span> <span class="org-keyword">or</span> x == <span class="org-string">"None"</span>) <span class="org-keyword">else</span> x.split(<span class="org-string">","</span>) <span class="org-keyword">for</span> x <span class="org-keyword">in</span> offsets[0,1:]]</code>
<code>  <span class="org-variable-name">classes_left</span> = [<span class="org-constant">None</span> <span class="org-keyword">if</span> (x == <span class="org-string">""</span> <span class="org-keyword">or</span> x == <span class="org-string">"None"</span>) <span class="org-keyword">else</span> x.split(<span class="org-string">','</span>) <span class="org-keyword">for</span> x <span class="org-keyword">in</span> offsets[1:,0]]</code>
<code>  <span class="org-keyword">for</span> r, row <span class="org-keyword">in</span> <span class="org-builtin">enumerate</span>(classes_left):</code>
<code>    <span class="org-keyword">if</span> row <span class="org-keyword">is</span> <span class="org-constant">None</span>: <span class="org-keyword">continue</span></code>
<code>    <span class="org-keyword">for</span> first_letter <span class="org-keyword">in</span> row:</code>
<code>      <span class="org-variable-name">g</span> = font.createMappedChar(first_letter)</code>
<code>      <span class="org-keyword">for</span> c, column <span class="org-keyword">in</span> <span class="org-builtin">enumerate</span>(classes_right):</code>
<code>        <span class="org-keyword">if</span> column <span class="org-keyword">is</span> <span class="org-constant">None</span>: <span class="org-keyword">continue</span></code>
<code>        <span class="org-keyword">for</span> second_letter <span class="org-keyword">in</span> column:</code>
<code>          <span class="org-keyword">if</span> kerning_matrix[r + 1][c + 1]:</code>
<code>            g.addPosSub(<span class="org-string">"kern-2"</span>, second_letter, 0, 0, kerning_matrix[r + 1][c + 1], 0, 0, 0, 0, 0)</code>
<code>  <span class="org-keyword">return</span> font</code>
</pre>
</div>



<p>I wanted to be able to easily compare different versions of my font: my original glyphs versus my tweaked glyphs, simple spacing versus kerned. This was a hassle with FontForge, since I had to open different font files in different Metrics windows. If I execute a little bit of source code in my Org Mode, though, I can use my test web page to view all the different versions. By arranging my Emacs windows a certain way and adding <code>:eval no</code> to the Org Babel blocks I'm not currently using, I can easily change the relevant table entries and evaluate the whole buffer to regenerate the font versions, including exports to OTF and WOFF. Here's the code for that: </p>



<div class="org-src-container">
<pre class="src src-python"><code>&lt;&lt;params&gt;&gt;</code>
<code>&lt;&lt;def_import_glyphs&gt;&gt;</code>
<code>&lt;&lt;def_set_bearings&gt;&gt;</code>
<code>&lt;&lt;def_kern_classes&gt;&gt;</code>
<code>&lt;&lt;def_kern_by_char&gt;&gt;</code>
<code><span class="org-variable-name">font</span> = fontforge.font()</code>
<code><span class="org-variable-name">font</span> = import_glyphs(font, params)</code>
<code><span class="org-variable-name">font</span> = set_bearings(font, bearings)</code>
<code>save_font(font, {**params, <span class="org-string">"new_otf"</span>: <span class="org-string">"sachacHandRaw.otf"</span>})</code>
<code><span class="org-variable-name">font</span> = kern_classes(font, kerning_matrix)</code>
<code><span class="org-variable-name">font</span> = kern_by_char(font, kerning_matrix)</code>
<code>save_font(font, {**params, <span class="org-string">"new_otf"</span>: <span class="org-string">"sachacHandRawKerned.otf"</span>})</code>
<code><span class="org-variable-name">font</span> = load_font(<span class="org-string">'SachaHandEdited.sfd'</span>)</code>
<code><span class="org-variable-name">font</span> = set_bearings(font, bearings)</code>
<code>font.removeLookup(<span class="org-string">'kern'</span>)</code>
<code>save_font(font, {**params, <span class="org-string">"new_otf"</span>: <span class="org-string">"sachacHandEdited.otf"</span>})</code>
<code><span class="org-variable-name">font</span> = kern_classes(font, kerning_matrix)</code>
<code><span class="org-variable-name">font</span> = kern_by_char(font, kerning_matrix)</code>
<code>save_font(font, {**params, <span class="org-string">"new_otf"</span>: <span class="org-string">"sachacHand.otf"</span>})</code>
</pre>
</div>



<p>I also like the way it's pretty easy to update multiple kerning values without clicking around. I sometimes use FontForge to get the number to set it to and then copy that into my table, but I also sometimes just tweak the number in Org Mode directly. </p>



<p>To see the results, I can generate a test HTML that shows me text with different versions of my font. I can also look at lots of kerning pairs at the same time. Here are the components of that test page: </p>



<div class="org-src-container">
<pre class="src src-python" id="orgde60347"><code><span class="org-keyword">def</span> <span class="org-function-name">test_css</span>(fonts):</code>
<code>  <span class="org-variable-name">doc</span>, <span class="org-variable-name">tag</span>, <span class="org-variable-name">text</span>, <span class="org-variable-name">line</span> = Doc().ttl()</code>
<code>  <span class="org-keyword">with</span> tag(<span class="org-string">'style'</span>):</code>
<code>    <span class="org-keyword">for</span> f <span class="org-keyword">in</span> fonts:</code>
<code>      text(<span class="org-string">"@font-face { font-family: '%s'; src: url('%s'); }"</span> % (f[0], f[1]))</code>
<code>      text(<span class="org-string">".%s { font-family: '%s'; }"</span> % (f[0], f[0]))</code>
<code>    text(<span class="org-string">"table { font-size: inherit; font-weight: inherit }"</span>)</code>
<code>    text(<span class="org-string">"td { text-align: left }"</span>)</code>
<code>    text(<span class="org-string">".blog-heading { font-weight: bold; font-size: 32px }"</span>)</code>
<code>    text(<span class="org-string">".default { color: gray }"</span>)</code>
<code>    text(<span class="org-string">"body { font-family: woff, Arial, sans-serif; font-size: 32px; padding: 10px }"</span>)</code>
<code>  <span class="org-keyword">return</span> doc.getvalue()</code>
<code><span class="org-keyword">def</span> <span class="org-function-name">test_html</span>(strings):</code>
<code>  <span class="org-variable-name">doc</span>, <span class="org-variable-name">tag</span>, <span class="org-variable-name">text</span>, <span class="org-variable-name">line</span> = Doc().ttl()</code>
<code>  <span class="org-keyword">with</span> doc.tag(<span class="org-string">'table'</span>, style=<span class="org-string">'border-bottom: 1px solid gray; width: 100%; border-collapse: collapse'</span>):</code>
<code>    <span class="org-keyword">for</span> s <span class="org-keyword">in</span> strings:</code>
<code>      <span class="org-keyword">for</span> i, f <span class="org-keyword">in</span> <span class="org-builtin">enumerate</span>(fonts):</code>
<code>        <span class="org-variable-name">style</span> = <span class="org-string">'border-top: 1px solid gray'</span> <span class="org-keyword">if</span> (i == 0) <span class="org-keyword">else</span> <span class="org-string">""</span></code>
<code>        <span class="org-keyword">with</span> tag(<span class="org-string">'tr'</span>, klass=f[0], style=style):</code>
<code>          line(<span class="org-string">'td'</span>, f[0])</code>
<code>          line(<span class="org-string">'td'</span>, s)</code>
<code>  <span class="org-keyword">return</span> doc.getvalue()</code>
<code><span class="org-keyword">def</span> <span class="org-function-name">test_kerning_matrix</span>(kerning_matrix):</code>
<code>  <span class="org-variable-name">doc</span>, <span class="org-variable-name">tag</span>, <span class="org-variable-name">text</span>, <span class="org-variable-name">line</span> = Doc().ttl()</code>
<code>  <span class="org-keyword">with</span> tag(<span class="org-string">'table'</span>):</code>
<code>    <span class="org-keyword">for</span> r, row <span class="org-keyword">in</span> <span class="org-builtin">enumerate</span>(classes_left):</code>
<code>      <span class="org-keyword">if</span> row <span class="org-keyword">is</span> <span class="org-constant">None</span>: <span class="org-keyword">continue</span></code>
<code>      <span class="org-keyword">for</span> first_letter <span class="org-keyword">in</span> row:</code>
<code>        <span class="org-keyword">with</span> tag(<span class="org-string">'tr'</span>):</code>
<code>          line(<span class="org-string">'td'</span>, first_letter)</code>
<code>          <span class="org-keyword">for</span> c, column <span class="org-keyword">in</span> <span class="org-builtin">enumerate</span>(classes_right):</code>
<code>            <span class="org-keyword">if</span> column <span class="org-keyword">is</span> <span class="org-constant">None</span>: <span class="org-keyword">continue</span></code>
<code>            <span class="org-keyword">for</span> second_letter <span class="org-keyword">in</span> column:</code>
<code>              <span class="org-variable-name">klass</span> = <span class="org-string">"kerned"</span> <span class="org-keyword">if</span> kerning_matrix[r + 1][c + 1] <span class="org-keyword">else</span> <span class="org-string">"default"</span></code>
<code>              line(<span class="org-string">'td'</span>, aglfn.to_glyph(first_letter) + aglfn.to_glyph(second_letter), klass=klass)</code>
<code>  <span class="org-keyword">return</span> doc.getvalue()</code>
</pre>
</div>



<p>
This code actually generates the test file:
</p>



<div class="org-src-container">
<pre class="src src-python"><code><span class="org-keyword">from</span> yattag <span class="org-keyword">import</span> Doc</code>
<code><span class="org-keyword">import</span> numpy <span class="org-keyword">as</span> np</code>
<code><span class="org-keyword">import</span> aglfn</code>
<code>&lt;&lt;def_test_html&gt;&gt;</code>
<code><span class="org-variable-name">doc</span>, <span class="org-variable-name">tag</span>, <span class="org-variable-name">text</span>, <span class="org-variable-name">line</span> = Doc().ttl()</code>
<code><span class="org-variable-name">fonts</span> = [[<span class="org-string">'raw'</span>, <span class="org-string">'sachacHandRaw.otf'</span>],</code>
<code>         [<span class="org-string">'raw-kerned'</span>, <span class="org-string">'sachacHandRawKerned.otf'</span>],</code>
<code>         [<span class="org-string">'edited'</span>, <span class="org-string">'sachacHandEdited.otf'</span>],</code>
<code>         [<span class="org-string">'woff'</span>, <span class="org-string">'sachacHand.woff'</span>]]</code>
<code><span class="org-variable-name">strings</span> = [<span class="org-string">"Python+FontForge+Org: I made a font based on my handwriting!"</span>,</code>
<code>           <span class="org-string">"Monthly review: May 2020"</span>,</code>
<code>           <span class="org-string">"Emacs News 2020-06-01"</span>]</code>
<code><span class="org-variable-name">offsets</span> = np.asarray(kerning_matrix)</code>
<code><span class="org-variable-name">classes_left</span> = [<span class="org-constant">None</span> <span class="org-keyword">if</span> (x == <span class="org-string">""</span> <span class="org-keyword">or</span> x == <span class="org-string">"None"</span>) <span class="org-keyword">else</span> x.split(<span class="org-string">','</span>) <span class="org-keyword">for</span> x <span class="org-keyword">in</span> offsets[1:,0]]</code>
<code><span class="org-variable-name">classes_right</span> = [<span class="org-constant">None</span> <span class="org-keyword">if</span> (x == <span class="org-string">""</span> <span class="org-keyword">or</span> x == <span class="org-string">"None"</span>) <span class="org-keyword">else</span> x.split(<span class="org-string">","</span>) <span class="org-keyword">for</span> x <span class="org-keyword">in</span> offsets[0,1:]]</code>
<code><span class="org-keyword">with</span> tag(<span class="org-string">'html'</span>):</code>
<code>  <span class="org-keyword">with</span> tag(<span class="org-string">'head'</span>): </code>
<code>    doc.asis(test_css(fonts))</code>
<code>  <span class="org-keyword">with</span> tag(<span class="org-string">'body'</span>):</code>
<code>    line(<span class="org-string">'h1'</span>, <span class="org-string">'Test headings'</span>)</code>
<code>    <span class="org-keyword">with</span> tag(<span class="org-string">'div'</span>, klass=<span class="org-string">"blog-heading"</span>):</code>
<code>      doc.asis(test_html(strings))</code>
<code>    line(<span class="org-string">'h1'</span>, <span class="org-string">'Kerning matrix'</span>)</code>
<code>    doc.asis(test_kerning_matrix(kerning_matrix))</code>
<code><span class="org-keyword">return</span> doc.getvalue()</code>
</pre>
</div>



<p> And here's what that <a href="https://pages.sachachua.com/sachac-hand/files/test.html">test.html</a> looks like: </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="878" height="576" src="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-12.png" alt="" class="wp-image-29579" srcset="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-12.png 878w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-12-640x420.png 640w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-12-280x184.png 280w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-12-768x504.png 768w" sizes="(max-width: 878px) 100vw, 878px"><figcaption>Testing the font with a few blog headings</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="560" height="266" src="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-23.png" alt="" class="wp-image-29580" srcset="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-23.png 560w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-07_22-37-23-280x133.png 280w" sizes="(max-width: 560px) 100vw, 560px"><figcaption>Kerning pairs: black for specified pairs, gray for defaults</figcaption></figure>



<p> Not bad… Now Emacs is my font editor! The code is at <a href="https://github.com/sachac/sachac-hand">https://github.com/sachac/sachac-hand</a> .</p>
]]></content>
		</entry><entry>
		<title type="html">Python+FontForge+Org: I made a font based on my handwriting!</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2020/06/pythonfontforgeorg-i-made-a-font-based-on-my-handwriting/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2020-06-05T08:29:25Z</updated>
    <published>2020-06-05T04:20:00Z</published>
    <category term="emacs" />
<category term="geek" />
<category term="org" />
		<id>https://sachachua.com/blog/?p=29568</id>
		<content type="html"><![CDATA[
<div class="wp-block-group"><div class="wp-block-group__inner-container">
<p>I wanted to make a font based on my handwriting using only free software. It turns out that FontForge can be scripted with Python. I know just a little about Python and even less about typography, but I managed to hack together something that worked for me. If you're reading this on my blog at <a href="https://sachachua.com/blog/">https://sachachua.com/blog/</a> , you'll probably see the new font being used on the blog post titles. Whee!</p>
<p><a href="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-04_23-49-38.png"><img loading="lazy" class="alignnone size-thumbnail wp-image-29569" src="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-04_23-49-38-280x52.png" alt="" width="280" height="52" srcset="https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-04_23-49-38-280x52.png 280w, https://sachachua.com/blog/wp-content/uploads/2020/06/Screenshot_2020-06-04_23-49-38.png 635w" sizes="(max-width: 280px) 100vw, 280px"></a></p>
<p>My rough notes are at <a href="https://github.com/sachac/sachac-hand/">https://github.com/sachac/sachac-hand/</a>&nbsp;. I wanted to write it as a literate program using Org Babel blocks. It's not really fully reproducible yet, but it might be a handy starting point. The basic workflow was:</p>
<ol class="org-ol">
<li>Generate a template using other fonts as the base.</li>
<li>Import the template into Medibang Paint on my phone and draw letters on a different layer. (I almost forgot the letter <code>q</code>, so I had to add it at the last minute.)</li>
<li>Export just the layer with my writing.</li>
<li>Cut the image into separate glyphs using Python and autotrace each one.</li>
<li>Import each glyph into FontForge as an SVG and a PNG.</li>
<li>Set the left side and right side bearing, overriding as needed based on a table.</li>
<li>Figure out kerning classes.</li>
<li>Hand-tweak the contours and kerning.</li>
<li>Use <code>sfnt2woff</code> to export the web font file for use on my blog, and modify the stylesheet to include it.</li>
</ol>
<p>I really liked being able to specify kerning classes through an Org Mode table like this:</p>
<table border="2" frame="hsides" rules="groups" cellspacing="0" cellpadding="6"><colgroup> <col class="org-left"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> <col class="org-right"> </colgroup>
<tbody>
<tr>
<td class="org-left">&nbsp;</td>
<td class="org-right">None</td>
<td class="org-right">o,a,c,e,d,g,q,w</td>
<td class="org-right">f,t,x,v,y,z</td>
<td class="org-right">h,b,l,i,k</td>
<td class="org-right">j</td>
<td class="org-right">m,n,p,r,u</td>
<td class="org-right">s</td>
<td class="org-right">T</td>
<td class="org-right">zero</td>
</tr>
<tr>
<td class="org-left">None</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-left">f</td>
<td class="org-right">0</td>
<td class="org-right">-102</td>
<td class="org-right">-61</td>
<td class="org-right">-30</td>
<td class="org-right">0</td>
<td class="org-right">-60</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">-70</td>
</tr>
<tr>
<td class="org-left">t</td>
<td class="org-right">0</td>
<td class="org-right">-70</td>
<td class="org-right">-41</td>
<td class="org-right">-25</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">-10</td>
</tr>
<tr>
<td class="org-left">r</td>
<td class="org-right">0</td>
<td class="org-right">-82</td>
<td class="org-right">-41</td>
<td class="org-right">-25</td>
<td class="org-right">0</td>
<td class="org-right">-20</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">29</td>
</tr>
<tr>
<td class="org-left">k</td>
<td class="org-right">0</td>
<td class="org-right">-50</td>
<td class="org-right">-81</td>
<td class="org-right">-20</td>
<td class="org-right">0</td>
<td class="org-right">-20</td>
<td class="org-right">-48</td>
<td class="org-right">-120</td>
<td class="org-right">-79</td>
</tr>
<tr>
<td class="org-left">l</td>
<td class="org-right">0</td>
<td class="org-right">-41</td>
<td class="org-right">-50</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">-52</td>
</tr>
<tr>
<td class="org-left">v</td>
<td class="org-right">0</td>
<td class="org-right">-40</td>
<td class="org-right">-35</td>
<td class="org-right">-30</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">30</td>
</tr>
<tr>
<td class="org-left">b,o,p</td>
<td class="org-right">0</td>
<td class="org-right">-20</td>
<td class="org-right">-80</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">43</td>
</tr>
<tr>
<td class="org-left">a</td>
<td class="org-right">0</td>
<td class="org-right">-23</td>
<td class="org-right">-60</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">7</td>
</tr>
<tr>
<td class="org-left">W</td>
<td class="org-right">0</td>
<td class="org-right">-40</td>
<td class="org-right">-30</td>
<td class="org-right">-20</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-120</td>
<td class="org-right">17</td>
</tr>
<tr>
<td class="org-left">T</td>
<td class="org-right">0</td>
<td class="org-right">-190</td>
<td class="org-right">-120</td>
<td class="org-right">-60</td>
<td class="org-right">0</td>
<td class="org-right">-130</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-188</td>
</tr>
<tr>
<td class="org-left">F</td>
<td class="org-right">0</td>
<td class="org-right">-100</td>
<td class="org-right">-90</td>
<td class="org-right">-60</td>
<td class="org-right">0</td>
<td class="org-right">-70</td>
<td class="org-right">-100</td>
<td class="org-right">-40</td>
<td class="org-right">-166</td>
</tr>
<tr>
<td class="org-left">two</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
<td class="org-right">-53</td>
</tr>
</tbody>
</table>
<p>I had a hard time defining classes using the FontForge interface because I occasionally ended up clearing my glyph selection, so it was great being able to just edit my columns and rows.</p>
<p>Clearly my kerning is still very rough–no actual values for j, for example–but it's a start. Also, I can probably figure out how to combine this with character pair kerning and have two tables for easier tweaking.</p>
<p>A- insisted on tracing my handwriting template a few times, so I might actually be able to go through the same process to convert her handwriting into a font. Whee!</p>
</div></div>
]]></content>
		</entry>
</feed>