This situation happens when one Bézier arc is, for example,
the upper edge of an outline and an "off" point happens to be above the
bbox. However, it is very rare in the case of character outlines
because most font designers and creation tools always place "on" points
at the extrema of each curved edges, as it makes hinting much
easier.
Unlike the bbox, the cbox is much faster to compute.
Control and bounding boxes can be computed automatically through the
functions FT_Get_Outline_CBox() and
FT_Get_Outline_BBox(). The former function is always very
fast, while the latter may be slow in the case of "outside"
control points (as it needs to find the extreme of conic and cubic arcs
for "perfect" computations). If this isn't the case, it is as fast as
computing the control box.
Note also that even though most glyph outlines have equal cbox and
bbox to ease hinting, this is not necessary the case anymore when a
transformation like rotation is applied to them.
3. Coordinates, scaling and grid-fitting
An outline point's vectorial coordinates are expressed in the
26.6 format, i.e. in 1/64th of a pixel, hence coordinates
(1.0,-2.5) is stored as the integer pair (x:64,y:-192).
After a master glyph outline is scaled from the EM grid to the
current character dimensions, the hinter or grid-fitter is in charge of
aligning important outline points (mainly edge delimiters) to the pixel
grid. Even though this process is much too complex to be described in a
few lines, its purpose is mainly to round point positions, while trying
to preserve important properties like widths, stems, etc.
The following operations can be used to round vectorial distances in
the 26.6 format to the grid:
round( x ) == ( x + 32 ) & -64
floor( x ) == x & -64
ceiling( x ) == ( x + 63 ) & -64
Once a glyph outline is grid-fitted or transformed, it often is
interesting to compute the glyph image's pixel dimensions before
rendering it. To do so, one has to consider the following:
The scan-line converter draws all the pixels whose centers
fall inside the glyph shape. It can also detect drop-outs,
i.e. discontinuities coming from extremely thin shape fragments, in
order to draw the "missing" pixels. These new pixels are always located
at a distance less than half of a pixel but it is not easy to predict
where they will appear before rendering.
This leads to the following computations:
-
compute the bbox
-
grid-fit the bounding box with the following:
xmin = floor( bbox.xMin )
xmax = ceiling( bbox.xMax )
ymin = floor( bbox.yMin )
ymax = ceiling( bbox.yMax )
-
return pixel dimensions, i.e.
width = (xmax - xmin)/64
and
height = (ymax - ymin)/64
By grid-fitting the bounding box, it is guaranteed that all the pixel
centers that are to be drawn, including those coming from drop-out
control, will be within the adjusted box. Then the box's
dimensions in pixels can be computed.
Note also that, when translating a grid-fitted outline, one should
always use integer distances to move an outline in the 2D
plane. Otherwise, glyph edges won't be aligned on the pixel grid
anymore, and the hinter's work will be lost, producing very low
quality bitmaps and pixmaps.