Goでフォントを扱うことって(おそらく、たぶん、きっと)ほとんどないと思うのですが、私はなぜか文字が入っているpngファイルの生成とかER図とかを出すようなOSSを開発していることから、フォント周りのGoパッケージを作る機会がありました。
どれもパッケージというには小さいコード片で紹介することもないだろうと思っていたのですが、せっかくなので紹介したいと思います*1。
fontdir
フォントを指定するためには大抵フォントファイルのパスを指定しなければいけません。
fontdirは各環境でフォントファイルが格納されているディレクトリを取得できるだけのパッケージです。
これはパッケージを作ったと言うより https://github.com/flopp/go-findfont のフォントディレクトリ取得関数がprivateだったのでその関数だけポーティングしました。
ffff
何かのOSSとかでフォントを指定してもらうような設定を作った時、「自分でフォントファイルを指定する」ならまだしも「ユーザにフォント名を寸分違わず指定してもらう」って厳しいUXだろうなと思って作りました。
ffffはフォントをFuzzy FindしてくれるGoパッケージです。
今のところTrueTypeとOpenTypeに対応していて、検索するときに 検索結果のフォントがどのTypeかはわからないので両方のOptionを指定しておく というアプローチをとっています。
package main import ( "fmt" "github.com/beta/freetype/truetype" "github.com/k1LoW/ffff" "golang.org/x/image/font" "golang.org/x/image/font/opentype" ) func main() { fontSize := 12.0 dpi := 72.0 to := &truetype.Options{ Size: fontSize, DPI: dpi, Hinting: font.HintingNone, GlyphCacheEntries: 0, SubPixelsX: 0, SubPixelsY: 0, } oo := &opentype.FaceOptions{ Size: fontSize, DPI: dpi, Hinting: font.HintingNone, } face, err := ffff.FuzzyFindFace("Arial", to, oo) if err != nil { panic(err) } fmt.Printf("%v", face) }
mplus-fonts
golang.org/x/image/font/gofont のフォントの組み込みの仕組み面白いですよね。中身は単純にTTFファイルを []byte
にして突っ込んでいるだけという。
面白いと思ったのでgofontの []byte
化の仕組みを使って、M+FONTSのTTFファイルをGoパッケージにしてみました。
本当は他のOSSで使おうと思って作ったのですが、他のアプローチでいろいろ解決したのでまだ使っていません。
ちなみに、デザイナーの人からしたら :thinking: な感じかもしれませんが「好きなフォントは何ですか?」と聞かれたら私は「Century GothicかM+FONTS」と答えるくらいにはM+FONTSの印象が強いです。
紹介は以上です。