Pango vs HarfBuzz
Since the rewritten HarfBuzz
is shaping up fast and getting lots of Buzz these days, I get asked the same question again and again: "Will HarfBuzz replace Pango?" This post tries to answer that.Short answer:
No, not at all! Pango is here to stay. It will change, but only get better.Long answer:
Pango provides two levels of API: A low-level and a high-level.Low level API:
What I can the "three pillars of pango":
pango_itemize(): Breaks text into runs that each have the same font, Unicode script, language, direction, and other characteristics.
pango_shape(): Shapes a single run of text, given the font, script, language, direction, and other properties. Shaping means converting Unicode text to positioned glyphs.
pango_break(): Does line breaking and other text segmentation (cursor positions, cluster boundaries, word boundaries, and sentence boundaries).
Pango's high-level API consists of the PangoLayout
object, aka "here's a piece of text render it in this box I don't care what you do."
Of these, HarfBuzz only does shaping. That is,
is functionally equivalent to
Here is how moving to HarfBuzz affects the Pango API:
- Everything in
pango-ot.h will be deprecated and be a thin wrapper around
hb-ot.h. This is already done in the
harfbuzz-ng-external branch of Pango.
- There will be new API in Pango, perhaps in
pango-hb.h to help extracting various HarfBuzz structures from their Pango equivalents.
pango_shape() will be a thin wrapper around
hb_shape() (read below).
calls into Pango shaper modules to get the actual shaping done. There are two kinds Pango shaper modules depending on what they do (the API is the same, so Pango doesn't differentiate between the two classes):
- Bridge modules: The basic-win32.c, basic-atsui.c modules call into another, platform native, shaping system to get the work done. The external (not integrated in Pango yet) modules basic-graphite.c and basic-m17n.c also do the same for the SIL Graphite and m17n shaping libraries.
- On Linux, since there currently is no native shaping engine, Pango has multiple shaping modules, one per script, to do the actual shaping (arabic-fc, syriac-fc, indic-fc, thai-fc, ..., and basic-fc for all the non-complex scripts).
Now, as HarfBuzz becomes the
shaping engine on Linux, all those script-specific modules will be removed and basic-fc will simply call into
. That's indeed what the basic-fc.c in the
Later on, when we add support for native win32, CoreText, Graphite, and m17n to HarfBuzz, all those other modules will also be replaced by HarfBuzz-calling equivalents.Which one to use: Pango or HarfBuzz?
PangoLayout is designed to be the 'render this text in this box I don't care how' kind of API. That's a perfect fit for GUI toolkits like GTK+, but not suitable for lots of other uses, for example:
- Web browsers
- Word processors
- Designer tools
- Font design tools
- Terminal emulators
- Batch document processors
- TeX engines
while in many of those cases PangoLayout can be made
to work (with much pain, mind you), Pango still provides the lower level API and lots of other bits and pieces to get something going. What it doesn't give full control on however is font selection, which happens to be a deal-breaker for many of those usecases (browsers following CSS rules, etc).
So, each of those kinds of applications need to assess the pros and cons of using Pango vs using HarBuzz and providing all the other bits themselves. For example, HarfBuzz doesn't
- An itemizer
- A Unicode Bidirection Algorithm implementation
- A Unicode Line Breaking implementation
- Glyph rasterization
- Glyph metrics information
There's also a hybrid use possible: to borrow those pieces from Pango on platforms that it's feasable, but drive HarfBuzz directly. It all depends. When in doubt, ask! We have a mailing list.
That said, Firefox will use HarfBuzz as soon as it's ready (there are patches circulating around). Google is using old HarfBuzz for their Webkit and will port to the new one. I'm also attending the Webkit-GTK hackfest in December to port that to the new HarfBuzz. We'll work towards sharing the HarfBuzz-dealing code among Webkit backends.
This is already a long post. Let me finish now. Hope I made it a tiny bit more clear.
Labels: gnome, harfbuzz, pango, textlayout