RenderText and Chrome UI text drawing
Most text in Chrome’s UI is rendered either through gfx::Canvas text drawing
facilities or by using gfx::RenderText directly. Indeed, gfx::Canvas itself
uses gfx::RenderText for drawing and measuring text, so that nearly all UI
text drawn in Chrome Windows and ChromeOS ends up going through
gfx::RenderText.
gfx::RenderText has platform-specific subclasses for shaping text runs using
platform APIs: Uniscribe on Windows, Pango on Linux + ChromeOS and CoreText on
the Mac. Although the shaping/layout code is platform-specific, drawing the text
uses a common path, using Skia. The gfx::RenderText subclasses also share
common implementations of the various effects that can be applied to the text
such as fading and shadows, as well as the more rudimentary settings such as
text alignment.
In addition to text layout, each gfx::RenderText subclass also performs any
necessary selection of fallback fonts needed to render particular runs of text.
While this is mostly delegated to Pango on Linux and CoreText on the Mac, the
Windows implementation has to do this work itself through the font linking
information from the registry.
gfx::RenderText is a stateful API - an instance of a gfx::RenderText
subclass will cache its layout information between draw calls. Because of this,
it is often more efficient to use the gfx::RenderText API directly instead of
using a state-less abstraction such as the gfx::Canvas drawing calls. In
particular, for text that changes rarely but that may be drawn multiple times,
it is more efficient to keep an instance of gfx::RenderText around, so that
the text layout would be performed only when the text is updated and not on
every draw operation. Prior to the introduction of gfx::RenderText, this
pattern was not possible, so you may see existing code still doing its text
drawing through gfx::Canvas text drawing APIs (which in the past were not
based on gfx::RenderText).
gfx::RenderText is also used to render footers and headers in printed page.
This works because Skia has a PDF backend so that the glyph drawing calls done
by gfx::RenderText are appropriately transformed to PDF output. This is
currently the case on Mac OS X and Windows, but not yet Linux or ChromeOS
because of sandboxing issues.