FreeType 1.31.1
This commit is contained in:
916
docs/user.txt
Normal file
916
docs/user.txt
Normal file
@@ -0,0 +1,916 @@
|
||||
|
||||
The FreeType Engine
|
||||
|
||||
Core Library User Guide
|
||||
|
||||
or
|
||||
|
||||
How to use the engine in your applications and font servers
|
||||
|
||||
---------------------------------------------------
|
||||
|
||||
Introduction
|
||||
|
||||
|
||||
I. Basic Concepts
|
||||
|
||||
1. Concepts
|
||||
2. Handles
|
||||
3. Conventions of use
|
||||
4. Object classes
|
||||
|
||||
II. Extensions
|
||||
|
||||
1. What is an extension?
|
||||
2. Where to find them
|
||||
3. Writing your own extension
|
||||
|
||||
Conclusion
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This file has been written to present the FreeType core library to
|
||||
would-be writers of applications and font servers. It first
|
||||
describes the concepts on which the engine is based, then how to
|
||||
use it to obtain glyph metrics, outlines and bitmaps.
|
||||
|
||||
The last part discusses the ability to add and use extensions to
|
||||
the core library to get access to supplemental TrueType tables
|
||||
which are not currently provided by the core engine. If you would
|
||||
like to write your own extensions, read also the FreeType
|
||||
developer's guide.
|
||||
|
||||
|
||||
I. Basic Concepts
|
||||
=================
|
||||
|
||||
|
||||
1. Concepts
|
||||
-----------
|
||||
|
||||
FreeType defines several kinds of structures called `objects',
|
||||
that are used to manage the various abstractions required to
|
||||
access and display fonts.
|
||||
|
||||
In care of good encapsulation, these objects are not directly
|
||||
accessible from a client application. Rather, the user receives
|
||||
a `handle' for each object he or she queries and wants to use.
|
||||
This handle is a stand-alone reference; it cannot be used like a
|
||||
pointer to access directly the object's data.
|
||||
|
||||
2. Properties
|
||||
-------------
|
||||
|
||||
It is however possible to obtain and set object properties
|
||||
through several functions of the API. For example, you can
|
||||
query a face object's properties with only a handle for it,
|
||||
using the function TT_Get_Face_Properties().
|
||||
|
||||
Note that the data will be returned in a user-allocated
|
||||
structure, but will also contain pointers addressing directly
|
||||
some data found within the object.
|
||||
|
||||
A client application should never modify the data through these
|
||||
pointers! In order to set new properties' values, the user must
|
||||
always call a specific API function to do so, as a certain
|
||||
number of other related data might not appear in the returned
|
||||
structure and imply various non-visible coherency and coercion
|
||||
rules.
|
||||
|
||||
3. Conventions of use
|
||||
---------------------
|
||||
|
||||
o All API functions have their label prefixed by `TT_', as well
|
||||
as all external (i.e. client-side) types.
|
||||
|
||||
o To allow the use of FreeType's core engine in threaded
|
||||
environments, nearly all API functions return an error code,
|
||||
which is always set to 0 in case of success.
|
||||
|
||||
The error codes' type is `TT_Error', and a listing of them is
|
||||
given in the API references (see `apiref.txt' and
|
||||
`apirefx.txt').
|
||||
|
||||
Some functions do not return an error code. Their result is
|
||||
usually a value that becomes negative in case of error (this
|
||||
is used for functions where only one kind of error can be
|
||||
reported, like an invalid glyph index).
|
||||
|
||||
An important note is that the engine should not leak memory
|
||||
when returning an error, e.g., querying the creation of an
|
||||
object will allocate several internal tables that will be
|
||||
freed if a disk error occurs during a load.
|
||||
|
||||
o A handle is acquired through API functions labeled along the
|
||||
names:
|
||||
|
||||
TT_Open_xxxx(), TT_New_xxxx()
|
||||
|
||||
where `xxxx' is the object's class (Face, Instance, etc).
|
||||
|
||||
Examples:
|
||||
|
||||
TT_Open_Face(), TT_Open_Collection(),
|
||||
TT_New_Instance(), TT_New_Glyph()
|
||||
|
||||
o A handle is closed through an API labeled
|
||||
|
||||
TT_Close_xxxx() or TT_Done_xxxx()
|
||||
|
||||
where `xxxx' is the object's class (Face, Instance, etc).
|
||||
|
||||
Examples:
|
||||
|
||||
TT_Close_Face(), TT_Done_Instance(), TT_Done_Glyph()
|
||||
|
||||
o Properties are obtained through an API labeled
|
||||
|
||||
TT_Get_xxxx_yyyy()
|
||||
|
||||
where `xxxx' is the object's class, and `yyyy' its property.
|
||||
|
||||
Examples:
|
||||
|
||||
TT_Get_Face_Properties(), TT_Get_Instance_Metrics()
|
||||
TT_Get_Glyph_Outline(), TT_Get_Glyph_Bitmap()
|
||||
|
||||
o Properties are set through an API labeled
|
||||
|
||||
TT_Set_xxxx_yyyy()
|
||||
|
||||
where `xxxx' is the object's class, and `yyyy' its property.
|
||||
|
||||
Examples:
|
||||
|
||||
TT_Set_Instance_Resolutions(),
|
||||
TT_Set_Instance_CharSize()
|
||||
|
||||
4. Object Classes
|
||||
-----------------
|
||||
|
||||
The following object classes are defined in this release of the
|
||||
engine:
|
||||
|
||||
o The Engine objects
|
||||
|
||||
The FreeType library can be built to be completely re-entrant,
|
||||
even though its default build doesn't support threads (more on
|
||||
this in the `threads.txt').
|
||||
|
||||
As a consequence, it is possible to open several instances of
|
||||
the library, called `engines'. Each engine has its own set of
|
||||
current objects (faces, instances, etc.), and there is no
|
||||
sharing between them.
|
||||
|
||||
The idea is that the library could be compiled as a shared
|
||||
library or DLL, and then be able to provide several distinct
|
||||
engines to independent client applications. In this case,
|
||||
each client program must create its own engine with
|
||||
TT_Init_FreeType() to hold its data.
|
||||
|
||||
Closing an engine will destroy _all_ objects that were
|
||||
allocated since its opening, releasing all resources, etc.,
|
||||
with the exception of user-allocated outline objects.
|
||||
|
||||
o The Face objects
|
||||
|
||||
A face contains the data that is specific to a single TrueType
|
||||
font file. It presents information common to all glyphs and
|
||||
all point sizes like font-specific metrics and properties.
|
||||
|
||||
You can open a face object by simply giving a pathname to the
|
||||
TrueType file. You can later close (i.e. discard) the face
|
||||
object.
|
||||
|
||||
You can also open a single face embedded in a TrueType
|
||||
collection.
|
||||
|
||||
See also:
|
||||
|
||||
TT_Open_Face(), TT_Open_Collection(), TT_Close_Face(),
|
||||
TT_Get_face_Properties()
|
||||
|
||||
o The Instance objects
|
||||
|
||||
An instance is also called a `pointsize' or a `fontsize' in
|
||||
some windowing systems. An instance holds the information
|
||||
used to render glyphs on a specific device at a given point
|
||||
size; it is always related to an opened face object.
|
||||
|
||||
For instance, if you want to generate glyphs for text from the
|
||||
same typeface at `sizes' of 10 and 12 points, all you need is
|
||||
one face object, from which you will create two distinct
|
||||
instances.
|
||||
|
||||
A device is defined by its horizontal and vertical resolution,
|
||||
usually specified in dots per inch (dpi). A point size is a
|
||||
scaling number, given as _absolute_ values in points, where 1
|
||||
point = 1/72 inch.
|
||||
|
||||
The `pixel' size, also known as the `ppem' value (for Points
|
||||
Per EM square) is computed from both the device resolution and
|
||||
the point size. It determines the size of the resulting glyph
|
||||
bitmaps on your screen or sheet of paper.
|
||||
|
||||
The default device resolution for any new instance is 96dpi in
|
||||
both directions, which corresponds to VGA screens. The
|
||||
default point size is 10pt. The high-level API allows you to
|
||||
change this whenever you want for any given instance object.
|
||||
|
||||
Note that closing a face object will automatically destroy all
|
||||
its child instances (even though you can release them yourself
|
||||
to free memory).
|
||||
|
||||
See also:
|
||||
|
||||
TT_New_Instance(), TT_Done_Instance(),
|
||||
TT_Get_Instance_Metrics(), TT_Set_Instance_Resolutions(),
|
||||
TT_Set_Instance_Pointsize()
|
||||
|
||||
o The Glyph objects
|
||||
|
||||
A Glyph object is a _container_ for the data that describes
|
||||
any glyph of a given font. This means that it typically
|
||||
holds:
|
||||
|
||||
- Glyph metrics information, like bounding box or advance
|
||||
width.
|
||||
|
||||
- Outline arrays sized large enough to hold any glyph from the
|
||||
face. This size is extracted from the face's internal
|
||||
`maxProfile' table to optimize memory costs.
|
||||
|
||||
- Other important parameters related to the `fine' rendering
|
||||
of the glyphs. This includes things like the
|
||||
dropout-control mode used at low sizes.
|
||||
|
||||
- And it doesn't contain a bitmap or a pixmap!
|
||||
|
||||
A glyph object is used to load, hint, and rasterize a single
|
||||
glyph, as taken from the font file.
|
||||
|
||||
See also:
|
||||
|
||||
TT_New_Glyph(), TT_Done_Glyph(), TT_Get_Glyph_Metrics(),
|
||||
TT_Get_Glyph_Outline(), TT_Get_Glyph_Bitmap(),
|
||||
TT_Get_Glyph_Pixmap()
|
||||
|
||||
o The Character Map (CharMap) handle
|
||||
|
||||
Glyphs can be indexed in a TrueType file in any order,
|
||||
independently of any standard character encoding, like ASCII
|
||||
or Unicode. For this reason, each file comes with one or more
|
||||
character mapping tables, used to translate from one specific
|
||||
encoding's character codes to font glyph indices.
|
||||
|
||||
There are many encoding formats, and each one can be
|
||||
distinguished by two values:
|
||||
|
||||
- its platform ID
|
||||
- its platform-specific encoding ID
|
||||
|
||||
Their values are defined in the TrueType specification and
|
||||
won't be commented there. The FAQ lists the most commonly
|
||||
used (platform,encoding) pairs.
|
||||
|
||||
It is possible to enumerate the charmaps provided by a
|
||||
TrueType font and to use any of these to perform translations.
|
||||
|
||||
The charmaps are loaded into memory only on demand to save the
|
||||
space taken by the maps that are not needed on your system.
|
||||
They are part of the face object, however.
|
||||
|
||||
This means that even though a charmap can be accessed through
|
||||
a handle (obtained through the TT_Get_CharMap() function), it
|
||||
isn't a stand-alone object. For example, you never need to
|
||||
de-allocate it; this is automatically done by the engine when
|
||||
its face object expires.
|
||||
|
||||
See also:
|
||||
|
||||
TT_Get_CharMap_Count(), TT_Get_CharMap_ID(),
|
||||
TT_Get_CharMap(), TT_Char_Index().
|
||||
|
||||
o The Outline Objects
|
||||
|
||||
An outline is a vector representation of a glyph. It is made
|
||||
of several control points joined by line segments and Bezier
|
||||
arcs, themselves gathered in closed paths called `contours'.
|
||||
The outline have also several flags, or attributes, which are
|
||||
used by the scan-line converter to select the best rendering
|
||||
algorithms to convert the glyph's bitmap.
|
||||
|
||||
Unlike other objects in FreeType, outlines aren't managed
|
||||
through handles, but directly with the structure `TT_Outline',
|
||||
defined for client applications. Each glyph container
|
||||
contains an outline sized large enough to hold any glyph from
|
||||
its parent face. Client applications can access it with
|
||||
TT_Get_Glyph_Outline(). However, one can also create its own
|
||||
outlines if needed with TT_New_Outline() and
|
||||
TT_Clone_Outline().
|
||||
|
||||
Note that user-created outlines are NOT tracked by the
|
||||
library. Hence, the client must release them himself with one
|
||||
or more calls to TT_Done_Outline().
|
||||
|
||||
A various number of methods/operations are defined for the
|
||||
outline class to simplify its management.
|
||||
|
||||
|
||||
IMPORTANT NOTE: **********************************************
|
||||
|
||||
The definition of TT_Outline may change in the future.
|
||||
Developers are thus advised to always use the outline
|
||||
methods provided by the API rather than reading or setting
|
||||
data themselves.
|
||||
|
||||
**************************************************************
|
||||
|
||||
See also:
|
||||
|
||||
TT_New_Outline(), TT_Clone_Outline(), TT_Copy_Outline(),
|
||||
TT_Done_Outline(), TT_Get_Outline_BBox(),
|
||||
TT_Get_Outline_Bitmap(), TT_Get_Outline_Pixmap(),
|
||||
TT_Translate_Outline(), TT_Transform_Outline()
|
||||
|
||||
o Bitmaps and Pixmaps
|
||||
|
||||
One very important aspect of FreeType is that it is unable to
|
||||
create bitmaps on its own. Rather, it is up to the client
|
||||
application to do it, and pass a reference, in the form of a
|
||||
TT_Raster_Map, to the scan-line converter (the component in
|
||||
charge of generating bitmaps from outlines).
|
||||
|
||||
Hence the importance of the TT_Raster_Map structure, which
|
||||
layout is:
|
||||
|
||||
struct
|
||||
{
|
||||
int rows; /* number of rows */
|
||||
int cols; /* number of columns (bytes) per row */
|
||||
int width; /* number of pixels per line */
|
||||
int flow; /* bitmap orientation */
|
||||
|
||||
void* bitmap; /* bit/pixmap buffer */
|
||||
long size; /* bit/pixmap size in bytes */
|
||||
} TT_Raster_Map;
|
||||
|
||||
- The `rows' field contains the total number of rows in the
|
||||
bitmap.
|
||||
|
||||
- The `width' field gives the number of pixels per row (a bit
|
||||
or a byte, depending on the map's nature).
|
||||
|
||||
- The `cols' field gives the number of columns, i.e. bytes,
|
||||
taken by each row in the map buffer.
|
||||
|
||||
IMPORTANT: The `cols' field must be a multiple of 4 for
|
||||
pixmaps!
|
||||
|
||||
Typically, its value should be `(width+7)/8' for bitmaps,
|
||||
and `(width+3) & -4' for pixmaps.
|
||||
|
||||
- The `flow' field gives the map's vertical orientation.
|
||||
|
||||
For example, if the first bytes of the bitmap buffer pertain
|
||||
to its upper row, the flow is said to be going `down', and
|
||||
the field should take the value `TT_Flow_Down'. If these
|
||||
bytes pertain to its lowest row, the flow is going `up', and
|
||||
the value is `TT_Flow_Up'.
|
||||
|
||||
As an example, the PC video modes use a `down' flow, where
|
||||
the first VRAM byte corresponds to the upper and leftmost
|
||||
corner of the screen.
|
||||
|
||||
- The `bitmap' field is a typeless pointer to the map's
|
||||
buffer.
|
||||
|
||||
- The `size' field contains the buffer's size in bytes. It is
|
||||
usually computed as follows:
|
||||
|
||||
size = rows * cols;
|
||||
|
||||
NOTE: For bitmaps, the leftmost-pixel is related to the
|
||||
highest (i.e. most significant) bit of its byte.
|
||||
There is currently no support for the opposite
|
||||
convention found in some systems.
|
||||
|
||||
(It can be easily added if you really need it, just
|
||||
ask the development team.)
|
||||
|
||||
|
||||
II. Step-by-step Example
|
||||
========================
|
||||
|
||||
Here is an example to show, step by step, how a client application
|
||||
can open a font file, set one or several instances, load any
|
||||
glyph, then render it to a bitmap.
|
||||
|
||||
1. Initialize the engine
|
||||
------------------------
|
||||
|
||||
This is the first thing to do. You need to initialize an engine
|
||||
through a call to TT_Init_FreeType(). This function will set up
|
||||
a various number of structures needed by the library.
|
||||
|
||||
This allocates about 68kByte, of which 64kByte are dedicated to
|
||||
the scan-line converter's `render pool', a workspace used for
|
||||
bitmap generation. Note that even though this space is bounded,
|
||||
the raster is able to render a glyph to any size or bitmap, even
|
||||
horribly huge ones.
|
||||
|
||||
NOTE: You can reduce the size of this pool by modifying the
|
||||
constant RASTER_RENDER_POOL in the file `ttraster.c'. A
|
||||
smaller pool will result in slower rendering at large
|
||||
sizes. Take care of never assigning a value smaller than
|
||||
4kByte however, as bugs may start to lurk in!
|
||||
|
||||
Example:
|
||||
|
||||
TT_Engine engine;
|
||||
|
||||
|
||||
error = TT_Init_FreeType( &engine );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not create engine instance\n");
|
||||
...
|
||||
}
|
||||
|
||||
2. Initialize the extensions you need
|
||||
-------------------------------------
|
||||
|
||||
FreeType provides several extensions which are optional,
|
||||
separately compilable components to add some rare features to
|
||||
the engine and its API.
|
||||
|
||||
You need to explicitly initialize the extensions you want to
|
||||
use. Each extension must provide an initialization function,
|
||||
following the naming convention:
|
||||
|
||||
TT_Init_xxx_Extension( engine );
|
||||
|
||||
where `xxx' is the extension's `kind'.
|
||||
|
||||
Example:
|
||||
|
||||
error = TT_Init_Kerning_Extension( engine );
|
||||
if ( error )
|
||||
...
|
||||
|
||||
3. Open the font file
|
||||
---------------------
|
||||
|
||||
There are two ways to open a font face, depending on its file
|
||||
format:
|
||||
|
||||
- If it is a TrueType file (ttf), you can simply use the API
|
||||
named TT_Open_Face(), which takes the file's pathname as
|
||||
argument, as well as the address of the returned face handle.
|
||||
|
||||
Check the returned error code to see if the file could be
|
||||
opened and accessed successfully.
|
||||
|
||||
TT_Face face; /* face handle */
|
||||
|
||||
|
||||
error = TT_Open_Face( engine, "/fonts/arial.ttf", &face );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not open the file\n" );
|
||||
...
|
||||
}
|
||||
|
||||
- If the font is embedded in a TrueType collection (ttc), you
|
||||
can use the API named TT_Open_Collection(), which takes also
|
||||
the font's index within the collection's directory.
|
||||
|
||||
TT_Face face; /* face handle */
|
||||
|
||||
|
||||
/* Load the collection's second face (index=1) */
|
||||
error = TT_Open_Collection( engine, "/fonts/mingli.ttc",
|
||||
1, &face );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not open the file\n" );
|
||||
...
|
||||
}
|
||||
|
||||
- Finally, when you do not know the number of faces embedded in
|
||||
a TrueType collection, the following technique can be used:
|
||||
|
||||
o Call TT_Open_Face() with the collection file's pathname.
|
||||
This API recognizes collections automatically and always
|
||||
return a handle for its first embedded font.
|
||||
|
||||
o Get the face's properties through TT_Get_Face_Properties().
|
||||
These contain, among other things, the total number of fonts
|
||||
embedded in the collection, in its field `num_Faces'.
|
||||
|
||||
TT_Face face; /* face handle */
|
||||
TT_Face_Properties props; /* face properties */
|
||||
|
||||
|
||||
/* open the first collection font */
|
||||
error = TT_Open_Face( engine, "/fonts/mingli.ttc",
|
||||
&face );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not open the file\n" );
|
||||
...
|
||||
}
|
||||
|
||||
/* Get the face properties */
|
||||
TT_Get_Face_Properties( face, &props );
|
||||
|
||||
/* Now print the number of faces */
|
||||
printf( "there are %d faces in this collection file\n",
|
||||
props->num_Faces );
|
||||
|
||||
4. Create an instance from the face object
|
||||
------------------------------------------
|
||||
|
||||
You must create an instance (also known as a `pointsize') which
|
||||
contains information relative to the target output device's
|
||||
resolutions and a given point size.
|
||||
|
||||
o The instance object is created through TT_New_Instance():
|
||||
|
||||
TT_Instance instance;
|
||||
|
||||
|
||||
error = TT_New_Instance( face, &instance );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not create instance\n" );
|
||||
...
|
||||
}
|
||||
|
||||
TECHNICAL NOTE: Creating a new instance executes its font
|
||||
program. This can fail if the font is broken.
|
||||
Never assume that the error code returned here
|
||||
is always 0.
|
||||
|
||||
o You must set the instance's properties to suit your needs.
|
||||
These are simply its device resolutions, set through
|
||||
TT_Set_Instance_Resolutions(), and its point size, set through
|
||||
TT_Set_Instance_CharSize():
|
||||
|
||||
/* Set the target horizontal and vertical resolution to */
|
||||
/* 300dpi in each direction (typically for a printer). */
|
||||
/* A fresh instance's default resolutions are 96dpi in */
|
||||
/* both directions. */
|
||||
error = TT_Set_Instance_Resolutions( instance, 300, 300 );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not set resolution\n" );
|
||||
...
|
||||
}
|
||||
|
||||
/* Now set the point size to 12pt. Default is 10pt. */
|
||||
/* Don't forget that the size is expressed in 26.6 fixed */
|
||||
/* float format, so multiply by 64. */
|
||||
error = TT_Set_Instance_CharSize( instance, 12 * 64 );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not set point size\n" );
|
||||
...
|
||||
}
|
||||
|
||||
TECHNICAL NOTE: These calls may execute the font's `prep'
|
||||
program, which can fail if the font is broken.
|
||||
Never assume that the error code returned is
|
||||
are always 0.
|
||||
|
||||
o You can also set the instance's transformation flags to tell
|
||||
the glyph loading function that you are going to perform a
|
||||
transformation (like rotation or slanting) on the glyph. Note
|
||||
that the glyph loader doesn't perform the transformation. It
|
||||
only informs the glyphs' hinting instruction streams about
|
||||
these flags which may use it to disable or enable various
|
||||
features (grid-fitting, drop-out control, etc).
|
||||
|
||||
Use e.g.
|
||||
|
||||
TT_Set_Instance_Transforms( FALSE, TRUE );
|
||||
|
||||
to indicate that you're going to stretch, but not rotate, this
|
||||
instance's glyphs. Default is, of course, both FALSE.
|
||||
|
||||
5. Create a glyph container
|
||||
---------------------------
|
||||
|
||||
You need a glyph object to serve as a container for the glyphs
|
||||
you want to load from the face. This is done simply by
|
||||
|
||||
TT_Glyph glyph; /* glyph object handle */
|
||||
|
||||
|
||||
error = TT_New_Glyph( face, &glyph );
|
||||
if ( error )
|
||||
{
|
||||
printf( "could not create glyph\n" );
|
||||
...
|
||||
}
|
||||
|
||||
6. Find your platform's character mappings
|
||||
------------------------------------------
|
||||
|
||||
Each font file can come with one or more character mapping
|
||||
tables, used to convert character codes to glyph indices. You
|
||||
must know the values of the `platformID' and `encodingID' as
|
||||
defined in the TrueType specification for your platform. For
|
||||
example, Windows Unicode encoding is (platform:3,encoding:1),
|
||||
while Apple Unicode is (platform:0,encoding:0). Both formats
|
||||
differ in internal storage layout and can be used transparently
|
||||
with the same inputs with FreeType.
|
||||
|
||||
The function TT_Get_CharMap_Count() returns the number of
|
||||
character mappings present in a face. You can then enumerate
|
||||
these with the function TT_Get_CharMap_ID(). Once you've found
|
||||
a mapping usable for your platform, use TT_Get_CharMap() to
|
||||
return a TT_CharMap handle that will be used later to get glyph
|
||||
indices.
|
||||
|
||||
7. Load the glyph
|
||||
-----------------
|
||||
|
||||
The glyph loader is easily queried through TT_Load_Glyph().
|
||||
This API function takes several arguments:
|
||||
|
||||
o An instance handle to specify at which point size and
|
||||
resolution the loaded glyph should be scaled and grid-fitted.
|
||||
|
||||
o A glyph container, used to hold the glyph's data in memory.
|
||||
Note that the instance and the glyph must relate to the _same_
|
||||
font file. An error would be produced immediately otherwise.
|
||||
|
||||
o A glyph index, used to reference the glyph within the font
|
||||
file. This index is not a platform specific character code,
|
||||
and a character's glyph index may vary from one font to
|
||||
another. To compute glyph indices from character codes, use
|
||||
the TT_CharMap handle created in section 6 with
|
||||
TT_Char_Index().
|
||||
|
||||
We strongly recommend using the Unicode charmap whenever
|
||||
possible.
|
||||
|
||||
o A load mode, indicating what kind of operations you need.
|
||||
There are only two defined for the moment:
|
||||
|
||||
TTLOAD_SCALE_GLYPH:
|
||||
|
||||
If set, this flag indicates that the loaded glyph will be
|
||||
scaled (according to the instance specified as an
|
||||
argument) to fractional pixel coordinates (26.6). If not,
|
||||
the coordinates will remain integer FUnits. Please refer
|
||||
to the TrueType specification and the FreeType header
|
||||
files for more details on the 26.6 format and other data
|
||||
types.
|
||||
|
||||
TTLOAD_HINT_GLYPH:
|
||||
|
||||
This flag is only in effect if the TTLOAD_SCALE_GLYPH flag
|
||||
is set. It indicates that the glyph must also be `hinted'
|
||||
resp. `grid-fitted' for better display results. Note that
|
||||
this also means that the glyph metrics will be
|
||||
grid-fitted, including the bounding box.
|
||||
|
||||
You can simply `or' the flags. As most applications will
|
||||
require both flags to be set, the constant TTLOAD_DEFAULT is
|
||||
defined as:
|
||||
|
||||
#define TTLOAD_DEFAULT (TTLOAD_SCALE_GLYPH | \
|
||||
TTLOAD_HINT_GLYPH )
|
||||
|
||||
Example:
|
||||
|
||||
error = TT_Load_Glyph( instance, glyph, 36,
|
||||
TTLOAD_DEFAULT );
|
||||
if ( error )
|
||||
{
|
||||
printf("could not load the glyph\n");
|
||||
...
|
||||
}
|
||||
|
||||
8. Query glyph properties
|
||||
-------------------------
|
||||
|
||||
You're then able to query various glyph properties:
|
||||
|
||||
o The glyph metrics can be obtained through
|
||||
TT_Get_Glyph_Metrics(). The data returned in the metrics
|
||||
structure is:
|
||||
|
||||
- the glyph's left side bearing (bearingX)
|
||||
- the glyph's top side bearing (bearingY)
|
||||
- the glyph's advance width (advance)
|
||||
- the glyph's bounding box (bbox)
|
||||
|
||||
These values are expressed in 26.6 pixel units when the glyph
|
||||
was loaded with scaling, or in FUnits if not. To obtain
|
||||
vertical metrics you should use the function
|
||||
TT_Get_Glyph_Big_Metrics().
|
||||
|
||||
o The glyph outline can be queried through
|
||||
TT_Get_Glyph_Outline(). This can be useful to process the
|
||||
point coordinates (e.g. applying stretching or rotation) with
|
||||
functions like TT_Apply_Outline_Matrix() or
|
||||
TT_Apply_Outline_Translation(). Note that these functions do
|
||||
not recompute a glyph's metrics after the transformation!
|
||||
|
||||
The outline's structure is described in the reference
|
||||
`apiref.txt'.
|
||||
|
||||
A bitmap or pixmap for the glyph can be queried with the API
|
||||
functions TT_Get_Glyph_Bitmap() and TT_Get_Glyph_Pixmap().
|
||||
These functions take a glyph handle as an argument, as well as
|
||||
a bitmap/pixmap description block and two offsets.
|
||||
|
||||
The target map is described through a TT_Raster_Map object,
|
||||
which structure is defined in the reference (see
|
||||
`apiref.txt'). The offsets are given in the same units as the
|
||||
points coordinates and glyph metrics: 26.6 pixel units for a
|
||||
scaled glyph, and FUnits for an unscaled one.
|
||||
|
||||
IMPORTANT TECHNICAL NOTE: If the glyph has been scaled and
|
||||
hinted, the offsets _must_ be
|
||||
multiples of 64 (i.e. integer pixel
|
||||
offsets). Otherwise, you would ruin
|
||||
the grid fitting (which usually
|
||||
results in ugly glyphs).
|
||||
|
||||
Example:
|
||||
|
||||
TT_Glyph_Metrics metrics;
|
||||
TT_Outline outline;
|
||||
TT_Raster_Map bitmap;
|
||||
|
||||
|
||||
TT_Get_Glyph_Metrics( glyph, &metrics );
|
||||
TT_Get_Glyph_Outline( glyph, &outline );
|
||||
|
||||
/* set up the bitmap */
|
||||
...
|
||||
TT_Get_Glyph_Bitmap( glyph, &bitmap, 0, 0 );
|
||||
|
||||
9. When you are done
|
||||
--------------------
|
||||
|
||||
o You can close any font face object with TT_Close_Face(). This
|
||||
call will automatically discard its child instances, glyphs
|
||||
and charmaps.
|
||||
|
||||
o You can also close the engine with a single call to
|
||||
TT_Done_FreeType(). This will release _all_ objects that were
|
||||
previously allocated (with the exception of user-created
|
||||
outlines), and close all font files, as well as extensions
|
||||
that were inited for it.
|
||||
|
||||
|
||||
III. Extensions
|
||||
===============
|
||||
|
||||
1. What is an extension?
|
||||
------------------------
|
||||
|
||||
FreeType allows you to access a various number of TrueType
|
||||
tables, as well as to render individual glyphs. However:
|
||||
|
||||
1. It doesn't perform some high-level operations, like
|
||||
generating a string text from many individual glyphs.
|
||||
|
||||
2. It doesn't perform kerning (which can be needed by operations
|
||||
mentioned in item 1).
|
||||
|
||||
3. It doesn't give access to all the defined TrueType tables,
|
||||
especially the optional ones.
|
||||
|
||||
While item 1 is a feature that will never go into FreeType's
|
||||
core engine, which goal is to provide easy access to font data
|
||||
and rendering _individual_ glyphs, point 2 and 3 can be added to
|
||||
the engine's features through extensions.
|
||||
|
||||
An extension is simply a small piece of code that extends the
|
||||
engine's abilities and APIs. It is possible to extend the
|
||||
engine without touching the core's source code, this is
|
||||
described in chapter 3 below.
|
||||
|
||||
2. The two kinds of extensions
|
||||
------------------------------
|
||||
|
||||
There are basically two kinds of extensions, which require
|
||||
different implementations.
|
||||
|
||||
a. API extensions
|
||||
|
||||
An API extension is a set of functions that extend the
|
||||
FreeType core API to give access to tables that are already
|
||||
loaded by the engine, but not provided for now. An example of
|
||||
such data can be:
|
||||
|
||||
- the horizontal metrics table (hmtx)
|
||||
- the `gasp' table
|
||||
|
||||
This kind of extension is made of:
|
||||
|
||||
o an API extension header file, following the usage convention
|
||||
introduced here (all labels prefixed with `TT_'), and which
|
||||
will be included by the clients which want to use the
|
||||
extension. By convention, such header names begin with
|
||||
`ftx' (for FreeType eXtension).
|
||||
|
||||
Examples: ftxgasp.h, ftxhmtx.h
|
||||
|
||||
o One or more functions used to give access to the tables that
|
||||
are already loaded and managed by the engine. They usually
|
||||
only copy pointers to the target structure given by the
|
||||
client application since these structures are not accessible
|
||||
through the 'normal' API. An API extension doesn't need to
|
||||
be initialized before being used.
|
||||
|
||||
b. Engine extensions
|
||||
|
||||
It can sometimes be useful to load and manage several tables
|
||||
that are not considered by the core engine. These extensions
|
||||
need to provide additional functions to fit into FreeType's
|
||||
internal object management model, and are more sophisticated
|
||||
than API extensions.
|
||||
|
||||
An example is given in this distribution to provide kerning
|
||||
support (or more technically spoken, access to the kerning
|
||||
tables found within the TrueType files). It is made of:
|
||||
|
||||
o An API extension providing new interfaces to the client
|
||||
applications that need it. See the file `ftxkern.h'
|
||||
resp. `apirefx.txt'.
|
||||
|
||||
o A specific implementation, providing services to create,
|
||||
load, and manage kerning tables as additional parts of a
|
||||
face object. In the case of kerning, the directory of
|
||||
tables is loaded when the face is opened, and tables
|
||||
themselves are fetched from the file on demand. This
|
||||
implies several `hooks' in the core engine. See the files
|
||||
`ttkern.h' and `ttkern.c'. These are called `engine
|
||||
extensions'.
|
||||
|
||||
o A specific extension initialization function, namely
|
||||
TT_Init_Kerning_Extension(), that must be called after an
|
||||
engine's creation, and before any face object allocation.
|
||||
This function will `register' the extension within the
|
||||
engine and make its API workable.
|
||||
|
||||
3. Writing your own extensions
|
||||
------------------------------
|
||||
|
||||
As it was suggested earlier, writing an engine extension is a
|
||||
delicate process, as the additional code must follow a certain
|
||||
number of design rules, presented in the FreeType developer's
|
||||
guide. Unfortunately, there is currently no extension writer's
|
||||
guide.
|
||||
|
||||
By writing your own extensions, it will be possible to support
|
||||
more advanced TrueType formats like TrueType GX or OpenType in a
|
||||
near future, without having to torture the engine core source at
|
||||
each iteration.
|
||||
|
||||
If you encounter some difficulties when trying to create your
|
||||
own extension, please read the core source file carefully, and
|
||||
in the event that you may need changes that are not fitted to
|
||||
the current extension mechanism, do not hesitate to contact the
|
||||
authors at `devel@freetype.org'.
|
||||
|
||||
|
||||
Conclusion
|
||||
==========
|
||||
|
||||
The engine source code has become rather stable since now, and
|
||||
its quality compares very favorably to Windows and the Macintosh
|
||||
rasterizers. Its internals will continue to change, though very
|
||||
slowly, even if the API isn't expected to grow much in a near
|
||||
future.
|
||||
|
||||
FreeType is really a glyph-oriented TrueType driver. Its
|
||||
purpose is to open and manage font files in order to load single
|
||||
glyphs and render them as cleanly as possible. A number of
|
||||
features, important to developers, like text string rendering,
|
||||
font mapping and underlining/stroking, to name a few, aren't
|
||||
provided there even though they'd be highly appreciated.
|
||||
|
||||
We hope you have success and fun using this engine. Much time
|
||||
has been taken to make it one of the best in its genre.
|
||||
Remember that it is not intended to be a complete font server or
|
||||
text rendering library, but a pretty solid base for these kinds
|
||||
of applications, as well as others.
|
||||
|
||||
We thank you for your time and consideration.
|
||||
|
||||
David Turner, Robert Wilhelm, Werner Lemberg,
|
||||
and all the FreeType enthusiasts...
|
||||
|
||||
|
||||
--- End of user.txt ---
|
||||
Reference in New Issue
Block a user