they are now moved to the "www" module, under "www/freetype2/docs"VER-2-0-4-PATCH
@ -1,267 +0,0 @@ |
||||
The FreeType 2 cache sub-system explained |
||||
(c) 2000 David Turner |
||||
|
||||
----------------------------------------------- |
||||
|
||||
Introduction : |
||||
-------------- |
||||
|
||||
this document describes the caching sub-system that comes |
||||
with the FreeType library, version 2.0. Note that unlike |
||||
the rest of the library, this code is still in beta stage |
||||
and might still suffer slight changes in the future. |
||||
|
||||
Its basic design shouldn't evolve though and is explained |
||||
in this paper. |
||||
|
||||
|
||||
I. Requirements and Design Goals: |
||||
--------------------------------- |
||||
|
||||
The FT2 cache sub-system was designed to implement caching |
||||
of glyph images. However, it is extremely flexible and can |
||||
be easily extended to cache other kind of data like metrics, |
||||
character maps, coverage tables, etc.. |
||||
|
||||
|
||||
II. Base Concepts: |
||||
------------------ |
||||
|
||||
1. The cache manager object: |
||||
|
||||
at the heart of the caching sub-system is a single object |
||||
called the "cache manager". It is used to deal with FT_Face |
||||
and FT_Size objects, as well as to manager a LRU list of |
||||
abstract "cache nodes". |
||||
|
||||
a. caching FT_Face and FT_Size objects: |
||||
|
||||
each FT_Face object created by FreeType 2 can take from |
||||
a few hundred bytes to several tens of kilobytes, depending |
||||
on the original font's file format as well as its content. |
||||
|
||||
there is no easy way to compute the size of a given FT_Face |
||||
object, so it's always a good idea to assume that it is |
||||
large and to want to limit the number of live face objects |
||||
as much as possible. |
||||
|
||||
similarly, each FT_Face can have one or more FT_Size childs, |
||||
whose byte size depends heavily on the font format. |
||||
|
||||
the first purpose of the cache manager is to provide a |
||||
small cache for FT_Face and FT_Size objects. Basically, |
||||
an application can use it as follows: |
||||
|
||||
- each font face is described to the cache manager |
||||
through a typeless pointer, called a FTC_FaceID. |
||||
|
||||
the cache manager itself doesn't interpret or use |
||||
the value of FTC_FaceIDs directly. Rather, it passes |
||||
them to a user-provided function called a |
||||
"face requester". see the defintion of the |
||||
FTC_Face_Requester type in <freetype/ftcache.h> |
||||
for details.. |
||||
|
||||
the face requester is in charge of translating a given |
||||
face into into a real new FT_Face object that is |
||||
returned to the cache manager. The latter will keep |
||||
the face object alive as long as it needs to. |
||||
|
||||
the face requester is unique and must be passed |
||||
to the function named FTC_Manager_New used to |
||||
create/initialise a new cache manager. |
||||
|
||||
|
||||
- to lookup a given FT_Face, call the function |
||||
FTC_Manager_Lookup_Face as in the following code: |
||||
|
||||
FTC_Manager_Lookup_Face( manager, |
||||
face_id, |
||||
&face ); |
||||
|
||||
if the corresponding FT_Face object is kept in |
||||
the cache manager's list, it will be returned |
||||
directly. Otherwise, this function will call |
||||
the user-provided face requester to create |
||||
a new FT_Face object, add it to the manager's |
||||
list to finally return it. |
||||
|
||||
FT_Face objects are always destroyed by the cache |
||||
manager. An application that uses the cache |
||||
sub-system should never call FT_Done_Face !! |
||||
|
||||
- to lookup a given FT_Size and FT_Face, call the |
||||
function FTC_Manager_Lookup_Size, as in: |
||||
|
||||
FTC_Manager_Lookup_Size( manager, |
||||
ftc_font, |
||||
&face, |
||||
&size ); |
||||
|
||||
where "ftc_font" is a pointer to a FTC_Font descriptor |
||||
(a structure containing a FTC_FaceIDs and character |
||||
dimensions corresponding to the desired FT_Size). |
||||
|
||||
note that the function returns both a FT_Face and |
||||
a FT_Size object. You don't need to call |
||||
FTC_Manager_Lookup_Face before it !! |
||||
|
||||
also note that returned FT_Size objects are always |
||||
destroyed by the cache manager. A client application |
||||
that uses it should never call FT_Done_Size !! |
||||
|
||||
|
||||
the big advantage of using FTC_FaceIDs is that is |
||||
makes the caching sub-system completely independent |
||||
of the way font files are installed / listed / managed |
||||
in your application. In most implementations, a FTC_FaceID |
||||
is really a pointer to an application-specific structure |
||||
that describe the source font file + face index. |
||||
|
||||
|
||||
b - manage a MRU list of abstract "cache nodes": |
||||
|
||||
the second role of the cache manager is to hold and manager |
||||
a list of abstract "cache nodes". The list is always sorted |
||||
in most-recently-used order. The manager always ensure that |
||||
the total size of nodes in memory doesn't over-reach a |
||||
certain threshold, by eliminating "old" nodes when |
||||
necessary. |
||||
|
||||
the cache manager doesn't know much about the cache nodes: |
||||
|
||||
- it knows how to move them in its list |
||||
- it knows how to destroy them when they're too old |
||||
- it knows how to "size" them (i.e. compute their byte |
||||
size in memory) |
||||
|
||||
|
||||
2. Cache objects: |
||||
|
||||
the cache manager doesn't create new cache nodes however, this |
||||
is the charge of what are called "cache objects". |
||||
|
||||
Basically, each cache object is in charge of managing cache |
||||
nodes of a certain type. Its role is to: |
||||
|
||||
- provide a simple description of its cache nodes to the |
||||
manager (i.e. through a FTC_CacheNode_Class structure) |
||||
|
||||
- provide a high-level API that can be called by client |
||||
applications to lookup cache nodes of the corresponding |
||||
type. |
||||
|
||||
this function usually creates new nodes when they're not |
||||
available yet. |
||||
|
||||
- also, and even though this is completely transparent to |
||||
the applications and the cache manager, each cache object |
||||
manages "node sets", where each set contains cache nodes |
||||
usually correspond to the same font face + font size. |
||||
|
||||
|
||||
For example, the cache sub-system currently comes with two |
||||
distinct cache classes: |
||||
|
||||
- a FTC_Image_Cache, which is used to cache FT_Glyph images |
||||
(with one FT_Glyph per cache node). |
||||
|
||||
|
||||
- a FTC_SBit_Cache, which is used to cache small glyph bitmaps |
||||
("sbit" means "embedded bitmaps" in digital typography). |
||||
|
||||
|
||||
the small bitmaps glyph is useful because storing one glyph |
||||
image per cache node isn't memory efficient when the data |
||||
associated to each node is very small. Indeed, each cache |
||||
node has a minimal size of 20 bytes, which is huge when |
||||
your data is an 8x8 monochrome bitmap :-) |
||||
|
||||
Hence, a FTC_SBit_Cache is capable of storing several |
||||
contiguous sbits in a single cache node, resulting in much |
||||
higher cached glyphs / total cache size. |
||||
|
||||
an application can lookup a FT_Glyph image with a FTC_Image_Cache |
||||
by calling: |
||||
|
||||
error = FTC_Image_Cache_Lookup( image_cache, |
||||
ftc_font, |
||||
glyph_index, |
||||
&ft_glyph ); |
||||
|
||||
or a FTC_SBit (small bitmap descriptor) by calling: |
||||
|
||||
error = FTC_SBit_Cache_Lookup( sbit_cache, |
||||
ftc_font, |
||||
glyph_index, |
||||
&ftc_sbit ); |
||||
|
||||
III. Extending the cache sub-system: |
||||
|
||||
It is possible to extend the current cache sub-system by |
||||
providing your own cache class and register it in the cache |
||||
manager. That might be useful to cache other kind of data |
||||
in the sub-system, like glyph metrics (without images), |
||||
|
||||
To do it, you'll need to read the cache sub-system public |
||||
header files rather heavily :-) Fortunately, they're pretty |
||||
well commented and should guide you to your goal. |
||||
|
||||
Note that the cache sub-system already provides two "abstract |
||||
cache" classes that can be re-used by your own implementation: |
||||
|
||||
|
||||
1. The abstract "FTC_GlyphCache" class: |
||||
|
||||
this code is used to implement an abstract "glyph cache", |
||||
i.e. one that simply maps one glyph data per cache node. |
||||
|
||||
it is sub-classed by FTC_Image_Cache, whose implementation |
||||
only consists in simple code to store a FT_Glyph in each |
||||
cache node. |
||||
|
||||
you could sub-class it in your application to store glyph |
||||
images in a different format, for example. |
||||
|
||||
see the files <freetype/cache/ftcglyph.h> and |
||||
"src/cache/ftcglyph.h" for details. |
||||
|
||||
|
||||
2. The abstract "FTC_ChunkCache" class: |
||||
|
||||
this code is used to implement an abstract "glyph chunk cache". |
||||
it's very similar to a FTC_GlyphCache, except that it is capable |
||||
of storing several glyph-specific elements per cache node. |
||||
|
||||
it is sub-classed by FTC_SBit_Cache, whose implementation |
||||
only consists in code to store a FTC_SBitRec record in each |
||||
node element. |
||||
|
||||
you could sub-class it in your application to store small |
||||
glyph data, like metrics, glyph names, wathever. |
||||
|
||||
see the files <freetype/cache/ftcchunk.h> and |
||||
"src/cache/ftcchunk.h" for details.. |
||||
|
||||
|
||||
Note that the two abstract caches are rather complex because |
||||
they use "glyph sets". Each glyph set corresponds to a single |
||||
font face + font size combination. both caches are also |
||||
glyph-specific, though it is perfectly possible to use |
||||
broader selection criterion, here are a few examples: |
||||
|
||||
- caching language coverage maps corresponding to |
||||
a given font face + language combination |
||||
|
||||
- caching charmaps, layout tables, and other global |
||||
data.. |
||||
|
||||
- caching (font_face + font_size) specific "latin1" |
||||
ascender + descender |
||||
|
||||
|
||||
as you can see, a lot is possible with this design :-) |
||||
|
||||
|
||||
|
||||
|
@ -1,710 +0,0 @@ |
||||
|
||||
Conventions and Design in the FreeType 2 library |
||||
------------------------------------------------ |
||||
|
||||
|
||||
Table of Contents |
||||
|
||||
Introduction |
||||
|
||||
I. Style and Formatting |
||||
|
||||
1. Naming |
||||
2. Declarations & Statements |
||||
3. Blocks |
||||
4. Macros |
||||
5. Conventions |
||||
|
||||
II. Design conventions |
||||
|
||||
1. Modularity and Components Layout |
||||
2. Configuration and Debugging |
||||
|
||||
III. Usage conventions |
||||
|
||||
1. Error handling |
||||
2. Font File I/O |
||||
3. Memory management |
||||
4. Support for threaded environments |
||||
5. Object Management |
||||
|
||||
|
||||
|
||||
Introduction |
||||
============ |
||||
|
||||
This text introduces the many conventions used within the FreeType 2 |
||||
library code. Please read it before trying any modifications or |
||||
extensions of the source code. |
||||
|
||||
|
||||
|
||||
I. Style and Formatting |
||||
======================= |
||||
|
||||
The following coding rules are extremely important to keep the |
||||
library's source code homogeneously. Keep in mind the following |
||||
points: |
||||
|
||||
- `Humans read source code, not machines' (Donald Knuth) |
||||
|
||||
The library source code should be as readable as possible, even |
||||
by non-C experts. With `readable', two things are meant: First, |
||||
the source code should be pleasant to the eye, with sufficient |
||||
whitespace and newlines, to not look like a boring stack of |
||||
characters stuck to each other. Second, the source should be |
||||
_expressive_ enough about its goals. This convention contains |
||||
rules that can help the source focus on its purpose, not on a |
||||
particular implementation. |
||||
|
||||
- `Paper is the _ultimate_ debugger' (David Turner :-) |
||||
|
||||
There is nothing like sheets of paper (and a large floor) to |
||||
help you understand the design of a library you're new to, or to |
||||
debug it. The formatting style presented here is targeted at |
||||
printing. For example, it is more than highly recommended to |
||||
never produce a source line that is wider than 78 columns. More |
||||
on this below. |
||||
|
||||
|
||||
1. Naming |
||||
--------- |
||||
|
||||
a. Long and expressive labels |
||||
|
||||
Never hesitate to use long labels for your types, variables, |
||||
etc.! Except maybe for things like very trivial types, the |
||||
longest is the best, as it increases the source's |
||||
_expressiveness_. Never forget that the role of a label is to |
||||
express the `function' of the entity it represents, not its |
||||
implementation! |
||||
|
||||
NOTE: Hungarian notation is NOT expressive, as it sticks the |
||||
`type' of a variable to its name. A label like `usFoo' |
||||
rarely tells the use of the variable it represents. |
||||
|
||||
And the state of a variable (global, static, dynamic) |
||||
isn't helpful anymore. |
||||
|
||||
Conclusion: Avoid Hungarian Notation in FreeType 2. |
||||
|
||||
|
||||
When forging a name with several nouns |
||||
(e.g. `number-of-points'), use an uppercase letter for the first |
||||
letter of each word (except the first), like: |
||||
|
||||
numberOfPoints |
||||
|
||||
You are also welcome to introduce underscores `_' in your |
||||
labels, especially when sticking large nouns together, as it |
||||
`airs' the code greatly. E.g.: |
||||
|
||||
`numberOfPoints' or `number_Of_Points' |
||||
|
||||
`IncredibleFunction' or `Incredible_Function' |
||||
|
||||
And finally, always put a capital letter after an underscore, |
||||
except in variable labels that are all lowercase: |
||||
|
||||
`number_of_points' is OK for a variable (_all_ lowercase label) |
||||
|
||||
`incredible_function' is NOT for a function! |
||||
^ ^ |
||||
|
||||
`Microsoft_windows' is a *shame*! |
||||
^ ^ |
||||
|
||||
`Microsoft_Windows' isn't really better, but at least its a |
||||
^ ^ correct function label within this |
||||
convention ;-) |
||||
|
||||
b. Data types |
||||
|
||||
Try to use C types to the very least! Rely on internally |
||||
defined equivalent types instead. For example, not all |
||||
compilers agree on the sign of `char'; the size of `int' is |
||||
platform-specific, etc. |
||||
|
||||
There are equivalents to the most common types in the |
||||
`fttypes.h' public header file, like `FT_Short', `FT_UShort', |
||||
etc. Using the internal types will guarantee that you won't |
||||
need to replace every occurence of `short' or whatever when |
||||
compiling on a weird platform or with a weird compiler, and |
||||
there are many more than you could think of... |
||||
|
||||
c. Functions |
||||
|
||||
The name of a function should always begin with a capital |
||||
letter, as lowercase first letters are reserved for variables. |
||||
The name of a function should be, again, _expressive_! Never |
||||
hesitate to put long function names in your code: It will make |
||||
the code much more readable. |
||||
|
||||
Expressiveness doesn't necessarily imply lengthiness though; for |
||||
instance, reading various data types from a file stream is |
||||
performed using the following functions defined in the |
||||
`ftstream.c' file of the `base' module: |
||||
|
||||
FT_Get_Char(), FT_Get_Short(), FT_Get_Long(), etc. |
||||
|
||||
Which is somewhat more readable than: |
||||
|
||||
cget, sget, usget, lget, etc. |
||||
|
||||
d. Variables |
||||
|
||||
Variable names (at least meant for the public interface) should |
||||
always begin with a lowercase letter. Lowercase first letters |
||||
are reserved for variables in this convention, as it has been |
||||
already explained above. You are still welcome to use long and |
||||
expressive variable names. |
||||
|
||||
Something like `numP' can express a number of pixels, porks, |
||||
pancakes, and much more... Something like `num_points' won't. |
||||
|
||||
Unfortunately (mostly due to the lazyness of the developers), |
||||
short variable names are still used in many parts of the |
||||
library. Volunteers are highly welcome to improve this... |
||||
|
||||
As a side note, a field name of a structure counts as a variable |
||||
name too. |
||||
|
||||
|
||||
2. Declarations & Statements |
||||
---------------------------- |
||||
|
||||
Try to align declarations and assignments in columns, if it proves |
||||
logically. For example (taken from `ttraster.c'): |
||||
|
||||
struct TProfile_ |
||||
{ |
||||
FT_F26Dot6 X; /* current coordinate during sweep */ |
||||
PProfile link; /* link to next profile - various purpose */ |
||||
PLong offset; /* start of profile's data in render pool */ |
||||
Int flow; /* profile orientation: asc/descending */ |
||||
Long height; /* profile's height in scanlines */ |
||||
Long start; /* profile's starting scanline */ |
||||
|
||||
UShort countL; /* number of lines to step before this */ |
||||
/* profile becomes drawable */ |
||||
|
||||
PProfile next; /* next profile in same contour, used */ |
||||
/* during drop-out control */ |
||||
}; |
||||
|
||||
instead of |
||||
|
||||
struct TProfile_ |
||||
{ |
||||
FT_F26Dot6 X; /* current coordinate during sweep */ |
||||
PProfile link; /* link to next profile - various purpose */ |
||||
PLong offset; /* start of profile's data in render pool */ |
||||
Int flow; /* profile orientation: asc/descending */ |
||||
Long height; /* profile's height in scanlines */ |
||||
Long start; /* profile's starting scanline */ |
||||
UShort countL; /* number of lines to step before this */ |
||||
/* profile becomes drawable */ |
||||
PProfile next; /* next profile in same contour, used */ |
||||
/* during drop-out control */ |
||||
}; |
||||
|
||||
This comes from the fact that you are more interested in the field |
||||
and its function than in its type. |
||||
|
||||
Or: |
||||
|
||||
x = i + 1; |
||||
y += j; |
||||
min = 100; |
||||
|
||||
instead of |
||||
|
||||
x=i+1; |
||||
y+=j; |
||||
min=100; |
||||
|
||||
And don't hesitate to separate blocks of declarations with |
||||
newlines to `distinguish' logical sections. |
||||
|
||||
E.g., taken from an old source file, in the declarations of the |
||||
CMap loader: |
||||
|
||||
long n, num_SH; |
||||
unsigned short u; |
||||
long off; |
||||
unsigned short l; |
||||
long num_Seg; |
||||
unsigned short* glArray; |
||||
long table_start; |
||||
int limit, i; |
||||
|
||||
TCMapDir cmap_dir; |
||||
TCMapDirEntry entry_; |
||||
PCMapTable Plcmt; |
||||
PCMap2SubHeader Plcmsub; |
||||
PCMap4 Plcm4; |
||||
PCMap4Segment segments; |
||||
|
||||
instead of |
||||
|
||||
long n, num_SH; |
||||
unsigned short u; |
||||
long off; |
||||
unsigned short l; |
||||
long num_Seg; |
||||
unsigned short *glArray; |
||||
long table_start; |
||||
int limit, i; |
||||
TCMapDir cmap_dir; |
||||
TCMapDirEntry entry_; |
||||
PCMapTable Plcmt; |
||||
PCMap2SubHeader Plcmsub; |
||||
PCMap4 Plcm4; |
||||
PCMap4Segment segments; |
||||
|
||||
|
||||
3. Blocks |
||||
--------- |
||||
|
||||
Block separation is done with `{' and `}'. We do not use the K&R |
||||
convention which becomes only useful with an extensive use of |
||||
tabs. The `{' and its corresponding `}' should always be on the |
||||
same column. It makes it easier to separate a block from the rest |
||||
of the source, and it helps your _brain_ associate the accolades |
||||
easily (ask any Lisp programmer on the topic!). |
||||
|
||||
Use two spaces for the next indentation level. |
||||
|
||||
Never use tabs in FreeType 2 code; their widths may vary with |
||||
editors and systems. |
||||
|
||||
Example: |
||||
|
||||
if (condition_test) { |
||||
waow mamma; |
||||
I'm doing K&R format; |
||||
just like the Linux kernel; |
||||
} else { |
||||
This test failed poorly; |
||||
} |
||||
|
||||
should be rather formatted as |
||||
|
||||
if ( condition_test ) |
||||
{ |
||||
This code isn't stuck to the condition; |
||||
read it on paper, you will find it more; |
||||
pleasant to the eye; |
||||
} |
||||
else |
||||
{ |
||||
Of course, this is a matter of taste; |
||||
This is just the way it is in this convention; |
||||
and you should follow it to be homogenuous with; |
||||
the rest of the FreeType code; |
||||
} |
||||
|
||||
|
||||
4. Macros |
||||
--------- |
||||
|
||||
Macros should be made of uppercase letters. If a macro label is |
||||
forged from several words, it is possible to only uppercasify the |
||||
first word, using an underscore to separate the nouns. This is |
||||
used in in some files for macros like |
||||
|
||||
GET_UShort(), USE_Stream(), etc. |
||||
|
||||
The role of macros used throughout the engine is explained later |
||||
in this document. |
||||
|
||||
|
||||
5. Conventions |
||||
-------------- |
||||
|
||||
Currently, FreeType 2 source code uses the following formatting |
||||
rules: |
||||
|
||||
. The data type is separated with two spaces from the variable, |
||||
structure, or function name: |
||||
|
||||
const char foo; |
||||
|
||||
Usually, the `*' operator is concatenated to the data type: |
||||
|
||||
FT_Int* pointer; |
||||
|
||||
However, when declaring resp. defining an `output' parameter |
||||
(i.e. a pointer which will be assigned by the function), the |
||||
last `*' must be placed on the right in order to denote this, as |
||||
in: |
||||
|
||||
FT_New_Face( FT_Library library, |
||||
FT_Face *aface ); |
||||
|
||||
where the `*' is used to indicate that `aface' is returned. In |
||||
most cases, the name of such an output variable starts with `a' |
||||
or `an' (`aface' instead of `face', `anlru' instead of `lru', |
||||
etc.), following the English rules of the indefinite article. |
||||
|
||||
. As mentioned above, multiple declarations are vertically |
||||
aligned: |
||||
|
||||
FT_Short foo; |
||||
FT_Long bar; |
||||
FT_GlyphSlot slot; |
||||
|
||||
. Declarations are separated with two blank lines from the |
||||
following code. This intentionally disturbs the code flow to |
||||
make variable definitions more visible. |
||||
|
||||
{ |
||||
char x, y; |
||||
|
||||
|
||||
x = 3; |
||||
y = 5; |
||||
} |
||||
|
||||
. An opening parenthesis follows a function directly without |
||||
space; after a built-in C keyword, one space is used: |
||||
|
||||
x = sin( y ); |
||||
y = sizeof ( long ); |
||||
|
||||
Except for casts, empty parameters, and the closing semicolon, |
||||
parentheses are surrounded with space: |
||||
|
||||
x = (char*)( foo + bar ); |
||||
y = rand(); |
||||
|
||||
. Binary operators are surrounded by spaces; unary operators have |
||||
no space after it: |
||||
|
||||
x = ( 3 + 4 ) / ( 7 - 2 ); |
||||
y = -( 3 + 4 ) * 7; |
||||
|
||||
. Array arguments are not surrounded by spaces: |
||||
|
||||
array[3] = array[1] + array[2]; |
||||
array[4] = array[1 + 3]; |
||||
|
||||
. Comma and semicolon have only space at the right side: |
||||
|
||||
if ( x = 0; x < y; x++, y-- ) |
||||
do_something(); |
||||
|
||||
Exception: |
||||
|
||||
for (;;) |
||||
{ |
||||
... |
||||
|
||||
. Don't use |
||||
|
||||
if ( x == y ) a = b; |
||||
|
||||
but |
||||
|
||||
if ( x == y ) |
||||
a = b; |
||||
|
||||
in general. |
||||
|
||||
. Preprocessor directives are never indented and always start in |
||||
the first column. |
||||
|
||||
. All function/structure/variable definitions start at column |
||||
three. |
||||
|
||||
. All full-line comments (except the header of a file) start at |
||||
column three (even comments for preprocessor directives). |
||||
|
||||
. Labels are sticking out two positions to the left: |
||||
|
||||
switch ( x ) |
||||
{ |
||||
case 1: |
||||
do_something(); |
||||
break; |
||||
default: |
||||
do_nothing(); |
||||
break; |
||||
} |
||||
|
||||
|
||||
|
||||
II. Design Conventions |
||||
====================== |
||||
|
||||
|
||||
1. Modularity and Components Layout |
||||
----------------------------------- |
||||
|
||||
The FreeType 2 engine has been designed with portability in mind. |
||||
This implies the ability to compile and run it on a great variety |
||||
of systems and weird environments, unlike many packages where the |
||||
word strictly means `runs on a bunch of Unix-like systems'. We |
||||
have thus decided to stick to the following restrictions: |
||||
|
||||
- The C version is written entirely in ANSI C. |
||||
|
||||
- The library, if compiled with gcc, doesn't produce any warning |
||||
with the `-ansi -pedantic' flags. Other compilers with better |
||||
checks may produce ANSI warnings -- please report. |
||||
|
||||
(NOTE: It can of course be compiled by an `average' C compiler, |
||||
and even by a C++ one.) |
||||
|
||||
- It only requires in its simplest form an ANSI libc to compile, |
||||
and no utilities other than a C preprocessor, compiler, and |
||||
linker. |
||||
|
||||
- It consists of modules, starting with a `base' module which |
||||
provides the API, some auxiliary modules used by the font |
||||
drivers, the font driver modules itself, and the rasterizer |
||||
modules. |
||||
|
||||
- The very low-level components can be easily replaced by |
||||
system-specific ones that do not rely on the standard libc. |
||||
These components deal mainly with i/o, memory, and mutex |
||||
operations. |
||||
|
||||
- A client application only needs to include one header file named |
||||
`freetype.h' to use the engine. Other public header files like |
||||
`ftglyph.h' or `ftimage.h' provide functional extensions. |
||||
|
||||
- All configuration options are gathered in two files, |
||||
`ftconfig.h' and `ftoption.h'. The former contains the |
||||
processor and OS specific configuration options, while the |
||||
latter treats options that may be enabled or disabled by the |
||||
user to enable and disable various features. |
||||
|
||||
|
||||
2. Configuration and Debugging |
||||
------------------------------ |
||||
|
||||
Configuration is covered by the `BUILD' documentation file. |
||||
|
||||
Debugging is controlled by two macros in `ftoption.h', |
||||
FT_DEBUG_LEVEL_ERROR and FT_DEBUG_LEVEL_TRACE; don't use them in |
||||
code to be released. Check the source code of the `ftview.c' |
||||
demonstration program (in the `ft2demos' package) how tracing can |
||||
be used and activated. |
||||
|
||||
|
||||
|
||||
III. Usage conventions |
||||
====================== |
||||
|
||||
|
||||
1. Error Handling |
||||
----------------- |
||||
|
||||
Most functions directly return an error code. A return value of 0 |
||||
(FT_Err_Ok) means that no error occured, while a non-zero other |
||||
value indicates a failure of any kind. |
||||
|
||||
We use code like this in FreeType 2: |
||||
|
||||
if ( ( rc = Perform_Action_1( parms_of_1 ) ) || |
||||
( rc = Perform_Action_2( parms_of_2 ) ) || |
||||
( rc = Perform_Action_3( parms_of_3 ) ) ) |
||||
goto Fail; |
||||
|
||||
which is better but uses assignments within expressions, which are |
||||
always delicate to manipulate in C (the risk of writing `==' |
||||
exists, and would go unnoticed by a compiler). Moreover, the |
||||
assignments are a bit redundant and don't express much things |
||||
about the actions performed (they only speak of the error |
||||
management issue). |
||||
|
||||
That is why some macros have been defined for the most frequently |
||||
used functions. They relate to low-level routines that are called |
||||
very often (mainly i/o and memory handling functions). Each macro |
||||
produces an implicit assignment to a variable called `error' and |
||||
can be used instead as a simple function call. Example: |
||||
|
||||
if ( PERFORM_Action_1( parms_of_1 ) || |
||||
PERFORM_Action_2( parms_of_2 ) || |
||||
PERFORM_Action_3( parms_of_3 ) ) |
||||
goto Fail; |
||||
|
||||
with |
||||
|
||||
#define PERFORM_Action_1( parms_1 ) \ |
||||
( error = Perform_Action_1( parms_1 ) ) |
||||
#define PERFORM_Action_2( parms_1 ) \ |
||||
( error = Perform_Action_2( parms_1 ) ) |
||||
#define PERFORM_Action_3( parms_1 ) \ |
||||
( error = Perform_Action_3( parms_1 ) ) |
||||
|
||||
defined in some header file. |
||||
|
||||
There, the developer only needs to define a local `error' variable |
||||
and use the macros directly in the code, without caring about the |
||||
actual error handling performed. Another advantage is that the |
||||
structure of source files remain very similar, even though the |
||||
error handling may be different. |
||||
|
||||
This convention is very close to the use of exceptions in |
||||
languages like C++, Pascal, Java, etc. where the developer |
||||
focuses on the actions to perform, and not on every little error |
||||
checking. |
||||
|
||||
|
||||
2. Font File I/O |
||||
---------------- |
||||
|
||||
a. Streams |
||||
|
||||
The engine uses `streams' to access the font files. A stream is |
||||
a structure containing information used to access files through |
||||
a system-specific i/o library. |
||||
|
||||
The default implementation of streams uses the ANSI libc i/o |
||||
functions. However, for the sake of embedding in light systems |
||||
and independence of a complete C library, it is possible to |
||||
re-implement the component for a specific system or OS, letting |
||||
it use system calls. |
||||
|
||||
b. Frames |
||||
|
||||
TrueType is tied to the big-endian format, which implies that |
||||
reading shorts or longs from the font file may need conversions |
||||
depending on the target processor. To be able to easily detect |
||||
read errors and allow simple conversion calls or macros, the |
||||
engine is able to access a font file using `frames'. |
||||
|
||||
A frame is simply a sequence of successive bytes taken from the |
||||
input file at the current position. A frame is pre-loaded into |
||||
memory by a call to the `ACCESS_Frame()' macro. |
||||
|
||||
It is then possible to read all sizes of data through the |
||||
`GET_xxx()' macros described above. |
||||
|
||||
When all important data is read, the frame can be released by a |
||||
call to `FORGET_Frame()'. |
||||
|
||||
The benefits of frames are various. Consider these two |
||||
approaches at extracting values: |
||||
|
||||
if ( ( error = Read_Short( &var1 ) ) || |
||||
( error = Read_Long ( &var2 ) ) || |
||||
( error = Read_Long ( &var3 ) ) || |
||||
( error = Read_Short( &var4 ) ) ) |
||||
|
||||
return FAILURE; |
||||
|
||||
and |
||||
|
||||
/* Read the next 16 bytes */ |
||||
if ( ACCESS_Frame( 16L ) ) |
||||
return error; /* The Frame could not be read */ |
||||
|
||||
var1 = GET_Short(); /* extract values from the frame */ |
||||
var2 = GET_Long(); |
||||
var3 = GET_Long(); |
||||
var4 = GET_Short(); |
||||
|
||||
FORGET_Frame(); /* release the frame */ |
||||
|
||||
In the first case, there are four error assignments with four |
||||
checks of the file read. This unnecessarily increases the size |
||||
of the generated code. Moreover, you must be sure that `var1' |
||||
and `var4' are short variables, `var2' and `var3' long ones, if |
||||
you want to avoid bugs and/or compiler warnings. |
||||
|
||||
In the second case, you perform only one check for the read, and |
||||
exit immediately on failure. Then the values are extracted from |
||||
the frame, as the result of function calls. This means that you |
||||
can use automatic type conversion; there is no problem if |
||||
e.g. `var1' and `var4' are longs, unlike previously. |
||||
|
||||
Finally, frames are ideal when you are using memory-mapped |
||||
files, as the frame is not really `pre-loaded' and never uses |
||||
any `heap' space. |
||||
|
||||
IMPORTANT: You CANNOT nest several frame accesses. There is |
||||
only one frame available at a time for a specific |
||||
instance. |
||||
|
||||
It is also the programmer's responsibility to never |
||||
extract more data than was pre-loaded in the frame! |
||||
(But you usually know how many values you want to |
||||
extract from the file before doing so). |
||||
|
||||
|
||||
3. Memory Management |
||||
-------------------- |
||||
|
||||
The library now has a component which uses an interface similar to |
||||
malloc()/free(). |
||||
|
||||
* FT_Alloc() |
||||
|
||||
To be used like malloc(), except that it returns an error code, |
||||
not an address. Its arguments are the size of the requested |
||||
block and the address of the target pointer to the `fresh' |
||||
block. An error code is returned in case of failure (and this |
||||
will also set the target pointer to NULL), 0 in case of success. |
||||
|
||||
FT_Alloc() internally calls the ft_alloc() function defined in |
||||
an FT_Memory object. All error checking is done by FT_Alloc() |
||||
itself so that ft_alloc() directly calls malloc(). |
||||
|
||||
* FT_Realloc() |
||||
|
||||
Similar to FT_Alloc(); it calls realloc() by default. |
||||
|
||||
* FT_Free() |
||||
|
||||
As you may have already guessed, FT_Free() is FT_Alloc()'s |
||||
counterpart. It takes as argument the _target pointer's |
||||
address_! You should _never_ pass the block's address directly, |
||||
i.e. the pointer, to FT_Free(). |
||||
|
||||
Similar to FT_Alloc(), FT_Free() does the necessary error |
||||
checking and calls free() by default. |
||||
|
||||
As the pointers addresses needed as arguments are typed `void**', |
||||
ftmemory.h provides some macros to help use the above functions |
||||
more easily, these are: |
||||
|
||||
MEM_Alloc() A version of FT_Alloc() that casts the argument |
||||
pointer to (void**). Similar functions are |
||||
MEM_Alloc_Array(), MEM_Realloc(), and |
||||
MEM_Realloc_Array() |
||||
|
||||
ALLOC() Same as MEM_Alloc(), but with an assignment to a |
||||
variable called `error'. See the section `error |
||||
handling' above for more info on this. Similar |
||||
functions are REALLOC(), ALLOC_ARRAY(), and |
||||
REALLOC_ARRAY(). |
||||
|
||||
FREE() A version of FT_Free() that casts the argument |
||||
pointer to (void**). |
||||
|
||||
MEM_Set() An alias for `memset()', which can be easily |
||||
changed to anything else if you wish to use a |
||||
different memory manager than the functions |
||||
provided by the ANSI libc. |
||||
|
||||
MEM_Copy() An alias of `memcpy()' or `bcopy()' used to move |
||||
blocks of memory. You may change it to something |
||||
different if necessary (e.g. not using libc). |
||||
|
||||
MEM_Move() An alias of `memmove().' Change its definition if |
||||
necessary. |
||||
|
||||
|
||||
4. Support for threaded environments |
||||
------------------------------------ |
||||
|
||||
Thread synchronisation has been dropped in FreeType 2. The |
||||
library is already re-entrant, and if you really need two threads |
||||
accessing the same FT_Library object, you should synchronize |
||||
access to it yourself with a simple mutex. |
||||
|
||||
|
||||
--- end of convntns.txt --- |
Before Width: | Height: | Size: 2.0 KiB |
@ -1,160 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-2.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
Introduction |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>This document provides details on the design and implementation of the |
||||
FreeType 2 library. Its goal is to allow developers to better |
||||
understand the way how FreeType 2 is organized, in order to let them |
||||
extend, customize, and debug it.</p> |
||||
|
||||
<p>Before anything else, it is important to understand the |
||||
<em>purpose</em> of this library, i.e., why it has been written:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>It allows client applications to <em>access font files easily</em>, |
||||
wherever they could be stored, and as independently of the font format |
||||
as possible.</p> |
||||
</li> |
||||
<li> |
||||
<p>Easy <em>retrieval of global font data</em> most commonly found in |
||||
normal font formats (i.e. global metrics, encoding/charmaps, |
||||
etc.).</p> |
||||
</li> |
||||
<li> |
||||
<p>It allows easy <em>retrieval of individual glyph data</em> |
||||
(metrics, images, name, anything else).</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Access to font format-specific "features"</em> whenever |
||||
possible (e.g. SFNT tables, Multiple Masters, OpenType Layout tables, |
||||
etc.).</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Its design has also severely been influenced by the following |
||||
requirements:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>High portability</em>. The library must be able to run on any |
||||
kind of environment. This requirement introduces a few drastic |
||||
choices that are part of FreeType 2's low-level system |
||||
interface.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Extendability</em>. New features should be added with the |
||||
least modifications in the library's code base. This requirement |
||||
induces an extremely simple design where nearly all operations are |
||||
provided by modules.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Customization</b>. It should be easy to build a version of the |
||||
library that only contains the features needed by a specific project. |
||||
This really is important when you need to integrate it in a font |
||||
server for embedded graphics libraries.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Compactness</em> and <em>efficiency</em>. The primary target |
||||
for this library are embedded systems with low cpu and memory |
||||
resources.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>The rest of this document is divided in several sections. First, a few |
||||
chapters will present the library's basic design as well as the |
||||
objects/data managed internally by FreeType 2.</p> |
||||
|
||||
<p>A later section is then dedicated to library customization, relating |
||||
such topics as system-specific interfaces, how to write your own module |
||||
and how to tailor library initialization & compilation to your needs.</p> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-3.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,187 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-1.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-3.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
I. Components and APIs |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>It's better to describe FreeType 2 as a collection of |
||||
<em>components</em>. Each one of them is a more or less abstract part of |
||||
the library that is in charge of one specific task. We will now explicit |
||||
the connections and relationships between them.</p> |
||||
|
||||
<p>A first brief description of this system of components could be:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>Client applications typically call the FreeType 2 |
||||
<b>high-level API</b>, whose functions are implemented in a single |
||||
component called the <em>Base Layer</em>.</p> |
||||
</li> |
||||
<li> |
||||
<p>Depending on the context or the task, the base layer then calls one |
||||
or more <em>module</em> components to perform the work. In most |
||||
cases, the client application doesn't need to know which module was |
||||
called.</p> |
||||
</li> |
||||
<li> |
||||
<p>The base layer also contains a set of routines that are used for |
||||
generic things like memory allocation, list processing, i/o stream |
||||
parsing, fixed point computation, etc. these functions can also be |
||||
called by a module at any time, and they form what is called the |
||||
<b>low-level base API</b>.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>This is illustrated by the following graphics (note that component |
||||
entry points are represented as colored triangles):</p> |
||||
|
||||
<center> |
||||
<img src="basic-design.png" |
||||
width="394" height="313" |
||||
alt="Basic FreeType design"> |
||||
</center> |
||||
|
||||
<p>Now, a few additional things must be added to complete this |
||||
picture:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>Some parts of the base layer can be replaced for specific builds of |
||||
the library, and can thus be considered as components themselves. |
||||
This is the case for the <tt>ftsystem</tt> component, which is in |
||||
charge of implementing memory management & input stream access, as |
||||
well as <tt>ftinit</tt>, which is in charge of library initialization |
||||
(i.e. implementing the <tt>FT_Init_FreeType()</tt> function).</p> |
||||
</li> |
||||
<li> |
||||
<p>FreeType 2 comes also with a set of <em>optional |
||||
components</em>, which can be used either as a convenience for client |
||||
applications (e.g. the <tt>ftglyph</tt> component, used to provide a |
||||
simple API to manage glyph images independently of their internal |
||||
representation), or to access format-specific features (e.g. the |
||||
<tt>ftmm</tt> component used to access and manage Multiple Masters |
||||
data in Type 1 fonts).</p> |
||||
</li> |
||||
<li> |
||||
<p>Finally, a module is capable of calling functions provided by |
||||
another module. This is very useful to share code and tables between |
||||
several font driver modules (for example, the <tt>truetype</tt> and |
||||
<tt>cff</tt> modules both use the routines provided by the |
||||
<tt>sfnt</tt> module).</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Hence, a more complete picture would be:</p> |
||||
|
||||
<center> |
||||
<img src="detailed-design.png" |
||||
width="390" height="429" |
||||
alt="Detailed FreeType design"> |
||||
</center> |
||||
|
||||
<p>Please take note of the following important points:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>An optional component can use either the high-level or base API. |
||||
This is the case of <tt>ftglyph</tt> in the above picture.</p> |
||||
</li> |
||||
<li> |
||||
<p>Some optional components can use module-specific interfaces ignored |
||||
by the base layer. In the above example, <tt>ftmm</tt> directly |
||||
accesses the Type 1 module to set/query data.</p> |
||||
</li> |
||||
<li> |
||||
<p>A replacable component can provide a function of the high-level |
||||
API. For example, <tt>ftinit</tt> provides |
||||
<tt>FT_Init_FreeType()</tt> to client applications.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-1.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-3.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,353 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-2.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-4.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
II. Public Objects and Classes |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>We will now explain the abstractions provided by FreeType 2 to |
||||
client applications to manage font files and data. As you would normally |
||||
expect, these are implemented through objects/classes.</p> |
||||
|
||||
<h2> |
||||
1. Object Orientation in FreeType 2 |
||||
</h2> |
||||
|
||||
<p>Though written in ANSI C, the library employs a few techniques, |
||||
inherited from object-oriented programming, to make it easy to extend. |
||||
Hence, the following conventions apply in the FreeType 2 source |
||||
code:</p> |
||||
|
||||
<ol> |
||||
<li> |
||||
<p>Each object type/class has a corresponding <em>structure |
||||
type</em> <b>and</b> a corresponding <em>structure pointer |
||||
type</em>. The latter is called the <em>handle type</em> for the |
||||
type/class.</p> |
||||
|
||||
<p>Consider that we need to manage objects of type "foo" in |
||||
FreeType 2. We would define the following structure and handle |
||||
types as follows:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
typedef struct FT_FooRec_* FT_Foo; |
||||
|
||||
typedef struct FT_FooRec_ |
||||
{ |
||||
// fields for the "foo" class |
||||
... |
||||
|
||||
} FT_FooRec;</pre> |
||||
</font> |
||||
|
||||
<p>As a convention, handle types use simple but meaningful |
||||
identifiers beginning with <tt>FT_</tt>, as in <tt>FT_Foo</tt>, |
||||
while structures use the same name with a <tt>Rec</tt> suffix |
||||
appended to it ("Rec" is short for "record"). <em>Note that each |
||||
class type has a corresponding handle type</em>.</p> |
||||
</li> |
||||
<li> |
||||
<p>Class derivation is achieved internally by wrapping base class |
||||
structures into new ones. As an example, we define a "foobar" class |
||||
that is derived from "foo". We would do something like:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
typedef struct FT_FooBarRec_* FT_FooBar; |
||||
|
||||
typedef struct FT_FooBarRec_ |
||||
{ |
||||
// the base "foo" class fields |
||||
FT_FooRec root; |
||||
|
||||
// fields proper to the "foobar" class |
||||
... |
||||
} FT_FooBarRec;</pre> |
||||
</font> |
||||
|
||||
<p>As you can see, we ensure that a "foobar" object is also a "foo" |
||||
object by placing a <tt>FT_FooRec</tt> at the start of the |
||||
<tt>FT_FooBarRec</tt> definition. It is called <b>root</b> by |
||||
convention.</p> |
||||
|
||||
<p>Note that a <tt>FT_FooBar</tt> handle also points to a "foo" |
||||
object and can be typecasted to <tt>FT_Foo</tt>. Similarly, when |
||||
the library returns a <tt>FT_Foo</tt> handle to client applications, |
||||
the object can be really implemented as a <tt>FT_FooBar</tt> or any |
||||
derived class from "foo".</p> |
||||
</li> |
||||
</ol> |
||||
|
||||
<p>In the following sections of this chapter, we will refer to "the |
||||
<tt>FT_Foo</tt> class" to indicate the type of objects handled through |
||||
<tt>FT_Foo</tt> pointers, be they implemented as "foo" or "foobar".</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
2. The <tt>FT_Library</tt> class |
||||
</h2> |
||||
|
||||
<p>This type corresponds to a handle to a single instance of the |
||||
library. Note that the corresponding structure <tt>FT_LibraryRec</tt> |
||||
is not defined in public header files, making client applications unable |
||||
to access its internal fields.</p> |
||||
|
||||
<p>The library object is the <em>parent</em> of all other objects in |
||||
FreeType 2. You need to create a new library instance before doing |
||||
anything else with the library. Similarly, destroying it will |
||||
automatically destroy all its children (i.e. faces and modules).</p> |
||||
|
||||
<p>Typical client applications should call <tt>FT_Init_FreeType()</tt> |
||||
in order to create a new library object, ready to be used for further |
||||
actions.</p> |
||||
|
||||
<p>Another alternative is to create a fresh new library instance by |
||||
calling the function <tt>FT_New_Library()</tt>, defined in the |
||||
<tt><freetype/ftmodule.h></tt> public header file. This function |
||||
will however return an "empty" library instance with no module |
||||
registered in it. You can "install" modules in the instance by calling |
||||
<tt>FT_Add_Module()</tt> manually.</p> |
||||
|
||||
<p>Calling <tt>FT_Init_FreeType()</tt> is a lot more convenient, because |
||||
this function basically registers a set of default modules into each new |
||||
library instance. The way this list is accessed and/or computed is |
||||
determined at build time, and depends on the content of the |
||||
<tt>ftinit</tt> component. This process is explained in details later |
||||
in this document.</p> |
||||
|
||||
<p>For now, one should consider that library objects are created with |
||||
<tt>FT_Init_FreeType()</tt>, and destroyed along with all children with |
||||
<tt>FT_Done_FreeType()</tt>.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
3. The <tt>FT_Face</tt> class |
||||
</h2> |
||||
|
||||
<p>A face object corresponds to a single <em>font face</em>, i.e., a |
||||
specific typeface with a specific style. For example, "Arial" and |
||||
"Arial Italic" correspond to two distinct faces.</p> |
||||
|
||||
<p>A face object is normally created through <tt>FT_New_Face()</tt>. |
||||
This function takes the following parameters: an <tt>FT_Library</tt> |
||||
handle, a C file pathname used to indicate which font file to open, an |
||||
index used to decide which face to load from the file (a single file may |
||||
contain several faces in certain cases), and the address of a |
||||
<tt>FT_Face</tt> handle. It returns an error code:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
FT_Error FT_New_Face( FT_Library library, |
||||
const char* filepathname, |
||||
FT_Long face_index, |
||||
FT_Face* face );</pre> |
||||
</font> |
||||
|
||||
<p>In case of success, the function will return 0, and the handle |
||||
pointed to by the <tt>face</tt> parameter will be set to a non-NULL |
||||
value.</p> |
||||
|
||||
<p>Note that the face object contains several fields used to describe |
||||
global font data that can be accessed directly by client applications. |
||||
For example, the total number of glyphs in the face, the face's family |
||||
name, style name, the EM size for scalable formats, etc. For more |
||||
details, look at the <tt>FT_FaceRec</tt> definition in the |
||||
FreeType 2 API Reference.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
4. The <tt>FT_Size</tt> class |
||||
</h2> |
||||
|
||||
<p>Each <tt>FT_Face</tt> object <em>has</em> one or more |
||||
<tt>FT_Size</tt> objects. A <em>size object</em> is used to store data |
||||
specific to a given character width and height. Each newly created face |
||||
object has one size, which is directly accessible as |
||||
<tt>face->size</tt>.</p> |
||||
|
||||
<p>The contents of a size object can be changed by calling either |
||||
<tt>FT_Set_Pixel_Sizes()</tt> or <tt>FT_Set_Char_Size()</tt>.</p> |
||||
|
||||
<p>A new size object can be created with <tt>FT_New_Size()</tt>, and |
||||
destroyed manually with </tt>FT_Done_Size()</tt>. Note that typical |
||||
applications don't need to do this normally: they tend to use the |
||||
default size object provided with each <tt>FT_Face</tt>.</p> |
||||
|
||||
<p>The public fields of <tt>FT_Size</tt> objects are defined in a very |
||||
small structure named <tt>FT_SizeRec</tt>. However, it is important to |
||||
understand that some font drivers define their own derivatives of |
||||
<tt>FT_Size</tt> to store important internal data that is re-computed |
||||
each time the character size changes. Most of the time, these are |
||||
size-specific <em>font hints</em>./p> |
||||
|
||||
<p>For example, the TrueType driver stores the scaled CVT table that |
||||
results from the execution of the "cvt" program in a <tt>TT_Size</tt> |
||||
structure, while the Type 1 driver stores scaled global metrics |
||||
(like blue zones) in a <tt>T1_Size</tt> object. Don't worry if you |
||||
don't understand the current paragraph; most of this stuff is highly |
||||
font format specific and doesn't need to be explained to client |
||||
developers :-)</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
5. The <tt>FT_GlyphSlot</tt> class |
||||
</h2> |
||||
|
||||
<p>The purpose of a glyph slot is to provide a place where glyph images |
||||
can be loaded one by one easily, independently of the glyph image format |
||||
(bitmap, vector outline, or anything else).</p> |
||||
|
||||
<p>Ideally, once a glyph slot is created, any glyph image can be loaded |
||||
into it without additional memory allocation. In practice, this is only |
||||
possible with certain formats like TrueType which explicitly provide |
||||
data to compute a slot's maximum size.</p> |
||||
|
||||
<p>Another reason for glyph slots is that they are also used to hold |
||||
format-specific hints for a given glyphs as well as all other data |
||||
necessary to correctly load the glyph.</p> |
||||
|
||||
<p>The base <tt>FT_GlyphSlotRec</tt> structure only presents glyph |
||||
metrics and images to client applications, while actual implementation |
||||
may contain more sophisticated data.</p> |
||||
|
||||
<p>As an example, the TrueType-specific <tt>TT_GlyphSlotRec</tt> |
||||
structure contains additional fields to hold glyph-specific bytecode, |
||||
transient outlines used during the hinting process, and a few other |
||||
things. |
||||
|
||||
The Type 1-specific <tt>T1_GlyphSlotRec</tt> structure holds glyph |
||||
hints during glyph loading, as well as additional logic used to properly |
||||
hint the glyphs when a native Type 1 hinter is used.</p> |
||||
|
||||
<p>Finally, each face object has a single glyph slot that is directly |
||||
accessible as <tt>face->glyph</tt>.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
6. The <tt>FT_CharMap</tt> class |
||||
</h2> |
||||
|
||||
<p>The <tt>FT_CharMap</tt> type is used as a handle to character map |
||||
objects, or <em>charmaps</em>. A charmap is simply some sort of table |
||||
or dictionary which is used to translate character codes in a given |
||||
encoding into glyph indices for the font.</p> |
||||
|
||||
<p>A single face may contain several charmaps. Each one of them |
||||
corresponds to a given character repertoire, like Unicode, Apple Roman, |
||||
Windows codepages, and other encodings.</p> |
||||
|
||||
<p>Each <tt>FT_CharMap</tt> object contains a "platform" and an |
||||
"encoding" field used to identify precisely the character repertoire |
||||
corresponding to it.</p> |
||||
|
||||
<p>Each font format provides its own derivative of |
||||
<tt>FT_CharMapRec</tt> and thus needs to implement these objects.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
7. Objects relationships |
||||
</h2> |
||||
|
||||
<p>The following diagram summarizes what we have just said regarding the |
||||
public objects managed by the library, as well as explicitely describes |
||||
their relationships</p> |
||||
|
||||
<center> |
||||
<img src="simple-model.png" |
||||
width=453 height=378 |
||||
alt="Simple library model"> |
||||
</center> |
||||
|
||||
<p>Note that this picture will be updated at the end of the next |
||||
chapter, related to <em>internal objects</em>.</p> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-2.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-4.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,361 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-3.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-5.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
III. Internal Objects and Classes |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>Let us have a look now at the <em>internal</em> objects that |
||||
FreeType 2 uses, i.e., those not directly available to client |
||||
applications, and see how they fit into the picture.</p> |
||||
|
||||
<h2> |
||||
1. Memory management |
||||
</h2> |
||||
|
||||
<p>All memory management operations are performed through three specific |
||||
routines of the base layer, namely: <tt>FT_Alloc()</tt>, |
||||
<tt>FT_Realloc()</tt>, and <tt>FT_Free()</tt>. Each one of these |
||||
functions expects a <tt>FT_Memory</tt> handle as its first |
||||
parameter.</p> |
||||
|
||||
<p>The latter is a pointer to a simple object used to describe the |
||||
current memory pool/manager. It contains a simple table of |
||||
alloc/realloc/free functions. A memory manager is created at library |
||||
initialization time by <tt>FT_Init_FreeType()</tt>, calling the function |
||||
<tt>FT_New_Memory()</tt> provided by the <tt>ftsystem</tt> |
||||
component.</p> |
||||
|
||||
<p>By default, this manager uses the ANSI <tt>malloc()</tt>, |
||||
<tt>realloc()</tt>, and <tt>free()</tt> functions. However, as |
||||
<tt>ftsystem</tt> is a replaceable part of the base layer, a specific |
||||
build of the library could provide a different default memory |
||||
manager.</p> |
||||
|
||||
<p>Even with a default build, client applications are still able to |
||||
provide their own memory manager by not calling |
||||
<tt>FT_Init_FreeType()</tt> but follow these simple steps:</p> |
||||
|
||||
<ol> |
||||
<li> |
||||
<p>Create a new <tt>FT_Memory</tt> object by hand. The definition |
||||
of <tt>FT_MemoryRec</tt> is located in the public file |
||||
<tt><freetype/ftsystem.h></tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p>Call <tt>FT_New_Library()</tt> to create a new library instance |
||||
using your custom memory manager. This new library doesn't yet |
||||
contain any registered modules.</p> |
||||
</li> |
||||
<li> |
||||
<p>Register the set of default modules by calling the function |
||||
<tt>FT_Add_Default_Modules()</tt> provided by the <tt>ftinit</tt> |
||||
component, or manually register your drivers by repeatedly |
||||
calling <tt>FT_Add_Module()</tt>.</p> |
||||
</li> |
||||
</ol> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
2. Input streams |
||||
</h2> |
||||
|
||||
<p>Font files are always read through <tt>FT_Stream</tt> objects. The |
||||
definition of <tt>FT_StreamRec</tt> is located in the public file |
||||
<tt><freetype/ftsystem.h></tt>, which allows client developers to |
||||
provide their own implementation of streams if they wish so.</p> |
||||
|
||||
<p>The function <tt>FT_New_Face()</tt> will always automatically create |
||||
a new stream object from the C pathname given as its second |
||||
argument. This is achieved by calling the function |
||||
<tt>FT_New_Stream()</tt> provided by the <tt>ftsystem</tt> component. |
||||
As the latter is replaceable, the implementation of streams may vary |
||||
greatly between platforms.</p> |
||||
|
||||
<p>As an example, the default implementation of streams is located in |
||||
the file <tt>src/base/ftsystem.c</tt> and uses the ANSI |
||||
<tt>fopen()</tt>, <tt>fseek()</tt>, and <tt>fread()</tt> calls. |
||||
However, the Unix build of FreeType 2 provides an alternative |
||||
implementation that uses memory-mapped files, when available on the host |
||||
platform, resulting in a significant access speed-up.</p> |
||||
|
||||
<p>FreeType distinguishes between memory-based and disk-based streams. |
||||
In the first case, all data is directly accessed in memory (e.g. |
||||
ROM-based, write-only static data and memory-mapped files), while in the |
||||
second, portions of the font files are read in chunks called |
||||
<em>frames</em>, and temporarily buffered similarly through typical |
||||
seek/read operations.</p> |
||||
|
||||
<p>The FreeType stream sub-system also implements extremely efficient |
||||
algorithms to very quickly load structures from font files while |
||||
ensuring complete safety in the case of a "broken file".</p> |
||||
|
||||
<p>The function <tt>FT_New_Memory_Face()</tt> can be used to directly |
||||
create/open a <tt>FT_Face</tt> object from data that is readily |
||||
available in memory (including ROM-based fonts).</p> |
||||
|
||||
<p>Finally, in the case where a custom input stream is needed, client |
||||
applications can use the function <tt>FT_Open_Face()</tt>, which can |
||||
accept custom input streams. This may be useful in the case of |
||||
compressed or remote font files, or even embedded font files that need |
||||
to be extracted from certain documents.</p> |
||||
|
||||
<p>Note that each face owns a single stream, which is also destroyed by |
||||
<tt>FT_Done_Face()</tt>. Generally speaking, it is certainly |
||||
<em>not</em> a good idea to keep numerous <tt>FT_Face</tt> objects |
||||
opened.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
3. Modules |
||||
</h2> |
||||
|
||||
<p>A FreeType 2 module is itself a piece of code. However, the |
||||
library creates a single <tt>FT_Module</tt> object for each module that |
||||
is registered when <tt>FT_Add_Module()</tt> is called.</p> |
||||
|
||||
<p>The definition of <tt>FT_ModuleRec</tt> is not publicly available to |
||||
client applications. However, each <em>module type</em> is described by |
||||
a simple public structure named <tt>FT_Module_Class</tt>, defined in |
||||
<tt><freetype/ftmodule.h></tt>, and is described later in this |
||||
document:</p> |
||||
|
||||
<p>You need a pointer to an <tt>FT_Module_Class</tt> structure when |
||||
calling <tt>FT_Add_Module()</tt>, whose declaration is:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
FT_Error FT_Add_Module( FT_Library library, |
||||
const FT_Module_Class* clazz );</pre> |
||||
</font> |
||||
|
||||
<p>Calling this function will do the following:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>It will check whether the library already holds a module object |
||||
corresponding to the same module name as the one found in |
||||
<tt>FT_Module_Class</tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p>If this is the case, it will compare the module version number to |
||||
see whether it is possible to <em>upgrade</em> the module to a new |
||||
version. If the module class's version number is smaller than the |
||||
already installed one, the function returns immediately. Similarly, |
||||
it checks that the version of FreeType 2 that is running is |
||||
correct compared to the one required by the module.</p> |
||||
</li> |
||||
<li> |
||||
<p>It creates a new <tt>FT_Module</tt> object, using data and flags |
||||
of the module class to determine its byte size and how to properly |
||||
initialize it.</p> |
||||
</li> |
||||
<li> |
||||
<p>If a module initializer is present in the module class, it will |
||||
be called to complete the module object's initialization.</p> |
||||
</li> |
||||
<li> |
||||
<p>The new module is added to the library's list of "registered" |
||||
modules. In case of an upgrade, the previous module object is |
||||
simply destroyed.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Note that this function doesn't return an <tt>FT_Module</tt> handle, |
||||
given that module objects are completely internal to the library (and |
||||
client applications shouldn't normally mess with them :-)</p> |
||||
|
||||
<p>Finally, it is important to understand that FreeType 2 |
||||
recognizes and manages several kinds of modules. These will be |
||||
explained in more details later in this document, but we will list for |
||||
now the following types:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>Renderer</em> modules are used to convert native glyph images |
||||
to bitmaps/pixmaps. FreeType 2 comes with two renderer modules |
||||
by default: one to generate monochrome bitmaps, the other to |
||||
generate high-quality anti-aliased pixmaps.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Font driver</em> modules are used to support one or more font |
||||
formats. Typically, each font driver provides a specific |
||||
implementation/derivative of <tt>FT_Face</tt>, <tt>FT_Size</tt>, |
||||
<tt>FT_GlyphSlot</tt>, as well as <tt>FT_CharMap</tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>Helper</em> modules are shared by several font drivers. For |
||||
example, the <tt>sfnt</tt> module parses and manages tables found in |
||||
SFNT-based font formats; it is then used by both the TrueType and |
||||
OpenType font drivers.</p> |
||||
</li> |
||||
<li> |
||||
<p>Finally, the <em>auto-hinter</em> module has a specific place in |
||||
the library's design, as its role is to process vectorial glyph |
||||
outlines, independently of their native font format, to produce |
||||
optimal results at small pixel sizes.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Note that every <tt>FT_Face</tt> object is <em>owned</em> by the |
||||
corresponding font driver, depending on the original font file's format. |
||||
This means that all face objects are destroyed when a module is |
||||
removed/unregistered from a library instance (typically by calling the |
||||
<tt>FT_Remove_Module()</tt> function).</p> |
||||
|
||||
<p><em>Because of this, you should always take care that no |
||||
<tt>FT_Face</tt> object is opened when you upgrade or remove a module |
||||
from a library, as this could cause unexpected object deletion!</em></p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
4. Libraries |
||||
</h2> |
||||
|
||||
<p>We now come back to our well-known <tt>FT_Library</tt> object. From |
||||
what have been said before, we already know that a library instance owns |
||||
at least the following:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>A memory manager object (<tt>FT_Memory</tt>), used for all |
||||
allocation/releases within the instance.</p> |
||||
</li> |
||||
<li> |
||||
<p>A list of <tt>FT_Module</tt> objects, corresponding to the |
||||
"installed" or "registered" modules of the instance. This list can |
||||
be changed at any time through <tt>FT_Add_Module()</tt> and |
||||
<tt>FT_Remove_Module()</tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p>Remember that face objects are owner by font drivers that are |
||||
themselves modules owned by the library.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>There is however another object owned by the library instance that |
||||
hasn't been described yet: the <em>raster pool</em>.</p> |
||||
|
||||
<p>The <em>raster pool</em> is simply a block of memory of fixed size |
||||
that is used internally as a "scratch area" for various memory-hungry |
||||
transient operations, avoiding memory allocation. For example, it is |
||||
used by each renderer when converting a vectorial glyph outline into a |
||||
bitmap (actually, that's where its name comes from :-).</p> |
||||
|
||||
<p>The size of the raster pool is fixed at initialisation time (it |
||||
defaults to 16kByte) and cannot be changed at run-time (though we could |
||||
fix this if there is a real need for that).</p> |
||||
|
||||
<p>When a transient operation needs more memory than the pool's size, it |
||||
can decide to either allocate a heap block as an exceptional condition, |
||||
or sub-divide recursively the task to perform in order to never exceed |
||||
the pool's threshold.</p> |
||||
|
||||
<p>This extremely memory-conservative behaviour is certainly one of the |
||||
keys to FreeType's performance in certain areas (most importantly in |
||||
glyph rendering/scanline-conversion).</p> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
5. Summary |
||||
</h2> |
||||
|
||||
<p>Finally, the following picture illustrates what has been said in this |
||||
section, as well as the previous, by presenting the complete object |
||||
graph of FreeType 2's base design:</p> |
||||
|
||||
<center> |
||||
<img src="library-model.png" |
||||
width=411 height=405 |
||||
alt="Complete library model"> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-3.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-5.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,458 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-4.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-6.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
IV. Module Classes |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>We will now try to explain more precisely the <em>types</em> 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.</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>Renderer</em> modules are used to manage scalable glyph images. |
||||
This means <em>transforming</em> them, computing their <em>bounding |
||||
box</em>, and <em>converting</em> them to either <em>monochrome</em> |
||||
or <em>anti-aliased</em> bitmaps</em>.</p> |
||||
|
||||
<p>Note that FreeType 2 is capable of dealing with <em>any</em> |
||||
kind of glyph images, as long as a renderer module is provided for it. |
||||
The library comes by default with two renderers:</p> |
||||
|
||||
<p><table cellpadding=8> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>raster</tt> |
||||
</td> |
||||
<td> |
||||
<p>Supports the conversion of vectorial outlines (described by a |
||||
<tt>FT_Outline</tt> object) to <em>monochrome</em> bitmaps. |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>smooth</tt> |
||||
</td> |
||||
<td> |
||||
<p>Supports the conversion of the same outlines to high-quality |
||||
<em>anti-aliased</em> pixmaps (using 256 levels of gray). Note |
||||
that this renderer also supports direct span generation.</p> |
||||
</td> |
||||
</tr> |
||||
</table></p> |
||||
|
||||
<li> |
||||
<p><em>Font driver</em> modules are used to support one or more |
||||
specific font format. By default, FreeType 2 comes with the |
||||
following font drivers:</p> |
||||
|
||||
<p><table cellpadding=8> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>truetype</tt> |
||||
</td> |
||||
<td> |
||||
<p>supports TrueType font files</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>type1</tt> |
||||
</td> |
||||
<td> |
||||
<p>supports Postscript Type 1 fonts, both in binary |
||||
(<tt>.pfb</tt>) or ASCII (<tt>.pfa</tt>) formats, including |
||||
Multiple Master fonts.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>cid</tt> |
||||
</td> |
||||
<td> |
||||
<p>supports Postscript CID-keyed fonts</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>cff</tt> |
||||
</td> |
||||
<td> |
||||
<p>supports OpenType, CFF as well as CEF fonts (CEF is a |
||||
derivative of CFF used by Adobe in its SVG viewer)</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>winfonts</tt> |
||||
</td> |
||||
<td> |
||||
<p>supports Windows bitmap fonts (i.e. <tt>.fon</tt> and |
||||
<tt>.fnt</tt>)</p> |
||||
</td> |
||||
</tr> |
||||
</table></p> |
||||
|
||||
<p>Note that font drivers can support bitmapped or scalable glyph |
||||
images. A given font driver that supports Bézier outlines |
||||
through <tt>FT_Outline</tt> can also provide its own hinter, or rely |
||||
on FreeType's <tt>autohinter</tt> module.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Helper</em> modules are used to hold shared code that is often |
||||
used by several font drivers, or even other modules. Here are the |
||||
default helpers:</p> |
||||
|
||||
<p><table cellpadding=8> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>sfnt</tt> |
||||
</td> |
||||
<td> |
||||
used to support font formats based on the <tt>SFNT</tt> storage |
||||
scheme: TrueType & OpenType fonts as well as other variants (like |
||||
TrueType fonts that only contain embedded bitmaps) |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>psnames</tt> |
||||
</td> |
||||
<td> |
||||
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. |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>psaux</tt> |
||||
</td> |
||||
<td> |
||||
used to provide various useful functions related to Type 1 |
||||
charstring decoding, as this "feature" is needed by the |
||||
<tt>type1</tt>, <tt>cid</tt>, and <tt>cff</tt> drivers. |
||||
</td> |
||||
</tr> |
||||
</table></p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p>Finally, the <em>autohinter</em> 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.</p> |
||||
|
||||
<p>This module's purpose and design is also heavily described on the |
||||
FreeType web site.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>We will now study how modules are described, then managed by the |
||||
library.</p> |
||||
|
||||
<h3> |
||||
1. The <tt>FT_Module_Class</tt> structure |
||||
</h3> |
||||
|
||||
<p>As described later in this document, library initialization is |
||||
performed by calling the <tt>FT_Init_FreeType()</tt> function. The |
||||
latter is in charge of creating a new "empty" <tt>FT_Library</tt> |
||||
object, then register each "default" module by repeatedly calling the |
||||
<tt>FT_Add_Module()</tt> function.</p> |
||||
|
||||
<p>Similarly, client applications can call <tt>FT_Add_Module()</tt> any |
||||
time they wish in order to register a new module in the library. Let us |
||||
take a look at this function's declaration:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
extern FT_Error FT_Add_Module( |
||||
FT_Library library, |
||||
const FT_Module_Class* clazz );</pre> |
||||
</font> |
||||
|
||||
<p>As one can see, this function expects a handle to a library object, |
||||
as well as a pointer to a <tt>FT_Module_Class</tt> 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!</p> |
||||
|
||||
<p>Here the definition of <tt>FT_Module_Class</tt>, with some |
||||
explanation. The following code is taken from |
||||
<tt><freetype/ftmodule.h></tt>:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
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;</pre> |
||||
</font> |
||||
|
||||
<p>A description of its fields:</p> |
||||
|
||||
<p><table cellpadding=8> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_flags</tt> |
||||
</td> |
||||
<td> |
||||
<p>A set of bit flags used to describe the module's category. Valid |
||||
values are:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<tt>ft_module_font_driver</tt> if the module is a font driver |
||||
</li> |
||||
<li> |
||||
<tt>ft_module_renderer</tt> if the module is a renderer |
||||
</li> |
||||
<li> |
||||
<tt>ft_module_hinter</tt> if the module is an auto-hinter |
||||
</li> |
||||
<li> |
||||
<tt>ft_module_driver_scalable</tt> if the module is a font |
||||
driver supporting scalable glyph formats |
||||
</li> |
||||
<li> |
||||
<tt>ft_module_driver_no_outlines</tt> if the module is a font |
||||
driver supporting scalable glyph formats that <em>cannot</em> be |
||||
described by an <tt>FT_Outline</tt> object |
||||
</li> |
||||
<li> |
||||
<tt>ft_module_driver_has_hinter</tt> if the module is a font |
||||
driver that provides its own hinting scheme/algorithm |
||||
</li> |
||||
</ul> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_size</tt> |
||||
</td> |
||||
<td> |
||||
<p>An integer that gives the size in <em>bytes</em> of a given |
||||
module object. This should <em>never</em> be less than |
||||
<tt>sizeof(FT_ModuleRec)</tt>, but can be more if the module needs |
||||
to sub-class the base <tt>FT_ModuleRec</tt> class.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_name</tt> |
||||
</td> |
||||
<td> |
||||
<p>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 <tt>FT_Library</tt> object. However, |
||||
<tt>FT_Add_Module()</tt> uses the <tt>module_version</tt> field to |
||||
detect module upgrades and perform them cleanly, even at |
||||
run-time.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_version</tt> |
||||
</td> |
||||
<td> |
||||
<p>A 16.16 fixed float number giving the module's major and minor |
||||
version numbers. It is used to determine whether a module needs to |
||||
be upgraded when calling <tt>FT_Add_Module()</tt>.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_requires</tt> |
||||
</td> |
||||
<td> |
||||
<p>A 16.16 fixed float number giving the version of FreeType 2 |
||||
that is required to install this module. The default value is |
||||
0x20000 for FreeType version 2.0</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_requires</tt> |
||||
</td> |
||||
<td> |
||||
<p>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, if there is one. It is 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.</p> |
||||
|
||||
<p>Note that is is optional, and can be set to NULL. Other |
||||
interfaces can also be accessed through the <tt>get_interface()</tt> |
||||
field.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_init</tt> |
||||
</td> |
||||
<td> |
||||
<p>A pointer to a function used to initialize the fields of a fresh |
||||
new <tt>FT_Module</tt> object. It is called <em>after</em> the |
||||
module's base fields have been set by the library, and is generally |
||||
used to initialize the fields of <tt>FT_ModuleRec</tt> |
||||
subclasses.</p> |
||||
|
||||
<p>Most module classes set it to NULL to indicate that no extra |
||||
initialization is necessary.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>module_done</tt> |
||||
</td> |
||||
<td> |
||||
<p>A pointer to a function used to finalize the fields of a given |
||||
<tt>FT_Module</tt> object. Note that it is called <em>before</em> |
||||
the library unsets the module's base fields, and is generally used |
||||
to finalize the fields of <tt>FT_ModuleRec</tt> subclasses.</p> |
||||
|
||||
<p>Most module classes set it to NULL to indicate that no extra |
||||
finalization is necessary</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign=top> |
||||
<td> |
||||
<tt>get_interface</tt> |
||||
</td> |
||||
<td> |
||||
<p>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.</p> |
||||
</td> |
||||
</tr> |
||||
</table></p> |
||||
|
||||
|
||||
<h3> |
||||
2. The <tt>FT_Module</tt> type |
||||
</h3> |
||||
|
||||
<p>The <tt>FT_Module</tt> type is a handle (i.e. a pointer) to a given |
||||
module object/instance, whose base structure is given by the internal |
||||
<tt>FT_ModuleRec</tt> type. We will intentionally <em>not</em> describe |
||||
this structure here, as there is no point to look so far into the |
||||
library's design.</p> |
||||
|
||||
<p>When <tt>FT_Add_Module</tt> is called, it first allocates a new |
||||
module instance, using the <tt>module_size</tt> class field to determine |
||||
its byte size. The function initializes the root <tt>FT_ModuleRec</tt> |
||||
field, then calls the class-specific initializer <tt>module_init</tt> |
||||
when this field is not set to NULL.</p> |
||||
|
||||
<p>Note that the library defines several sub-classes of |
||||
<tt>FT_ModuleRec</tt>, which are, as you could have guessed:</p> |
||||
|
||||
<ul> |
||||
<li><p><tt>FT_Renderer</tt> for renderer modules</p> |
||||
<li><p><tt>FT_Driver</tt> for font driver modules</p> |
||||
<li><p><tt>FT_AutoHinter</tt> for the auto-hinter</p> |
||||
</ul> |
||||
|
||||
<p>Helper modules use the base <tt>FT_ModuleRec</tt> type. We will |
||||
describe these classes in the next chapters.</p> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-4.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-6.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,94 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="design-5.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#ccccee"><td> |
||||
<h1> |
||||
TO BE CONTINUED... |
||||
</h1> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href=design-5.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 2.4 KiB |
@ -1,81 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>The design of FreeType 2</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
The design of FreeType 2 |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
|
||||
<center> |
||||
<table width="70%"> |
||||
<tr><td> |
||||
|
||||
<p>This document describes the details of FreeType 2's internals. |
||||
Read this carefully if you need to understand the innards of the library |
||||
in order to hack or extend it.</p> |
||||
|
||||
<table width="100%"> |
||||
<tr valign=center |
||||
bgcolor="#CCCCFF"> |
||||
<td align=center> |
||||
<h2> |
||||
Table of Contents |
||||
</h2> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<center> |
||||
<table width="80%"> |
||||
<tr><td> |
||||
|
||||
<h2> |
||||
<a href="design-1.html">Introduction</a> |
||||
</h2> |
||||
|
||||
<h2> |
||||
<a href="design-2.html">I. Components and APIs</a> |
||||
</h2> |
||||
|
||||
<h2> |
||||
<a href="design-3.html">II. Public Objects and Classes</a> |
||||
</h2> |
||||
|
||||
<h2> |
||||
<a href="design-4.html">III. Internal Objects and Classes</a> |
||||
</h2> |
||||
|
||||
<h2> |
||||
<a href="design-5.html">IV. Module Classes</a> |
||||
</h2> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 4.2 KiB |
@ -1,639 +0,0 @@ |
||||
<html> |
||||
<head><title>FreeType 2 - Modules</title> |
||||
<basefont face="Georgia, Arial, Helvetica, Geneva"> |
||||
<style content="text/css"> |
||||
P { text-align=justify } |
||||
H1 { text-align=center } |
||||
H2 { text-align=center } |
||||
LI { text-align=justify } |
||||
</style> |
||||
</head> |
||||
<body text=#000000 bgcolor=#ffffff> |
||||
|
||||
<center><table width="500"><tr><td> |
||||
|
||||
<center><h1>FreeType 2 Modules</h1></center> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Introduction</h1> |
||||
</td></tr></table> |
||||
|
||||
<p> |
||||
The purpose of this document is to present in great details the way |
||||
FreeType 2 uses and manages modules. Among other things, it answers |
||||
the following questions:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
what is a module, and what kind of modules are recognized |
||||
by the library? |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
how are modules registered and managed by the library? |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
how to write a new module, especially new font drivers? |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
how to select specific modules for a given build of the |
||||
library ? |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
how to compile modules as stand-alone DLLs / shared objects? |
||||
</p></li> |
||||
|
||||
</ul> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Overview</h1> |
||||
</td></tr></table> |
||||
|
||||
|
||||
<h3>1. Library design:</h3> |
||||
|
||||
<p>The design of the library is pretty basic:</p> |
||||
<ul> |
||||
<li><p> |
||||
client applications typically call the FreeType 2 high-level |
||||
API, whose functions are implemented in a single component |
||||
called the <em>Base Layer</em>. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
depending on the context or the task, the base |
||||
layer then calls one or more modules to perform the |
||||
work. In most cases, the client application doesn't |
||||
need to know what module was called. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
the base layer also contains a set of routines that are |
||||
used for generic things like memory allocation, list |
||||
processing, i/o stream parsing, fixed point computation, |
||||
etc.. these functions can also be called by a module |
||||
at any, and they form what is called the "low-level |
||||
base API". |
||||
</p></li> |
||||
</ul> |
||||
|
||||
<p>This is illustrated by the following graphics:</p> |
||||
|
||||
<center><img src="basic-design.png" width="312" height="312"></center> |
||||
|
||||
<p>Note that, however, FT2 comes with a set of <em>optional</em> |
||||
components that can be ommited from certain builds, and whose |
||||
purpose vary between two situations:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
some are located on top of the high-level API and provide |
||||
convenience functions that make certain things easier |
||||
for typical applications. They typically do not call |
||||
modules directly, though they can use the low level |
||||
base API for certain tasks.</p> |
||||
|
||||
<p>As an example, see the the <tt>ftglyph</tt> component |
||||
that is used to manipulate glyph images more conveniently |
||||
than the default API.</p> |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
some other components complement the base layer, by providing |
||||
additional routines. Most of them allow client applications |
||||
to access format-specific data.</p> |
||||
|
||||
<p>For example, the <tt>ftmm</tt> component provides high-level |
||||
functions to specify Multiple Master coordinates for MM Type 1 |
||||
fonts.</p> |
||||
</p></li> |
||||
</ul> |
||||
|
||||
<p>This is illustrated by the following graphics:</p> |
||||
|
||||
<center><img src="detailed-design.png" width="365" height="392"></center> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Module Classes</h1> |
||||
</td></tr></table> |
||||
|
||||
<p> |
||||
The library is capable of managing and using several kinds of |
||||
modules:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
<b>renderer</b> modules are used to convert scalable glyph images |
||||
to bitmaps. FreeType 2 comes by default with two of them:</p> |
||||
|
||||
<center><table cellpadding=5><tr valign=top><td> |
||||
<p><b><tt>raster1</tt></b></p> |
||||
</td><td> |
||||
<p>supports the conversion of vectorial outlines (described by a |
||||
<tt>FT_Outline</tt> object) to <em>monochrome</em> bitmaps. |
||||
</td></tr><tr valign=top><td></p> |
||||
|
||||
<p><b><tt>smooth</tt></b></p> |
||||
</td><td> |
||||
<p>supports the conversion of the same outlines to high-quality |
||||
<em>anti-aliased</em> pixmaps.</p> |
||||
</td></tr></table></center> |
||||
|
||||
|
||||
<p>The specification and interface of renderers is described in |
||||
details within this document.</p> |
||||
|
||||
<p>Note that most font formats use <tt>FT_Outline</tt> objects |
||||
to describe scalable glyph images. However, FT2 is flexible |
||||
and allows specific modules to register and support other |
||||
formats. As an example, it's (at least theorically :-) perfectly |
||||
possible to write a renderer module that is capable of directly |
||||
converting MetaFont glyph definitions to bitmaps or pixmaps ! |
||||
(of course, this assumes that you also write a MetaFont font |
||||
driver to load the definitions :-). |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>font driver</b> modules are used to support one or more specific |
||||
font format. By default, FT2 comes with the following modules:</p> |
||||
|
||||
<center><table cellpadding=5><tr valign=top><td> |
||||
<p><tt><b>truetype</b></tt></p> |
||||
</td><td> |
||||
<p>supports TrueType font files</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><tt><b>type1</b></tt></p> |
||||
</td><td> |
||||
<p>supports Postscript Type 1 fonts, both in binary (.pfb) or ASCII |
||||
(.pfa) formats, including Multiple Master fonts.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><tt><b>cid</b></tt></p> |
||||
</td><td> |
||||
<p>supports Postscript CID-keyed fonts</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><tt><b>cff</b></tt></p> |
||||
</td><td> |
||||
<p>supports OpenType, CFF as well as CEF fonts (CEF is a derivative |
||||
of CFF used by Adobe in its SVG viewer).</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><tt><b>winfonts</b></tt></p> |
||||
</td><td> |
||||
<p>supports Windows bitmap fonts (i.e. ".FON" and ".FNT").</p> |
||||
</td></tr> |
||||
|
||||
</td></tr></table></center> |
||||
|
||||
<p>Note that font drivers can support bitmapped or scalable glyph |
||||
images. A given font driver that supports bezier outlines through |
||||
the <tt>FT_Outline</tt> can also provide its own hinter, or rely |
||||
on FreeType's <b>autohinter</b> module. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>helper</b> modules are used to hold shared code that is |
||||
often used by several font drivers, or even other modules. |
||||
Here are a few examples of helper modules that come with |
||||
FreeType 2:</p> |
||||
|
||||
<table cellpadding=5><tr valign=top><td> |
||||
<b><tt>sfnt</tt></b> |
||||
</td><td> |
||||
used to support font formats based on the "<tt>SFNT</tt>" |
||||
storage scheme. This means TrueType & OpenType fonts as |
||||
well as other variants (like TrueType fonts that only |
||||
contain embedded bitmaps). |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<b><tt>psnames</tt></b> |
||||
</td><td> |
||||
used to provide various useful function 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. |
||||
</td></tr></table></center> |
||||
</p></li> |
||||
|
||||
|
||||
<li><p> |
||||
finally, the <b>autohinter</b> 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. |
||||
</p></li> |
||||
</ul> |
||||
|
||||
<p>We will now study how modules are described, then managed by |
||||
the library.</p> |
||||
|
||||
<h3>1. The <tt>FT_Module_Class</tt> structure:</h3> |
||||
|
||||
<p>As described later in this document, library initialisation is |
||||
performed by calling the <tt>FT_Init_FreeType</tt> function. The |
||||
latter is in charge of creating a new "empty" <tt>FT_Library</tt> |
||||
object, then register each "default" module by repeatedly calling |
||||
the <tt>FT_Add_Module</tt> function.</p> |
||||
|
||||
<p>Similarly, client applications can call <tt>FT_Add_Module</tt> |
||||
any time they wish in order to register a new module in the library. |
||||
Let's take a look at this function's declaration:</p> |
||||
|
||||
<pre><font color="blue"> |
||||
extern FT_Error FT_Add_Module( FT_Library library, |
||||
const FT_Module_Class* clazz ); |
||||
</font></pre> |
||||
|
||||
<p>As one can see, this function expects a handle to a library object, |
||||
as well as a pointer to a <tt>FT_Module_Class</tt> 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 !.</p> |
||||
|
||||
<p>Let's study the definition of <tt>FT_Module_Class</tt>, and explain it |
||||
a bit. The following code is taken from |
||||
<tt><freetype/ftmodule.h></tt>:</p> |
||||
|
||||
<pre><font color="blue"> |
||||
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; |
||||
</font></pre> |
||||
|
||||
<p>here's a description of its fields:</p> |
||||
|
||||
<center><table cellpadding=5><tr valign=top><td> |
||||
<p><b>module_flags</b></p> |
||||
</td><td> |
||||
<p>this is a set of bit flags used to describe the module's |
||||
category. Valid values are:</p> |
||||
<ul> |
||||
<li><p> |
||||
<b>ft_module_font_driver</b> if the module is a font driver |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>ft_module_renderer</b> if the module is a renderer |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>ft_module_hinter</b> if the module is an auto-hinter |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>ft_module_driver_scalable</b> if the module is a font |
||||
driver supporting scalable glyph formats. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>ft_module_driver_no_outlines</b> if the module is a |
||||
font driver supporting scalable glyph formats that <em>cannot</em> |
||||
be described by a <tt>FT_Outline</tt> object |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>ft_module_driver_has_hinter</b> if the module is a font |
||||
driver that provides its own hinting scheme/algorithm |
||||
</p></li> |
||||
</ul> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_size</b></p> |
||||
</td><td> |
||||
<p>an integer that gives the size in <em>bytes</em> of a given module |
||||
object. This should <em>never</em> be less than |
||||
<tt>sizeof(FT_ModuleRec)</tt>, but can be more when the module |
||||
needs to sub-class the base <tt>FT_ModuleRec</tt> class.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_name</b></p> |
||||
</td><td> |
||||
<p>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 <tt>FT_Library</tt> object. However, <tt>FT_Add_Module</tt> |
||||
uses the <b>module_version</b> field to detect module upgrades |
||||
and perform them cleanly, even at run-time.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_version</b></p> |
||||
</td><td> |
||||
<p>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 <tt>FT_Add_Module</tt>.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_requires</b></p> |
||||
</td><td> |
||||
<p>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</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_requires</b></p> |
||||
</td><td> |
||||
<p>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.</p> |
||||
|
||||
<p>Note that is is optional, and can be set to NULL. Other interfaces |
||||
can also be accessed through the <b>get_interface</b> field.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_init</b></p> |
||||
</td><td> |
||||
<p>this is a pointer to a function used to initialise the fields of |
||||
a fresh new <tt>FT_Module</tt> object. It is called <em>after</em> the module's |
||||
base fields have been set by the library, and is generally used to |
||||
initialise the fields of <tt>FT_ModuleRec</tt> subclasses.</p> |
||||
|
||||
<p>Most module classes set it to NULL to indicate that no extra |
||||
initialisation is necessary</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>module_done</b></p> |
||||
</td><td> |
||||
<p>this is a pointer to a function used to finalise the fields of |
||||
a given <tt>FT_Module</tt> object. Note that it is called <em>before</em> the |
||||
library unsets the module's base fields, and is generally used to |
||||
finalize the fields of <tt>FT_ModuleRec</tt> subclasses.</p> |
||||
|
||||
<p>Most module classes set it to NULL to indicate that no extra |
||||
finalisation is necessary</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
<p><b>get_interface</b></p> |
||||
</td><td> |
||||
<p>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.</p> |
||||
</td></tr><tr valign=top><td> |
||||
|
||||
</td></tr></table></center> |
||||
|
||||
|
||||
<h3>2. The <tt>FT_Module</tt> type:</h3> |
||||
|
||||
<p>the <tt>FT_Module</tt> type is a handle (i.e. a pointer) to a given |
||||
module object / instance, whose base structure is given by the |
||||
internal <tt>FT_ModuleRec</tt> type (we will not detail its |
||||
structure here).</p> |
||||
|
||||
<p>When <tt>FT_Add_Module</tt> is called, it first allocate a new |
||||
module instance, using the <tt><b>module_size</b></tt> class |
||||
field to determine its byte size. The function initializes |
||||
a the root <tt>FT_ModuleRec</tt> fields, then calls |
||||
the class-specific initializer <tt><b>module_init</b></tt> |
||||
when this field is not set to NULL.</p> |
||||
|
||||
|
||||
|
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Renderer Modules</h1> |
||||
</td></tr></table> |
||||
|
||||
<p>As said previously, <b>renderers</b> are used to convert scalable |
||||
glyph images to bitmaps or pixmaps. Each renderer module is defined |
||||
through a <b>renderer class</b>, whose definition is found in the |
||||
file <tt><freetype/ftrender.h></tt>. However, a few concepts |
||||
need to be explained before having a detailed look at this structure. |
||||
</p> |
||||
|
||||
<h3>1. Glyph formats:</h3> |
||||
|
||||
<p>Each glyph image that is loaded by FreeType (either through |
||||
<tt>FT_Load_Glyph</tt> or <tt>FT_Load_Char</tt>), has a given |
||||
<em>image format</em>, described by the field |
||||
<tt>face->glyph->format</tt>. It is a 32-byte integer that |
||||
can take any value. However, the file <tt><freetype/ftimage.h></tt> |
||||
defines at least the following values:</p> |
||||
|
||||
<center><table cellpadding=5> |
||||
<tr valign=top><td> |
||||
<tt><b>ft_glyph_format_bitmap</b></tt> |
||||
</td><td> |
||||
this value is used to indicate that the glyph image is a bitmap or pixmap. |
||||
Its content can then be accessed directly from |
||||
<tt>face->glyph->bitmap</tt> after the glyph was loaded. |
||||
</td></tr> |
||||
|
||||
<tr valign=top><td> |
||||
<tt><b>ft_glyph_format_outline</b></tt> |
||||
</td><td> |
||||
this value is used to indicate that the glyph image is a scalable vectorial |
||||
outline, that can be described by a <tt>FT_Outline</tt> object. Its content |
||||
can be accessed directly from |
||||
<tt>face->glyph->outline</tt> after the glyph was loaded. |
||||
this is the format that is commonly returned by TrueType, Type1 and |
||||
OpenType / CFF fonts. |
||||
</td></tr> |
||||
|
||||
<tr valign=top><td> |
||||
<tt><b>ft_glyph_format_plotter</b></tt> |
||||
</td><td> |
||||
this value is equivalent to <tt><b>ft_glyph_format_outline</b></tt> except |
||||
that the outline stored corresponds to path strokes, instead of filled |
||||
outlines. It can be returned from certain Type 1 fonts (notably the Hershey |
||||
collection of free fonts). |
||||
</td></tr> |
||||
|
||||
<tr valign=top><td> |
||||
<tt><b>ft_glyph_format_composite</b></tt> |
||||
</td><td> |
||||
this value is used to indicate that the glyph image is really a "compound" |
||||
of several other "sub-glyphs". This value is only returned when a glyph |
||||
is loaded with the <tt><b>FT_LOAD_NO_RECURSE</b></tt> flag. The list of |
||||
subglyphs that make up the composite can be accessed directly as |
||||
<tt>face->glyph->subglyphs</tt> after the glyph was loaded. |
||||
</td></tr> |
||||
|
||||
</table></center> |
||||
|
||||
<p>Note that this is only a list of pre-defined formats supported by |
||||
FreeType. Nothing prevents an application to install a new font |
||||
driver that creates other kinds of glyph images. For example, one |
||||
could imagine a MetaFont font driver, that would be capable to |
||||
parse font definition files and create in-memory "glyph programs", |
||||
that could be returned in <tt>face->glyph->other</tt>.</p> |
||||
|
||||
<h3>2. The <tt>FT_Outline</tt> type:</h3> |
||||
|
||||
<p>This structure, which is also defined, and heavily commented, in |
||||
the file <tt><freetype/ftimage.h></tt>, is used to hold |
||||
a scalable glyph image that is made of one or more contours, each |
||||
contour being described by line segments or bezier arcs (either |
||||
quadratic or cubic). The outline itself is stored in a compact |
||||
way that makes processing it easy.</p> |
||||
|
||||
<p>Points are placed in a 2D plane that uses the y-upwards convention, |
||||
and their coordinates are stored in 1/64th of pixels (also known |
||||
as the 26.6 fixed point format). Pixels correspond to single squares |
||||
whose borders are on integer coordinates (i.e. mutiples of 64). |
||||
In other words, pixel centers are located on half pixel coordinates.</p> |
||||
|
||||
<p>Outlines can be very easily transformed (translated, rotated, etc..) |
||||
before being converted to bitmap, which allows for sophisticated |
||||
use of text. FreeType 2 comes by default with two "outline renderer" |
||||
modules:</p> |
||||
|
||||
<p><ul> |
||||
<li><b>raster1</b>, used to convert them to monochrome bitmaps</li> |
||||
<li><b>smooth</b>, used to convert them to high-quality anti-aliased |
||||
pixmaps</li> |
||||
</ul></p> |
||||
|
||||
<h3>3. Bitmaps and scan-conversion:</h3> |
||||
|
||||
<p>Bitmaps and pixmaps are described through a <tt>FT_Bitmap</tt> |
||||
structure, which is defined and heavily commented in |
||||
<tt><freetype/ftimage.h></tt> |
||||
|
||||
|
||||
<pre><font color="blue"> |
||||
typedef struct FT_Renderer_Class_ |
||||
{ |
||||
FT_Module_Class root; |
||||
|
||||
FT_Glyph_Format glyph_format; |
||||
|
||||
FTRenderer_render render_glyph; |
||||
FTRenderer_transform transform_glyph; |
||||
FTRenderer_getCBox get_glyph_cbox; |
||||
FTRenderer_setMode set_mode; |
||||
|
||||
FT_Raster_Funcs* raster_class; |
||||
|
||||
} FT_Renderer_Class; |
||||
</font></pre> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Font Driver Modules</h1> |
||||
</td></tr></table> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Library Initialisation & Dynamic Builds</h1> |
||||
</td></tr></table> |
||||
|
||||
<p>By default, all components of FreeType 2 are compiled independently, |
||||
then grouped into a single static library file that can be installed |
||||
or used directly to compile client applications</p> |
||||
|
||||
<p>Such applications must normally call the <tt>FT_Init_FreeType</tt> |
||||
function before using the library. This function is in charge of |
||||
two things:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
First, it creates a <tt>FT_Library</tt> object (by calling |
||||
the public function <tt>FT_New_Library</tt>). This new |
||||
object is "empty" and has no module registered in it. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
Then, it registers all "default modules" by repeatedly calling |
||||
<tt>FT_Add_Module</tt>. |
||||
</p></li> |
||||
</ul> |
||||
|
||||
<p>It is important to notice that the default implementation of |
||||
<tt>FT_Init_FreeType</tt>, which is located in the source |
||||
file <tt>"src/base/ftinit.c"</tt> always uses a <em>static</em> |
||||
list of modules that is generated at compile time from the |
||||
configuration file <tt><freetype/config/ftmodule.h></tt>. |
||||
</p> |
||||
|
||||
<p>There are cases where this may be inadequate. For example, one |
||||
might want to compile modules as independent DLLs in a specific |
||||
location (like <tt>"/usr/lib/freetype/module/"</tt>), and have |
||||
the library initialisation function load the modules dynamically |
||||
by parsing the directory's content</p> |
||||
|
||||
<p>This is possible, and we're going to explain how to do it.</p> |
||||
|
||||
|
||||
<h4>a. Building the library as a DLL (i.e. "shared object" on Unix)</h4> |
||||
|
||||
<p>But first of all, let's explain how to build FreeType 2 as a single |
||||
DLL or shared object, i.e. one that includes the base layer, all |
||||
default modules and optional components into a single file.</p> |
||||
|
||||
<p>When building dynamic libraries, certain compilers require specific |
||||
directives to <em>declare</em> exported DLL entry points. For example, the |
||||
"<tt>__cdecl</tt>" directive is required by Win32 compilers, as it forces |
||||
the use of the "C" parameter passing convention (instead of "smarter" |
||||
schemes, which usually use registers and the stack to pass parameters).</p> |
||||
|
||||
<p>To make matter worse, some of these compilers require the directive |
||||
before the function's return type, while some others want it between |
||||
the return type and the function's identifier.</p> |
||||
|
||||
<p>To allow such compilations, the <tt>FT_EXPORT_DEF()</tt> macro is |
||||
used in all public header files in order to declare each high-level |
||||
API function of FreeType 2, as in the following example, taken from |
||||
<tt><freetype/freetype.h></tt>:</p> |
||||
|
||||
<pre><font color="blue"> |
||||
FT_EXPORT_DEF(FT_Error) FT_Init_FreeType( void ); |
||||
</font></pre> |
||||
|
||||
<p>the definition of <tt>FT_EXPORT_DEF(x)</tt> defaults to <tt>"extern x"</tt>, |
||||
except when a specific definition is given in the library's system-specific |
||||
configuration file <tt><freetype/config/ftconfig.h></tt>. This |
||||
allows project builders to specify the exact compilation directive |
||||
they need.</p> |
||||
|
||||
<p>Similarly, the <tt>FT_EXPORT_FUNC(x)</tt> macro is defined and used to |
||||
<em>define</em> exported functions within the FreeType 2 source code. |
||||
However, it is only used at compilation time.</p> |
||||
|
||||
|
||||
<p>Note that on Unix, there is no need for specific exportation directives. |
||||
However, the code must be compiled in a special way, named Position |
||||
Independent Code ("PIC"), which is normally selected through specific |
||||
compiler flags (like "-PIC" with gcc).</p> |
||||
|
||||
|
||||
<h4>b. Building modules as DLLs</h4> |
||||
|
||||
<p>In order to build modules as dynamic libraries, we first need to compile |
||||
the base layer (and optional components) as a single DLL. This is very |
||||
similar to the case we just described, except that we also need to |
||||
export all functions that are part of the "low level base API", |
||||
as these will get called by the modules in various cases.</p> |
||||
|
||||
<p>Similarly to the high-level API, all functions of the low-level base |
||||
API are declared in the internal header files of FreeType 2 with the |
||||
<tt>BASE_DEF(x)</tt> macro. The latter is similar to |
||||
<tt>FT_EXPORT_DEF</tt> and defaults to <tt>"extern x"</tt> unless |
||||
you specify a specific definition in |
||||
<tt><freetype/config/ftconfig.h></tt>.</p> |
||||
<p> |
||||
|
||||
<hr> |
||||
|
||||
<table width="100%" cellpadding=5><tr bgcolor="#ccccee"><td> |
||||
<h1>Conclusion</h1> |
||||
</td></tr></table> |
||||
|
||||
</td></tr></table></center> |
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 4.0 KiB |
@ -1,352 +0,0 @@ |
||||
<html> |
||||
<head> |
||||
<title>FreeType 2 Introduction</title> |
||||
<basefont face="Georgia, Arial, Helvetica, Geneva"> |
||||
<style content="text/css"> |
||||
P { text-align=justify } |
||||
H1 { text-align=center } |
||||
H2 { text-align=center } |
||||
LI { text-align=justify } |
||||
</style> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
|
||||
<font size=1>http://www.freetype.org</font><p> |
||||
|
||||
<center> |
||||
<a href="freetype.html"> |
||||
<img src="image/freetype.jpg" width=550 height=105 alt="The FreeType Project" border=0></a> |
||||
<h1>An Introduction to FreeType 2</h1> |
||||
</center> |
||||
|
||||
<center><table width=750 cellspacing=10 cellpadding=30><tr><td> |
||||
<hr><p> |
||||
|
||||
DOCUMENT INDEX:<br> |
||||
<ul> |
||||
<li><a href="#what">What is FreeType 2 ?</a> |
||||
<li><a href="#features">Features</a> |
||||
<li><a href="#requirements">Requirements</a> |
||||
<li><a href="#patents">Patents issues</a> |
||||
</ul><p> |
||||
|
||||
|
||||
<hr><p> |
||||
|
||||
<table width="100%" cellspacing=5><tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center><a name="what">What is FreeType 2 ?</h2> |
||||
</td></tr><tr><td> |
||||
|
||||
<p>The FreeType project is a team of volunteers who develop free, portable |
||||
and high-quality software solutions for digital typography. We specifically |
||||
target embedded systems and focus on bringing small, efficient and |
||||
ubiquitous products.</p> |
||||
|
||||
<p>the FreeType 2 library is our new software font engine. It has been |
||||
designed to provide the following important features:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
<b>A universal and simple API to manage font files:</b><br> |
||||
<ul> |
||||
<p>The FreeType 2 API is simple and easy to use. It supports both |
||||
bitmapped and scalable fonts and is well-suited to manage font |
||||
files of all formats. Unlike other font libraries, FreeType 2 |
||||
returns and manages outline font data (images & metrics).</p> |
||||
</ul> |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
<b>Support for several font formats through loadable modules:</b><br> |
||||
<ul> |
||||
<p>FreeType 2 uses <em>"font drivers"</em>. Each driver is a loadable |
||||
module used to support one specific font format. Each driver can also |
||||
provide specific extensions used to access format-specific features of |
||||
the font.</p> |
||||
</ul> |
||||
</p></li> |
||||
|
||||
|
||||
<li><p> |
||||
<b>High-quality anti-aliasing:</b><br> |
||||
<ul> |
||||
<p>FreeType 2 produces etremely smooth outlines at small sizes, with its new |
||||
anti-aliasing renderer, which produces bitmaps with 256-levels of gray. |
||||
It uses a new algorithm that has been specifically designed to render |
||||
small complex shapes (like glyphs) at high speed. Indeed, it's even |
||||
faster than the monochrome renderer for small character sizes (under |
||||
20 pixels) !! |
||||
</p> |
||||
</ul> |
||||
|
||||
|
||||
<li><b>High portability & performance:</b><br> |
||||
<ul> |
||||
<p>The FreeType 2 source code is written in ANSI C and runs on any |
||||
platform with a compliant compiler. Client applications can |
||||
provide their own memory manager or input stream to the library |
||||
(which means that font files can come from any place: disk, |
||||
memory, compressed file, network, etc..). |
||||
</p> |
||||
</ul> |
||||
|
||||
</ul> |
||||
|
||||
<p>Note that <em>the beta of FreeType 2 is available <b>now</b></em>. For more |
||||
info, check our <a href="download.html">Download page</a> or see the source |
||||
and its diffs through our <a href="cgi-bin/cvsweb.cgi">CVS Web interface</a>. |
||||
</p> |
||||
</ul> |
||||
|
||||
</td></tr></table> |
||||
|
||||
<table width="100%" cellspacing=5><tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center><a name="features">Features</h2> |
||||
</td></tr><tr><td> |
||||
|
||||
<h3>Supported font formats</h3> |
||||
|
||||
<p>FreeType 2 readily supports the following font formats:</p> |
||||
|
||||
<ul> |
||||
<li>TrueType files (.ttf) and collections (.ttc)</li> |
||||
<li>Type 1 font files both in ASCII (.pfa) or binary (.pfb) format</li> |
||||
<li>Type 1 Multiple Master fonts. The FreeType 2 API also provides |
||||
routines to manage design instances easily</li> |
||||
<li>Type 1 CID-keyed fonts</li> |
||||
<li>OpenType/CFF (.otf) fonts</li> |
||||
<li>CFF/Type 2 fonts</li> |
||||
<li>Adobe CEF fonts (.cef), used to embed fonts in SVG documents |
||||
with the Adobe SVG viewer plugin.</li> |
||||
<li>Windows FNT/FON bitmap fonts</li> |
||||
</ul> |
||||
|
||||
<p>Note that Apple's TrueType GX fonts are supported as normal TTFs, |
||||
(the advanced tables are ignored).</p> |
||||
|
||||
<p>Besides, it's possible to add support for new font formats by providing |
||||
a specific <em>font driver</em> module. Modules can be added either at |
||||
build time (when recompiling the library), or at <em>run-time</em>; |
||||
this allows, for example, applications to register their own |
||||
font driver to support program-specific formats.</p> |
||||
|
||||
|
||||
<h3>Patent-free automatic hinter</h3> |
||||
|
||||
<p>TrueType fonts are normally renderered (hinted) with the help of a |
||||
specific bytecode where the behaviour of a few opcodes is patented by |
||||
Apple. We're currently in contact with Apple to discuss the importance |
||||
of such patents and their use in open source projects like FreeType. |
||||
</p> |
||||
|
||||
<p>In the meantime, we have developped our own alternative technology that |
||||
is capable of automatically hinting scalable glyph images. It is |
||||
now part of the FreeType 2 source tree as the "autohint" module, |
||||
and is used to hint glyphs when the bytecode interpreter is disabled |
||||
(through a configuration macro when building the engine). Note that |
||||
the auto-hinter is also used to handle glyphs in other formats like |
||||
CFF and Type 1.</p> |
||||
|
||||
<p>The auto-hinter provides pretty good results (in some cases, it even |
||||
significantly improves the output of poorly hinted fonts) but we'll |
||||
continue to improve it with each new release of FreeType to achieve |
||||
the highest possible quality.</p> |
||||
|
||||
|
||||
<h3>Modular design:</h3> |
||||
|
||||
<p>The design of FreeType 2 is extremely modular as most features are |
||||
supported through optional modules. This means it's easily possible to |
||||
only compile the features you need. As each module is between |
||||
10 and 20 Kb in size, it's possible to build a bare-bones |
||||
font engine that supports anti-aliasing in about 30 Kb !!</p> |
||||
|
||||
<p>Configuration is performed by modifications of only two header |
||||
files (one to select global features, another one to select modules) |
||||
and don't need tweaking of source code. Note that it is however |
||||
possible to provide your own implementation of certain components.</p> |
||||
|
||||
<p>For example, when building on Unix, the engine will automatically |
||||
use memory-mapped files when available on the target platform, |
||||
thus significantly increasing font file i/o.</p> |
||||
|
||||
|
||||
<p>Due to its very flexible design, it is possible to add, remove and |
||||
upgrade modules at run-time.</p> |
||||
|
||||
|
||||
|
||||
<h3>Advanced glyph management</h3> |
||||
|
||||
<p>The API comes with a standard extension used to extract individual |
||||
glyph images from font files. These images can be bitmaps, scalable |
||||
bezier outlines or even anything else. (e.g. bi-color or metafont |
||||
glyphs, as long as they're supported by a module).</p> |
||||
|
||||
<p>Each scalable glyph image can be transformed, measured and |
||||
rendered into a monochrome or anti-aliased bitmaps easily |
||||
through a uniform interface. |
||||
|
||||
This allows client applications to easily cache glyphs or |
||||
perform text rendering effects with minimal difficulty |
||||
(look at the FreeType 2 Tutorial to see how to render |
||||
rotated text with very few lines of code). |
||||
</p> |
||||
|
||||
|
||||
|
||||
<h3>Advanced font access</h3> |
||||
|
||||
<p>The FreeType 2 API is useful to retrieve advanced information from |
||||
various fonts:</p> |
||||
|
||||
<ul> |
||||
<li>vertical metrics are available whenever found in the font file</li> |
||||
|
||||
<li>kerning distances are available when found in the font file. It |
||||
is also possible to "attach" a given additional file to a given |
||||
font face. This is useful to load kerning distances from an |
||||
.afm file into a Type 1 face for example.</li> |
||||
|
||||
<li>provides ASCII glyph names whenever available in the font |
||||
(TrueType, OpenType, Type1, etc..)</li> |
||||
|
||||
<li>provides access to important tables for SFNT-based font formats |
||||
(i.e. TrueType, OpenType, CEF, etc..), like the name table, |
||||
font header, maximum profile, etc...</li> |
||||
|
||||
<li>automatic synthesis of Unicode-based character maps for |
||||
those fonts or formats that do not provide one. This is |
||||
extremely useful with Type 1 fonts which are normally |
||||
limited to a stupid 256-characters encoding.</li> |
||||
</ul> |
||||
|
||||
|
||||
<h3>Simple & clean API</h3> |
||||
|
||||
<p>The FreeType 2 high-level API is simple and straightforward, as it |
||||
has been specifically designed to make the most commmon font operations |
||||
easy</p> |
||||
|
||||
<p>As a comparison, the number of function calls needed to perform a |
||||
the tasks of font face creation/opening and glyph loading/rendering |
||||
has been reduced by a factor of 4 !!</p> |
||||
|
||||
<p>The API is also independent of any font-format specific issue, though |
||||
it provides standard extensions to access format-specific tables and |
||||
information. More extensions can also be easily added through new |
||||
modules</p> |
||||
|
||||
|
||||
<h3>Robust & Portable code</h3> |
||||
|
||||
<p>Because it is written in industry-standard ANSI C, FreeType 2 compiles |
||||
on all platforms with a compliant compiler. Because the default build |
||||
only relies on the C library, it is free of any system-specific |
||||
dependencies, even if it is possible to "enhance" certain components |
||||
by providing a specific implementation.</p> |
||||
|
||||
<p>The code doesn't use global or static variables. Client applications |
||||
can provide their own memory manager. Font files can be read from |
||||
a disk file, memory, or through a client-provided input stream. This |
||||
allows to support compressed font files, remote fonts, fonts embedded |
||||
in other streams (e.g. Type42 fonts), etc..</p> |
||||
|
||||
<p>An advanced i/o sub-system is used to optimise file access, as well |
||||
as reduce memory usage of the library when the file is memory-based |
||||
( ROM, RAM, memory-mapped ).</p> |
||||
|
||||
|
||||
<h3>Open Source & Vendor Independence</h3> |
||||
|
||||
<p>Finally, FreeType 2 is released under its own BSD-like open source |
||||
license, one of the less restricting licenses available, and this |
||||
means that:</p> |
||||
|
||||
<ul> |
||||
<li><p> |
||||
It can be included in all kinds of products, be they proprietary |
||||
or not. |
||||
</p></li> |
||||
|
||||
<li><p> |
||||
As any module can be added or replaced anytime, any third party |
||||
vendor has the ability to provide its own set of modules (under |
||||
its own license) in order to support proprietary font formats or |
||||
more advanced features (e.g. a new auto-hinter, or a new |
||||
anti-aliasing renderer for LCDs or TV screens). |
||||
</p></li> |
||||
</ul> |
||||
|
||||
<p>One could even imagine an application using the FreeType 2 API with |
||||
a "wrapper" module used to access system-specific fonts (like through |
||||
the Windows GDI). This would mean native font support with more portable |
||||
application code (as simply changing the wrapper module would be required |
||||
to port the application to another system).</p> |
||||
|
||||
</td></tr></table> |
||||
|
||||
<table width="100%" cellspacing=5><tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center><a name="requirements">Requirements</h2> |
||||
</td></tr><tr><td> |
||||
|
||||
<p>FreeType 2 is written in ANSI C and should compile with no problems |
||||
on a great variety of platforms. We have taken care of removing all |
||||
compilation warnings from major compliant compilers. Detailed compilation |
||||
instructions are provided in the software archive.</p> |
||||
|
||||
<p>This version of the library has been succesfully compiled and run |
||||
under the following systems: Dos, OS/2, Windows, Macintosh, Unix |
||||
(including the 64-bits DEC Unix, a.k.a. "True64"). You should not |
||||
encounter major problems compiling it on any other kind of platform. |
||||
In all cases, contact us if you do.</p> |
||||
|
||||
<p>Note that a small set of demonstration programs is also separately |
||||
available. They include a tiny graphics sub-system that is used to |
||||
display and show-off the library's capabilities on the following |
||||
platforms: X11, MacOS, OS/2 & Windows.</p> |
||||
|
||||
<p>Please visit our <a href="http://www.freetype.org/download.html"> |
||||
Download section</a> to access the software archives.</p> |
||||
|
||||
</ul> |
||||
|
||||
</td></tr></table> |
||||
|
||||
<table width="100%" cellspacing=5><tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center><a name="patents">Patents issues</h2> |
||||
</td></tr><tr><td> |
||||
|
||||
<p>The FreeType 2 source code includes a TrueType bytecode interpreter that |
||||
is covered by the Apple patents. However, this piece of code is never |
||||
compiled by default in this release (unlike in previous betas) making |
||||
a default build of the library <em>entirely patent-free !!</em></p> |
||||
|
||||
<p>Note that in order to compile the interpreter, one needs to define |
||||
the configuration macro <tt><b>TT_CONFIG_OPTION_BYTECODE_INTERPRETER</b></tt> configuration |
||||
macro in the file "<tt>ftoption.h</tt>". More details are available in |
||||
the software archive. Note that the use of the interpreter is normally |
||||
protected by US, UK and French patents. In the event you'd absolutely |
||||
need it, you may have to <a href="mailto:patents@apple.org">contact |
||||
Apple legal department</a> for licensing conditions, depending on your |
||||
location and the places you distribute/sell your products.</p> |
||||
|
||||
<p>Please do not ask us any detailed information regarding licensing, as |
||||
we're still discussing with Apple this issue, we're unable to inform |
||||
the public of what's currently going on..</p> |
||||
|
||||
</td></tr></table> |
||||
|
||||
<hr> |
||||
<p> |
||||
<a href="index.html">Back to FreeType homepage</a><p> |
||||
|
||||
</td></tr></table> |
||||
</body> |
||||
</html> |
@ -1,729 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType 2 FAQ</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
|
||||
<font size=1>http://www.freetype.org</font><p> |
||||
|
||||
<h1 align=center> |
||||
<a href="freetype.html"> |
||||
<img src="image/freetype.jpg" |
||||
width=550 height=105 |
||||
alt="The FreeType Project" |
||||
border=0></a> |
||||
<h1>The FreeType 2 FAQ</h1> |
||||
</h1> |
||||
|
||||
<center> |
||||
<table width="75%"> |
||||
<tr><td> |
||||
|
||||
<hr><p> |
||||
|
||||
Document index |
||||
|
||||
<ul> |
||||
<li><a href="#general">General</a> |
||||
<ul><p> |
||||
<li> |
||||
<a href="#general-dead">I thought the FreeType project was dead. |
||||
Is this true?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#general-long">Why did it take so long to release |
||||
FreeType 2?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#general-unix">Is FreeType 2 a Unix-only |
||||
project?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#general-x11">When will X11 support anti-aliased |
||||
glyphs?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#general-ft1">Is FreeType 2 backwards compatible |
||||
to FreeType 1.x?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#general-edit">Can I use FreeType 2 to edit fonts |
||||
or create new ones?</a> |
||||
</li> |
||||
</p></ul> |
||||
</li> |
||||
<li><a href="#builds">Compilation & Configuration</a> |
||||
<ul><p> |
||||
<li> |
||||
<a href="#builds-compile">How do I compile the FreeType 2 |
||||
library?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#builds-config">How do I configure my library build?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#builds-modules">How do I select the modules I need?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#builds-flat">How do I compile all FreeType 2 files |
||||
in a single directory?</a> |
||||
</li> |
||||
</p></ul> |
||||
</li> |
||||
<li> |
||||
<a href="#autohint">The FreeType 2 autohinter</a> |
||||
<ul><p> |
||||
<li> |
||||
<a href="#autohint-license">Under which license is the auto-hinter |
||||
released?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#autohint-work">How does auto-hinting work in |
||||
FreeType 2?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#autohint-cjk">Why doesn't the auto-hinter work well |
||||
with CJK fonts?</a> |
||||
</li> |
||||
</p></ul> |
||||
</li> |
||||
<li> |
||||
<a href="#other">Other questions</a> |
||||
<ul><p> |
||||
<li> |
||||
<a href="#other-color">How can I set the color of text rendered |
||||
by FreeType?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#other-depth">Can I use FreeType to draw text on a pixmap |
||||
with arbitrary depth?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#other-size">I set the pixel size to 8x8, but the |
||||
resulting glyphs are larger than that. Why?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#other-bbox">How can I compute the bounding box of a text |
||||
string without loading its glyphs?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#other-antialias">Which anti-aliasing algorithm is |
||||
used in the FreeType 2 renderer?</a> |
||||
</li> |
||||
<li> |
||||
<a href="#other-opentype">When will FreeType 2 support |
||||
OpenType?</a> |
||||
</li> |
||||
</p></ul> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center> |
||||
<a name="general">General questions & answers |
||||
</h2> |
||||
</td></tr> |
||||
<tr><td> |
||||
|
||||
<a name="general-dead"> |
||||
<h3> |
||||
I.1 I though the FreeType project was dead. Is this true? |
||||
</h3> |
||||
|
||||
<p>Well, not exactly :-) It's true that the TrueType patents |
||||
issues have been less than a graceful event to handle but it didn't not |
||||
really killed the project per se, as Apple hasn't made an official |
||||
statement yet regarding the use of the patented "technology" in open |
||||
source projects (or other products).</p> |
||||
|
||||
<p>We have thus continued updating FreeType 1.x, and started |
||||
developing FreeType 2 with the idea of providing this time a |
||||
completely patent free font engine. However, we largely preferred not |
||||
to broadly communicate about it until we've got a satisfying |
||||
implementation to show.</p> |
||||
|
||||
<hr> |
||||
<a name="general-long"> |
||||
<h3> |
||||
I.2 Why did it take so long to release FreeType 2? |
||||
</h3> |
||||
|
||||
<p>Several factors come to mind. The first one is that FreeType 2 |
||||
is a much more complex and dense project that was mostly developed |
||||
during non-working hours. And surely some important changes in the life |
||||
(like marriage, new jobs and kids) of some the FreeType developers |
||||
cannot be ignored :-)</p> |
||||
|
||||
<p>A second one is that a first version of the library was designed one |
||||
year ago (and already worked with a multitude of font drivers), though |
||||
with a design that was judged by its authors as well as beta testers as |
||||
not enough flexible or consistent. In short, it worked well but we were |
||||
not exactly proud of it (call us perfectionists). It has then be |
||||
significantly reworked to become what we are now distributing as |
||||
FreeType 2</p> |
||||
|
||||
<p>Finally, it would have been hard to distribute such a library without |
||||
an alternative technology to replace the patented bytecode interpreter. |
||||
This involved significant research work that could only be performed |
||||
correctly full-time, and we had to found a company to fund such a |
||||
development and still make it available under a BSD-like license. Huge |
||||
thanks to <a href="http://www.catharon.com">Catharon Productions, |
||||
Inc.</a> for their commitment to this project.</p> |
||||
|
||||
<p>And of course, we added support for more font files, and we will |
||||
continue to as long as the specifications are available and that we find |
||||
an interest in it. For example, FreeType 2 is to date the only |
||||
software library available on the market that supports the new Adobe |
||||
"CEF" font format.</p> |
||||
|
||||
<hr> |
||||
<a name="general-unix"> |
||||
<h3> |
||||
I.3 Is FreeType 2 a Unix-only project? |
||||
</h3> |
||||
|
||||
<p>Absolutely not, even though many people still seem to think |
||||
so :-) FreeType 2, just like version 1.x, can be compiled |
||||
on any platform with an ANSI compiler. Some beta versions of the |
||||
library are even heavily used in brand new OSes (see the <a |
||||
href="http://www.atheos.cx">AtheOS</a> screenshots for examples).</p> |
||||
|
||||
<p>The library is itself mainly developed on several platforms (Windows |
||||
& Linux, though a great deal has also been achieved on OS/2) and the |
||||
code is highly generic and modular to adapt even the most strict |
||||
environments like low-memory embedded systems.</p> |
||||
|
||||
<hr> |
||||
<a name="general-x11"> |
||||
<h3> |
||||
I.4 When will X11/XFree support anti-aliased text? |
||||
</h3> |
||||
|
||||
<p>This question isn't exactly related to FreeType as we have no direct |
||||
connection to the XFree people, but we have been asked so frequently |
||||
about it that it deserves a prominent place in this FAQ :-)</p> |
||||
|
||||
<p>FreeType has been capable of anti-aliasing since version 1.0. |
||||
The reason why XFree doesn't support it is directly related to the |
||||
limitations of the design and specification of X11. More |
||||
specifically:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
X11 assumes that all glyph images are monochrome bitmaps, hence the |
||||
X font library and server are unable to send anything else to |
||||
the X server. |
||||
</li> |
||||
<li> |
||||
Even if the X font library/server was able to generate |
||||
anti-aliased bitmaps (and this has been already done through |
||||
extensions), the X rendering model doesn't allow translucent |
||||
composition of "gray" pixmaps onto an arbitrary drawable. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>As both the font and rendering models of X11 are limited, it is |
||||
basically impossible to draw anti-aliased glyphs without performing |
||||
<em>huge</em> hacks within the server.</p> |
||||
|
||||
<p>Note that Keith Packard, from XFree86 fame, has recently started |
||||
working on a new rendering model for X11 in order to support new |
||||
features (mainly transparency and anti-aliased fonts). This will be |
||||
provided through protocol extensions. The question of knowing whether |
||||
legacy X applications will be able to display anti-aliased text is still |
||||
very uncertain.</p> |
||||
|
||||
<hr> |
||||
<a name="general-ft1"> |
||||
<h3> |
||||
I.5 Is FreeType 2 backwards compatible with FreeType 1.x? |
||||
</h3> |
||||
|
||||
<p>Not directly, though we had the project to provide an optional binary |
||||
compatibility layer on top of it in order to easily re-link applications |
||||
with the new version. However, this idea has been dropped as it is |
||||
possible to install and use the two versions independently on any system |
||||
(read: no namespace conflicts).</p> |
||||
|
||||
<p>The FreeType 2 API is a lot simpler than the one in 1.x |
||||
while being much more powerful. We thus encourage you to adapt your |
||||
source code to it as this should not involve much work.</p> |
||||
|
||||
<hr> |
||||
<a name="general-edit"> |
||||
<h3> |
||||
I.6 Can I use FreeType 2 to edit fonts or create new ones? |
||||
</h3> |
||||
|
||||
<p>The answer is a definitive <b>no</b>, because the library was |
||||
specifically designed to <em>read</em> font files with small code size |
||||
and very low memory usage.</p> |
||||
|
||||
<p>We thus do not plan to support editing or creation in the font engine |
||||
in any way, as this would imply a complete rewrite. This doesn't mean |
||||
that we won't introduce a font editing/creation library in the future, |
||||
as this really depends on how many people are asking for it (or how much |
||||
they would be willing to pay for it), as well as the time of the |
||||
FreeType developers.</p> |
||||
|
||||
<p>Do not expect anything in this direction until we officially announce |
||||
something though. There are other axes of development for this project |
||||
(like text-layout capabilities, glyph caching, etc.) that may be more |
||||
important to us at the moment.</p> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<br> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center> |
||||
<a name="builds">Compilation & Configuration |
||||
</h2> |
||||
</td></tr> |
||||
<tr><td> |
||||
|
||||
<a name="builds-compile"> |
||||
<h3> |
||||
II.1 How do I compile the FreeType 2 library? |
||||
</h3> |
||||
|
||||
<p>The library can be compiled in various ways, and a detailed |
||||
documentation is available in the file <tt>freetype2/docs/BUILD</tt>. |
||||
However, we will summarize the process to a few cases:</p> |
||||
|
||||
<h4> |
||||
a. Using the command-line 2 build system |
||||
</h4> |
||||
|
||||
<p>The engine comes with a sophisticated build system that is used to |
||||
configure and compile a build of the library. You will need <em>GNU |
||||
Make</em> installed on your platform (<b>Note:</b> It will |
||||
<em>not</em> work with other Make tools).</p> |
||||
|
||||
<p>Basically, you will need to invoke <tt>make</tt> a first time in |
||||
the top-level FreeType 2 directory in order to set up the build. |
||||
This will detect your current platform and choose a configuration |
||||
sub-makefile to drive the build. A specific compiler can be selected |
||||
on some platforms by providing an additional target. For example, on |
||||
Win32:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<b><tt>make visualc</tt></b> will select the Visual C++ |
||||
compiler |
||||
</li> |
||||
<li> |
||||
<b><tt>make lcc</tt></b> will select the Win32-lcc compiler |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Note that on Unix, when the first time make is called, a configure |
||||
script located in <tt>freetype2/builds/unix</tt> will be run in order |
||||
to automatically detect the platform & compiler.</p> |
||||
|
||||
<p>A summary will be displayed showing the detected platform and |
||||
compiler selected. You will then be able to start the build by |
||||
invoking <tt>make</tt> a second time. In case of problem, consult the |
||||
<tt>BUILD</tt> document.</p> |
||||
|
||||
<h4> |
||||
b. Direct compilation |
||||
</h4> |
||||
|
||||
<p>You can also directly compile the library from the command line by |
||||
using these simple rules:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
You should place the directories <tt>freetype2/include</tt> and |
||||
<tt>freetype2/src</tt> in your include path in order to compile |
||||
any component of the library. You can also add the |
||||
system-specific build directory (i.e. |
||||
<tt>builds/<em>system</em>/</tt>) in the case where an alternate |
||||
implementation of some of the components is available there (e.g. |
||||
the memory-mapped i/o implementation on some Unix systems). |
||||
</li> |
||||
<li> |
||||
The components of the library are located in sub-directories of |
||||
<tt>src</tt>, for example: <tt>src/base</tt>, |
||||
<tt>src/truetype</tt>, etc. |
||||
</li> |
||||
<li> |
||||
Each component is normally compiled through a single C file that |
||||
<em>wraps</em> other sources in the component's directory. For |
||||
example, you should build the TrueType font driver by compiling |
||||
the file <tt>src/truetype/truetype.c</tt>. The list of |
||||
C files to compile for a feature-complete build of the |
||||
library is given in the <tt>BUILD</tt> document. |
||||
</li> |
||||
</ul> |
||||
|
||||
<h4> |
||||
c. Using a graphical IDE |
||||
</h4> |
||||
|
||||
<p>Well, the process is vastly similar to the one described in b., |
||||
except that you need to set the include paths, source code paths, etc. |
||||
in dialog boxes before running the compilation.</p> |
||||
|
||||
<hr> |
||||
<a name="builds-config"> |
||||
<h3> |
||||
II.2 How do I configure my build of the library? |
||||
</h3> |
||||
|
||||
<p>Each build of the library is configured through two header files |
||||
located in <tt>include/freetype/config</tt>:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<tt>ftoption.h</tt> |
||||
<br> |
||||
This file contains various configuration macros whose definition can |
||||
be toggled on a per-build basis. Each macro is heavily commented in |
||||
this file's comment, and we invite you to refer to it directly. |
||||
</li> |
||||
<li> |
||||
<tt>ftmodule.h</tt> |
||||
<br> |
||||
This file contains the list of all the modules that are initially |
||||
registered (added) when the function <tt>FT_Init_FreeType()</tt> is |
||||
called. See the next answer to know how to change it and why it may |
||||
be important. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Alternatively, some specific implementations of some FreeType 2 |
||||
components can be provided in a <tt>builds/<em>system</em>/</tt> |
||||
directory (e.g. the Unix-specific <tt>ftsystem.c</tt> that uses |
||||
memory-mapped file for i/o).</p> |
||||
|
||||
<hr> |
||||
<a name="builds-modules"> |
||||
<h3> |
||||
II.3 How do I select the modules I need in my build? |
||||
</h3> |
||||
|
||||
<p>The function <tt>FT_Init_FreeType()</tt> creates a new instance of |
||||
the FreeType 2 library and registers a set of "default" modules |
||||
before returning to the calling application. Its default implementation |
||||
is in the file <tt>src/base/ftinit.c</tt>.</p> |
||||
|
||||
<p>The list of default modules used by <tt>ftinit.c</tt> is located in |
||||
the configuration file <tt>include/freetype/config/ftmodule.h</tt>. |
||||
Normally, it is automatically generated by the build system by invoking |
||||
the "<tt><b>make modules</b></tt>" command in the top level |
||||
FreeType 2 directory (Note: this only works with GNU Make; you can |
||||
edit the file by hand otherwise). It does so by parsing all |
||||
sub-directories of <tt>src</tt> that contain a file named |
||||
<tt>module.mk</tt>.</p> |
||||
|
||||
<p>Note that a specific port or project is free to provide its own |
||||
implementation of <tt>ftinit.c</tt> in order to ensure a different |
||||
initialization sequence. For example, one could do something like:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
Compile each module as a shared library (DLL or <tt>.so</tt>) with a |
||||
common "entry point" to retrieve a pointer to its module class |
||||
(there is already some code that allows this when compiling each |
||||
module). |
||||
</li> |
||||
<li> |
||||
Place these modules in a directory like |
||||
<tt>/usr/lib/freetype2/modules/</tt>. |
||||
</li> |
||||
<li> |
||||
Provide an implementation of <tt>ftinit.c</tt> that would scan the |
||||
directory for valid modules. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>This example only emphasizes the flexibility that is left to |
||||
developers when building the library.</p> |
||||
|
||||
<hr> |
||||
<a name="builds-flat"> |
||||
<h3> |
||||
II.4 How do I compile all FreeType 2 files in a single |
||||
directory? |
||||
</h3> |
||||
|
||||
<p>Some projects may need, for the sake of simplicity or ease of |
||||
building, to compile the FreeType 2 library with all source files |
||||
copied to a single directory. This is possible.</p> |
||||
|
||||
<p>To do so, you have to copy all source files located under |
||||
<tt>src</tt> to your own directory (you must retain the include files in |
||||
a distinct hierarchy though), then compile each of the FreeType 2 |
||||
component with the macro <tt>FT_FLAT_COMPILE</tt>. This will change the |
||||
way <tt>#include</tt> works during the build.</p> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
|
||||
<br> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center> |
||||
<a name="autohint">The FreeType 2 auto-hinter |
||||
</h2> |
||||
</td></tr> |
||||
<tr><td> |
||||
|
||||
<a name="autohint-license"> |
||||
<h3> |
||||
III.1 Under which license is the FreeType 2 auto-hinter released? |
||||
</h3> |
||||
|
||||
<p>The auto-hinter was initially designed and implemented under contract |
||||
for <a href="http://www.catharon.com">Catharon Productions, Inc</a> |
||||
which gladly accepted to released it under an open-source license |
||||
compatible with the FreeType one.</p> |
||||
|
||||
<p>This license can be found in |
||||
<tt>src/autohint/CatharonLicense.txt</tt> and requires that you cite |
||||
Catharon Productions in your documentation (just like you do with |
||||
FreeType) when using the auto-hinting module.</p> |
||||
|
||||
<p>Other than that, you still have the same freedom than with the good |
||||
old FreeType license. Enjoy!</p> |
||||
|
||||
<hr> |
||||
<a name="autohint-work"> |
||||
<h3> |
||||
III.2 How does the auto-hinter work? |
||||
</h3> |
||||
|
||||
<p>Well, a complete description would be difficult. Have a look at the |
||||
dedicated <a href="autohinting/index.html">auto-hinter pages</a> on the |
||||
FreeType site, as they describe most of its details with graphics and |
||||
explanations. You could also look at the source code if you want |
||||
to :-)</p> |
||||
|
||||
<p>To give a few details, the auto-hinter is used to perform |
||||
grid-fitting on scalable font formats that use Bézier outlines as |
||||
their primary glyph image format (this means nearly all scalable font |
||||
formats today). If a given font driver doesn't provide its own hinter, |
||||
the auto-hinter is used by default. If a format-specific hinter is |
||||
provided, it is still possible to use the auto-hinter using the |
||||
<tt>FT_LOAD_FORCE_AUTOHINT</tt> bit flag when calling |
||||
<tt>FT_Load_Glyph()</tt>.</p> |
||||
|
||||
<p>The auto-hinter currently doesn't use external hints to do its job, |
||||
as it automatically computes global metrics (when it "opens" a font for |
||||
the first time) and glyph "hints" from their outline. Note that we plan |
||||
the ability to specify external hints, given that it is based on a |
||||
constraint system. That could be used to support native hints in |
||||
Type 1/Type 2 fonts, for example.</p> |
||||
|
||||
<hr> |
||||
<a name="autohint-cjk"> |
||||
<h3> |
||||
III.3 Why does the auto-hinter doesn't work correctly with CJK |
||||
fonts? |
||||
</h3> |
||||
|
||||
<p>The auto-hinter was first designed to manage and hint Latin-based |
||||
fonts, as they consist of most of the fonts available today. It doesn't |
||||
hint Asian fonts, as well as a few other complex scripts, because we |
||||
didn't put enough research on the topic yet. Hinting CJK isn't really |
||||
more difficult than Latin, just different, with a set of different |
||||
constraints (basically, more distortion of glyphs is acceptable as long |
||||
as certain features like triple-stem positions are respected more |
||||
strictly).</p> |
||||
|
||||
<p>We thus plan to handle such a case in the near future. Please be |
||||
patient.</p> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<br> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCEE"><td> |
||||
<h2 align=center> |
||||
<a name="other">Other questions |
||||
</h2> |
||||
</td></tr> |
||||
<tr><td> |
||||
|
||||
<a name="other-depth"> |
||||
<h3> |
||||
IV.1 Can I use FreeType to draw text on a pixmap with arbitratry depth? |
||||
</h3> |
||||
|
||||
<p>Not directly, as FreeType is a font library, not a general purpose |
||||
graphics library or text rendering service. However, note that the |
||||
anti-aliased renderer allows you to convert a vectorial glyph outline |
||||
into a list of "spans" (i.e. horizontal pixel segments with same |
||||
coverage) that can be rendered through user-provided callbacks.</p> |
||||
|
||||
<p>By providing the appropriate span callback, you can render |
||||
anti-aliased text to any kind of surface. You can also use any color or |
||||
fill pattern/image if you want to. This process is called <em>direct |
||||
rendering</em>. For more information, please read the documentation |
||||
contained in the following files:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><tt><freetype/ftimage.h></tt> contains the definition of |
||||
the <tt>FT_Raster_Params</tt> type used with direct rendering.</p> |
||||
</li> |
||||
<li> |
||||
<p><tt><freetype/ftoutln.h></tt> contains the definition of |
||||
the <tt>FT_Outline_Render()</tt> function that can be used to |
||||
convert vectorial outlines to span lists.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Here's some code that uses them:</p> |
||||
|
||||
<font color="blue"><pre> |
||||
FT_Raster_Params params; |
||||
FT_Outline outline; |
||||
|
||||
|
||||
... load vectorial glyph in "outline" ... |
||||
|
||||
params.flags = ft_raster_flag_aa | ft_raster_flag_direct; |
||||
params.gray_spans = (FT_Raster_Span_Func)your_own_span_function_here; |
||||
params.user = your_own_data_pointer; |
||||
|
||||
error = FT_Outline_Render( library, &outline, &params );</pre> |
||||
</font> |
||||
|
||||
<p>Note that direct rendering is <em>not</em> available with monochrome |
||||
output, as the current renderer uses a two-pass algorithm to generate |
||||
glyphs with correct drop-out control.</p> |
||||
|
||||
<hr> |
||||
<a name="other-color"> |
||||
<h3> |
||||
IV.2 How can I set the color of text rendered by FreeType? |
||||
</h3> |
||||
|
||||
<p>Basically, you can't do that, because FreeType is simply a font |
||||
library. In general, you will need to use your favorite graphics |
||||
library to draw the FreeType glyphs with the appropriate color.</p> |
||||
|
||||
<p>Note that for anti-aliased glyphs, you can "set the color" by using |
||||
<em>direct rendering</em> as described in <a href="#other-depth">this |
||||
answer</a>.</p> |
||||
|
||||
<hr> |
||||
<a name="other-size"> |
||||
<h3> |
||||
IV.3 I set the pixel size to 8x8, but the resulting glyphs are larger |
||||
(or smaller) than that. Why? |
||||
</h3> |
||||
|
||||
<p>A lot of people have difficulties to understand this topic, because |
||||
they think of glyphs as fixed-width resp. fixed-height "cells", like |
||||
those of fonts used in terminals/consoles. This assumption is simply |
||||
not valid with most "modern" font formats, even bitmapped-based ones |
||||
like <tt>PCF</tt> or <tt>BDF</tt>.</p> |
||||
|
||||
<p>Be aware that the <em>character size</em> that is set either through |
||||
<tt>FT_Set_Char_Size()</tt> or <tt>FT_Set_Pixel_Sizes()</tt> isn't |
||||
directly related to the dimension of the glyph bitmaps generated.</p> |
||||
|
||||
<p>Rather, the character size is indeed the size of <em>an abstract |
||||
square</em>, called the <em>EM</em>, used by typographers to design |
||||
fonts. Scaling two distinct fonts to the same character size, be it |
||||
expressed in points or pixels, will generally result in bitmaps with |
||||
<em>distinct dimensions</em>!</p> |
||||
|
||||
<p>Note that historically, the EM corresponded to the width of a capital |
||||
"M" in Latin typefaces. However, later improvements in typography led |
||||
to designs that greatly detract from this rule. Today, it is not |
||||
possible to connect the EM size to a specific font "feature" in a |
||||
reliable way.</p> |
||||
|
||||
<hr> |
||||
<a name="other-bbox"> |
||||
<h3> |
||||
IV.4 How can I compute the bounding box of a given string of text |
||||
without loading its glyphs before? |
||||
</h3> |
||||
|
||||
<p>A lot of people want to be able to compute the size in pixels of a |
||||
simple string of text with minimal overhead. For example, that can be |
||||
useful to draw centered text within a button. (to be continued...)</p> |
||||
|
||||
<hr> |
||||
<a name="other-antialias"> |
||||
<h3> |
||||
IV.5 Which anti-aliasing algorithm is used by FreeType 2?</h3> |
||||
|
||||
<p>The algorithm has been specifically designed for FreeType. It is |
||||
based on ideas that were originally found in the implementation of the |
||||
<a href="http://www.levien.com/libart">libArt</a> graphics library to |
||||
compute the <em>exact pixel coverage</em> of a vector image with |
||||
absolutely no sub-sampling/filtering.</p> |
||||
|
||||
<p>However, these two implementations are radically distinct and use |
||||
vastly different models. The FreeType 2 renderer is optimized |
||||
specifically for rendering small complex shapes, like glyphs, at very |
||||
high speed while using very few memory; while libArt shines at general |
||||
shape/polygon processing, especially large ones.</p> |
||||
|
||||
<p>The FreeType 2 anti-aliasing renderer is indeed <em>faster</em> |
||||
than the monochrome renderer for small character sizes (typically |
||||
<20 pixels). The reason is that the monochrome renderer must |
||||
perform two passes on the outline in order to perform drop-out control |
||||
according to the TrueType specification (we could drop this requirement |
||||
later though).</p> |
||||
|
||||
<p>We will try to document its design in a later document, though this |
||||
is not a priority for now.</p> |
||||
|
||||
<hr> |
||||
<a name="other-opentype"> |
||||
<h3> |
||||
IV.6 When will FreeType 2 support OpenType? |
||||
</h3> |
||||
|
||||
<p>Well, the engine already reads OpenType/CFF files perfectly. What it |
||||
doesn't do is handle "OpenType Layout" tables yet.</p> |
||||
|
||||
<p>FreeType 1 comes with a set of extensions that are used to load |
||||
and manage OpenType Layout tables. It even has a demonstration program |
||||
named <tt>ftstrtto</tt> to show its capabilities.</p> |
||||
|
||||
<p>For FreeType 2, we have decided that the layout operations |
||||
provided through these tables are better placed in a specific |
||||
text-layout library, (many people having asked for such a thing). This |
||||
new engine will not depend on FreeType2 explicitly and will be developed |
||||
as a separate project. We plan to announce it in a few weeks with all |
||||
gory details, once the definitive 2.0 release of FreeType has been |
||||
made.</p> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<a href="index.html">Back to FreeType homepage</a><p> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.2 KiB |
@ -1,199 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-2.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
I. Basic typographic concepts |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Font files, format and information |
||||
</h3> |
||||
|
||||
<p>A font is a collection of various character images that can be used |
||||
to display or print text. The images in a single font share some common |
||||
properties, including look, style, serifs, etc. Typographically |
||||
speaking, one has to distinguish between a <em>font family</em> and its |
||||
multiple <em>font faces</em>, which usually differ in style though come |
||||
from the same template.</p> |
||||
|
||||
For example, "Palatino Regular" and "Palatino Italic" are two distinct |
||||
<em>faces</em> from the same famous <em>family</em>, called "Palatino" |
||||
itself.</p> |
||||
|
||||
<p>The single term <em>font</em> is nearly always used in ambiguous ways |
||||
to refer to either a given family or given face, depending on the |
||||
context. For example, most users of word-processors use "font" to |
||||
describe a font family (e.g. "Courier", "Palatino", etc.); however most |
||||
of these families are implemented through several data files depending |
||||
on the file format: For TrueType, this is usually one per face (i.e. |
||||
<tt>arial.ttf</tt> for "Arial Regular", <tt>ariali.ttf</tt> for "Arial |
||||
Italic", etc.). The file is also called a "font" but really contains a |
||||
font face.</p> |
||||
|
||||
<p>A <em>digital font</em> is thus a data file that may contain <em>one |
||||
or more font faces</em>. For each of these, it contains character |
||||
images, character metrics, as well as other kind of information |
||||
important to the layout of text and the processing of specific character |
||||
encodings. In some awkward formats, like Adobe's Type 1, a single |
||||
font face is described through several files (i.e. one contains the |
||||
character images, another one the character metrics). We will ignore |
||||
this implementation issue in most parts of this document and consider |
||||
digital fonts as single files, though FreeType 2.0 is able to |
||||
support multiple-files fonts correctly.</p> |
||||
|
||||
<p>As a convenience, a font file containing more than one face is called |
||||
a <em>font collection</em>. This case is rather rare but can be seen in |
||||
many Asian fonts, which contain images for two or more representation |
||||
forms of a given scripts (usually for horizontal and vertical |
||||
layout.</p> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Character images and mappings |
||||
</h3> |
||||
|
||||
<p>The character images are called <em>glyphs</em>. A single character |
||||
can have several distinct images, i.e. several glyphs, depending on |
||||
script, usage or context. Several characters can also take a single |
||||
glyph (good examples are Roman ligatures like "fi" and "fl" which can be |
||||
represented by a single glyph). The relationships between characters |
||||
and glyphs can be very complex, but won't be discussed in this document. |
||||
Moreover, some formats use more or less awkward schemes to store and |
||||
access glyphs. For the sake of clarity, we only retain the following |
||||
notions when working with FreeType:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>A font file contains a set of glyphs; each one can be stored as a |
||||
bitmap, a vector representation or any other scheme (most scalable |
||||
formats use a combination of mathematical representation and control |
||||
data/programs). These glyphs can be stored in any order in the font |
||||
file, and is typically accessed through a simple glyph index.</p> |
||||
</li> |
||||
<li> |
||||
<p>The font file contains one or more tables, called a <em>character |
||||
map</em> (or charmap in short), which is used to convert character |
||||
codes for a given encoding (e.g. ASCII, Unicode, DBCS, Big5, etc..) |
||||
into glyph indices relative to the font file. A single font face |
||||
may contain several charmaps. For example, most TrueType fonts |
||||
contain an Apple-specific charmap as well as a Unicode charmap, |
||||
which makes them usable on both Mac and Windows platforms.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Character and font metrics |
||||
</h3> |
||||
|
||||
<p>Each glyph image is associated with various metrics which are used to |
||||
describe how it must be placed and managed when rendering text. These |
||||
are described in more details in section III; they relate to glyph |
||||
placement, cursor advances as well as text layout. They are extremely |
||||
important to compute the flow of text when rendering a string of |
||||
text.</p> |
||||
|
||||
<p>Each scalable format also contains some global metrics, expressed in |
||||
notional units, to describe some properties of all glyphs in the same |
||||
face. Examples for global metrics are the maximum glyph bounding box, |
||||
the ascender, descender and text height for the font.</p> |
||||
|
||||
<p>Though these metrics also exist for non-scalable formats, they only |
||||
apply for a set of given character dimensions and resolutions, and are |
||||
usually expressed in pixels.</p> |
||||
|
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-2.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,397 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-1.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-3.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
II. Glyph outlines |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>This section describes the way scalable representations of glyph |
||||
images, called outlines, are used by FreeType as well as client |
||||
applications.</p> |
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Pixels, points and device resolutions |
||||
</h3> |
||||
|
||||
<p>Though it is a very common assumption when dealing with computer |
||||
graphics programs, the physical dimensions of a given pixel (be it for |
||||
screens or printers) are not squared. Often, the output device, be it a |
||||
screen or printer, exhibits varying resolutions in both horizontal and |
||||
vertical direction, and this must be taken care of when rendering |
||||
text.</p> |
||||
|
||||
<p>It is thus common to define a device's characteristics through two |
||||
numbers expressed in <em>dpi</em> (dots per inch). For example, a |
||||
printer with a resolution of 300x600 dpi has 300 pixels per |
||||
inch in the horizontal direction, and 600 in the vertical one. The |
||||
resolution of a typical computer monitor varies with its size |
||||
(15" and 17" monitors don't have the same pixel sizes at |
||||
640x480), and of course the graphics mode resolution.</p> |
||||
|
||||
<p>As a consequence, the size of text is usually given in |
||||
<em>points</em>, rather than device-specific pixels. Points are a |
||||
simple <em>physical</em> unit, where 1 point = 1/72th of |
||||
an inch, in digital typography. As an example, most Roman books are |
||||
printed with a body text whose size is somewhere between 10 and |
||||
14 points.</p> |
||||
|
||||
<p>It is thus possible to compute the size of text in pixels from the |
||||
size in points with the following formula:</p> |
||||
|
||||
<center> |
||||
<tt>pixel_size = point_size * resolution / 72</tt> |
||||
</center> |
||||
|
||||
<p>The resolution is expressed in <em>dpi</em>. Since horizontal and |
||||
vertical resolutions may differ, a single point size usually defines a |
||||
different text width and height in pixels.</p> |
||||
|
||||
<p><em>Unlike what is often thought, the "size of text in pixels" is not |
||||
directly related to the real dimensions of characters when they are |
||||
displayed or printed. The relationship between these two concepts is a |
||||
bit more complex and relate to some design choices made by the font |
||||
designer. This is described in more detail in the next sub-section (see |
||||
the explanations on the EM square).</em></p> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Vectorial representation |
||||
</h3> |
||||
|
||||
<p>The source format of outlines is a collection of closed paths called |
||||
<em>contours</em>. Each contour delimits an outer or inner |
||||
<em>region</em> of the glyph, and can be made of either <em>line |
||||
segments</em> or <em>Bézier arcs</em>.</p> |
||||
|
||||
<p>The arcs are defined through <em>control points</em>, and can be |
||||
either second-order (these are <em>conic</em> Béziers) or |
||||
third-order (<em>cubic</em> Béziers) polynomials, depending on |
||||
the font format. Note that conic Béziers are usually called |
||||
<em>quadratic</em> Béziers in the literature. Hence, each point |
||||
of the outline has an associated flag indicating its type (normal or |
||||
control point). And scaling the points will scale the whole |
||||
outline.</p> |
||||
|
||||
<p>Each glyph's original outline points are located on a grid of |
||||
indivisible units. The points are usually stored in a font file as |
||||
16-bit integer grid coordinates, with the grid origin's being at (0,0); |
||||
they thus range from -16384 to 16383. (Even though point |
||||
coordinates can be floats in other formats such as Type 1, we will |
||||
restrict our analysis to integer values for simplicity).</p> |
||||
|
||||
<p><em>The grid is always oriented like the traditional mathematical |
||||
two-dimensional plane, i.e., the <i>X</i> axis from the left to the |
||||
right, and the <i>Y</i> axis from bottom to top.</em></p> |
||||
|
||||
<p>In creating the glyph outlines, a type designer uses an imaginary |
||||
square called the <em>EM square</em>. Typically, the EM square can be |
||||
thought of as a tablet on which the characters are drawn. The square's |
||||
size, i.e., the number of grid units on its sides, is very important for |
||||
two reasons:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>It is the reference used to scale the outlines to a given text |
||||
dimension. For example, a size of 12pt at 300x300 dpi |
||||
corresponds to 12*300/72 = 50 pixels. This is the |
||||
size the EM square would appear on the output device if it was |
||||
rendered directly. In other words, scaling from grid units to |
||||
pixels uses the formula:</p> |
||||
|
||||
<p><center> |
||||
<tt>pixel_size = point_size * resolution / 72</tt><br> |
||||
<tt>pixel_coord = grid_coord * pixel_size / EM_size</tt> |
||||
</center></p> |
||||
</li> |
||||
<li> |
||||
<p>The greater the EM size is, the larger resolution the designer |
||||
can use when digitizing outlines. For example, in the extreme |
||||
example of an EM size of 4 units, there are only 25 point |
||||
positions available within the EM square which is clearly not |
||||
enough. Typical TrueType fonts use an EM size of 2048 units; |
||||
Type 1 PostScript fonts have a fixed EM size of 1000 grid |
||||
units but point coordinates can be expressed as floating values.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Note that glyphs can freely extend beyond the EM square if the font |
||||
designer wants so. The EM is used as a convenience, and is a valuable |
||||
convenience from traditional typography.</p> |
||||
|
||||
<p>Grid units are very often called <em>font units</em> or <em>EM |
||||
units</em>.</p> |
||||
|
||||
<p><em>As said before, <tt>pixel_size</tt> computed in the above formula |
||||
does not relate directly to the size of characters on the screen. It |
||||
simply is the size of the EM square if it was to be displayed. Each |
||||
font designer is free to place its glyphs as it pleases him within the |
||||
square. This explains why the letters of the following text have not |
||||
the same height, even though they are displayed at the same point size |
||||
with distinct fonts:</em> |
||||
|
||||
<p><center> |
||||
<img src="body_comparison.png" |
||||
height=40 width=580 |
||||
alt="Comparison of font heights"> |
||||
</center></p> |
||||
|
||||
<p>As one can see, the glyphs of the Courier family are smaller than |
||||
those of Times New Roman, which themselves are slightly smaller than |
||||
those of Arial, even though everything is displayed or printed at a size |
||||
of 16 points. This only reflects design choices.</p> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Hinting and Bitmap rendering |
||||
</h3> |
||||
|
||||
<p>The outline as stored in a font file is called the "master" outline, |
||||
as its points coordinates are expressed in font units. Before it can be |
||||
converted into a bitmap, it must be scaled to a given size/resolution. |
||||
This is done through a very simple transformation, but always creates |
||||
undesirable artifacts, e.g. stems of different widths or heights in |
||||
letters like "E" or "H".</p> |
||||
|
||||
<p>As a consequence, proper glyph rendering needs the scaled points to |
||||
be aligned along the target device pixel grid, through an operation |
||||
called <em>grid-fitting</em> (often called<em>hinting</em>). One of its |
||||
main purposes is to ensure that important widths and heights are |
||||
respected throughout the whole font (for example, it is very often |
||||
desirable that the "I" and the "T" have their central vertical line of |
||||
the same pixel width), as well as to manage features like stems and |
||||
overshoots, which can cause problems at small pixel sizes.</p> |
||||
|
||||
<p>There are several ways to perform grid-fitting properly; most |
||||
scalable formats associate some control data or programs with each glyph |
||||
outline. Here is an overview:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>explicit grid-fitting</em></p> |
||||
|
||||
<p>The TrueType format defines a stack-based virtual machine, for |
||||
which programs can be written with the help of more than |
||||
200 opcodes (most of these relating to geometrical operations). |
||||
Each glyph is thus made of both an outline and a control program to |
||||
perform the actual grid-fitting in the way defined by the font |
||||
designer.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>implicit grid-fitting (also called hinting)</em></p> |
||||
|
||||
<p>The Type 1 format takes a much simpler approach: Each glyph |
||||
is made of an outline as well as several pieces called |
||||
<em>hints</em> which are used to describe some important features of |
||||
the glyph, like the presence of stems, some width regularities, and |
||||
the like. There aren't a lot of hint types, and it is up to the |
||||
final renderer to interpret the hints in order to produce a fitted |
||||
outline.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>automatic grid-fitting</em></p> |
||||
|
||||
<p>Some formats simply include no control information with each |
||||
glyph outline, apart from metrics like the advance width and height. |
||||
It is then up to the renderer to "guess" the more interesting |
||||
features of the outline in order to perform some decent |
||||
grid-fitting.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>The following table summarises the pros and cons of each scheme.</p> |
||||
|
||||
<center> |
||||
<table width="90%" |
||||
bgcolor="#CCCCCC" |
||||
cellpadding=5> |
||||
<tr bgcolor="#999999"> |
||||
<td> |
||||
<center> |
||||
<b>grid-fitting scheme</b> |
||||
</center> |
||||
</td> |
||||
<td> |
||||
<center> |
||||
<b>advantages</b> |
||||
</center> |
||||
</td> |
||||
<td> |
||||
<center> |
||||
<b>disadvantages</b> |
||||
</center> |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<center> |
||||
<b>explicit</b> |
||||
</center> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Quality.</b> Excellent results at small sizes are possible. |
||||
This is very important for screen display.</p> |
||||
|
||||
<p><b>Consistency.</b> All renderers produce the same glyph |
||||
bitmaps.</p> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Speed.</b> Intepreting bytecode can be slow if the glyph |
||||
programs are complex.</p> |
||||
|
||||
<p><b>Size.</b> Glyph programs can be long.</p> |
||||
|
||||
<p><b>Technical difficulty.</b> |
||||
It is extremely difficult to write good hinting |
||||
programs. Very few tools available.</p> |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td valign=top> |
||||
<center> |
||||
<b>implicit</b> |
||||
</center> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Size.</b> Hints are usually much smaller than explicit glyph |
||||
programs.</p> |
||||
|
||||
<p><b>Speed.</b> |
||||
Grid-fitting is usually a fast process.</p> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Quality.</b> Often questionable at small sizes. Better with |
||||
anti-aliasing though.</p> |
||||
|
||||
<p><b>Inconsistency.</b> Results can vary between different |
||||
renderers, or even distinct versions of the same engine.</p> |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<center> |
||||
<b>automatic</b> |
||||
</center> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Size.</b> No need for control information, resulting in |
||||
smaller font files.</p> |
||||
|
||||
<p><b>Speed.</b> Depends on the grid-fitting algorithm. Usually |
||||
faster than explicit grid-fitting.</p> |
||||
</td> |
||||
|
||||
<td valign=top> |
||||
<p><b>Quality.</b> Often questionable at small sizes. Better with |
||||
anti-aliasing though.</p> |
||||
|
||||
<p><b>Speed.</b> Depends on the grid-fitting algorithm.</p> |
||||
|
||||
<p><b>Inconsistency.</b> Results can vary between different |
||||
renderers, or even distinct versions of the same engine.</p> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-1.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-3.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,430 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-2.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-4.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
III. Glyph metrics |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Baseline, pens and layouts |
||||
</h3> |
||||
|
||||
<p>The baseline is an imaginary line that is used to "guide" glyphs when |
||||
rendering text. It can be horizontal (e.g. Roman, Cyrillic, Arabic, |
||||
etc.) or vertical (e.g. Chinese, Japanese, Korean, etc). Moreover, to |
||||
render text, a virtual point, located on the baseline, called the <em>pen |
||||
position</em> or <em>origin</em>, is used to locate glyphs.</p> |
||||
|
||||
<p>Each layout uses a different convention for glyph placement:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>With horizontal layout, glyphs simply "rest" on the baseline. |
||||
Text is rendered by incrementing the pen position, either to the |
||||
right or to the left.</p> |
||||
|
||||
<p>The distance between two successive pen positions is |
||||
glyph-specific and is called the <em>advance width</em>. Note that |
||||
its value is <em>always</em> positive, even for right-to-left |
||||
oriented alphabets, like Arabic. This introduces some differences |
||||
in the way text is rendered.</p> |
||||
|
||||
<p><em>The pen position is always placed on the baseline.</em></p> |
||||
|
||||
<p><center> |
||||
<img src="Image1.png" |
||||
height=179 width=458 |
||||
alt="horizontal layout"> |
||||
</center></p> |
||||
</li> |
||||
<li> |
||||
<p>With a vertical layout, glyphs are centered around the |
||||
baseline:</p> |
||||
|
||||
<p><center> |
||||
<img src="Image2.png" |
||||
height=275 width=162 |
||||
alt="vertical layout"> |
||||
</center></p> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Typographic metrics and bounding boxes |
||||
</h3> |
||||
|
||||
<p>A various number of face metrics are defined for all glyphs in a |
||||
given font.</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>Ascent</em></p> |
||||
|
||||
<p>The distance from the baseline to the highest/upper grid |
||||
coordinate used to place an outline point. It is a positive value, |
||||
due to the grid's orientation with the <i>Y</i> axis |
||||
upwards.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Descent</em></p> |
||||
|
||||
<p>The distance from the baseline to the lowest grid coordinate used |
||||
to place an outline point. This is a negative value, due to the |
||||
grid's orientation.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Linegap</em></p> |
||||
|
||||
<p>The distance that must be placed between two lines of text. The |
||||
baseline-to-baseline distance should be computed as: |
||||
|
||||
<center><p> |
||||
<tt>ascent - descent + linegap</tt> |
||||
</p></center> |
||||
|
||||
<p>if you use the typographic values.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Other, simpler metrics are:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>The glyph's bounding box</em>, also called <em>bbox</em></p> |
||||
|
||||
<p>This is an imaginary box that encloses all glyphs from the font, |
||||
usually as tightly as possible. It is represented by four fields, |
||||
namely <tt>xMin</tt>, <tt>yMin</tt>, <tt>xMax</tt>, and |
||||
<tt>yMax</tt>, that can be computed for any outline. Their values |
||||
can be in font units (if measured in the original outline) or in |
||||
fractional/integer pixel units (when measured on scaled |
||||
outlines).</p> |
||||
|
||||
<p>Note that if it wasn't for grid-fitting, you wouldn't need to |
||||
know a box's complete values, but only its dimensions to know how |
||||
big is a glyph outline/bitmap. However, correct rendering of hinted |
||||
glyphs needs the preservation of important grid alignment on each |
||||
glyph translation/placement on the baseline.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Internal leading</em></p> |
||||
|
||||
<p>This concept comes directly from the world of traditional |
||||
typography. It represents the amount of space within the |
||||
<em>leading</em> which is reserved for glyph features that lay |
||||
outside of the EM square (like accentuation). It usually can be |
||||
computed as:</p> |
||||
|
||||
<center><p> |
||||
<tt>internal leading = ascent - descent - EM_size</tt> |
||||
</p></center> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>External leading</em></p> |
||||
|
||||
<p>This is another name for the line gap.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Bearings and Advances |
||||
</h3> |
||||
|
||||
Each glyph has also distances called <em>bearings</em> and |
||||
<em>advances</em>. Their definition is constant, but their values |
||||
depend on the layout, as the same glyph can be used to render text |
||||
either horizontally or vertically: |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>Left side bearing</em> or <em>bearingX</em></p> |
||||
|
||||
<p>The horizontal distance from the current pen position to the |
||||
glyph's left bbox edge. It is positive for horizontal layouts, and |
||||
in most cases negative for vertical ones.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Top side bearing</em> or <em>bearingY</em></p> |
||||
|
||||
<p>The vertical distance from the baseline to the top of the glyph's |
||||
bbox. It is usually positive for horizontal layouts, and negative |
||||
for vertical ones.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Advance width</em> or <em>advanceX</em></p> |
||||
|
||||
<p>The horizontal distance the pen position must be incremented (for |
||||
left-to-right writing) or decremented (for right-to-left writing) by |
||||
after each glyph is rendered when processing text. It is always |
||||
positive for horizontal layouts, and null for vertical ones.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Advance height</em> <em>advanceY</em></p> |
||||
|
||||
<p>The vertical distance the pen position must be decremented by |
||||
after each glyph is rendered. It is always null for horizontal |
||||
layouts, and positive for vertical layouts.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Glyph width</em></p> |
||||
|
||||
<p>The glyph's horizontal extent. For unscaled font coordinates, it |
||||
is <tt>bbox.xMax-bbox.xMin</tt>. For scaled glyphs, its computation |
||||
requests specific care, described in the grid-fitting chapter |
||||
below.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Glyph height</em> |
||||
|
||||
<p>The glyph's vertical extent. For unscaled font coordinates, it is |
||||
<tt>bbox.yMax-bbox.yMin</tt>. For scaled glyphs, its computation |
||||
requests specific care, described in the grid-fitting chapter |
||||
below.</p> |
||||
</li> |
||||
|
||||
<li> |
||||
<p><em>Right side bearing</em></p> |
||||
|
||||
<p>Only used for horizontal layouts to describe the distance from |
||||
the bbox's right edge to the advance width. It is in most cases a |
||||
non-negative number:</p> |
||||
|
||||
<p><center> |
||||
<tt>advance_width - left_side_bearing - (xMax-xMin)</tt> |
||||
</center></p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Here is a picture giving all the details for horizontal metrics: |
||||
|
||||
<center><p> |
||||
<img src="Image3.png" |
||||
height=253 width=388 |
||||
alt="horizontal glyph metrics"> |
||||
</p></center> |
||||
|
||||
<p>And here is another one for the vertical metrics:</p> |
||||
|
||||
<center><p> |
||||
<img src="Image4.png" |
||||
height=278 width=294 |
||||
alt="vertical glyph metrics"> |
||||
</p></center> |
||||
|
||||
|
||||
<a name="section-4"> |
||||
<h3> |
||||
4. The effects of grid-fitting |
||||
</h3> |
||||
|
||||
<p>Because hinting aligns the glyph's control points to the pixel grid, |
||||
this process slightly modifies the dimensions of character images in |
||||
ways that differ from simple scaling.</p> |
||||
|
||||
<p>For example, the image of the lowercase "m" letter sometimes fits a |
||||
square in the master grid. However, to make it readable at small pixel |
||||
sizes, hinting tends to enlarge its scaled outline in order to keep its |
||||
three legs distinctly visible, resulting in a larger character |
||||
bitmap.</p> |
||||
|
||||
<p>The glyph metrics are also influenced by the grid-fitting process: |
||||
|
||||
<ul> |
||||
<li> |
||||
The image's width and height are altered. Even if this is only by |
||||
one pixel, it can make a big difference at small pixel sizes. |
||||
</li> |
||||
<li> |
||||
The image's bounding box is modified, thus modifying the bearings. |
||||
</li> |
||||
<li> |
||||
The advances must be updated. For example, the advance width must |
||||
be incremented if the hinted bitmap is larger than the scaled one, |
||||
to reflect the augmented glyph width. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>This has some implications:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
Because of hinting, simply scaling the font ascent or descent might |
||||
not give correct results. A possible solution is to keep the |
||||
ceiling of the scaled ascent, and floor of the scaled descent. |
||||
</li> |
||||
|
||||
<li> |
||||
There is no easy way to get the hinted glyph and advance widths of a |
||||
range of glyphs, as hinting works differently on each outline. The |
||||
only solution is to hint each glyph separately and record the |
||||
returned values. Some formats, like TrueType, even include a table |
||||
of pre-computed values for a small set of common character pixel |
||||
sizes. |
||||
</li> |
||||
<li> |
||||
Hinting depends on the final character width and height in pixels, |
||||
which means that it is highly resolution-dependent. This property |
||||
makes correct WYSIWYG layouts difficult to implement. |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
<em> |
||||
<p>Performing 2D transformations on glyph outlines is very easy with |
||||
FreeType. However, when using translation on a hinted outlines, one |
||||
should aways take care of <b>exclusively using integer pixel |
||||
distances</b> (which means that the parameters to the |
||||
<tt>FT_Translate_Outline()</tt> API should all be multiples |
||||
of 64, as the point coordinates are in 26.6 fixed float |
||||
format).</p> |
||||
|
||||
<p>Otherwise, the translation will simply <em>ruin the hinter's |
||||
work</em>, resulting in a very low quality bitmaps!</p> |
||||
</em> |
||||
|
||||
|
||||
<a name="section-5"> |
||||
<h3> |
||||
5. Text widths and bounding box |
||||
</h3> |
||||
|
||||
<p>As seen before, the "origin" of a given glyph corresponds to the |
||||
position of the pen on the baseline. It is not necessarily located on |
||||
one of the glyph's bounding box corners, unlike many typical bitmapped |
||||
font formats. In some cases, the origin can be out of the bounding box, |
||||
in others, it can be within it, depending on the shape of the given |
||||
glyph.</p> |
||||
|
||||
<p>Likewise, the glyph's "advance width" is the increment to apply to |
||||
the pen position during layout, and is not related to the glyph's |
||||
"width", which really is the glyph's bounding width. |
||||
|
||||
<p>The same conventions apply to strings of text. This means that: |
||||
|
||||
<ul> |
||||
<li> |
||||
The bounding box of a given string of text doesn't necessarily |
||||
contain the text cursor, nor is the latter located on one of its |
||||
corners. |
||||
</li> |
||||
|
||||
<li> |
||||
The string's advance width isn't related to its bounding box |
||||
dimensions. Especially if it contains beginning and terminal spaces |
||||
or tabs. |
||||
</li> |
||||
<li> |
||||
Finally, additional processing like kerning creates strings of text |
||||
whose dimensions are not directly related to the simple |
||||
juxtaposition of individual glyph metrics. For example, the advance |
||||
width of "VA" isn't the sum of the advances of "V" and "A" taken |
||||
separately. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-2.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-4.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,231 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-3.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-4.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
IV. Kerning |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>The term <em>kerning</em> refers to specific information used to |
||||
adjust the relative positions of coincident glyphs in a string of text. |
||||
This section describes several types of kerning information, as well as |
||||
the way to process them when performing text layout.</p> |
||||
|
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Kerning pairs |
||||
</h3> |
||||
|
||||
<p>Kerning consists of modifying the spacing between two successive |
||||
glyphs according to their outlines. For example, a "T" and a "y" can be |
||||
easily moved closer, as the top of the "y" fits nicely under the upper |
||||
right bar of the "T".</p> |
||||
|
||||
<p>When laying out text with only their standard widths, some |
||||
consecutive glyphs seem a bit too close or too distant. For example, |
||||
the space between the "A" and the "V" in the following word seems a |
||||
little wider than needed.</p> |
||||
|
||||
<center><p> |
||||
<img src="bravo_unkerned.png" |
||||
height=37 width=116 |
||||
alt="the word 'bravo' unkerned"> |
||||
</p></center> |
||||
|
||||
<p>Compare this to the same word, where the distance between these two |
||||
letters has been slightly reduced:</p> |
||||
|
||||
<center><p> |
||||
<img src="bravo_kerned.png" |
||||
height=37 width=107 |
||||
alt="the word 'bravo' with kerning"> |
||||
</p></center> |
||||
|
||||
<p>As you can see, this adjustment can make a great difference. Some |
||||
font faces thus include a table containing kerning distances for a set |
||||
of given glyph pairs for text layout.</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>The pairs are ordered, i.e., the space for pair (A,V) isn't |
||||
necessarily the space for pair (V,A). They also index glyphs, and |
||||
not characters.</p> |
||||
</li> |
||||
<li> |
||||
<p>Kerning distances can be expressed in horizontal or vertical |
||||
directions, depending on layout and/or script. For example, some |
||||
horizontal layouts like Arabic can make use of vertical kerning |
||||
adjustments between successive glyphs. A vertical script can have |
||||
vertical kerning distances.</p> |
||||
</li> |
||||
<li> |
||||
<p>Kerning distances are expressed in grid units. They are usually |
||||
oriented in the <i>X</i> axis, which means that a negative |
||||
value indicates that two glyphs must be set closer in a horizontal |
||||
layout.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Applying kerning |
||||
</h3> |
||||
|
||||
<p>Applying kerning when rendering text is a rather easy process. It |
||||
merely consists in adding the scaled kern distance to the pen position |
||||
before writing each next glyph. However, the typographically correct |
||||
renderer must take a few more details in consideration.</p> |
||||
|
||||
<p>The "sliding dot" problem is a good example: Many font faces include |
||||
a kerning distance between capital letters like "T" or "F" and a |
||||
following dot ("."), in order to slide the latter glyph just right to |
||||
their main leg:</p> |
||||
|
||||
<center><p> |
||||
<img src="twlewis1.png" |
||||
height=38 width=314 |
||||
alt="example for sliding dots"> |
||||
</p></center> |
||||
|
||||
<p>This sometimes requires additional adjustments between the dot and |
||||
the letter following it, depending on the shapes of the enclosing |
||||
letters. When applying "standard" kerning adjustments, the previous |
||||
sentence would become:</p> |
||||
|
||||
<center><p> |
||||
<img src="twlewis2.png" |
||||
height=36 width=115 |
||||
alt="example for too much kerning"> |
||||
</p></center> |
||||
|
||||
<p>This is clearly too contracted. The solution here, as exhibited in |
||||
the first example, is to only slide the dots when possible. Of course, |
||||
this requires a certain knowledge of the text's meaning. The above |
||||
adjustments would not necessarily be welcome if we were rendering the |
||||
final dot of a given paragraph.</p. |
||||
|
||||
<p>This is only one example, and there are many others showing that a |
||||
real typographer is needed to layout text properly. If not available, |
||||
some kind of user interaction or tagging of the text could be used to |
||||
specify some adjustments, but in all cases, this requires some support |
||||
in applications and text libraries.</p> |
||||
|
||||
<p>For more mundane and common uses, however, we can have a very simple |
||||
algorithm, which avoids the sliding dot problem, and others, though not |
||||
producing optimal results. It can be seen as</p> |
||||
|
||||
<ol> |
||||
<li> |
||||
Place the first glyph on the baseline. |
||||
</li> |
||||
<li> |
||||
Save the location of the pen position/origin in <tt>pen1</tt>. |
||||
</li> |
||||
<li> |
||||
Adjust the pen position with the kerning distance between the first |
||||
and second glyph. |
||||
</li> |
||||
<li> |
||||
Place the second glyph and compute the next pen position/origin in |
||||
<tt>pen2</tt>. |
||||
</li> |
||||
<li> |
||||
Use <tt>pen1</tt> as the next pen position if it is beyond |
||||
<tt>pen2</tt>, use <tt>pen2</tt> otherwise. |
||||
</li> |
||||
</ol> |
||||
|
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-3.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-5.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,484 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-4.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-6.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
V. Text processing |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>This section demonstrates how to use the concepts previously defined |
||||
to render text, whatever the layout you use.</p> |
||||
|
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Writing simple text strings |
||||
</h3> |
||||
|
||||
<p>In this first example, we will generate a simple string of Roman |
||||
text, i.e. with a horizontal left-to-right layout. Using exclusively |
||||
pixel metrics, the process looks like: |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its 'origin' matches the pen position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Increment the pen position by the glyph's advance width in pixels. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
<li> |
||||
When all glyphs are done, set the text cursor to the new pen |
||||
position. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
<p>Note that kerning isn't part of this algorithm.</p> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Sub-pixel positioning |
||||
</h3> |
||||
|
||||
<p>It is somewhat useful to use sub-pixel positioning when rendering |
||||
text. This is crucial, for example, to provide semi-WYSIWYG text |
||||
layouts. Text rendering is very similar to the algorithm described in |
||||
subsection 1, with the following few differences:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
The pen position is expressed in fractional pixels. |
||||
</li> |
||||
<li> |
||||
Because translating a hinted outline by a non-integer distance will |
||||
ruin its grid-fitting, the position of the glyph origin must be |
||||
rounded before rendering the character image. |
||||
</li> |
||||
<li> |
||||
The advance width is expressed in fractional pixels, and isn't |
||||
necessarily an integer. |
||||
</li> |
||||
</ol> |
||||
|
||||
<p>Here an improved version of the algorithm:</p> |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. This can be a non-integer |
||||
point. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its "origin" matches the rounded pen |
||||
position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Increment the pen position by the glyph's advance width in |
||||
fractional pixels. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
<li> |
||||
When all glyphs are done, set the text cursor to the new pen |
||||
position. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
<p>Note that with fractional pixel positioning, the space between two |
||||
given letters isn't fixed, but determined by the accumulation of |
||||
previous rounding errors in glyph positioning.</p> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Simple kerning |
||||
</h3> |
||||
|
||||
<p>Adding kerning to the basic text rendering algorithm is easy: When a |
||||
kerning pair is found, simply add the scaled kerning distance to the pen |
||||
position before step 4. Of course, the distance should be rounded |
||||
in the case of algorithm 1, though it doesn't need to for |
||||
algorithm 2. This gives us:</p> |
||||
|
||||
<p>Algorithm 1 with kerning:</p> |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Add the rounded scaled kerning distance, if any, to the pen |
||||
position. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its "origin" matches the pen position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Increment the pen position by the glyph's advance width in pixels. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
<p>Algorithm 2 with kerning:</p> |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Add the scaled unrounded kerning distance, if any, to the pen |
||||
position. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its "origin" matches the rounded pen |
||||
position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Increment the pen position by the glyph's advance width in |
||||
fractional pixels. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
Of course, the algorithm described in section IV can also be |
||||
applied to prevent the sliding dot problem if one wants to. |
||||
|
||||
|
||||
<a name="section-4"> |
||||
<h3> |
||||
4. Right-to-left layout |
||||
</h3> |
||||
|
||||
<p>The process of laying out Arabic or Hebrew text is extremely similar. |
||||
The only difference is that the pen position must be decremented before |
||||
the glyph rendering (remember: the advance width is always positive, |
||||
even for Arabic glyphs).</p> |
||||
|
||||
<p>Right-to-left algorithm 1:</p> |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Decrement the pen position by the glyph's advance width in pixels. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its "origin" matches the pen position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
<p>The changes to algorithm 2, as well as the inclusion of kerning |
||||
are left as an exercise to the reader.</p> |
||||
|
||||
|
||||
<a name="section-5"> |
||||
<h3> |
||||
5. Vertical layouts |
||||
</h3> |
||||
|
||||
<p>Laying out vertical text uses exactly the same processes, with the |
||||
following significant differences:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>The baseline is vertical, and the vertical metrics must be used |
||||
instead of the horizontal one.</p> |
||||
</li> |
||||
<li> |
||||
<p>The left bearing is usually negative, but this doesn't change the |
||||
fact that the glyph origin must be located on the baseline.</p> |
||||
</li> |
||||
<li> |
||||
The advance height is always positive, so the pen position must be |
||||
decremented if one wants to write top to bottom (assuming the |
||||
<i>Y</i> axis is oriented upwards). |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Here the algorithm:</p> |
||||
|
||||
<tt> |
||||
<ol> |
||||
<li> |
||||
Convert the character string into a series of glyph |
||||
indices. |
||||
</li> |
||||
<li> |
||||
Place the pen to the cursor position. |
||||
</li> |
||||
<li> |
||||
Get or load the glyph image. |
||||
</li> |
||||
<li> |
||||
Translate the glyph so that its "origin" matches the pen position. |
||||
</li> |
||||
<li> |
||||
Render the glyph to the target device. |
||||
</li> |
||||
<li> |
||||
Decrement the vertical pen position by the glyph's advance height |
||||
in pixels. |
||||
</li> |
||||
<li> |
||||
Start over at step 3 for each of the remaining glyphs. |
||||
</li> |
||||
<li> |
||||
When all glyphs are done, set the text cursor to the new pen |
||||
position. |
||||
</li> |
||||
</ol> |
||||
</tt> |
||||
|
||||
|
||||
<a name="section-6"> |
||||
<h3> |
||||
6. WYSIWYG text layouts |
||||
</h3> |
||||
|
||||
<p>As you probably know, the acronym WYSIWYG stands for "What You See Is |
||||
What You Get". Basically, this means that the output of a document on |
||||
the screen should match "perfectly" its printed version. A |
||||
<em>true</em> WYSIWYG system requires two things:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p><em>device-independent text layout</em></p> |
||||
|
||||
<p>This means that the document's formatting is the same on the |
||||
screen than on any printed output, including line breaks, |
||||
justification, ligatures, fonts, position of inline images, etc.</p> |
||||
</li> |
||||
<li> |
||||
<p><em>matching display and print character sizes</em></p> |
||||
|
||||
<p>The displayed size of a given character should match its |
||||
dimensions when printed. For example, a text string which is |
||||
exactly 1 inch tall when printed should also appear 1 inch |
||||
tall on the screen (when using a scale of 100%).</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>It is clear that matching sizes cannot be possible if the computer |
||||
has no knowledge of the physical resolutions of the display device(s) it |
||||
is using. And of course, this is the most common case! That is not too |
||||
unfortunate, however, because most users really don't care about this |
||||
feature. Legibility is much more important.</p> |
||||
|
||||
<p>When the Mac appeared, Apple decided to choose a resolution of |
||||
72 dpi to describe the Macintosh screen to the font sub-system |
||||
(whatever the monitor used). This choice was most probably driven by |
||||
the fact that, at this resolution, 1 point equals exactly |
||||
1 pixel. However, it neglected one crucial fact: As most users |
||||
tend to choose a document character size between 10 and 14 points, |
||||
the resultant displayed text was rather small and not too legible |
||||
without scaling. Microsoft engineers took notice of this problem and |
||||
chose a resolution of 96 dpi on Windows, which resulted in slightly |
||||
larger, and more legible, displayed characters (for the same printed |
||||
text size).</p> |
||||
|
||||
<p>These distinct resolutions explain some differences when displaying |
||||
text at the same character size on a Mac and a Windows machine. |
||||
Moreover, it is not unusual to find some TrueType fonts with enhanced |
||||
hinting (technical note: through delta-hinting) for the sizes of 10, 12, |
||||
14 and 16 points at 96 dpi.</p> |
||||
|
||||
<p>The term <em>device-independent text</em> is, unfortunately, often |
||||
abused. For example, many word processors, including MS Word, do |
||||
not really use device-independent glyph positioning algorithms when |
||||
laying out text. Rather, they use the target printer's resolution to |
||||
compute <em>hinted</em> glyph metrics for the layout. Though it |
||||
guarantees that the printed version is always the "nicest" it can be, |
||||
especially for very low resolution printers (like dot-matrix), it has a |
||||
very sad effect: Changing the printer can have dramatic effects on the |
||||
<em>whole</em> document layout, especially if it makes strong use of |
||||
justification, uses few page breaks, etc.</p> |
||||
|
||||
<p>Because glyph metrics vary slightly when the resolution changes (due |
||||
to hinting), line breaks can change enormously, when these differences |
||||
accumulate over long runs of text. Try for example printing a very long |
||||
document (with no page breaks) on a 300 dpi ink-jet printer, then |
||||
the same one on a 3000 dpi laser printer: You will be extremely |
||||
lucky if your final page count didn't change between the prints! Of |
||||
course, we can still call this WYSIWYG, as long as the printer |
||||
resolution is fixed.</p> |
||||
|
||||
<p>Some applications, like Adobe Acrobat, which targeted |
||||
device-independent placement from the start, do not suffer from this |
||||
problem. There are two ways to achieve this: either use the scaled and |
||||
unhinted glyph metrics when laying out text both in the rendering and |
||||
printing processes, or simply use whatever metrics you want and store |
||||
them with the text in order to get sure they are printed the same on all |
||||
devices (the latter being probably the best solution, as it also enables |
||||
font substitution without breaking text layouts).</p> |
||||
|
||||
<p>Just like matching sizes, device-independent placement isn't |
||||
necessarily a feature that most users want. However, it is pretty clear |
||||
that for any kind of professional document processing work, it |
||||
<em>is</em> a requirement.</p> |
||||
|
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-4.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-6.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,432 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-5.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-7.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
VI. FreeType outlines |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>The purpose of this section is to present the way FreeType manages |
||||
vectorial outlines, as well as the most common operations that can be |
||||
applied on them.</p> |
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. FreeType outline description and structure |
||||
</h3> |
||||
|
||||
<h4> |
||||
a. Outline curve decomposition |
||||
</h4> |
||||
|
||||
<p>An outline is described as a series of closed contours in the 2D |
||||
plane. Each contour is made of a series of line segments and |
||||
Bézier arcs. Depending on the file format, these can be |
||||
second-order or third-order polynomials. The former are also called |
||||
quadratic or conic arcs, and they are used in the TrueType format. |
||||
The latter are called cubic arcs and are mostly used in the |
||||
Type 1 format.</p> |
||||
|
||||
<p>Each arc is described through a series of start, end, and control |
||||
points. Each point of the outline has a specific tag which indicates |
||||
whether it is used to describe a line segment or an arc. The tags can |
||||
take the following values:</p> |
||||
|
||||
<center> |
||||
<table cellspacing=5 |
||||
cellpadding=5 |
||||
width="80%"> |
||||
<tr VALIGN=TOP> |
||||
<td valign=top> |
||||
<tt>FT_Curve_Tag_On</tt> |
||||
</td> |
||||
<td valign=top> |
||||
<p>Used when the point is "on" the curve. This corresponds to |
||||
start and end points of segments and arcs. The other tags specify |
||||
what is called an "off" point, i.e. a point which isn't located on |
||||
the contour itself, but serves as a control point for a |
||||
Bézier arc.</p> |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>FT_Curve_Tag_Conic</tt> |
||||
</td> |
||||
<td valign=top> |
||||
<p>Used for an "off" point used to control a conic Bézier |
||||
arc.</p> |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>FT_Curve_Tag_Cubic</tt> |
||||
</td> |
||||
<td valign=top> |
||||
<p>Used for an "off" point used to control a cubic Bézier |
||||
arc.</p> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p>The following rules are applied to decompose the contour's points |
||||
into segments and arcs:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
Two successive "on" points indicate a line segment joining them. |
||||
</li> |
||||
<li> |
||||
One conic "off" point amidst two "on" points indicates a conic |
||||
Bézier arc, the "off" point being the control point, and |
||||
the "on" ones the start and end points. |
||||
</li> |
||||
<li> |
||||
Two successive cubic "off" points amidst two "on" points indicate |
||||
a cubic Bézier arc. There must be exactly two cubic |
||||
control points and two "on" points for each cubic arc (using a |
||||
single cubic "off" point between two "on" points is forbidden, for |
||||
example). |
||||
</li> |
||||
<li> |
||||
Finally, two successive conic "off" points forces the rasterizer |
||||
to create (during the scan-line conversion process exclusively) a |
||||
virtual "on" point amidst them, at their exact middle. This |
||||
greatly facilitates the definition of successive conic |
||||
Bézier arcs. Moreover, it is the way outlines are |
||||
described in the TrueType specification. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>Note that it is possible to mix conic and cubic arcs in a single |
||||
contour, even though no current font driver produces such |
||||
outlines.</p> |
||||
|
||||
<center> |
||||
<table> |
||||
<tr> |
||||
<td> |
||||
<img src="points_segment.png" |
||||
height=166 width=221 |
||||
alt="segment example"> |
||||
</td> |
||||
<td> |
||||
<img src="points_conic.png" |
||||
height=183 width=236 |
||||
alt="conic arc example"> |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td> |
||||
<img src="points_cubic.png" |
||||
height=162 width=214 |
||||
alt="cubic arc example"> |
||||
</td> |
||||
<td> |
||||
<img src="points_conic2.png" |
||||
height=204 width=225 |
||||
alt="cubic arc with virtual 'on' point"> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
|
||||
<h4> |
||||
b. Outline descriptor |
||||
</h4> |
||||
|
||||
<p>A FreeType outline is described through a simple structure:</p> |
||||
|
||||
<center> |
||||
<table cellspacing=3 |
||||
cellpadding=3> |
||||
<caption> |
||||
<b><tt>FT_Outline</tt></b> |
||||
</caption> |
||||
|
||||
<tr> |
||||
<td> |
||||
<tt>n_points</tt> |
||||
</td> |
||||
<td> |
||||
the number of points in the outline |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td> |
||||
<tt>n_contours</tt> |
||||
</td> |
||||
<td> |
||||
the number of contours in the outline |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td> |
||||
<tt>points</tt> |
||||
</td> |
||||
<td> |
||||
array of point coordinates |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td> |
||||
<tt>contours</tt> |
||||
</td> |
||||
<td> |
||||
array of contour end indices |
||||
</td> |
||||
</tr> |
||||
<tr> |
||||
<td> |
||||
<tt>tags</tt> |
||||
</td> |
||||
<td> |
||||
array of point flags |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p>Here, <tt>points</tt> is a pointer to an array of |
||||
<tt>FT_Vector</tt> records, used to store the vectorial coordinates of |
||||
each outline point. These are expressed in 1/64th of a pixel, which |
||||
is also known as the <em>26.6 fixed float format</em>.</p> |
||||
|
||||
<p><tt>contours</tt> is an array of point indices used to delimit |
||||
contours in the outline. For example, the first contour always starts |
||||
at point 0, and ends at point <tt>contours[0]</tt>. The second |
||||
contour starts at point <tt>contours[0]+1</tt> and ends at |
||||
<tt>contours[1]</tt>, etc.</p> |
||||
|
||||
<p>Note that each contour is closed, and that <tt>n_points</tt> should |
||||
be equal to <tt>contours[n_contours-1]+1</tt> for a valid outline.</p> |
||||
|
||||
<p>Finally, <tt>tags</tt> is an array of bytes, used to store each |
||||
outline point's tag.</p> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. Bounding and control box computations |
||||
</h3> |
||||
|
||||
<p>A <em>bounding box</em> (also called <em>bbox</em>) is simply a |
||||
rectangle that completely encloses the shape of a given outline. The |
||||
interesting case is the smallest bounding box possible, and in the |
||||
following we subsume this under the term "bounding box". Because of the |
||||
way arcs are defined, Bézier control points are not necessarily |
||||
contained within an outline's (smallest) bounding box.</p> |
||||
|
||||
<p>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.</p> |
||||
|
||||
<p>We thus define the <em>control box</em> (also called <em>cbox</em>) |
||||
as the smallest possible rectangle that encloses all points of a given |
||||
outline (including its "off" points). Clearly, it always includes the |
||||
bbox, and equates it in most cases.</p> |
||||
|
||||
<p>Unlike the bbox, the cbox is much faster to compute.</p> |
||||
|
||||
<center> |
||||
<table> |
||||
<tr> |
||||
<td> |
||||
<img src="bbox1.png" |
||||
height=264 width=228 |
||||
alt="a glyph with different bbox and cbox"> |
||||
</td> |
||||
<td> |
||||
<img src="bbox2.png" |
||||
height=229 width=217 |
||||
alt="a glyph with identical bbox and cbox"> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p>Control and bounding boxes can be computed automatically through the |
||||
functions <tt>FT_Get_Outline_CBox()</tt> and |
||||
<tt>FT_Get_Outline_BBox()</tt>. The former function is always very |
||||
fast, while the latter <em>may</em> 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. |
||||
|
||||
<p>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.</p> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Coordinates, scaling and grid-fitting |
||||
</h3> |
||||
|
||||
<p>An outline point's vectorial coordinates are expressed in the |
||||
26.6 format, i.e. in 1/64th of a pixel, hence the coordinates |
||||
(1.0,-2.5) are stored as the integer pair (x:64,y:-192).</p> |
||||
|
||||
<p>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.</p> |
||||
|
||||
<p>The following operations can be used to round vectorial distances in |
||||
the 26.6 format to the grid:</p> |
||||
|
||||
<pre> |
||||
round( x ) == ( x + 32 ) & -64 |
||||
floor( x ) == x & -64 |
||||
ceiling( x ) == ( x + 63 ) & -64</pre> |
||||
|
||||
<p>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:</p> |
||||
|
||||
<p>The scan-line converter draws all the pixels whose <em>centers</em> |
||||
fall inside the glyph shape. It can also detect <em>drop-outs</em>, |
||||
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.</p> |
||||
|
||||
<p>This leads to the following computations:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>compute the bbox</p> |
||||
</li> |
||||
<li> |
||||
<p>grid-fit the bounding box with the following:</p> |
||||
|
||||
<pre> |
||||
xmin = floor( bbox.xMin ) |
||||
xmax = ceiling( bbox.xMax ) |
||||
ymin = floor( bbox.yMin ) |
||||
ymax = ceiling( bbox.yMax )</pre> |
||||
</li> |
||||
<li> |
||||
return pixel dimensions, i.e. |
||||
|
||||
<pre> |
||||
width = (xmax - xmin)/64</pre> |
||||
|
||||
and |
||||
|
||||
<pre> |
||||
height = (ymax - ymin)/64</pre> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>By grid-fitting the bounding box, it is guaranteed that all the pixel |
||||
centers that are to be drawn, <em>including those coming from drop-out |
||||
control</em>, will be <em>within</em> the adjusted box. Then the box's |
||||
dimensions in pixels can be computed.</p> |
||||
|
||||
<p>Note also that, when translating a grid-fitted outline, one should |
||||
<em>always use integer distances</em> 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 <em>very low |
||||
quality </em>bitmaps and pixmaps.</p> |
||||
|
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-5.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-7.html">Next</a> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
@ -1,356 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="65%"> |
||||
<tr><td> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-6.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<table width="100%"> |
||||
<tr bgcolor="#CCCCFF" |
||||
valign=center><td> |
||||
<h2> |
||||
VII. FreeType bitmaps |
||||
</h2> |
||||
</td></tr> |
||||
</table> |
||||
|
||||
<p>The purpose of this section is to present the way FreeType manages |
||||
bitmaps and pixmaps, and how they relate to the concepts previously |
||||
defined. The relationships between vectorial and pixel coordinates is |
||||
explained.</p> |
||||
|
||||
|
||||
<a name="section-1"> |
||||
<h3> |
||||
1. Vectorial versus pixel coordinates |
||||
</h3> |
||||
|
||||
<p>This sub-section explains the differences between vectorial and pixel |
||||
coordinates. To make things clear, brackets will be used to describe |
||||
pixel coordinates, e.g. [3,5], while parentheses will be used for |
||||
vectorial ones, e.g. (-2,3.5).</p> |
||||
|
||||
<p>In the pixel case, as we use the <em>Y upwards</em> convention; |
||||
the coordinate [0,0] always refers to the <em>lower left pixel</em> of a |
||||
bitmap, while coordinate [width-1, rows-1] to its <em>upper right |
||||
pixel</em>.</p> |
||||
|
||||
<p>In the vectorial case, point coordinates are expressed in floating |
||||
units, like (1.25, -2.3). Such a position doesn't refer to a given |
||||
pixel, but simply to an immaterial point in the 2D plane.</p> |
||||
|
||||
<p>The pixels themselves are indeed <em>square boxes</em> of the 2D |
||||
plane, whose centers lie in half pixel coordinates. For example, the |
||||
lower left pixel of a bitmap is delimited by the square (0,0)-(1,1), its |
||||
center being at location (0.5,0.5).</p> |
||||
|
||||
<p>This introduces some differences when computing distances. For |
||||
example, the <em>length</em> in pixels of the line [0,0]-[10,0] is 11. |
||||
However, the vectorial distance between (0,0)-(10,0) covers exactly |
||||
10 pixel centers, hence its length is 10.</p> |
||||
|
||||
<center> |
||||
<img src="grid_1.png" |
||||
height=390 width=402 |
||||
alt="bitmap and vector grid"> |
||||
</center> |
||||
|
||||
|
||||
<a name="section-2"> |
||||
<h3> |
||||
2. FreeType bitmap and pixmap descriptor |
||||
</h3> |
||||
|
||||
<p>A bitmap or pixmap is described through a single structure, called |
||||
<tt>FT_Bitmap</tt>, defined in the file |
||||
<tt><freetype/ftimage.h></tt>. It is a simple descriptor whose |
||||
fields are:</p> |
||||
|
||||
<center> |
||||
<table cellspacing=3 |
||||
cellpadding=5 |
||||
width="80%"> |
||||
<caption> |
||||
<b><tt>FT_Bitmap</tt></b> |
||||
</caption> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>rows</tt> |
||||
</td> |
||||
<td valign=top> |
||||
the number of rows, i.e. lines, in the bitmap |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>width</tt> |
||||
</td> |
||||
<td valign=top> |
||||
the number of horizontal pixels in the bitmap |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>pitch</tt> |
||||
</td> |
||||
<td valign=top> |
||||
its absolute value is the number of bytes per bitmap line; it can |
||||
be either positive or negative depending on the bitmap's vertical |
||||
orientation |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>buffer</tt> |
||||
</td> |
||||
<td valign=top> |
||||
a typeless pointer to the bitmap pixel bufer |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>pixel_mode</tt> |
||||
</td> |
||||
<td valign=top> |
||||
an enumeration used to describe the pixel format of the bitmap; |
||||
examples are <tt>ft_pixel_mode_mono</tt> for 1-bit monochrome |
||||
bitmaps and <tt>ft_pixel_mode_grays</tt> for 8-bit anti-aliased |
||||
"gray" values |
||||
</td> |
||||
</tr> |
||||
|
||||
<tr> |
||||
<td valign=top> |
||||
<tt>num_grays</tt> |
||||
</td> |
||||
<td valign=top> |
||||
this is only used for "gray" pixel modes; it gives the number of |
||||
gray levels used to describe the anti-aliased gray levels -- |
||||
FreeType 2 defaults to 256 grays. |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
|
||||
<p>Note that the sign of the <tt>pitch</tt> fields determines whether |
||||
the rows in the pixel buffer are stored in ascending or descending |
||||
order.</p> |
||||
|
||||
<p>Remember that FreeType uses the <em>Y upwards</em> convention in |
||||
the 2D plane, which means that a coordinate of (0,0) always refer to the |
||||
<em>lower-left corner</em> of a bitmap.</p> |
||||
|
||||
<p>If the pitch is positive, the rows are stored in decreasing vertical |
||||
position; the first bytes of the pixel buffer are part of the |
||||
<em>upper</em> bitmap row.</p> |
||||
|
||||
<p>On the opposite, if the pitch is negative, the first bytes of the |
||||
pixel buffer are part of the <em>lower</em> bitmap row.</p> |
||||
|
||||
<p>In all cases, one can see the pitch as the byte increment needed to |
||||
skip to the <em>next lower scanline</em> in a given bitmap buffer.</p> |
||||
|
||||
<center> |
||||
<table> |
||||
<tr> |
||||
<td> |
||||
<img src="up_flow.png" |
||||
height=261 width=275 |
||||
alt="negative 'pitch'"> |
||||
</td> |
||||
<td> |
||||
<img src="down_flow.png" |
||||
height=263 width=273 |
||||
alt="positive 'pitch'"> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
<p>The "positive pitch" convention is very often used, though |
||||
some systems might need the other.</p> |
||||
|
||||
|
||||
<a name="section-3"> |
||||
<h3> |
||||
3. Converting outlines into bitmaps and pixmaps |
||||
</h3> |
||||
|
||||
<p>Generating a bitmap or pixmap image from a vectorial image is easy |
||||
with FreeType. However, one must understand a few points regarding the |
||||
positioning of the outline in the 2D plane before converting it to a |
||||
bitmap:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>The glyph loader and hinter always places the outline in the 2D |
||||
plane so that (0,0) matches its character origin. This means that |
||||
the glyph's outline, and corresponding bounding box, can be placed |
||||
anywhere in the 2D plane (see the graphics in section III).</p> |
||||
</li> |
||||
<li> |
||||
<p>The target bitmap's area is mapped to the 2D plane, with its |
||||
lower left corner at (0,0). This means that a bitmap or pixmap of |
||||
dimensions [<tt>w,h</tt>] will be mapped to a 2D rectangle window |
||||
delimited by (0,0)-(<tt>w,h</tt>).</p> |
||||
</li> |
||||
<li> |
||||
<p>When scan-converting the outline, everything that falls within |
||||
the bitmap window is rendered, the rest is ignored.</p> |
||||
</li> |
||||
|
||||
<p>A common mistake made by many developers when they begin using |
||||
FreeType is believing that a loaded outline can be directly rendered |
||||
in a bitmap of adequate dimensions. The following images illustrate |
||||
why this is a problem.</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
The first image shows a loaded outline in the 2D plane. |
||||
</li> |
||||
<li> |
||||
The second one shows the target window for a bitmap of arbitrary |
||||
dimensions [w,h]. |
||||
</li> |
||||
<li> |
||||
The third one shows the juxtaposition of the outline and window in |
||||
the 2D plane. |
||||
</li> |
||||
<li> |
||||
The last image shows what will really be rendered in the bitmap. |
||||
</li> |
||||
</ul> |
||||
|
||||
<center> |
||||
<img src="clipping.png" |
||||
height=151 width=539 |
||||
alt="clipping algorithm"> |
||||
</center> |
||||
</ul> |
||||
|
||||
<p>Indeed, in nearly all cases, the loaded or transformed outline must |
||||
be translated before it is rendered into a target bitmap, in order to |
||||
adjust its position relative to the target window.</p> |
||||
|
||||
<p>For example, the correct way of creating a <em>standalone</em> glyph |
||||
bitmap is as follows</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>Compute the size of the glyph bitmap. It can be computed |
||||
directly from the glyph metrics, or by computing its bounding box |
||||
(this is useful when a transformation has been applied to the |
||||
outline after the load, as the glyph metrics are not valid |
||||
anymore).</p> |
||||
</li> |
||||
<li> |
||||
<p>Create the bitmap with the computed dimensions. Don't forget to |
||||
fill the pixel buffer with the background color.</p> |
||||
</li> |
||||
<li> |
||||
<p>Translate the outline so that its lower left corner matches |
||||
(0,0). Don't forget that in order to preserve hinting, one should |
||||
use integer, i.e. rounded distances (of course, this isn't required |
||||
if preserving hinting information doesn't matter, like with rotated |
||||
text). Usually, this means translating with a vector |
||||
<tt>(-ROUND(xMin), -ROUND(yMin))</tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p>Call the rendering function (it can be |
||||
<tt>FT_Outline_Render()</tt> for example).</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>In the case where one wants to write glyph images directly into a |
||||
large bitmap, the outlines must be translated so that their vectorial |
||||
position correspond to the current text cursor/character origin.</p> |
||||
|
||||
<p><hr></p> |
||||
|
||||
<center> |
||||
<table width="100%" |
||||
border=0 |
||||
cellpadding=5> |
||||
<tr bgcolor="#CCFFCC" |
||||
valign=center> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="glyphs-6.html">Previous</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
<a href="index.html">Contents</a> |
||||
</td> |
||||
<td align=center |
||||
width="30%"> |
||||
|
||||
</td> |
||||
</tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 2.0 KiB |
@ -1,200 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType Glyph Conventions</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType Glyph Conventions |
||||
</h1> |
||||
|
||||
<h2 align=center> |
||||
Version 2.1 |
||||
</h2> |
||||
|
||||
<h3 align=center> |
||||
Copyright 1998-2000 David Turner (<a |
||||
href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
Copyright 2000 The FreeType Development Team (<a |
||||
href="mailto:devel@freetype.org">devel@freetype.org</a>) |
||||
</h3> |
||||
|
||||
|
||||
<center> |
||||
<table width="70%"> |
||||
<tr><td> |
||||
|
||||
<p>This document presents the core conventions used within the FreeType |
||||
library to manage font and glyph data. It is a <em>must-read</em> for all |
||||
developers who need to understand digital typography, especially if you |
||||
want to use the FreeType 2 library in your projects.</p> |
||||
|
||||
<table width="100%"> |
||||
<tr valign=center |
||||
bgcolor="#CCCCFF"> |
||||
<td align=center> |
||||
<h2> |
||||
Table of Contents |
||||
</h2> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<center> |
||||
<table width="80%"> |
||||
<tr><td> |
||||
|
||||
<h2> |
||||
<a href="glyphs-1.html">I. Basic Typographic Concepts</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-1.html#section-1">1. Font files, format and |
||||
information</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-1.html#section-2">2. Character images and mappings</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-1.html#section-3">3. Character and font metrics</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-2.html">II. Glyph outlines</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-2.html#section-1">1. Pixels, points and device |
||||
resolutions</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-2.html#section-2">2. Vectorial representation</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-2.html#section-3">3. Hinting and bitmap rendering</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-3.html">III. Glyph metrics</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-3.html#section-1">1. Baseline, pens and layouts</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-3.html#section-2">2. Typographic metrics and |
||||
bounding boxes</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-3.html#section-3">3. Bearings and advances</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-3.html#section-4">4. The effects of grid-fitting</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-3.html#section-5">5. Text widths and bounding box</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-4.html">IV. Kerning</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-4.html#section-1">1. Kerning pairs</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-4.html#section-2">2. Applying kerning</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-5.html">V. Text processing</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-5.html#section-1">1. Writing simple text strings</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-5.html#section-2">2. Sub-pixel positioning</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-5.html#section-3">3. Simple kerning</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-5.html#section-4">4. Right-to-left layouts</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-5.html#section-5">5. Vertical layouts</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-5.html#section-6">6. WYSIWYG text layouts</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-6.html">VI. FreeType Outlines</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-6.html#section-1">1. FreeType outline description |
||||
and structure</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-6.html#section-2">2. Bounding and control box |
||||
computations</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-6.html#section-3">3. Coordinates, scaling, and |
||||
grid-fitting</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
<h2> |
||||
<a href="glyphs-7.html">VII. FreeType bitmaps</a> |
||||
</h2> |
||||
<blockquote> |
||||
<h3> |
||||
<a href="glyphs-7.html#section-1">1. Vectorial versus pixel |
||||
coordinates</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-7.html#section-2">2. FreeType bitmap and pixmap |
||||
descriptor</a> |
||||
<br> |
||||
|
||||
<a href="glyphs-7.html#section-3">3. Converting outlines into |
||||
bitmaps and pixmaps</a> |
||||
<br> |
||||
</h3> |
||||
</blockquote> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |
Before Width: | Height: | Size: 846 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 919 B |
Before Width: | Height: | Size: 661 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.8 KiB |
@ -1,948 +0,0 @@ |
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" |
||||
"http://www.w3.org/TR/REC-html40/loose.dtd"> |
||||
<html> |
||||
<head> |
||||
<meta http-equiv="Content-Type" |
||||
content="text/html; charset=iso-8859-1"> |
||||
<meta name="Author" |
||||
content="David Turner"> |
||||
<title>FreeType 2 Tutorial</title> |
||||
</head> |
||||
|
||||
<body text="#000000" |
||||
bgcolor="#FFFFFF" |
||||
link="#0000EF" |
||||
vlink="#51188E" |
||||
alink="#FF0000"> |
||||
|
||||
<h1 align=center> |
||||
FreeType 2.0 Tutorial<br> |
||||
Step 1 -- simple glyph loading |
||||
</h1> |
||||
|
||||
<h3 align=center> |
||||
© 2000 David Turner |
||||
(<a href="mailto:david@freetype.org">david@freetype.org</a>)<br> |
||||
© 2000 The FreeType Development Team |
||||
(<a href="http://www.freetype.org">www.freetype.org</a>) |
||||
</h3> |
||||
|
||||
<center> |
||||
<table width="550"> |
||||
<tr><td> |
||||
|
||||
<hr> |
||||
|
||||
<h2> |
||||
Introduction |
||||
</h2> |
||||
|
||||
<p>This is the first part of the FreeType 2 tutorial. It will |
||||
teach you to do the following:</p> |
||||
|
||||
<ul> |
||||
<li>initialize the library</li> |
||||
<li>open a font file by creating a new face object</li> |
||||
<li>select a character size in points or in pixels</li> |
||||
<li>load a single glyph image and convert it to a bitmap</li> |
||||
<li>render a very simple string of text</li> |
||||
<li>render a rotated string of text easily</li> |
||||
</ul> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
1. Header files |
||||
</h3> |
||||
|
||||
<p>To include the main FreeType header file, say</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
#include <freetype/freetype.h></pre> |
||||
</font> |
||||
|
||||
<p>in your application code. Note that other files are available in the |
||||
FreeType include directory, most of them being included by |
||||
<tt>freetype.h</tt> and other (internal) files. Some of them will be |
||||
described later in this tutorial.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
2. Initialize the library |
||||
</h3> |
||||
|
||||
<p>Simply create a variable of type <tt>FT_Library</tt> named, for |
||||
example, <tt>library</tt>, and call the function |
||||
<tt>FT_Init_FreeType()</tt> as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
#include <freetype/freetype.h> |
||||
|
||||
FT_Library library; |
||||
|
||||
... |
||||
|
||||
{ |
||||
... |
||||
error = FT_Init_FreeType( &library ); |
||||
if ( error ) |
||||
{ |
||||
... an error occurred during library initialization ... |
||||
} |
||||
}</pre> |
||||
</font> |
||||
|
||||
<p>This function is in charge of the following:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
Creating a new instance of the FreeType 2 library, and set the |
||||
handle <tt>library</tt> to it. |
||||
</li> |
||||
<li> |
||||
Load each module that FreeType knows about in the library. This |
||||
means that by default, your new <tt>library</tt> object is able to |
||||
handle TrueType, Type 1, Windows FON, CID-keyed & OpenType/CFF |
||||
fonts gracefully. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>As you can see, the function returns an error code, like most others |
||||
in the FreeType API. An error code of 0 <em>always</em> means that |
||||
the operation was successful; otherwise, the value describes the error, |
||||
and <tt>library</tt> is set to <tt>NULL</tt>.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
3. Load a font face |
||||
</h3> |
||||
|
||||
<h4> |
||||
a. From a font file |
||||
</h4> |
||||
|
||||
<p>Create a new <em>face</em> object by calling |
||||
<tt>FT_New_Face()</tt>. A <em>face</em> describes a given typeface |
||||
and style. For example, "Times New Roman Regular" and "Times New |
||||
Roman Italic" correspond to two different faces.</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_Library library; /* handle to library */ |
||||
FT_Face face; /* handle to face object */ |
||||
|
||||
|
||||
error = FT_Init_FreeType( &library ); |
||||
if ( error ) { ... } |
||||
|
||||
error = FT_New_Face( library, |
||||
"/usr/share/fonts/truetype/arial.ttf", |
||||
0, |
||||
&face ); |
||||
if ( error == FT_Err_Unknown_File_Format ) |
||||
{ |
||||
... the font file could be opened and read, but it appears |
||||
... that its font format is unsupported |
||||
} |
||||
else if ( error ) |
||||
{ |
||||
... another error code means that the font file could not |
||||
... be opened or read, or that it is broken |
||||
}</pre> |
||||
</font> |
||||
|
||||
<p>As you can certainly imagine, <tt>FT_New_Face()</tt> opens a font |
||||
file, then tries to extract one face from it. Its parameters are</p> |
||||
|
||||
<table cellpadding=5> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>library</tt> |
||||
</td> |
||||
<td> |
||||
<p>A handle to the FreeType library instance where the face |
||||
object is created</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>filepathname</tt> |
||||
</td> |
||||
<td> |
||||
<p>The font file pathname (a standard C string).</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face_index</tt> |
||||
</td> |
||||
<td> |
||||
<p>Certain font formats allow several font faces to be embedded |
||||
in a single file.</p> |
||||
|
||||
<p>This index tells which face you want to load. An error will |
||||
be returned if its value is too large.</p> |
||||
|
||||
<p>Index 0 always work though.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face</tt> |
||||
</td> |
||||
<td> |
||||
<p>A <em>pointer</em> to the handle that will be set to describe |
||||
the new face object.</p> |
||||
|
||||
<p>It is set to <tt>NULL</tt> in case of error.</p> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<p>To know how many faces a given font file contains, load its first |
||||
face (use <tt>face_index</tt>=0), then check the value of |
||||
<tt>face->num_faces</tt> which indicates how many faces are embedded |
||||
in the font file.</p> |
||||
|
||||
<h4> |
||||
b. From memory |
||||
</h4> |
||||
|
||||
<p>In the case where you have already loaded the font file in memory, |
||||
you can similarly create a new face object for it by calling |
||||
<tt>FT_New_Memory_Face()</tt> as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_Library library; /* handle to library */ |
||||
FT_Face face; /* handle to face object */ |
||||
|
||||
|
||||
error = FT_Init_FreeType( &library ); |
||||
if ( error ) { ... } |
||||
|
||||
error = FT_New_Memory_Face( library, |
||||
buffer, /* first byte in memory */ |
||||
size, /* size in bytes */ |
||||
0, /* face_index */ |
||||
&face ); |
||||
if ( error ) { ... }</pre> |
||||
</font> |
||||
|
||||
<p>As you can see, <tt>FT_New_Memory_Face()</tt> takes a pointer to |
||||
the font file buffer and its size in bytes instead of a file pathname. |
||||
Other than that, it has exactly the same semantics as |
||||
<tt>FT_New_Face()</tt>.</p> |
||||
|
||||
<h4> |
||||
c. From other sources (compressed files, network, etc.) |
||||
</h4> |
||||
|
||||
<p>There are cases where using a file pathname or preloading the file |
||||
in memory is not sufficient. With FreeType 2, it is possible to |
||||
provide your own implementation of I/O routines.</p> |
||||
|
||||
<p>This is done through the <tt>FT_Open_Face()</tt> function, which |
||||
can be used to open a new font face with a custom input stream, select |
||||
a specific driver for opening, or even pass extra parameters to the |
||||
font driver when creating the object. We advise you to refer to the |
||||
FreeType 2 API reference in order to learn how to use it.</p> |
||||
|
||||
<p>Note that providing a custom stream might also be used to access a |
||||
TrueType font embedded in a Postscript Type 42 wrapper.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
4. Accessing face contents |
||||
</h3> |
||||
|
||||
<p>A <em>face object</em> models all information that globally describes |
||||
the face. Usually, this data can be accessed directly by dereferencing |
||||
a handle, like</p> |
||||
|
||||
<table cellpadding=5> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face->num_glyphs</tt> |
||||
</td> |
||||
<td> |
||||
<p>Gives the number of <em>glyphs</em> available in the font face. |
||||
A glyph is simply a character image. It doesn't necessarily |
||||
correspond to a <em>character code</em> though.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face->flags</tt> |
||||
</td> |
||||
<td> |
||||
<p>A 32-bit integer containing bit flags used to describe some |
||||
face properties. For example, the flag |
||||
<tt>FT_FACE_FLAG_SCALABLE</tt> is used to indicate that the face's |
||||
font format is scalable and that glyph images can be rendered for |
||||
all character pixel sizes. For more information on face flags, |
||||
please read the <a href="#">FreeType 2 API Reference</a>.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face->units_per_EM</tt> |
||||
</td> |
||||
<td> |
||||
<p>This field is only valid for scalable formats (it is set |
||||
to 0 otherwise). It indicates the number of font units |
||||
covered by the EM.</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face->num_fixed_sizes</tt> |
||||
</td> |
||||
<td> |
||||
<p>This field gives the number of embedded bitmap <em>strikes</em> |
||||
in the current face. A <em>strike</em> is a series of glyph |
||||
images for a given character pixel size. For example, a font face |
||||
could include strikes for pixel sizes 10, 12 and 14. Note |
||||
that even scalable font formats can have embedded bitmap |
||||
strikes!</p> |
||||
</td> |
||||
</tr> |
||||
<tr valign="top"> |
||||
<td> |
||||
<tt>face->fixed_sizes</tt> |
||||
</td> |
||||
<td> |
||||
<p>This is a pointer to an array of <tt>FT_Bitmap_Size</tt> |
||||
elements. Each <tt>FT_Bitmap_Size</tt> indicates the horizontal |
||||
and vertical <em>pixel sizes</em> for each of the strikes that are |
||||
present in the face.</p> |
||||
</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<p>For a complete listing of all face properties and fields, please read |
||||
the <a href="#">FreeType 2 API Reference</a>.<p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
5. Setting the current pixel size |
||||
</h3> |
||||
|
||||
<p>FreeType 2 uses <em>size objects</em> to model all information |
||||
related to a given character size for a given face. For example, a size |
||||
object will hold the value of certain metrics like the ascender or text |
||||
height, expressed in 1/64th of a pixel, for a character size of |
||||
12 points.</p> |
||||
|
||||
<p>When the <tt>FT_New_Face()</tt> function is called (or one of its |
||||
cousins), it <em>automatically</em> creates a new size object for the |
||||
returned face. This size object is directly accessible as |
||||
<tt>face->size</tt>.</p> |
||||
|
||||
<p><em>A single face object can deal with one or more size objects at a |
||||
time; however, this is something that few programmers really need to do. |
||||
We have thus have decided to simplify the API for the most common use |
||||
(i.e. one size per face), while keeping this feature available through |
||||
additional functions.</em></p> |
||||
|
||||
<p>Before a glyph can be loaded, the size object must be set up. To do |
||||
that, simply call <tt>FT_Set_Char_Size()</tt>. Here is an example where |
||||
the character size is set to 16pt for a 300x300 dpi device:</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
error = FT_Set_Char_Size( |
||||
face, /* handle to face object */ |
||||
0, /* char_width in 1/64th of points */ |
||||
16 * 64, /* char_height in 1/64th of points */ |
||||
300, /* horizontal device resolution */ |
||||
300 ); /* vertical device resolution */</pre> |
||||
</font> |
||||
|
||||
<p>You will notice that</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
The character width and heights are specified in 1/64th of points. |
||||
A point is a <em>physical</em> distance, equaling 1/72th of an inch; |
||||
it is not a pixel. |
||||
</li> |
||||
<li> |
||||
Horizontal and vertical device resolutions are expressed in |
||||
<em>dots-per-inch</em>, or <em>dpi</em>. You can use 72 or |
||||
96 dpi for display devices like the screen. The resolution is |
||||
used to compute the character pixel size from the character point |
||||
size. |
||||
</li> |
||||
<li> |
||||
A value of 0 for the character width means <em>same as |
||||
character height</em>, a value of 0 for the character height |
||||
means <em>same as character width</em>. Otherwise, it is possible |
||||
to specify different char widths and heights. |
||||
</li> |
||||
<li> |
||||
Using a value of 0 for the horizontal or vertical resolution |
||||
means 72 dpi, which is the default. |
||||
</li> |
||||
<li> |
||||
The first argument is a handle to a face object, not a size object. |
||||
This behaviour must be seen as a convenience. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>This function computes the character pixel size that corresponds to |
||||
the character width and height and device resolutions. However, if you |
||||
want to specify the pixel sizes yourself, you can simply call |
||||
<tt>FT_Set_Pixel_Sizes()</tt>, as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
error = FT_Set_Pixel_Sizes( |
||||
face, /* handle to face object */ |
||||
0, /* pixel_width */ |
||||
16 ); /* pixel_height */</pre> |
||||
</font> |
||||
|
||||
<p>This example will set the character pixel sizes to 16x16 pixels. |
||||
As previously, a value of 0 for one of the dimensions means |
||||
<em>same as the other</em>.</p> |
||||
|
||||
<p>Note that both functions return an error code. Usually, an error |
||||
occurs with a fixed-size font format (like FNT or PCF) when trying to |
||||
set the pixel size to a value that is not listed in the |
||||
<tt>face->fixed_sizes</tt> array.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
6. Loading a glyph image |
||||
</h3> |
||||
|
||||
<h4> |
||||
a. Converting a character code into a glyph index |
||||
</h4> |
||||
|
||||
<p>Usually, an application wants to load a glyph image based on its |
||||
<em>character code</em>, which is a unique value that defines the |
||||
character for a given <em>encoding</em>. For example, the character |
||||
code 65 in ASCII encoding represents letter `A'.</p> |
||||
|
||||
<p>A face object contains one or more tables, called |
||||
<em>charmaps</em>, that are used to convert character codes to glyph |
||||
indices. For example, most TrueType fonts contain two charmaps. One |
||||
is used to convert Unicode character codes to glyph indices, the other |
||||
is used to convert Apple Roman encoding into glyph indices. Such |
||||
fonts can then be used either on Windows (which uses Unicode) and |
||||
Macintosh (which uses Apple Roman usually). Note also that a given |
||||
charmap might not map to all the glyphs present in the font.</p> |
||||
|
||||
<p>By default, when a new face object is created, it lists all the |
||||
charmaps contained in the font face and selects the one that supports |
||||
Unicode character codes if it finds one. Otherwise, it tries to find |
||||
support for Latin-1, then ASCII.</p> |
||||
|
||||
<p>We will describe later how to look for specific charmaps in a face. |
||||
For now, we will assume that the face contains at least a Unicode |
||||
charmap that was selected during <tt>FT_New_Face()</tt>. To convert a |
||||
Unicode character code to a font glyph index, we use |
||||
<tt>FT_Get_Char_Index()</tt> as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
glyph_index = FT_Get_Char_Index( face, charcode );</pre> |
||||
</font> |
||||
|
||||
<p>This will look up the glyph index corresponding to the given |
||||
<tt>charcode</tt> in the charmap that is currently selected for the |
||||
face. |
||||
|
||||
<p>Note that this is one of the rare FreeType functions that do not |
||||
return an error code. If a given character code has no glyph image in |
||||
the face, the value 0 is returned. By convention, it always |
||||
corresponds to a special glyph image called the <em>missing |
||||
glyph</em>, which usually is represented as a box or a space.</p> |
||||
|
||||
<h4> |
||||
b. Loading a glyph from the face |
||||
</h4> |
||||
|
||||
<p>Once you have a glyph index, you can load the corresponding glyph |
||||
image. The latter can be stored in various formats within the font |
||||
file. For fixed-size formats like FNT or PCF, each image is a bitmap. |
||||
Scalable formats like TrueType or Type 1 use vectorial shapes, |
||||
named <em>outlines</em>, to describe each glyph. Some formats may have |
||||
even more exotic ways of representing glyphs (e.g. MetaFont). |
||||
Fortunately, FreeType 2 is flexible enough to support any kind of |
||||
glyph format through a simple API.</p> |
||||
|
||||
<p>The glyph image is always stored in a special object called a |
||||
<em>glyph slot</em>. As its name suggests, a glyph slot is a |
||||
container that is able to hold one glyph image at a time, be it a |
||||
bitmap, an outline, or something else. Each face object has a single |
||||
glyph slot object that can be accessed as <tt>face->glyph</tt>.</p> |
||||
|
||||
<p>Loading a glyph image into the slot is performed by calling |
||||
<tt>FT_Load_Glyph()</tt> as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
error = FT_Load_Glyph( |
||||
face, /* handle to face object */ |
||||
glyph_index, /* glyph index */ |
||||
load_flags ); /* load flags, see below */</pre> |
||||
</font> |
||||
|
||||
<p>The <tt>load_flags</tt> value is a set of bit flags used to |
||||
indicate some special operations. The default value |
||||
<tt>FT_LOAD_DEFAULT</tt> is 0.</p> |
||||
|
||||
<p>This function will try to load the corresponding glyph image from |
||||
the face. Basically, this means that</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>If a bitmap is found for the corresponding glyph and pixel |
||||
size, it will be loaded into the slot. Embedded bitmaps are |
||||
always favored over native image formats, because we assume that |
||||
they are higher-quality versions of the same glyph. This can be |
||||
changed by using the <tt>FT_LOAD_NO_BITMAP</tt> flag.</p> |
||||
</li> |
||||
<li> |
||||
<p>Otherwise, a native image for the glyph will be loaded. It |
||||
will also be scaled to the current pixel size as well as hinted |
||||
for certain formats like TrueType and Type 1.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>The field <tt>glyph->format</tt> describes the format used to store |
||||
the glyph image in the slot. If it is not |
||||
<tt>ft_glyph_format_bitmap</tt>, it is possible to immedialy convert |
||||
it to a bitmap through <tt>FT_Render_Glyph()</tt>, as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
error = FT_Render_Glyph( |
||||
face->glyph, /* glyph slot */ |
||||
render_mode ); /* render mode */</pre> |
||||
</font> |
||||
|
||||
<p>The parameter <tt>render_mode</tt> specifies how to render the |
||||
glyph image. Set it <tt>ft_render_mode_normal</tt> to render a |
||||
high-quality anti-aliased (256 gray levels) bitmap. You can |
||||
alternatively use <tt>ft_render_mode_mono</tt> if you want to generate |
||||
a 1-bit monochrome bitmap.</p> |
||||
|
||||
<p>Once you have a bitmapped glyph image, you can access it directly |
||||
through <tt>glyph->bitmap</tt> (a simple bitmap descriptor), and |
||||
position it with <tt>glyph->bitmap_left</tt> and |
||||
<tt>glyph->bitmap_top</tt>.</p> |
||||
|
||||
<p>Note that <tt>bitmap_left</tt> is the horizontal distance from the |
||||
current pen position to the left-most border of the glyph bitmap, |
||||
while <tt>bitmap_top</tt> is the vertical distance from the pen |
||||
position (on the baseline) to the top-most border of the glyph bitmap. |
||||
<em>It is positive to indicate an upwards distance</em>.</p> |
||||
|
||||
<p>The second part of the tutorial describes the contents of a glyph |
||||
slot and how to access specific glyph information (including |
||||
metrics).</p> |
||||
|
||||
<h4> |
||||
c. Using other charmaps |
||||
</h4> |
||||
|
||||
<p>As said before, when a new face object is created, it will look for |
||||
a Unicode, Latin-1, or ASCII charmap and select it. The currently |
||||
selected charmap is accessed via <tt>face->charmap</tt>. This field |
||||
is <tt>NULL</tt> if no charmap is selected, which typically happens |
||||
when you create a new <tt>FT_Face</tt> object from a font file that |
||||
doesn't contain an ASCII, Latin-1, or Unicode charmap (rare |
||||
stuff).</p> |
||||
|
||||
<p>There are two ways to select a different charmap with |
||||
FreeType 2. The easiest is if the encoding you need already has |
||||
a corresponding enumeration defined in <tt>freetype/freetype.h</tt>, |
||||
as <tt>ft_encoding_big5</tt>. In this case, you can simply call |
||||
<tt>FT_Select_CharMap()</tt> as in</p> |
||||
|
||||
<font color="blue"><pre> |
||||
error = FT_Select_CharMap( |
||||
face, /* target face object */ |
||||
ft_encoding_big5 ); /* encoding */</pre> |
||||
</font> |
||||
|
||||
<p>Another way is to manually parse the list of charmaps for the face; |
||||
this is accessible through the fields <tt>num_charmaps</tt> and |
||||
<tt>charmaps</tt> (notice the final 's') of the face object. As |
||||
expected, the first is the number of charmaps in the face, while the |
||||
second is <em>a table of pointers to the charmaps</em> embedded in the |
||||
face.</p> |
||||
|
||||
<p>Each charmap has a few visible fields used to describe it more |
||||
precisely. Mainly, one will look at <tt>charmap->platform_id</tt> and |
||||
<tt>charmap->encoding_id</tt> which define a pair of values that can |
||||
be used to describe the charmap in a rather generic way.</p> |
||||
|
||||
<p>Each value pair corresponds to a given encoding. For example, the |
||||
pair (3,1) corresponds to Unicode (on the Windows platform). A list |
||||
of such pairs is defined in the TrueType specification, but you can |
||||
also use the file <tt><freetype/ttnameid.h></tt> which defines |
||||
several helpful constants to deal with them.</p> |
||||
|
||||
<p>Note that some pid/eid pairs are <em>artificial</em>; such values |
||||
have been created by FreeType to identify platforms resp. encodings |
||||
not covered by the original TrueType specification.</p> |
||||
|
||||
<p>To look up a specific encoding you need to find a corresponding |
||||
value pair in the specification, then look for it in the |
||||
<tt>charmaps</tt> list. Bear in mind that some encodings correspond |
||||
to several values pairs (yes, it's a real mess, but blame Apple and |
||||
Microsoft on such stupidity). Here some code to do it:</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_CharMap found = 0; |
||||
FT_CharMap charmap; |
||||
int n; |
||||
|
||||
|
||||
for ( n = 0; n < face->num_charmaps; n++ ) |
||||
{ |
||||
charmap = face->charmaps[n]; |
||||
if ( charmap->platform_id == my_platform_id && |
||||
charmap->encoding_id == my_encoding_id ) |
||||
{ |
||||
found = charmap; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if ( !found ) { ... } |
||||
|
||||
/* now, select the charmap for the face object */ |
||||
error = FT_Set_CharMap( face, found ); |
||||
if ( error ) { ... }</pre> |
||||
</font> |
||||
|
||||
<p>Once a charmap has been selected, either through |
||||
<tt>FT_Select_CharMap()</tt> or <tt>FT_Set_CharMap()</tt>, it is used |
||||
by all subsequent calls to <tt>FT_Get_Char_Index()</tt>.</p> |
||||
|
||||
<h4> |
||||
d. Glyph transformations |
||||
</h4> |
||||
|
||||
<p>It is possible to specify an affine transformation to be applied to |
||||
glyph images when they are loaded. Of course, this will only work for |
||||
scalable (vectorial) font formats.</p> |
||||
|
||||
<p>To do that, simply call <tt>FT_Set_Transform()</tt>, as in</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
error = FT_Set_Transform( |
||||
face, /* target face object */ |
||||
&matrix, /* pointer to 2x2 matrix */ |
||||
&delta ); /* pointer to 2d vector */</pre> |
||||
</font> |
||||
|
||||
<p>This function will set the current transformation for a given face |
||||
object. Its second parameter is a pointer to an <tt>FT_Matrix</tt> |
||||
structure that describes a 2x2 affine matrix. The third |
||||
parameter is a pointer to an <tt>FT_Vector</tt> structure that |
||||
describes a simple 2d vector that is used to translate the glyph |
||||
image <em>after</em> the 2x2 transformation.</p> |
||||
|
||||
<p>Note that the matrix pointer can be set to <tt>NULL</tt>, in which |
||||
case the identity transformation will be used. Coefficients of the |
||||
matrix are otherwise in 16.16 fixed float units.</p> |
||||
|
||||
<p>The vector pointer can also be set to <tt>NULL</tt> in which case a |
||||
delta vector of (0,0) will be used. The vector coordinates are |
||||
expressed in 1/64th of a pixel (also known as 26.6 fixed floats).</p> |
||||
|
||||
<p><em>The transformation is applied to every glyph that is loaded |
||||
through <tt>FT_Load_Glyph()</tt> and is <b>completely independent of |
||||
any hinting process.</b> This means that you won't get the same |
||||
results if you load a glyph at the size of 24 pixels, or a glyph |
||||
at the size at 12 pixels scaled by 2 through a |
||||
transformation, because hints will have been computed differently |
||||
(unless hints have been disabled, of course).</em></p> |
||||
|
||||
<p>If you ever need to use a non-orthogonal transformation with |
||||
optimal hints, you first need to decompose your transformation into a |
||||
scaling part and a rotation/shearing part. Use the scaling part to |
||||
compute a new character pixel size, then the other one to call |
||||
<tt>FT_Set_Transform()</tt>. This is explained in details in a later |
||||
section of this tutorial.</p> |
||||
|
||||
<p>Note also that loading a glyph bitmap with a non-identity |
||||
transformation will produce an error.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
7. Simple text rendering |
||||
</h3> |
||||
|
||||
<p>We will now present a very simple example used to render a string of |
||||
8-bit Latin-1 text, assuming a face that contains a Unicode charmap</p> |
||||
|
||||
<p>The idea is to create a loop that will, on each iteration, load one |
||||
glyph image, convert it to an anti-aliased bitmap, draw it on the target |
||||
surface, then increment the current pen position.</p> |
||||
|
||||
<h4> |
||||
a. basic code |
||||
</h4> |
||||
|
||||
<p>The following code performs our simple text rendering with the |
||||
functions previously described.</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ |
||||
int pen_x, pen_y, n; |
||||
|
||||
|
||||
.. initialize library .. |
||||
.. create face object .. |
||||
.. set character size .. |
||||
|
||||
pen_x = 300; |
||||
pen_y = 200; |
||||
|
||||
for ( n = 0; n < num_chars; n++ ) |
||||
{ |
||||
FT_UInt glyph_index; |
||||
|
||||
|
||||
/* retrieve glyph index from character code */ |
||||
glyph_index = FT_Get_Char_Index( face, text[n] ); |
||||
|
||||
/* load glyph image into the slot (erase previous one) */ |
||||
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); |
||||
if ( error ) continue; /* ignore errors */ |
||||
|
||||
/* convert to an anti-aliased bitmap */ |
||||
error = FT_Render_Glyph( face->glyph, ft_render_mode_normal ); |
||||
if ( error ) continue; |
||||
|
||||
/* now, draw to our target surface */ |
||||
my_draw_bitmap( &slot->bitmap, |
||||
pen_x + slot->bitmap_left, |
||||
pen_y - slot->bitmap_top ); |
||||
|
||||
/* increment pen position */ |
||||
pen_x += slot->advance.x >> 6; |
||||
pen_y += slot->advance.y >> 6; /* not useful for now */ |
||||
}</pre> |
||||
</font> |
||||
|
||||
<p>This code needs a few explanations:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
We define a handle named <tt>slot</tt> that points to the face |
||||
object's glyph slot. (The type <tt>FT_GlyphSlot</tt> is a |
||||
pointer.) This is a convenience to avoid using |
||||
<tt>face->glyph->XXX</tt> every time. |
||||
</li> |
||||
<li> |
||||
We increment the pen position with the vector |
||||
<tt>slot->advance</tt>, which corresponds to the glyph's |
||||
<em>advance width</em> (also known as its <em>escapement</em>). |
||||
The advance vector is expressed in 1/64th of pixels, and is |
||||
truncated to integer pixels on each iteration. |
||||
</li> |
||||
<li> |
||||
The function <tt>my_draw_bitmap()</tt> is not part of FreeType but |
||||
must be provided by the application to draw the bitmap to the |
||||
target surface. In this example, it takes a pointer to an |
||||
<tt>FT_Bitmap</tt> descriptor and the position of its top-left |
||||
corner as arguments. |
||||
</li> |
||||
<li> |
||||
The value of <tt>slot->bitmap_top</tt> is positive for an |
||||
<em>upwards</em> vertical distance. Assuming that the coordinates |
||||
taken by <tt>my_draw_bitmap()</tt> use the opposite convention |
||||
(increasing Y corresponds to downwards scanlines), we substract it |
||||
to <tt>pen_y</tt> instead of adding it. |
||||
</li> |
||||
</ul> |
||||
|
||||
<h4>b. refined code</h4> |
||||
|
||||
<p>The following code is a refined version of the example above. It |
||||
uses features and functions of FreeType 2 that have not yet been |
||||
introduced, and which will be explained below.</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ |
||||
FT_UInt glyph_index; |
||||
int pen_x, pen_y, n; |
||||
|
||||
|
||||
.. initialize library .. |
||||
.. create face object .. |
||||
.. set character size .. |
||||
|
||||
pen_x = 300; |
||||
pen_y = 200; |
||||
|
||||
for ( n = 0; n < num_chars; n++ ) |
||||
{ |
||||
/* load glyph image into the slot (erase previous one) */ |
||||
error = FT_Load_Char( face, text[n], FT_LOAD_RENDER ); |
||||
if ( error ) continue; /* ignore errors */ |
||||
|
||||
/* now, draw to our target surface */ |
||||
my_draw_bitmap( &slot->bitmap, |
||||
pen_x + slot->bitmap_left, |
||||
pen_y - slot->bitmap_top ); |
||||
|
||||
/* increment pen position */ |
||||
pen_x += slot->advance.x >> 6; |
||||
}</pre> |
||||
</font> |
||||
|
||||
<p>We have reduced the size of our code, but it does exactly the same |
||||
thing.</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
<p>We use the function <tt>FT_Load_Char()</tt> instead of |
||||
<tt>FT_Load_Glyph()</tt>. As you probably imagine, it is |
||||
equivalent to calling <tt>FT_Get_Char_Index()</tt> followed by |
||||
<tt>FT_Get_Load_Glyph()</tt>.</p> |
||||
</li> |
||||
<li> |
||||
<p>We do not use <tt>FT_LOAD_DEFAULT</tt> for the loading mode but |
||||
the bit flag <tt>FT_LOAD_RENDER</tt>. It indicates that the glyph |
||||
image must be immediately converted to an anti-aliased bitmap. |
||||
This is of course a shortcut that avoids calling |
||||
<tt>FT_Render_Glyph()</tt> explicitly but is strictly |
||||
equivalent.</p> |
||||
|
||||
<p>Note that you can also specify that you want a monochrome |
||||
bitmap by using the <tt>FT_LOAD_MONOCHROME</tt> load flag |
||||
instead.</p> |
||||
</li> |
||||
</ul> |
||||
|
||||
<h4>c. more advanced rendering</h4> |
||||
|
||||
<p>We now render transformed text (for example through a rotation). |
||||
To do that we use <tt>FT_Set_Transform()</tt>:</p> |
||||
|
||||
<font color="blue"> |
||||
<pre> |
||||
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ |
||||
FT_Matrix matrix; /* transformation matrix */ |
||||
FT_UInt glyph_index; |
||||
FT_Vector pen; /* untransformed origin */ |
||||
int n; |
||||
|
||||
|
||||
.. initialize library .. |
||||
.. create face object .. |
||||
.. set character size .. |
||||
|
||||
/* set up matrix */ |
||||
matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L ); |
||||
matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L ); |
||||
matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L ); |
||||
matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L ); |
||||
|
||||
/* the pen position in 26.6 cartesian space coordinates */ |
||||
pen.x = 300 * 64; |
||||
pen.y = ( my_target_height - 200 ) * 64; |
||||
|
||||
for ( n = 0; n < num_chars; n++ ) |
||||
{ |
||||
/* set transformation */ |
||||
FT_Set_Transform( face, &matrix, &pen ); |
||||
|
||||
/* load glyph image into the slot (erase previous one) */ |
||||
error = FT_Load_Char( face, text[n], FT_LOAD_RENDER ); |
||||
if ( error ) continue; /* ignore errors */ |
||||
|
||||
/* now, draw to our target surface (convert position) */ |
||||
my_draw_bitmap( &slot->bitmap, |
||||
slot->bitmap_left, |
||||
my_target_height - slot->bitmap_top ); |
||||
|
||||
/* increment pen position */ |
||||
pen.x += slot->advance.x; |
||||
pen.y += slot->advance.y; |
||||
}</pre> |
||||
</font> |
||||
|
||||
<p>Notes:</p> |
||||
|
||||
<ul> |
||||
<li> |
||||
We now use a vector of type <tt>FT_Vector</tt> to store the pen |
||||
position, with coordinates expressed as 1/64th of pixels, hence a |
||||
multiplication. The position is expressed in cartesian space. |
||||
</li> |
||||
<li> |
||||
In FreeType, glyph images are always loaded, transformed, and |
||||
described in the cartesian coordinate system (which means that |
||||
increasing Y corresponds to upper scanlines), unlike the |
||||
system typically used for bitmaps (where the top-most scanline has |
||||
coordinate 0). We must thus convert between the two systems |
||||
when we define the pen position, and when we compute the top-left |
||||
position of the bitmap. |
||||
</li> |
||||
<li> |
||||
We apply the transformation matrix on each glyph to indicate |
||||
rotation as well as a delta vector that will move the transformed |
||||
image to the current pen position (in cartesian space, not bitmap |
||||
space). |
||||
</li> |
||||
<li> |
||||
The advance width is always returned transformed, which is why it |
||||
can be directly added to the current pen position. Note that it |
||||
is <em>not</em> rounded this time. |
||||
</li> |
||||
</ul> |
||||
|
||||
<p>It is important to note that, while this example is a bit more |
||||
complex than the previous one, it is strictly equivalent for the case |
||||
where the transformation is the identity. Hence it can be used as a |
||||
replacement (but a more powerful one).</p> |
||||
|
||||
<p>It has, however, a few shortcomings that we will explain, and |
||||
solve, in the next part of this tutorial.</p> |
||||
|
||||
<hr> |
||||
|
||||
<h3> |
||||
Conclusion |
||||
</h3> |
||||
|
||||
<p>In this first section, you have learned the basics of FreeType 2 |
||||
as well as sufficient knowledge how to render rotated text.</p> |
||||
|
||||
<p>The next part will dive into more details of the API in order to let |
||||
you access glyph metrics and images directly, how to deal with scaling, |
||||
hinting, kerning, etc.</p> |
||||
|
||||
<p>The third part will discuss issues like modules, caching, and a few |
||||
other advanced topics like how to use multiple size objects with a |
||||
single face.</p> |
||||
|
||||
</td></tr> |
||||
</table> |
||||
</center> |
||||
|
||||
</body> |
||||
</html> |