racket/draw: how to extract the path from a font% object?

60 views
Skip to first unread message

Matthew Butterick

unread,
Mar 31, 2020, 7:52:44 PM3/31/20
to Racket Users
IIUC every `font%` object must correspond to a particular font file on disk.

If so, given a `font%` object, how do I extract the path to that file?

Matthew Butterick

unread,
Apr 1, 2020, 2:48:25 PM4/1/20
to Racket Users
The answer is you can't, through pure Racket, because Racket delegates the nitty-gritty of font-file resolution to external font-handling libraries.

It is possible, however, to call into the `fontconfig` library via the FFI and make it do the heavy lifting of 1) scanning font directories to amass a list of possible fonts and then 2) finding a match for a certain query pattern, say a family name.

David Storrs

unread,
Apr 1, 2020, 11:14:15 PM4/1/20
to Matthew Butterick, Racket Users
I knocked together a very minimal pure-Racket library for this so you
don't have to FFI. It won't give you all the bells and whistles, but
it should be a good starting point.

https://pkgd.racket-lang.org/pkgn/package/font-finder

Docs: https://github.com/dstorrs/font-finder/blob/master/README.md

Newly arrived on a package server near you.

...where I note there is a newly-created package named 'fontland' that
was put up by Matthew and probably does all this and more. Doh.

Well, hopefully this helps a little bit.
> --
> You received this message because you are subscribed to the Google Groups "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/C28B01B3-4772-4AA4-899C-78DADE7B8B2A%40mbtype.com.

Matthew Butterick

unread,
Apr 2, 2020, 12:19:04 PM4/2/20
to David Storrs, Racket Users
The thorny issue that `fontconfig` handles is mapping from a high-level specification of a font (e.g., family, weight, slant) — that is, how a user would typically specify a font — to an actual font file on disk.

The shortcoming with font filenames is that they don't reliably tell you anything about the font inside. So `fontconfig` digs out metadata from the file itself (IIUC) and uses this to guess which font file best suits your wishes. (Also, Racket ships with `fontconfig`, so it’s guaranteed to be available.)

Most of `fontland` is esoteric nonsense, but for the benefit of future list spelunkers, here's how I used `fontconfig` (badly, perhaps) to solve this problem:

https://github.com/mbutterick/fontland/blob/master/fontland/font-path.rkt
Reply all
Reply to author
Forward
0 new messages