A wrapper for using the Pango text layout and rendering library with Cinder. Supports inline style markup and complex layouts that would be tedious to achieve with Cinder's built-in TextBox and TextLayout classes.
Take a look at the PangoBasic example.
This block has an obscene number of dependencies. Using Tinderbox or similar to integrate it with your project is recommended.
Alpha channels in textures returned from Cinder-Pango are premultiplied. Call
gl::enableAlphaBlendingPremult(); before drawing the texture. If you're seeing strange artifacts around text on different colored backgrounds, this is probably why.
Tested against the Cinder master branch (v9.1).
Tinderbox-generated project files are known to work on:
- Mac OS X 10.11 x64 with Xcode 7.2
- Windows 10 x64 with Visual Studio 2015 Community.
This library was not built with an eye towards backwards compatibility. It's probably relatively trivially achievable by rebuilding the dependencies, but this isn't currently a priority.
Some fonts may not render correctly on Mac OS X, they'll just render as a default serif or sans instead of what you requested. I haven't tracked down exactly how / why this is, but as a work-around you can tell PangoCairo to render glyphs with Freetype instead of the native CoreText library by setting the
PANGOCAIRO_BACKEND environment variable. There's a method in the API to do this globally:
CinderPango::setTextRenderer(TextRenderer::FREETYPE); // this works around some font issues on mac
The TextRenderer::PLATFORM_NATIVE (coretext) backend renderer leaks memory through _pango_core_text_shape, _pango_cairo_core_text_font_new and other methods. The TextRenderer::FREETYPE backend renderer is comparatively free of leaks.
If you get a bunch of
ld: warning: object file (../../../lib/macosx/libcairo.a(cairo.o)) was built for newer OSX version (10.11) than being linked (10.8) warnings, then increase the minimum deploy target to 10.11.
Tinderbox enables the /gm flag in Visual Studio projects by default, which will conflicts with the /mp flag. Disable /gm to take care of this.
There's an issue with the GTK DLLs afflicting Win32 bit builds. Win32 is currently not supported.
The environmental variable set by setTextRenderer doesn't seem to do anything on Windows. Instead, I think rendering is determined by the type of cairo surface you draw into. The win32 surface support is compiled into Cinder's core Cairo block, but isn't present in the DLLs included in this library. Currently, if you import Cinder's cairo block before importing CinderPango, then CinderPango will automatically use win32 surfaces instead of what (I assume) is the freetype backend to blit the glyphs.
Font loading from a local file doesn't work (yet) on Windows. You have to install any fonts you'd like to use at the system level.
There are some issues with text rendering quality on Windows that I'm trying to work through.
On Windows, antialiasing and some other properties have no effect.
All dependencies are included in the block.
On Mac, dependencies were built through Homebrew. Two formulae had to be modified to build static libs instead of dylibs. The modified formulae are included in this repo. Here's how to build them if necessary:
// from the /docs/homebrew folder in this repo
brew rm cairo
brew rm pango
brew rm harfbuzz
brew install cairo --universal
brew install pango.rb --universal
brew install harfbuzz.rb --with-cairo --universal
On Windows, dependencies were compiled elsewhere.
Windows 32 bit libs from here and there, currently not working.
- Consolidate renderer property across platforms.
- Windows local font loading.
- Document and warn about platform-invalid parameters. (E.g. anti-alaising settings on Windows.)
- Wrap more of the API. (Hyphenation, hinting, etc.)
- Wrap certain attributes normally relegated to markup... letterspacing, underline, etc?
- Make alpha optional.
- Cross-platform font size unification like Cinder's font system? See pango_cairo_context_set_resolution.
- High DPI stuff.
- Try blitting glyphs directly into a surface or texture by passing a reference to to the pixel data to
cairo_image_surface_create_for_datainstead of creating a new one via
- Figure out why some fonts don't load correctly on Mac + CoreText.
- Use the Cinder Cairo block instead of including Cairo.
- 32 bit Windows support. (Some issue with the GTK DLLs.)
- Fix libraries for 32 bit Mac.