FreeType 2 Design - Modules Classes
We will now try to explain more precisely the types of modules
that FreeType 2 is capable of managing. Note that each one of them
is decribed with more details in the following chapters of this
document:
renderer modules are used to manage scalable glyph images. This
means transforming them, computing their bounding box,
and converting them to either monochrome or anti-aliased
bitmaps.
Note that FreeType 2 is capable of dealing with any kind of
glyph images, as long as a renderer module is provided for it. The
library comes by default with two renderers:
raster
|
supports the conversion of vectorial outlines (described by a
FT_Outline object) to monochrome bitmaps.
|
smooth
|
supports the conversion of the same outlines to high-quality
anti-aliased pixmaps (using 256 levels of gray). Note
that this renderer also supports direct span generation.
|
font driver modules are used to support one or more specific
font format. By default, FT2 comes with the following font drivers:
truetype
|
supports TrueType font files
|
type1
|
supports Postscript Type 1 fonts, both in binary (.pfb) or ASCII
(.pfa) formats, including Multiple Master fonts.
|
cid
|
supports Postscript CID-keyed fonts
|
cff
|
supports OpenType, CFF as well as CEF fonts (CEF is a derivative
of CFF used by Adobe in its SVG viewer).
|
winfonts
|
supports Windows bitmap fonts (i.e. ".FON" and ".FNT").
|
Note that font drivers can support bitmapped or scalable glyph
images. A given font driver that supports bezier outlines through
the FT_Outline can also provide its own hinter, or rely
on FreeType's autohinter module.
helper modules are used to hold shared code that is
often used by several font drivers, or even other modules.
Here are the default helpers:
sfnt
|
used to support font formats based on the "SFNT"
storage scheme. This means TrueType & OpenType fonts as
well as other variants (like TrueType fonts that only
contain embedded bitmaps).
|
psnames
|
used to provide various useful functions related to glyph
names ordering and Postscript encodings/charsets. For example,
this module is capable of automatically synthetizing a Unicode
charmap from a Type 1 glyph name dictionary.
|
psaux
|
used to provide various useful functions related to Type 1
charstring decoding, as this "feature" is needed by the
type1, cid and cff drivers.
|
finally, the autohinter module has a specific role in
FreeType 2, as it can be used automatically during glyph loading
to process individual glyph outlines when a font driver doesn't
provide it's own hinting engine.
This module's purpose and design is also heavily described
on the FreeType web site.
We will now study how modules are described, then managed by
the library.
1. The FT_Module_Class structure:
As described later in this document, library initialisation is
performed by calling the FT_Init_FreeType function. The
latter is in charge of creating a new "empty" FT_Library
object, then register each "default" module by repeatedly calling
the FT_Add_Module function.
Similarly, client applications can call FT_Add_Module
any time they wish in order to register a new module in the library.
Let's take a look at this function's declaration:
extern FT_Error FT_Add_Module( FT_Library library,
const FT_Module_Class* clazz );
As one can see, this function expects a handle to a library object,
as well as a pointer to a FT_Module_Class structure. It
returns an error code. In case of success, a new module object is
created and added to the library. Note by the way that the module
isn't returned directly by the call !.
Let's study the definition of FT_Module_Class, and explain it
a bit. The following code is taken from
<freetype/ftmodule.h>:
typedef struct FT_Module_Class_
{
FT_ULong module_flags;
FT_Int module_size;
const FT_String* module_name;
FT_Fixed module_version;
FT_Fixed module_requires;
const void* module_interface;
FT_Module_Constructor module_init;
FT_Module_Destructor module_done;
FT_Module_Requester get_interface;
} FT_Module_Class;
here's a description of its fields:
module_flags
|
this is a set of bit flags used to describe the module's
category. Valid values are:
ft_module_font_driver if the module is a font driver
ft_module_renderer if the module is a renderer
ft_module_hinter if the module is an auto-hinter
ft_module_driver_scalable if the module is a font
driver supporting scalable glyph formats.
ft_module_driver_no_outlines if the module is a
font driver supporting scalable glyph formats that cannot
be described by a FT_Outline object
ft_module_driver_has_hinter if the module is a font
driver that provides its own hinting scheme/algorithm
|
module_size
|
an integer that gives the size in bytes of a given module
object. This should never be less than
sizeof(FT_ModuleRec), but can be more when the module
needs to sub-class the base FT_ModuleRec class.
|
module_name
|
this is the module's internal name, coded as a simple ASCII C
string. There can't be two modules with the same name registered
in a given FT_Library object. However, FT_Add_Module
uses the module_version field to detect module upgrades
and perform them cleanly, even at run-time.
|
module_version
|
a 16.16 fixed float number giving the module's major and minor
version numbers. It is used to determine wether a module needs
to be upgraded when calling FT_Add_Module.
|
module_requires
|
a 16.16 fixed float number giving the version of FreeType 2 that
is required to install this module. By default, should be 0x20000
for FreeType 2.0
|
module_requires
|
most modules support one or more "interfaces", i.e. tables of function
pointers. This field is used to point to the module's main interface,
where there is one. It's a short-cut that prevents users of the module
to call "get_interface" each time they need to access one of the object's
common entry points.
Note that is is optional, and can be set to NULL. Other interfaces
can also be accessed through the get_interface field.
|
module_init
|
this is a pointer to a function used to initialise the fields of
a fresh new FT_Module object. It is called after the module's
base fields have been set by the library, and is generally used to
initialise the fields of FT_ModuleRec subclasses.
Most module classes set it to NULL to indicate that no extra
initialisation is necessary
|
module_done
|
this is a pointer to a function used to finalise the fields of
a given FT_Module object. Note that it is called before the
library unsets the module's base fields, and is generally used to
finalize the fields of FT_ModuleRec subclasses.
Most module classes set it to NULL to indicate that no extra
finalisation is necessary
|
get_interface
|
this is a pointer to a function used to request the address of
a given module interface. Set it to NULL if you don't need to support
additional interfaces but the main one.
|
|
2. The FT_Module type:
the FT_Module type is a handle (i.e. a pointer) to a given
module object / instance, whose base structure is given by the
internal FT_ModuleRec type. We will intentionally not
describe this structure here, as there's not point to look so far
in the library's design.
When FT_Add_Module is called, it first allocate a new
module instance, using the module_size class
field to determine its byte size. The function initializes
a the root FT_ModuleRec fields, then calls
the class-specific initializer module_init
when this field is not set to NULL.
Note that the library defines several sub-classes of FT_ModuleRec,
which are, as you could have guessed:
FT_Renderer for renderer modules
FT_Driver for font driver modules
FT_AutoHinter for the auto-hinter
Helper modules use the base FT_ModuleRec type.
We will now detail these classes in the next chapters
|