A simple library for font loading and glyph rasterization using FontConfig, FreeType and pixman.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Daniel Eklöf d4463930cf
changelog: add new ‘unreleased’ section
2 years ago
.builds ci: sr.ht: add step that builds with text-shaping disabled 2 years ago
doc doc: bump version to 2.3.1 2 years ago
fcft fcft: grapheme rasterize: we want to be able to pass tags=NULL 2 years ago
unicode license: add Unicode license file, closes #4 2 years ago
.gitignore gitignore: subprojects directory 2 years ago
.gitlab-ci.yml ci: add stage that builds *without* text-shaping 2 years ago
.gitmodules tllist: remove submodule 2 years ago
CHANGELOG.md changelog: add new ‘unreleased’ section 2 years ago
LICENSE license: add missing license (MIT) file. Closes #3 2 years ago
PKGBUILD meson/pkgbuild: bump version to 2.3.1 2 years ago
README.md readme: document how to enable the text-shaping tests, and their requirements 2 years ago
fcft.c fcft: static_assert() -> _Static_assert() 2 years ago
generate-unicode-precompose.sh meson: generate a table of pre-composed unicode characters 2 years ago
generate-version.sh fcft: log fcft version when logging freetype+fontconfig version 2 years ago
log.c log: \e -> \033 since \e is a gcc extension 2 years ago
log.h log: include 'fmt' in __VA_ARGS__ 2 years ago
meson.build meson/pkgbuild: bump version to 2.3.1 2 years ago
meson_options.txt meson: add option -Dtest-text-shaping=false|true 2 years ago
test.c test: verify fcft_grapheme_rasterize() returns a different grapheme when tags differ 2 years ago



fcft is a small font loading and glyph rasterization library built on-top of FontConfig, FreeType2 and pixman.

It can load and cache fonts from a fontconfig-formatted name string, e.g. Monospace:size=12, optionally with user configured fallback fonts.

After a font has been loaded, you can rasterize glyphs. When doing so, the primary font is first considered. If it does not have the requested glyph, the user configured fallback fonts (if any) are considered. If none of the user configured fallback fonts has the requested glyph, the FontConfig generated list of fallback fonts are checked.

The API is documented as man pages. These are built and installed when fcft is built as a standalone project, but not when built as a subproject.


  • fontconfig
  • freetype
  • pixman
  • harfbuzz (optional)
  • tllist, unless built as a subproject


  • Supports all fonts loadable by FreeType2
  • Antialiasing
  • Subpixel antialiasing
  • Color bitmap fonts (emoji fonts)
  • Font caching
  • Glyph caching
  • Kerning1

Not supported

  • Subpixel positioning

Remember, this is a simple library, not a full blown layout engine.

Projects using fcft


You can either install fcft as a system library, or use it as a meson subproject (assuming your project is meson based, of course).


If you install fcft as a system library, you can use pkg-config to get the compiler flags needed to find and link against fcft.


If your project is meson based, you can use fcft as a subproject. In your main project's meson.build, do something like:

fcft = subproject('fcft').get_variable('fcft')
executable('you-executable', ..., dependencies: [fcft])

Or, if fcft has been installed as a system library, a regular

fcft = dependency('fcft')

will suffice. Optionally, you can combine the two; search for a system library first, and fallback to a subproject:

fcft = dependency('fcft', version: '>=0.4.0', fallback: 'fcft')


For most users, this is typically enough:

meson build --buildtype=release
ninja -C build
ninja -C build test
sudo ninja -C build install

The tests require at least one latin font to be installed.

By default, fcft will be built with support for text-shaping if HarfBuzz is available. You can explicitly enable or disable this with the -Dtext-shaping=disabled|enabled|auto meson command line option.

If text-shaping is enabled, you might also want to enable the associated tests. Use -Dtest-text-shaping=true to do so. Note that these tests require an emoji font to be installed, and fc-match emoji must return that font first.


fcft is released under the MIT license.

fcft uses Unicode data files released under the Unicode, INC. License Agreement.

  1. only basic kerning supported (i.e. the old 'kern' tables, not the new 'GPOS' tables)