Official mirror of https://gitlab.freedesktop.org/freetype/freetype
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
10 KiB
291 lines
10 KiB
About FTLayout |
|
============== |
|
FTLayout is a layout engine stacked on FreeType2. Currently |
|
TrueTypeGX/AAT is supported as a file format. OpenType is also |
|
supported, but highly experimental. |
|
|
|
FTLayout provides an generic interface which is shared by a layout |
|
engine(GXLayout) for TrueTypeGX/AAT and a layout engine(OTLayout)for |
|
OpenType for glyph substitution, one of the text layout function. |
|
|
|
See "The TureType Font File" |
|
(http://developer.apple.com/fonts/TTRefMan/RM06/Chap6.html) |
|
about TrueTypeGX/AAT. |
|
|
|
About GXLayout |
|
============== |
|
GXLayout provides interface for mort, morx, lcar, format 0, 2 3 kern, |
|
feat TrueTypeGX/AAT tables. |
|
|
|
We tested GXLayout against "Non-contextual glyph substitution" and |
|
"Ligature substitution" in kochigx-substitute-20040218 |
|
fonts. "Non-contextual glyph substitution" in |
|
kochigx-substitute-20040218 fonts represents "vertical |
|
substitution". "Ligature substitution" in kochigx-substitute-20040218 |
|
fonts represents "Non-contextual glyph substitution". |
|
|
|
We tested GXLayout against "fi" ligature("Ligature substitution") in |
|
MacOSX's dfonts. |
|
|
|
It seems that Pfaedit can generate TrueTypeGX/AAT font. However, we |
|
have not tested GXLayout against fonts generated by Pfaedit yet. |
|
|
|
About OTLayout |
|
============== |
|
(Different from GXLayout)OTLayout is not written from scratch; it |
|
is just applied existing implementation to FTLayout, a newly designed |
|
interface. The existing implementation stands for: |
|
|
|
The code ported by the author of Pango to FreeType2 for using |
|
the code in Pango from TrueTypeOpen code in FreeType1 |
|
implemented by FreeType developers. |
|
|
|
What we have done is to make fit the existing implementation to |
|
new FTLayout glyph substitution interface. As written above, OTLayout |
|
in FTLayout is highly experimental. We have tested only punctuation |
|
substitution in Japanese vertical writing. Currently OpenType/TrueType |
|
is supported; OpenType/CFF is not supported. Hereafter in this |
|
document we focus on GXLayout. |
|
|
|
Install |
|
======= |
|
You have not changed the install procedure. However we recommend to |
|
give --prefix=/somewhere-different-from-/usr-or-/usr/local to |
|
configure command if FreeType2 is already installed on your system. |
|
e.g. --prefix=/opt |
|
|
|
We have taken care that we do not change the source/binary interfaces |
|
of FreeType2. However FTLayout development is based on the FreeType |
|
code of HEAD in FreeType2's CVS repository(as of Mon Feb 23 14:30:49 |
|
2004). If source/binary interfaces are not compatible between in |
|
FreeType2 on your system and that of HEAD, installing FreeType2 with |
|
FTLayout into /usr/lib or /usr/local/lib will be trouble. Take care. |
|
|
|
Demo program |
|
============ |
|
fi and gxdemo are bundled as GXLayout demo programs. To build the demo |
|
programs, type following command line in src/gxlayout after installing |
|
FreeType2 with FTLayout: |
|
|
|
$ make -f demo.mk |
|
|
|
fi and gxdemo will be built. |
|
|
|
- fi command |
|
With rules defined in a font file specified as the first argument |
|
for fi, try to substitute "fi" glyph string; and print the result |
|
to stdout. The default value defined in feat table is used as font |
|
feature settings in substitution. If you want to try different |
|
settings, gxdemo is suitable. |
|
|
|
Example: |
|
|
|
$ ./fi /Library/Fonts/Zapfino.dfont |
|
------------------- |
|
File: /Library/Fonts/Zapfino.dfont |
|
Name: Zapfino |
|
[IN]f: 536, i: 552 |
|
[OUT]f: 1089, i: 65535<empty> |
|
|
|
This output stands for |
|
- [IN] is input glyph string, |
|
- [OUT] substituted glyph string, |
|
- ([IN])the glyph id for `f' is 536, |
|
- ([IN])the glyph id for `i' is 552, and |
|
- ([OUT])as the result of substitution, we get single glyph which |
|
is 1089. 536, 552 are ligature into 1089. |
|
|
|
Only FreeType2 with FTLayout and standard C library are used in |
|
fi. |
|
|
|
- gxdemo |
|
gxdemo is a tool to inspect tables in a TrueTypeGX/AAT font and |
|
the behavior of GXLayout with GUI. |
|
|
|
Run gxdemo with a target TrueTypeGX/AAT font file from a terminal. |
|
gxdemo's window has multiple tabs. |
|
|
|
In "Features" tab, you can change the feature settings. Pressing |
|
"Reset" button and the settings are reset; setting are set to the |
|
default values defined in feat table. With "Run" button, you can |
|
try to substitute glyphs under the setting given in this "Features" |
|
tab. Pressing "Run" button, "Input: " prompt is appeared in the |
|
terminal. Give the glyph ids separated by space and type return key |
|
at the end of input glyph ids. Then substituted glyph ids are |
|
printed on the terminal. |
|
|
|
Example: |
|
$ ./gxdemo ~/.fonts/kochigx-mincho-subst.ttf |
|
Input: 200 19 20 300 |
|
Substituted: 200 14571 65535<empty> 300 |
|
|
|
In "Glyph" tab, you can render a glyph by giving a glyph id. |
|
|
|
In "Dump" tab, you can dump the TrueTypeGX/AAT tables of the font |
|
in pseudo XML format with pressing "Dump Font Tables" button. Also |
|
with pressing "Dump Feature Request" button, you can dump the |
|
current font feature settings in "Features" tab in a text format. |
|
|
|
Batch dump mode is also available. To dump mort and feat from a |
|
terminal, type |
|
|
|
$ ./gxdemo --batch --table=mort:feat font.ttf |
|
|
|
We, FTLayout developers used |
|
mlview(http://www.freespiders.org/projects/gmlview/) to browse |
|
the XML formated dump datum. |
|
|
|
In "Trace" tab, you can set FreeType2's trace level. To examine |
|
the process of glyph substitution, set "gxvm" and "gxchain" to 3. |
|
|
|
Different from fi, gxdemo uses gtk+ GUI toolkit. To build gxdemo, |
|
following libraries are needed: |
|
- glib-2.0 |
|
- gtk+-2.0 |
|
- libgnomecanvas-2.0 |
|
- popt |
|
At least Red Hat Linux 9 includes these libraries. |
|
|
|
Using FTLayout and GXLayout |
|
=========================== |
|
To do glyph substitution in your program, you have to use both |
|
FTLayout interface(as generic interface) and GXLayout interface(as |
|
concrete interface). The symbols in FTLayout have "FTL" as prefix. |
|
The symbols in GXLayout have "GXL" as prefix. Symbols in FTLayout |
|
are declared in include/freetype/ftlayout.h. Symbols in GXLayout |
|
are declared in include/freetype/gxlayout.h. To include these header |
|
files in your source file, you have to obey to the way of FreeType2; |
|
you have to specify the header files in symbols: |
|
|
|
#include<ft2build.h> |
|
... |
|
#include FT_LAYOUT_H |
|
#include FT_GXLAYOUT_H |
|
|
|
|
|
The outlines of usage are: |
|
|
|
1. Create a face |
|
This procedure is the same as before. |
|
Create a `face' from the target font file after |
|
initialize the library itself. |
|
|
|
2. Check the existence of substitution tables |
|
You can check the existence of substitution table |
|
in the target font by the logical AND operation between |
|
face::face_flags and FT_FACE_FLAG_GLYPH_SUBSTITUTION. |
|
|
|
3. Check the type of layout engine |
|
You can check whether the type of text layout engine |
|
is GXLayout or OTLayout by invoking FTL_Query_EngineType. |
|
Hereafter, we assume the engine type is GXLayout. |
|
|
|
4. Create a request |
|
A `request' is needed in FTLayout to specify the |
|
font feature settings in substitution. You can create more |
|
than one requests against one face and specify the font |
|
feature settings independently each of them; and activate |
|
one of them. Invoke FTL_New_FeaturesRequest with a face to |
|
create a requests. Invoke FTL_Done_FeaturesRequest to release a |
|
request. |
|
|
|
5. Set the features and settings to the request |
|
Concrete text layout engine(GXLayout)'s interface is used to |
|
specify the font feature settings to a request. Following |
|
functions are available to specify: |
|
|
|
- GXL_FeaturesRequest_Get_Feature returns a object(feature) |
|
which represents Nth feature of a face. |
|
|
|
- GXL_FeaturesRequest_Get_Feature_Count returns the number of |
|
features in a face. |
|
|
|
- GXL_Feature_Get_Setting returns a object(setting) which |
|
requests Nth setting of a feature. |
|
|
|
- GXL_Feature_Get_Setting_Count returns the number of settings |
|
in a feature. |
|
|
|
- GXL_Feature_Get_Name returns the name of given feature. |
|
|
|
- GXL_Setting_Get_State returns the state (enable or disable) |
|
of given setting. |
|
|
|
- GXL_Setting_Get_Name returns the name of given setting. |
|
|
|
- GXL_Feature_Is_Setting_Exclusive returns whether given |
|
setting is exclusive or not. |
|
|
|
These functions may be useful to construct GUI thorough which |
|
application users can specify the font features settings. |
|
"Features" tab of gxdemo may be good example to construct |
|
GUI. |
|
|
|
The writing direction(vertical or horizontal) have to be |
|
specified also in FTLayout level. Use |
|
|
|
FTL_Set_FeaturesRequest_Direction |
|
|
|
to specify. Whether you have to specify the direction in |
|
GXLayout level or not depends on the target font file. |
|
|
|
6. Activate request |
|
After setting a request by functions explained in 5., |
|
You have to activate it. Use |
|
|
|
FTL_Activate_FeaturesRequest |
|
|
|
to activate a face. (Only one request is active for |
|
a face at the same time.) |
|
|
|
7. Create input/output glyph array |
|
FTL_New_Glyphs_Array is used to create a glyph array. |
|
To substitute two glyph arrays are needed to store |
|
input glyphs(input) and substituted result(output). |
|
|
|
About the input, you have to set the length and fill the array |
|
with glyphs by your self. Use |
|
|
|
|
|
FTL_Set_Glyphs_Array_Length |
|
|
|
to set the length of glyph array. Use `gid' field of glyph |
|
array to fill the input glyphs. |
|
|
|
The length of output are automatically set by FTLayout. |
|
|
|
8. Substitute |
|
Invoke |
|
|
|
FTL_Substitute_Glyphs |
|
|
|
with a face, input and output. |
|
|
|
Other than 5. are procedures are done in fi command. Therefore fi.c |
|
may be good simple example to substitute glyphs. |
|
|
|
TODO |
|
==== |
|
- lazy table loading |
|
- verification table data during loading not in |
|
substitution time |
|
- more detailing error codes and using them |
|
|
|
|
|
License |
|
======= |
|
The licenses of FTLayout and GXLayout are the same as that |
|
of FreeType2. About OTLayout, see src/otlayout/README. |
|
|
|
Acknowledgments |
|
=============== |
|
This development is supported by Information-technology Promotion |
|
Agency, Japan(IPA). We would like to appreciate the supports. |
|
|
|
Mitsuru Oka advised us about OpenType and Pango. We would like to |
|
appreciate his advices. |
|
|
|
Contact |
|
======= |
|
Masatake YAMATO |
|
<yamato@redhat.com> or <jet@gyve.org>
|
|
|