Just a short post to share a wonderful C library I recently came across: libotf which provides a really nice API for working with OpenType fonts. Of course, LuaTeX already has excellent support of OpenType fonts through the use of code from FontForge and the excellent fontspec
package by Will Robertson and Khaled Hosny. So, for sure, with LuaTeX you don’t need to leverage the services libotf
provides but it does offer an additional route to explore OpenType fonts and access OpenType font features in a direct way, which can be extremely instructive. The only downside is that the liboft
API is not documened in great detail: you have to rely on comments within one of the header files (otf.h
) and reading the source code of the examples… plus a bit of trial and error.
I use Microsoft’s Visual Studio for my C programming hobby (except for compiling LuaTeX) which can make for some “interesting challenges” when using C libraries that originate from the Linux world: particularly where there are complex dependencies on many other libraries (“dependency hell”). Thankfully, liboft
has only 1 dependency, FreeType, which itself builds really cleanly and easily using Visual Studio. libotf
is also fairly straightforward to compile as a Windows library (.lib).
Compiling on Windows, a tip: After building
libotf
I found that the API calls kept failing and tracked it down to 1 line of theliboft
source code (note that I am usinglibotf
version 0.9.12). Inotfopen.c
there is 1 line that you’ll need to change on Windows.Line 2974 of
otfopen.c
usesfopen
but did not use binary mode, so for Windows change
fp = fopen (otf_name, "r");
to
fp = fopen (otf_name, "rb");
and that seems to have fixed all the problems. If only all ports were that easy!
To use libtof
/FreeType as a DLL plug-in with LuaTeX you will, of course, need to use the Lua C api to create a Lua “binding”, something I’m not going to cover here.