parent
cad0775afe
commit
a5f7fcdf56
86 changed files with 46305 additions and 5 deletions
@ -0,0 +1,291 @@ |
||||
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> |
@ -0,0 +1,515 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* ftltypes.h */ |
||||
/* */ |
||||
/* FreeType Layout API (specification) */
|
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __FTL_LAYOUT_H_ |
||||
#define __FTL_LAYOUT_H_ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Section> */ |
||||
/* text_layout */ |
||||
/* */ |
||||
/* <Title> */ |
||||
/* Text Layout */ |
||||
/* */ |
||||
/* <Abstract> */ |
||||
/* Generic text layout functions. */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* The following types and functions are used in text layout. */ |
||||
/* 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 abstract 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. */ |
||||
/* */ |
||||
/*************************************************************************/ |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Type> */ |
||||
/* FTL_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An opaque data type to specify which font features are used in */ |
||||
/* text layout. */ |
||||
/* */ |
||||
/* Use @FTL_New_FeaturesRequest to create from a face and */ |
||||
/* @FTL_Done_FeaturesRequest to discard. The way to specify the font */ |
||||
/* features' settting depenes on the concrete font engine behind the */ |
||||
/* face. */ |
||||
/* */ |
||||
typedef struct FTL_FeaturesRequestRec_ * FTL_FeaturesRequest; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Type> */ |
||||
/* FTL_Glyphs_Array */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Data type represents glyphs array used in glyph substitution. */ |
||||
/* See @FTL_GlyphRec for more detail. */ |
||||
/* */ |
||||
typedef struct FTL_Glyphs_ArrayRec_ * FTL_Glyphs_Array; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Enum> */ |
||||
/* FTL_EngineType */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An enumeration representing the concrete text layout engine type. */ |
||||
/* You can get the value for a given face, use @FTL_Query_EngineType. */ |
||||
/* */ |
||||
/* <Values> */ |
||||
/* FTL_NO_ENGINE :: */ |
||||
/* No text layout engine behind the face. */ |
||||
/* */ |
||||
/* FTL_OPENTYPE_ENGINE :: */ |
||||
/* OpneType layout engine. You should use the interface declared in */ |
||||
/* otlayout.h. */ |
||||
/* */ |
||||
/* FTL_TRUETYPEGX_ENGINE :: */ |
||||
/* TrueTypeGX/AAT layout engine. You should use the interface */ |
||||
/* declared in gxlayout.h. */ |
||||
/* */ |
||||
typedef enum |
||||
{ |
||||
FTL_NO_ENGINE = 0, |
||||
FTL_OPENTYPE_ENGINE = 1, /* Use otlayout.h */ |
||||
FTL_TRUETYPEGX_ENGINE = 2 /* Use gxlayout.h */ |
||||
} FTL_EngineType; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Enum> */ |
||||
/* FTL_Direction */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An enumeration representing the text layout direction. */ |
||||
/* */ |
||||
/* You can set the direction value to a features request by */ |
||||
/* @FTL_Set_FeaturesRequest_Direction. You can get the direction */ |
||||
/* value from a features request by */ |
||||
/* @FTL_Get_FeaturesRequest_Direction. */ |
||||
/* */ |
||||
/* <Values> */ |
||||
/* FTL_HORIZONTAL :: */ |
||||
/* Value representing horizontal writing. */ |
||||
/* */ |
||||
/* FTL_VERTICAL :: */ |
||||
/* Value representing vertical writing. */ |
||||
/* */
|
||||
typedef enum
|
||||
{
|
||||
FTL_HORIZONTAL = 0,
|
||||
FTL_VERTICAL = 1 |
||||
} FTL_Direction; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Struct> */ |
||||
/* FTL_GlyphRec */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Data type represents a glyph id used in glyph substitution. */ |
||||
/* */ |
||||
/* <Fields> */ |
||||
/* gid :: The glyph id. If gid is 0xFFFF, this element in an */ |
||||
/* glyph array should be ignored. */ |
||||
/* */ |
||||
/* ot_prop :: Glyph's property used in OTLayout substitution. */ |
||||
/* GXLayout does not use this field. */ |
||||
/* */ |
||||
typedef struct FTL_GlyphRec_ |
||||
{ |
||||
FT_UShort gid; |
||||
FT_UShort reserved1; |
||||
FT_ULong ot_prop; |
||||
FT_ULong reserved2; |
||||
} FTL_GlyphRec, * FTL_Glyph; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Struct> */ |
||||
/* FTL_Glyph_ArrayRec_ */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Data type represents glyphs array used in glyph substitution. */ |
||||
/* */ |
||||
/* This data type is used as input and output arguments for */ |
||||
/* @FTL_Substitute_Glyphs. */ |
||||
/* @FTL_New_Glyphs_Array allocates 0 length FTL_GlyphRec object. */ |
||||
/* @FTL_Set_Glyphs_Array_Length sets the length of FTL_GlyphRec */ |
||||
/* object. You have to set the length to create an input glyph array */ |
||||
/* for substitution. */ |
||||
/* */ |
||||
/* <Fields> */ |
||||
/* memory :: The current memory object which handles the glyph */ |
||||
/* arrray. */ |
||||
/* */ |
||||
/* glyphs :: Glyphs ids' array. */ |
||||
/* */ |
||||
/* length :: The valid length of glyphs. */ |
||||
/* */ |
||||
/* allocated :: The allocation size of glyphs. The client should not */ |
||||
/* refer this field. */ |
||||
/* */ |
||||
typedef struct FTL_Glyphs_ArrayRec_ |
||||
{ |
||||
FT_Memory memory; |
||||
FTL_Glyph glyphs; |
||||
/* FT_ULong pos; */ |
||||
FT_ULong reserved1; |
||||
FT_ULong length; |
||||
FT_ULong allocated; |
||||
} FTL_Glyphs_ArrayRec; |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Query_EngineType */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the text layout engine type behind a face. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* face :: The target face. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* engine_type :: The type of text layout engine for the face. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Query_EngineType ( FT_Face face,
|
||||
FTL_EngineType * engine_type); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_New_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Creates a new features request for a face. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* face :: The target face. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* request :: A features request for a face. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
/* <Note> */ |
||||
/* When the target face is discarded by @FT_Done_Face, all features */ |
||||
/* requests corresponding to the face are also discardeded */ |
||||
/* automatically. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_New_FeaturesRequest ( FT_Face face,
|
||||
FTL_FeaturesRequest* request); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Done_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Discards a features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A features request. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Done_FeaturesRequest ( FTL_FeaturesRequest request ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Activate_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Even though it is possible to create serveral features request */ |
||||
/* object for a given face (see @FTL_New_FeaturesRequest), */ |
||||
/* @FTL_Substitute_Glyphs only use the last activated request. */ |
||||
/* With this function, a features request can be activated. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A features request to be activated. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT ( FT_Error ) |
||||
FTL_Activate_FeaturesRequest ( FTL_FeaturesRequest request ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Copy_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Copy the setting of one features request to another. */
|
||||
/* */ |
||||
/* <Input> */ |
||||
/* from :: The source features request. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* to :: The destination features request. This must be created by */ |
||||
/* @FTL_New_FeaturesRequest before copying. */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
/* <Note> */ |
||||
/* from and to must be created from the same face. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Copy_FeaturesRequest ( FTL_FeaturesRequest from,
|
||||
FTL_FeaturesRequest to ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Reset_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Resets the settings of a features request. In other word set a */
|
||||
/* features request to default settings. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A features request to be reseted. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Reset_FeaturesRequest ( FTL_FeaturesRequest request ); |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Get_FeaturesRequest_Direction */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the writing direction in a features request. */
|
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A features request. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* The writing direction. */ |
||||
/* */ |
||||
FT_EXPORT ( FTL_Direction ) |
||||
FTL_Get_FeaturesRequest_Direction ( FTL_FeaturesRequest request ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Set_FeaturesRequest_Direction */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Sets the writing direction to a features request. */
|
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A features request. */ |
||||
/* */ |
||||
/* direction :: Writing direction. */ |
||||
/* */ |
||||
FT_EXPORT ( void ) |
||||
FTL_Set_FeaturesRequest_Direction ( FTL_FeaturesRequest request,
|
||||
FTL_Direction direction); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_New_Glyphs_Array */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Creates an empty glyphs array. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* momory :: A memory object from which a glyphs array is allocated. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* garray :: A glyphs array. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
/* <Note> */ |
||||
/* The lengoth of newly allocated glyphs array is 0. Set the length */ |
||||
/* by @FTL_Set_Glyphs_Array_Length after allocating if you need. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_New_Glyphs_Array ( FT_Memory memory, |
||||
FTL_Glyphs_Array * garray ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Set_Glyphs_Array_Length */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Sets the length of a glyphs array. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* length :: New glyphs array length. */ |
||||
/* */ |
||||
/* <InOut> */ |
||||
/* garray :: A glyphs array. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Set_Glyphs_Array_Length ( FTL_Glyphs_Array garray, |
||||
FT_ULong new_length ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Copy_Glyphs_Array */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Copies glyphs array. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* in :: The source glyphs array. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* out :: The destination glyphs array. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Copy_Glyphs_Array ( FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Done_Glyphs_Array */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Discards a glyphs array. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* garray :: A glyphs array. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Done_Glyphs_Array ( FTL_Glyphs_Array garray ); |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Substitute_Glyphs */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Substitutes glyphs based on the rule specified by the current */ |
||||
/* activated features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* face :: A face which has substitution tables. */ |
||||
/* */ |
||||
/* in :: Input glyphs array. */
|
||||
/* */ |
||||
/* <Output> */ |
||||
/* out :: Output(substituted) glyphs array. The length of glyphs */ |
||||
/* are automatically extended. */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Substitute_Glyphs ( FT_Face face, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Get_LigatureCaret_Count */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the number of ligature divisions for a given glyph. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* face :: A face. */ |
||||
/* */ |
||||
/* glyphID :: The target glyph's id. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* The number of ligature divisions. If the glyph is not ligatured */ |
||||
/* glyph, returns 0. */ |
||||
/* */ |
||||
FT_EXPORT( FT_UShort ) |
||||
FTL_Get_LigatureCaret_Count ( FT_Face face, FT_UShort glyphID ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* FTL_Get_LigatureCaret_Division */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the point of Nth ligature divisions for a given glyph. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* face :: A face. */ |
||||
/* */ |
||||
/* glyphID :: The target glyph's id. */ |
||||
/* */ |
||||
/* nth :: The index of ligature divisions. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* The point of a ligature division. If the glyph is not ligatured */ |
||||
/* glyph, returns 0. */ |
||||
/* */ |
||||
FT_EXPORT( FT_UShort ) |
||||
FTL_Get_LigatureCaret_Division ( FT_Face face,
|
||||
FT_UShort glyphID,
|
||||
FT_UShort nth ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __FTL_LAYOUT_H_ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,363 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlayout.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX based layout engine(specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXLAYOUT_H__ |
||||
#define __GXLAYOUT_H__ |
||||
|
||||
|
||||
#include <ft2build.h> |
||||
#include FT_SFNT_NAMES_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Section> */ |
||||
/* gx_text_layout */ |
||||
/* */ |
||||
/* <Title> */ |
||||
/* GX Text Layout */ |
||||
/* */ |
||||
/* <Abstract> */ |
||||
/* TrueTypeGX/AAT text layout types and functions. */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* The following types and functions(interface) are used in text */ |
||||
/* layout with TrueTypeGX/AAT font. You have to use combination with */ |
||||
/* this GXLayout interface and generic FTLayout interface. */ |
||||
/* You have to use GXLayout interface to get the font features */ |
||||
/* defined in `feat' table; and specify settings to the features */ |
||||
/* request created by @FTL_New_FeaturesRequest. */ |
||||
/* */ |
||||
/*************************************************************************/ |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Type> */ |
||||
/* GXL_FeaturesRequest */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* GXLayout level representation of FTL_FeaturesRequest. */ |
||||
/* */ |
||||
/* GXLayout functions dealing in features requests requires */ |
||||
/* arguments typed to GXL_FeaturesRequest instead of */ |
||||
/* FTL_FeaturesRequest. */ |
||||
/* */ |
||||
typedef struct GXL_FeaturesRequestRec_ *GXL_FeaturesRequest; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Type> */ |
||||
/* GXL_Feature */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An opaque data type representing a feature of TrueTypeGX/AAT font. */ |
||||
/* */ |
||||
/* @GXL_FeaturesRequest_Get_Feature_Count returns the number of */ |
||||
/* in a font. @GXL_FeaturesRequest_Get_Feature returns Nth feature */ |
||||
/* object in a font. */ |
||||
/* */ |
||||
typedef struct GXL_FeatureRec_ *GXL_Feature; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Type> */ |
||||
/* GXL_Setting */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An opaque data type representing a setting of a feature. */ |
||||
/* */ |
||||
/* @GXL_Feature_Get_Setting_Count returns the number of settings in a */ |
||||
/* feature. @GXL_Feature_Get_Setting returns Nth setting in a */ |
||||
/* feature. */ |
||||
/* */ |
||||
typedef struct GXL_SettingRec_ *GXL_Setting; |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Enum> */ |
||||
/* GXL_Initial_State */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* An enumeration for the initial state of GX glyph substitution */ |
||||
/* automaton. */ |
||||
/* */ |
||||
/* You can set/get these value to/from a features request by */ |
||||
/* @GXL_FeaturesRequest_Set_Initial_State and */ |
||||
/* @GXL_FeaturesRequest_Set_Initial_State. */ |
||||
/* */ |
||||
/* <Values> */ |
||||
/* GXL_START_OF_TEXT_STATE :: */ |
||||
/* State of text start. */ |
||||
/* */ |
||||
/* GXL_START_OF_LINE_STATE :: */ |
||||
/* State of line start. */ |
||||
/* */ |
||||
typedef enum |
||||
{ |
||||
GXL_START_OF_TEXT_STATE = 0, |
||||
GXL_START_OF_LINE_STATE = 1 |
||||
} GXL_Initial_State; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_FeaturesRequest_Set_Initial_State */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Sets a initial state for glyph the initial state of GX glyph */ |
||||
/* substitution automaton to a features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: a Target features request. */ |
||||
/* */ |
||||
/* initial_state :: The initial state. */ |
||||
/* */ |
||||
FT_EXPORT ( void ) |
||||
GXL_FeaturesRequest_Set_Initial_State ( GXL_FeaturesRequest request, |
||||
GXL_Initial_State initial_state ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_FeaturesRequest_Get_Initial_State */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns a initial state for glyph the initial state of GX glyph */ |
||||
/* substitution automaton in a features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A target features request. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* An initial state value typed to @GXL_Initial_State. */ |
||||
/* */ |
||||
FT_EXPORT ( GXL_Initial_State ) |
||||
GXL_FeaturesRequest_Get_Initial_State ( GXL_FeaturesRequest request ); |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_FeaturesRequest_Get_Feature_Count */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the number of features in a features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A target features request. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* The number of features. */ |
||||
/* */ |
||||
FT_EXPORT ( FT_ULong ) |
||||
GXL_FeaturesRequest_Get_Feature_Count ( GXL_FeaturesRequest request ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_FeaturesRequest_Get_Feature */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns Nth font feature object from a features request. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A target features request. */ |
||||
/* */ |
||||
/* index :: The index of feature. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* A feature object. */ |
||||
/* */ |
||||
/* <Note> */ |
||||
/* Use @GXL_FeaturesRequest_Get_Feature_Count to get the number of */ |
||||
/* available features. */ |
||||
/* */ |
||||
FT_EXPORT ( GXL_Feature ) |
||||
GXL_FeaturesRequest_Get_Feature ( GXL_FeaturesRequest request,
|
||||
FT_ULong index); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Feature_Get_Name */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Gets the name for a feature. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* feature :: A target feature. */ |
||||
/* */ |
||||
/* platform_id :: Platform ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* encoding_id :: Encoding ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* language_id :: Language ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* aname :: The name of a setting. The memory area must be */ |
||||
/* allocated by the client. The pointer to a object */ |
||||
/* on a stack is ok. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error )
|
||||
GXL_Feature_Get_Name ( GXL_Feature feature , |
||||
FT_UShort platform_id, |
||||
FT_UShort pencoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ); |
||||
|
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Feature_Get_Setting_Count */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns the number of settings in a feature */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* request :: A target feature. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* The number of settings. */ |
||||
/* */ |
||||
FT_EXPORT( FT_UShort ) |
||||
GXL_Feature_Get_Setting_Count ( GXL_Feature feature ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Feature_Get_Setting */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns Nth setting object from a feature. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* feature :: A target feature. */ |
||||
/* */ |
||||
/* index :: The index of setting. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* A setting object. */ |
||||
/* */ |
||||
/* <Note> */ |
||||
/* Use @GXL_Feature_Get_Setting_Count to get the number of available */ |
||||
/* settings. */ |
||||
/* */ |
||||
FT_EXPORT( GXL_Setting ) |
||||
GXL_Feature_Get_Setting ( GXL_Feature feature, |
||||
FT_ULong index ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Feature_Is_Setting_Exclusive */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns whether a feature's setting is exclusive or not. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* feature :: A target feature. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* True if a feature's setting is exclusive. False if not. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Bool ) |
||||
GXL_Feature_Is_Setting_Exclusive ( GXL_Feature feature ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Setting_Get_Name */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Gets the name for a setting. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* setting :: A target setting. */ |
||||
/* */ |
||||
/* platform_id :: Platform ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* encoding_id :: Encoding ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* language_id :: Language ID for the name. 0 is wild-card. */ |
||||
/* */ |
||||
/* <Output> */ |
||||
/* aname :: The name of a setting. The memory area must be */ |
||||
/* allocated by the client. The pointer to a object */ |
||||
/* on a stack is ok. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* FreeType error code. 0 means success. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Error ) |
||||
GXL_Setting_Get_Name ( GXL_Setting setting, |
||||
FT_UShort platform_id, |
||||
FT_UShort encoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Setting_Get_State */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Returns whether a setting is enabled or disabled. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* setting :: A target setting. */ |
||||
/* */ |
||||
/* <Return> */ |
||||
/* True if a setting is enabled. False if disabled. */ |
||||
/* */ |
||||
FT_EXPORT( FT_Bool ) |
||||
GXL_Setting_Get_State ( GXL_Setting setting ); |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* <Function> */ |
||||
/* GXL_Setting_Set_State */ |
||||
/* */ |
||||
/* <Description> */ |
||||
/* Make a setting enable or disable. */ |
||||
/* */ |
||||
/* <Input> */ |
||||
/* setting :: A target setting. */ |
||||
/* */ |
||||
/* state :: A state to set. If this is true, the setting is */ |
||||
/* enabled. If this is false, the setting is disabled. */ |
||||
/* */ |
||||
FT_EXPORT( void ) |
||||
GXL_Setting_Set_State ( GXL_Setting setting,
|
||||
FT_Bool state ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXLAYOUT_H__ */ |
||||
|
||||
|
||||
|
@ -0,0 +1,85 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* ftltypes.h */ |
||||
/* */ |
||||
/* Types used in the layout engine stacked on ft2 (specification) */
|
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __FTL_TYPES_H__ |
||||
#define __FTL_TYPES_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LAYOUT_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
#define FTL_FONT( x ) ((FTL_Font)(x)) |
||||
#define FTL_FONT_FACE( x ) (FTL_FONT( x )->face) |
||||
#define FTL_FEATURES_REQUEST( x ) ((FTL_FeaturesRequest)( x )) |
||||
#define FTL_FEATURES_REQUEST_FONT( x )(FTL_FEATURES_REQUEST( x )->font) |
||||
|
||||
typedef struct FTL_FontRec_ * FTL_Font; |
||||
typedef struct FTL_FeaturesRequestRec_ |
||||
{ |
||||
FTL_Font font; |
||||
FTL_Direction direction; |
||||
} FTL_FeaturesRequestRec; |
||||
|
||||
typedef struct FTL_FontRec_ |
||||
{ |
||||
FT_Face face; |
||||
|
||||
/* This one is used as active features request. */ |
||||
FTL_FeaturesRequest features_request;
|
||||
FT_ListRec features_requests_list; |
||||
} FTL_FontRec; |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Font_Init ( FTL_Font font, |
||||
FT_Face face ); |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Font_Finalize ( FTL_Font font ); |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
FTL_FeaturesRequest_Init ( FT_Face face,
|
||||
FTL_FeaturesRequest request); |
||||
FT_EXPORT( FT_Error ) |
||||
FTL_FeaturesRequest_Finalize ( FTL_FeaturesRequest request ); |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_FeaturesRequest_Copy ( FTL_FeaturesRequest from,
|
||||
FTL_FeaturesRequest to ); |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Font_Get_Default_FeaturesRequest ( FTL_Font font, |
||||
FTL_FeaturesRequest * request ); |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Font_Get_Current_FeaturesRequest ( FTL_Font font, |
||||
FTL_FeaturesRequest * request ); |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
FTL_Get_Font ( FT_Face face, |
||||
FTL_Font * font ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __FTL_TYPES_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,84 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* svlayout.h */ |
||||
/* */ |
||||
/* The FreeType Layout services (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __SVLAYOUT_H__ |
||||
#define __SVLAYOUT_H__ |
||||
|
||||
#include FT_INTERNAL_SERVICE_H |
||||
#include FT_LAYOUT_H |
||||
#include FT_INTERNAL_FTL_TYPES_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
#define FT_SERVICE_ID_LAYOUT "layout" |
||||
|
||||
typedef FT_Error |
||||
(*FTL_Get_Font_Func)( FT_Face face, |
||||
FTL_Font* font ); |
||||
|
||||
typedef FTL_EngineType |
||||
(*FTL_Get_EngineType_Func) ( FT_Face face ); |
||||
|
||||
typedef FT_Error |
||||
(*FTL_New_FeaturesRequest_Func)( FT_Face face, |
||||
FTL_FeaturesRequest* request ); |
||||
typedef FT_Error |
||||
(*FTL_Done_FeaturesRequest_Func)( FTL_FeaturesRequest request ); |
||||
|
||||
typedef FT_Error |
||||
(*FTL_Copy_FeaturesRequest_Func)( FTL_FeaturesRequest from, |
||||
FTL_FeaturesRequest to ); |
||||
|
||||
typedef FT_UShort |
||||
(*FTL_Get_LigatureCaret_Count_Func) ( FT_Face face, FT_UShort glyphID ); |
||||
|
||||
typedef FT_UShort |
||||
(*FTL_Get_LigatureCaret_Division_Func) ( FT_Face face,
|
||||
FT_UShort glyphID,
|
||||
FT_UShort nth ); |
||||
typedef FT_Error |
||||
(*FTL_Substitute_Glyphs_Func) ( FT_Face face, |
||||
FTL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
FT_DEFINE_SERVICE( Layout ) |
||||
{ |
||||
FTL_Get_Font_Func get_font; |
||||
FTL_Get_EngineType_Func get_engine_type; |
||||
FTL_New_FeaturesRequest_Func new_features_request; |
||||
FTL_Done_FeaturesRequest_Func done_features_request; |
||||
FTL_Copy_FeaturesRequest_Func copy_features_request; |
||||
FTL_Get_LigatureCaret_Count_Func get_ligature_caret_count; |
||||
FTL_Get_LigatureCaret_Division_Func get_ligature_caret_division; |
||||
FTL_Substitute_Glyphs_Func substitute_glyphs; |
||||
}; |
||||
|
||||
/* */ |
||||
|
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* __SVLAYOUT_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,79 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otlayout.h */ |
||||
/* */ |
||||
/* OpenType based layout engine */ |
||||
/* (For application developers, specification only). */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
|
||||
#ifndef __OTLAYOUT_H__ |
||||
#define __OTLAYOUT_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef FT_ULong OTTag; |
||||
typedef enum { |
||||
OT_TABLE_GSUB, |
||||
OT_TABLE_GPOS |
||||
} OTTableType; |
||||
|
||||
typedef struct OTL_FeaturesRequestRec_ *OTL_FeaturesRequest; |
||||
typedef struct OTL_Tag_ListRec_ |
||||
{ |
||||
OTL_FeaturesRequest request; |
||||
OTTag * tags; /* 0 is terminator. */ |
||||
} OTL_Tag_ListRec, *OTL_Tag_List; |
||||
|
||||
FT_EXPORT( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Script ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
OTTag script_tag, |
||||
FT_UInt *script_index); |
||||
|
||||
FT_EXPORT( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Language ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag, |
||||
FT_UInt *language_index, |
||||
FT_UInt *required_feature_index ); |
||||
|
||||
FT_EXPORT ( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Feature ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
OTTag feature_tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index, |
||||
FT_UInt *feature_index ); |
||||
|
||||
FT_EXPORT ( OTL_Tag_List ) |
||||
OTL_FeaturesRequest_List_Scripts ( OTL_FeaturesRequest request, |
||||
OTTableType table_type ); |
||||
|
||||
FT_EXPORT ( OTL_Tag_List )
|
||||
OTL_FeaturesRequest_List_Languages ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index ); |
||||
|
||||
FT_EXPORT ( OTL_Tag_List ) |
||||
OTL_FeaturesRequest_List_Features ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index ); |
||||
|
||||
FT_EXPORT ( FT_Error ) |
||||
OTL_Tag_List_Done ( OTL_Tag_List taglist ); |
||||
|
||||
FT_EXPORT ( FT_Error ) |
||||
OTL_FeaturesRequest_Add_Feature ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt feature_index, |
||||
FT_ULong property_bit); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __OTLAYOUT_H__ */ |
@ -0,0 +1,496 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* ftltypes.h */ |
||||
/* */ |
||||
/* Implementation of FreeType Layout API (body) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LAYOUT_H |
||||
#include FT_INTERNAL_FTL_TYPES_H |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_SERVICE_LAYOUT_H |
||||
#include FT_LIST_H |
||||
|
||||
static void |
||||
destroy_feaatures_requests ( FT_Memory memory, |
||||
void * data, |
||||
void * user ); |
||||
|
||||
static FT_Error |
||||
ft_face_get_layout_service( FT_Face face, |
||||
FT_Service_Layout *aservice ) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
*aservice = NULL; |
||||
|
||||
if ( !face ) |
||||
return FT_Err_Invalid_Face_Handle; |
||||
|
||||
error = FT_Err_Invalid_Argument; |
||||
|
||||
|
||||
FT_FACE_LOOKUP_SERVICE( face, |
||||
*aservice, |
||||
LAYOUT ); |
||||
|
||||
if ( *aservice ) |
||||
error = FT_Err_Ok; |
||||
|
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Get_Font ( FT_Face face, |
||||
FTL_Font * font ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return error; |
||||
|
||||
error = FT_Err_Invalid_Argument; |
||||
if ( service->get_font ) |
||||
error = service->get_font ( face, font ); |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Query_EngineType ( FT_Face face,
|
||||
FTL_EngineType * engine_type) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
|
||||
if ( !face ) |
||||
return FT_Err_Invalid_Argument; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return error; |
||||
|
||||
error = FT_Err_Invalid_Argument; |
||||
if ( service->get_engine_type ) |
||||
{ |
||||
error = FT_Err_Ok; |
||||
*engine_type = service->get_engine_type( face ); |
||||
} |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_New_FeaturesRequest ( FT_Face face,
|
||||
FTL_FeaturesRequest* request) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
FTL_FeaturesRequest arequest = NULL; |
||||
FT_ListNode node = NULL; |
||||
FT_Memory memory; |
||||
FTL_Font font; |
||||
|
||||
memory = face->driver->root.memory; |
||||
|
||||
if ( FT_NEW( node ) ) |
||||
goto Exit; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
goto Exit; |
||||
|
||||
if ( service->get_font ) |
||||
{ |
||||
if (( error = service->get_font( face, &font ) )) |
||||
goto Failure; |
||||
} |
||||
|
||||
if ( service->new_features_request ) |
||||
{ |
||||
if (( error = service->new_features_request( face, &arequest ) )) |
||||
goto Failure; |
||||
} |
||||
else |
||||
{ |
||||
if ( FT_NEW( arequest ) ) |
||||
goto Exit; |
||||
if (( error = FTL_FeaturesRequest_Init ( face, arequest ) )) |
||||
{ |
||||
FT_FREE( arequest ); |
||||
goto Failure; |
||||
} |
||||
} |
||||
*request = arequest; |
||||
node->data = arequest; |
||||
FT_List_Add( &font->features_requests_list, node ); |
||||
if ( !font->features_request ) |
||||
font->features_request = arequest; |
||||
error = FT_Err_Ok; |
||||
Exit: |
||||
return error; |
||||
Failure: |
||||
if ( arequest ) |
||||
FT_FREE ( arequest ); |
||||
if ( node ) |
||||
FT_FREE( node ); |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_FeaturesRequest_Init ( FT_Face face,
|
||||
FTL_FeaturesRequest request) |
||||
{ |
||||
FT_Error error; |
||||
FTL_Font font; |
||||
|
||||
if ( ( error = FTL_Get_Font( face, &font ) ) ) |
||||
return error; |
||||
request->font = font; |
||||
request->direction = FTL_HORIZONTAL; |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Done_FeaturesRequest ( FTL_FeaturesRequest request ) |
||||
{ |
||||
FT_Error error; |
||||
FTL_Font font; |
||||
FT_Face face; |
||||
FT_Memory memory; |
||||
FT_ListNode node; |
||||
FT_Service_Layout service; |
||||
|
||||
font = request->font; |
||||
FT_ASSERT(font); |
||||
face = font->face; |
||||
FT_ASSERT(face); |
||||
memory = face->driver->root.memory; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return error; |
||||
|
||||
node = FT_List_Find( &font->features_requests_list, request ); |
||||
FT_ASSERT(node); |
||||
FT_List_Remove ( &font->features_requests_list, node ); |
||||
FT_FREE( node ); |
||||
if ( font->features_request == request ) |
||||
{ |
||||
font->features_request = NULL; |
||||
if ( font->features_requests_list.head ) |
||||
font->features_request = (FTL_FeaturesRequest)(font->features_requests_list.head->data); |
||||
} |
||||
if ( service->done_features_request ) |
||||
error = service->done_features_request( request ); |
||||
else |
||||
{ |
||||
error = FTL_FeaturesRequest_Finalize( request ); |
||||
FT_FREE( request ); /* TODO */ |
||||
} |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_FeaturesRequest_Finalize ( FTL_FeaturesRequest request ) |
||||
{ |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
|
||||
FT_EXPORT_DEF ( FTL_Direction ) |
||||
FTL_Get_FeaturesRequest_Direction ( FTL_FeaturesRequest request ) |
||||
{ |
||||
FT_ASSERT( request ); |
||||
return request->direction; |
||||
} |
||||
|
||||
FT_EXPORT_DEF ( void ) |
||||
FTL_Set_FeaturesRequest_Direction ( FTL_FeaturesRequest request,
|
||||
FTL_Direction direction) |
||||
{ |
||||
FT_ASSERT( request ); |
||||
request->direction = direction; |
||||
} |
||||
|
||||
FT_EXPORT_DEF ( FT_Error ) |
||||
FTL_Activate_FeaturesRequest ( FTL_FeaturesRequest request ) |
||||
{ |
||||
FTL_Font font; |
||||
|
||||
if ( !request ) |
||||
return FT_Err_Invalid_Argument; |
||||
|
||||
font = request->font; |
||||
if ( !font ) |
||||
return FT_Err_Invalid_Argument; |
||||
font->features_request = request; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Copy_FeaturesRequest ( FTL_FeaturesRequest from, FTL_FeaturesRequest to ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
|
||||
if ( from->font != to->font ) |
||||
return FT_Err_Invalid_Argument; |
||||
if ( from == to ) |
||||
return FT_Err_Ok; |
||||
|
||||
FT_ASSERT(from->font->face); |
||||
if (( error = ft_face_get_layout_service( from->font->face, &service ) )) |
||||
return error; |
||||
|
||||
if ( service->copy_features_request ) |
||||
error = service->copy_features_request( from, to ); |
||||
else |
||||
error = FTL_FeaturesRequest_Copy ( from, to ); |
||||
return error; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_FeaturesRequest_Copy ( FTL_FeaturesRequest from, FTL_FeaturesRequest to ) |
||||
{ |
||||
FTL_Set_FeaturesRequest_Direction(to,
|
||||
FTL_Get_FeaturesRequest_Direction(to)); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Reset_FeaturesRequest ( FTL_FeaturesRequest request ) |
||||
{ |
||||
FTL_Font font; |
||||
FTL_FeaturesRequest default_request; |
||||
|
||||
if ( !request ) |
||||
return FT_Err_Invalid_Argument; |
||||
|
||||
font = request->font; |
||||
FT_ASSERT( font ); |
||||
FTL_Font_Get_Default_FeaturesRequest( font, &default_request ); |
||||
return FTL_Copy_FeaturesRequest( (FTL_FeaturesRequest)default_request,
|
||||
(FTL_FeaturesRequest)request ); |
||||
|
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Font_Init ( FTL_Font font, |
||||
FT_Face face ) |
||||
{ |
||||
if ( (!font) || (!face) ) |
||||
return FT_Err_Invalid_Argument; |
||||
font->face = face; |
||||
font->features_request = NULL; |
||||
font->features_requests_list.head = NULL; |
||||
font->features_requests_list.tail = NULL; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Font_Finalize ( FTL_Font font ) |
||||
{ |
||||
FT_Face face = font->face; |
||||
FT_Memory memory = face->driver->root.memory; |
||||
|
||||
if ( !font ) |
||||
return FT_Err_Invalid_Argument; |
||||
|
||||
FT_List_Finalize( &font->features_requests_list, |
||||
(FT_List_Destructor)destroy_feaatures_requests, |
||||
memory, |
||||
NULL ); |
||||
|
||||
font->features_requests_list.head = NULL; |
||||
font->features_requests_list.tail = NULL; |
||||
font->features_request = NULL; |
||||
font->face = NULL; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
static void |
||||
destroy_feaatures_requests ( FT_Memory memory, |
||||
void * data, |
||||
void * user ) |
||||
{ |
||||
FTL_Font font; |
||||
FT_Face face; |
||||
FTL_FeaturesRequest request = data; |
||||
FT_Service_Layout service = NULL; |
||||
|
||||
FT_UNUSED(user); |
||||
|
||||
font = request->font; |
||||
FT_ASSERT(font); |
||||
face = font->face; |
||||
FT_ASSERT(face); |
||||
|
||||
ft_face_get_layout_service( face, &service ); |
||||
|
||||
if ( service && service->done_features_request ) |
||||
service->done_features_request( request ); |
||||
else |
||||
{ |
||||
FTL_FeaturesRequest_Finalize( request ); |
||||
FT_FREE( request ); |
||||
} |
||||
}
|
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Font_Get_Default_FeaturesRequest ( FTL_Font font, |
||||
FTL_FeaturesRequest * request ) |
||||
{ |
||||
FT_ListNode node; |
||||
|
||||
if ( !font ) |
||||
return FT_Err_Invalid_Argument; |
||||
node = font->features_requests_list.head; |
||||
*request = node->data; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Font_Get_Current_FeaturesRequest ( FTL_Font font, |
||||
FTL_FeaturesRequest * request ) |
||||
{ |
||||
*request = font->features_request; |
||||
FT_ASSERT ( *request ); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_UShort ) |
||||
FTL_Get_LigatureCaret_Count ( FT_Face face, FT_UShort glyphID ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return 0; |
||||
|
||||
if ( service->get_ligature_caret_count ) |
||||
return service->get_ligature_caret_count( face, glyphID ); |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_UShort ) |
||||
FTL_Get_LigatureCaret_Division ( FT_Face face,
|
||||
FT_UShort glyphID,
|
||||
FT_UShort nth ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return 0; |
||||
|
||||
if ( service->get_ligature_caret_division ) |
||||
return service->get_ligature_caret_division( face, glyphID, nth ); |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_New_Glyphs_Array ( FT_Memory memory, |
||||
FTL_Glyphs_Array * garray ) |
||||
{ |
||||
FT_Error error; |
||||
FTL_Glyphs_Array agarray; |
||||
|
||||
if ( FT_NEW( agarray ) ) |
||||
return error; |
||||
|
||||
agarray->memory = memory; |
||||
agarray->glyphs = NULL; |
||||
agarray->length = 0; |
||||
agarray->allocated = 0; |
||||
|
||||
*garray = agarray; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Set_Glyphs_Array_Length ( FTL_Glyphs_Array garray, |
||||
FT_ULong new_length ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = garray->memory; |
||||
|
||||
if ( new_length > garray->allocated ) |
||||
{ |
||||
if ( FT_RENEW_ARRAY( garray->glyphs, garray->allocated, new_length ) ) |
||||
return error; |
||||
garray->allocated = new_length; |
||||
garray->length = new_length; |
||||
} |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Copy_Glyphs_Array ( FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ) |
||||
{ |
||||
FT_Error error; |
||||
FT_ULong i; |
||||
|
||||
if (( error = FTL_Set_Glyphs_Array_Length( out, in->length ) )) |
||||
return error; |
||||
|
||||
for ( i = 0; i < in->length; i++ ) |
||||
out->glyphs[i] = in->glyphs[i]; |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Done_Glyphs_Array ( FTL_Glyphs_Array garray ) |
||||
{ |
||||
FT_Memory memory = garray->memory; |
||||
FT_FREE( garray->glyphs ); |
||||
FT_FREE( garray ); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
FTL_Substitute_Glyphs ( FT_Face face, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Service_Layout service; |
||||
FTL_Font font; |
||||
FTL_FeaturesRequest request; |
||||
|
||||
if (( error = ft_face_get_layout_service( face, &service ) )) |
||||
return error; |
||||
|
||||
if ( ( error = FTL_Get_Font ( face, &font ) ) ) |
||||
return error; |
||||
|
||||
if ( ( error = FTL_Font_Get_Current_FeaturesRequest ( font, |
||||
&request ) ) ) |
||||
return error; |
||||
|
||||
if ( service->substitute_glyphs ) |
||||
return service->substitute_glyphs( face, request, in, out ); |
||||
else |
||||
return FTL_Copy_Glyphs_Array(in, out); |
||||
} |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,23 @@ |
||||
# Copyied from src/gx. |
||||
## |
||||
## FreeType 2 src/gx Jamfile (c) 2003 RedHat K.K. |
||||
## |
||||
|
||||
SubDir FT2_TOP $(FT2_SRC_DIR) gxlayout ; |
||||
|
||||
{ |
||||
local _sources ; |
||||
|
||||
if $(FT2_MULTI) |
||||
{ |
||||
_sources = gxdriver gxload gxobjs gxlayout gxaccess gxfeatreg gxlfeatreg gxstatetbl gxlookuptbl gxvm gxutils |
||||
} |
||||
else |
||||
{ |
||||
_sources = gx ; |
||||
} |
||||
|
||||
Library $(FT2_LIB) : $(_sources).c ; |
||||
} |
||||
|
||||
# end of src/gx Jamfile |
@ -0,0 +1,70 @@ |
||||
#
|
||||
# demo.mk --- Makefile for GX driver demo program
|
||||
#
|
||||
# Copyright 2004 by Masatake YAMATO and RedHat K.K.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
#
|
||||
########################################################################
|
||||
|
||||
# Development of the code in demo.mk is support of
|
||||
# Information-technology Promotion Agency, Japan.
|
||||
|
||||
SHELL=/bin/bash
|
||||
|
||||
GLIB_CFLAGS=`pkg-config --cflags glib-2.0 gobject-2.0`
|
||||
GLIB_LIBS=`pkg-config --libs glib-2.0 gobject-2.0`
|
||||
GTK_CFLAGS=`pkg-config --cflags gtk+-2.0`
|
||||
GTK_LIBS=`pkg-config --libs gtk+-2.0`
|
||||
POPT_LIBS=-lpopt
|
||||
GCANVAS_CFLAGS=`pkg-config --cflags libgnomecanvas-2.0`
|
||||
GCANVAS_LDFLAGS=`pkg-config --libs libgnomecanvas-2.0`
|
||||
|
||||
GUI_CFLAGS=$(GTK_CFLAGS) $(GLIB_CFLAGS) $(GCANVAS_CFLAGS)
|
||||
GUI_LIBS=$(GTK_LIBS) $(POPT_LIBS) $(GLIB_LIBS) $(GCANVAS_LDFLAGS)
|
||||
|
||||
BASE_CFLAGS=-c -O0 -g -I../../include -Wall -std=c99
|
||||
BASE_LIBS=-Xlinker -rpath -Xlinker ../../objs/.libs -lz
|
||||
########################################################################
|
||||
GXOBJ=../../objs/.libs/libfreetype.so
|
||||
|
||||
DEMO=gxdemo
|
||||
DEMOBIN=$(DEMO)
|
||||
DEMOOBJ=$(DEMO).o
|
||||
DEMOSRC=$(DEMO).c
|
||||
DEMO_CFLAGS=$(BASE_CFLAGS) $(GUI_CFLAGS)
|
||||
DEMO_LIBS=$(BASE_LIBS) $(GUI_LIBS)
|
||||
|
||||
FI=fi
|
||||
FIBIN=$(FI)
|
||||
FIOBJ=$(FI).o
|
||||
FISRC=$(FI).c
|
||||
FI_CFLAGS=$(BASE_CFLAGS)
|
||||
FI_LIBS=$(BASE_LIBS)
|
||||
|
||||
########################################################################
|
||||
all: $(DEMO) $(FI) |
||||
$(GXOBJ): *.c *.h |
||||
(cd ../../; make)
|
||||
clean: |
||||
rm -f $(DEMOBIN) $(DEMOOBJ) $(FIBIN) $(FIOBJ) core.*
|
||||
|
||||
########################################################################
|
||||
$(DEMOBIN): $(GXOBJ) $(DEMOOBJ) |
||||
$(CC) -o $(@) $(DEMO_LIBS) $^
|
||||
|
||||
$(DEMOOBJ): $(DEMOSRC) $(GXOBJ) |
||||
$(CC) $(DEMO_CFLAGS) $(DEMOSRC)
|
||||
|
||||
########################################################################
|
||||
$(FIBIN): $(GXOBJ) $(FIOBJ) |
||||
$(CC) -o $(@) $(FI_LIBS) $^
|
||||
|
||||
$(FIOBJ): $(FISRC) $(GXOBJ) |
||||
$(CC) $(FI_CFLAGS) $(FISRC)
|
||||
|
||||
########################################################################
|
@ -0,0 +1,159 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* fi.c */ |
||||
/* */ |
||||
/* 2 characters ligature test program for AAT/TrueTypeGX font driver. */ |
||||
/* */ |
||||
/* Copyright 2004 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
/* "fi" is the typical alphabet ligature. *
|
||||
* "fl" is another good candidate to be tried. */ |
||||
|
||||
const char * target = "fi"; |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LAYOUT_H |
||||
#include FT_GXLAYOUT_H |
||||
#include FT_INTERNAL_OBJECTS_H /* for FT_FACE_MEMORY */ |
||||
|
||||
#include <stdio.h> |
||||
|
||||
FT_Error try_lig(FT_Face face, char a, char b); |
||||
|
||||
int |
||||
main(int argc, char ** argv) |
||||
{ |
||||
FT_Error error; |
||||
int result = 0; |
||||
FT_Library library; |
||||
FT_Face face; |
||||
|
||||
if ( argc != 2 ) |
||||
{ |
||||
fprintf(stderr, "Usage: %s fontfile\n", argv[0]); |
||||
return 1; |
||||
} |
||||
|
||||
error = FT_Init_FreeType ( &library ); |
||||
if ( error ) |
||||
{ |
||||
fprintf(stderr, "Abort: Fail to initialize FT2\n"); |
||||
result = 1; |
||||
goto Fail; |
||||
} |
||||
|
||||
error = FT_New_Face (library, argv[1], 0, &face);
|
||||
if ( error ) |
||||
{ |
||||
fprintf(stderr, "Abort: Fail to open the file\n"); |
||||
result = 1; |
||||
goto Fail; |
||||
} |
||||
if ( !( face->face_flags & FT_FACE_FLAG_GLYPH_SUBSTITUTION) ) |
||||
{ |
||||
fprintf(stderr, "Abort: No substitution table for the face\n"); |
||||
result = 1; |
||||
goto Fail; |
||||
} |
||||
|
||||
fprintf(stdout, "-------------------\n"); |
||||
fprintf(stdout, |
||||
"File: %s\nName: %s\n",
|
||||
argv[1],
|
||||
((FT_Face)face)->family_name); |
||||
|
||||
error = try_lig( face, target[0], target[1] ); |
||||
if ( error ) |
||||
{ |
||||
fprintf(stderr, "Abort: Fail to substitute\n"); |
||||
result = 1; |
||||
} |
||||
|
||||
FT_Done_Face ( face ); |
||||
|
||||
Fail: |
||||
FT_Done_FreeType (library); |
||||
return result; |
||||
}
|
||||
|
||||
FT_Error
|
||||
try_lig( FT_Face face, char c1, char c2 ) |
||||
{ |
||||
FT_Error error = FT_Err_Ok; |
||||
FTL_EngineType engine_type; |
||||
FTL_Glyphs_Array in, out; |
||||
FTL_FeaturesRequest request; |
||||
|
||||
/* Get the engine type */ |
||||
if (( error = FTL_Query_EngineType( face, &engine_type ) )) |
||||
goto Fail; |
||||
|
||||
/* Ignore if the engine type is not GX. */ |
||||
if ( engine_type != FTL_TRUETYPEGX_ENGINE ) |
||||
{ |
||||
fprintf(stderr, "Abort: Not GX font.\n"); |
||||
goto Fail; |
||||
} |
||||
|
||||
/* Allocate input and output glyphs arrays.
|
||||
The lenght for input has already been known: 2 */ |
||||
FTL_New_Glyphs_Array ( FT_FACE_MEMORY(face), &in ); |
||||
FTL_New_Glyphs_Array ( FT_FACE_MEMORY(face), &out ); |
||||
FTL_Set_Glyphs_Array_Length ( in, 2 ); |
||||
|
||||
/* Get glyph id for c1 and c2 */ |
||||
in->glyphs[0].gid = FT_Get_Char_Index( face, c1 ); |
||||
in->glyphs[1].gid = FT_Get_Char_Index( face, c2 ); |
||||
fprintf(stdout, "[IN]%c: %u, %c: %u\n",
|
||||
c1, in->glyphs[0].gid, |
||||
c2, in->glyphs[1].gid); |
||||
|
||||
/* Create a features-request. */ |
||||
FTL_New_FeaturesRequest ( face, &request ); |
||||
|
||||
/* -------------------------------------
|
||||
* YOU CAN SET SOME LAYOUT SETTINGS HERE
|
||||
* ------------------------------------- |
||||
* In this program, just use default. |
||||
* ------------------------------------- |
||||
*/
|
||||
|
||||
/* Activeate the features request */ |
||||
FTL_Activate_FeaturesRequest( request ); |
||||
|
||||
/* Do substitute the glyphs */ |
||||
FTL_Substitute_Glyphs( face, in, out ); |
||||
|
||||
/* Free the features-request */ |
||||
FTL_Done_FeaturesRequest ( request ); |
||||
|
||||
fprintf(stdout,
|
||||
"[OUT]%c: %u, %c: %u%s\n",
|
||||
c1, out->glyphs[0].gid, |
||||
c2, out->glyphs[1].gid,
|
||||
(out->glyphs[1].gid == 0xFFFF)? "<empty>": ""); |
||||
|
||||
/* Free glyphs arrays */ |
||||
FTL_Done_Glyphs_Array ( in ); |
||||
FTL_Done_Glyphs_Array ( out );
|
||||
|
||||
Fail: |
||||
return error; |
||||
} |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,42 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gx.c */ |
||||
/* */ |
||||
/* FreeType AAT/TrueTypeGX driver component (body only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
#define FT_MAKE_OPTION_SINGLE_OBJECT |
||||
|
||||
#include <ft2build.h> |
||||
|
||||
#include "gxdriver.c" /* low level driver interface */ |
||||
#include "gxobjs.c" /* low level object manager */ |
||||
#include "gxload.c" /* tables loader */ |
||||
|
||||
#include "gxlookuptbl.c" |
||||
#include "gxstatetbl.c" |
||||
#include "gxaccess.c" |
||||
#include "gxutils.c" |
||||
#include "gxfeatreg.c" |
||||
|
||||
#include "gxlayout.c" |
||||
#include "gxlfeatreg.c" |
||||
#include "gxvm.c" |
||||
|
||||
#include "gxdump.c" /* only for debug */ |
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,112 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxaccess.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX private data accessor (specification only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXACCESS_H__ |
||||
#define __GXACCESS_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_TYPES_H |
||||
|
||||
#include "gxltypes.h" |
||||
#include "gxtypes.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/* feat */ |
||||
FT_LOCAL ( FT_Bool )
|
||||
gx_feat_has_feature_type ( GX_Feat feat,
|
||||
FT_UShort feature_type ); |
||||
|
||||
/* prop */ |
||||
FT_LOCAL ( FT_UShort )
|
||||
gx_prop_get( GX_Prop prop,
|
||||
FT_Long glyph ); |
||||
|
||||
/* lcar */ |
||||
FT_LOCAL( GX_LigCaretClassEntry )
|
||||
gx_lcar_get ( GX_Lcar lcar,
|
||||
FT_UShort glyphID ); |
||||
|
||||
/* mort */ |
||||
typedef FT_Error (* GX_Mort_Feature_Func)( GX_MetamorphosisFeatureTable feat_Subtbl,
|
||||
FT_Pointer user ); |
||||
FT_LOCAL( FT_Error ) gx_mort_foreach_feature ( GX_Mort mort,
|
||||
GX_Mort_Feature_Func func,
|
||||
FT_Pointer user ); |
||||
FT_LOCAL( FT_UShort )
|
||||
gx_mort_count_feat_not_in_feat ( GX_Mort mort,
|
||||
GX_Feat feat ); |
||||
FT_LOCAL( FT_Error )
|
||||
gx_mort_substitute_glyph ( GX_Mort mort, |
||||
GXL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
/* morx */ |
||||
typedef FT_Error (* GX_Morx_Feature_Func)( GX_XMetamorphosisFeatureTable feat_Subtbl,
|
||||
FT_Pointer user ); |
||||
FT_LOCAL( FT_Error ) |
||||
gx_morx_foreach_feature ( GX_Morx morx,
|
||||
GX_Morx_Feature_Func func,
|
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL( FT_UShort ) |
||||
gx_morx_count_feat_not_in_feat ( GX_Morx morx,
|
||||
GX_Feat feat ); |
||||
FT_LOCAL( FT_Error ) |
||||
gx_morx_substitute_glyph ( GX_Morx morx, |
||||
GXL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
/* kern */ |
||||
FT_LOCAL( FT_Error ) gx_kern_get_pair_kerning ( GX_Kern kern,
|
||||
FT_UShort left_glyph,
|
||||
FT_UShort right_glyph, |
||||
FTL_Direction dir, |
||||
FT_Vector* kerning ); |
||||
|
||||
FT_LOCAL( FT_Error ) gx_kern_get_contextual_kerning( GX_Kern kern, |
||||
FTL_Glyphs_Array garray, |
||||
FTL_Direction dir, |
||||
GXL_Initial_State initial_state, |
||||
FT_Vector * kerning ); |
||||
|
||||
/* trak */ |
||||
FT_LOCAL( FT_Error ) gx_trak_get( GX_Trak trak, |
||||
FT_Fixed track, |
||||
FT_Fixed size, |
||||
FTL_Direction dir, |
||||
FT_FWord* value ); |
||||
|
||||
FT_LOCAL( FT_UShort ) gx_trak_count_name_index( GX_Trak trak ); |
||||
FT_LOCAL( FT_Error ) gx_trak_get_name ( GX_Trak trak, |
||||
FT_UShort index, |
||||
FT_UShort * name_index, |
||||
FTL_Direction * dir, |
||||
FT_Fixed * track ); |
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXACCESS_H__ */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,101 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxdriver.c */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX font driver implementation (body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include "gxdriver.h" |
||||
#include "gxobjs.h" |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */ |
||||
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ |
||||
/* messages during execution. */ |
||||
/* */ |
||||
#undef FT_COMPONENT |
||||
#define FT_COMPONENT trace_gxdriver |
||||
|
||||
/*************************************************************************
|
||||
* gx_driver_class is not initialized statically but dynamically. |
||||
* ----------------------------------------------------------------------- |
||||
* Almost all fields should be initialized in gxobjs.c::gx_driver_init. |
||||
*************************************************************************/ |
||||
|
||||
FT_CALLBACK_TABLE_DEF |
||||
const FT_Driver_ClassRec gx_driver_class = |
||||
{ |
||||
/* FT_Module_Class */ |
||||
{ |
||||
/* module_flags, copyied from ttdriver.c */ |
||||
FT_MODULE_FONT_DRIVER | |
||||
FT_MODULE_DRIVER_SCALABLE | |
||||
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER |
||||
FT_MODULE_DRIVER_HAS_HINTER, |
||||
#else |
||||
0, |
||||
#endif |
||||
/* module_size, copyied from ttdriver.c */ |
||||
sizeof (GX_DriverRec), |
||||
/* module_name */ |
||||
"gx", |
||||
/* module_version */ |
||||
0x10000L, |
||||
/* module_requires */ |
||||
0x20000L, |
||||
|
||||
/* module_interface */ |
||||
NULL, |
||||
|
||||
/* module_init */ |
||||
(FT_Module_Constructor) gx_driver_init, |
||||
|
||||
/* module_done */ |
||||
(FT_Module_Destructor) NULL, |
||||
|
||||
/* get_interface */ |
||||
(FT_Module_Requester) NULL, |
||||
}, |
||||
|
||||
/* now the specific driver fields */ |
||||
0, |
||||
0, |
||||
0, |
||||
|
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
|
||||
NULL, |
||||
NULL, |
||||
|
||||
NULL, |
||||
|
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
}; |
||||
|
||||
/* END */ |
@ -0,0 +1,42 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxdriver.h */ |
||||
/* */ |
||||
/* High-level AAT/TrueTypeGX driver interface (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXDRIVER_H__ |
||||
#define __GXDRIVER_H__ |
||||
|
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_DRIVER_H |
||||
|
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
|
||||
FT_CALLBACK_TABLE |
||||
const FT_Driver_ClassRec gx_driver_class; |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* __GXDRIVER_H__ */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,71 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxdump.h */ |
||||
/* */ |
||||
/* Debug functions for AAT/TrueTypeGX driver (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXDUMP_H__ |
||||
#define __GXDUMP_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_GXLAYOUT_H |
||||
#include <stdio.h> |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef enum { |
||||
GX_DUMP_mort = 1 << 0, |
||||
GX_DUMP_morx = 1 << 1, |
||||
GX_DUMP_feat = 1 << 2, |
||||
GX_DUMP_prop = 1 << 3, |
||||
GX_DUMP_trak = 1 << 4, |
||||
GX_DUMP_kern = 1 << 5, |
||||
GX_DUMP_just = 1 << 6, |
||||
GX_DUMP_lcar = 1 << 7, |
||||
GX_DUMP_opbd = 1 << 8, |
||||
GX_DUMP_bsln = 1 << 9, |
||||
GX_DUMP_fmtx = 1 << 10, |
||||
GX_DUMP_fdsc = 1 << 11, |
||||
GX_DUMP_fvar = 1 << 12, |
||||
GX_DUMP_ALL = 0x7FFFFFFFUL /* gcc warns if I set this to 0xFFFFFFFFUL. */ |
||||
} GXDumpFlag; |
||||
|
||||
FT_EXPORT( FT_Error ) |
||||
gx_face_dump( FT_Face face, FT_ULong tables, const char * fname ); |
||||
|
||||
/* If STREAM is NULL, stderr is used as output stream. */ |
||||
FT_EXPORT ( void ) |
||||
gxl_features_request_dump ( GXL_FeaturesRequest request, FILE * stream ); |
||||
|
||||
|
||||
FT_EXPORT ( void ) |
||||
gx_feature_registory_dump ( FILE * stream ); |
||||
|
||||
FT_EXPORT ( void ) |
||||
gxl_feature_dump ( GXL_Feature feature, FILE * stream ); |
||||
|
||||
FT_EXPORT ( void ) |
||||
gxl_setting_dump ( GXL_Setting setting, FILE * stream ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXDUMP_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,46 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxerrors.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX error codes (specification only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* This file is used to define the AAT/TrueTypeGX error */ |
||||
/* enumeration constants. */ |
||||
/* */ |
||||
/*************************************************************************/ |
||||
|
||||
#ifndef __GXERRORS_H__ |
||||
#define __GXERRORS_H__ |
||||
|
||||
#include FT_MODULE_ERRORS_H |
||||
|
||||
#undef __FTERRORS_H__ |
||||
|
||||
#define FT_ERR_PREFIX GX_Err_ |
||||
#define FT_ERR_BASE FT_Mod_Err_GX |
||||
|
||||
|
||||
#include FT_ERRORS_H |
||||
|
||||
#endif /* __GXERRORS_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,45 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxfeatreg.h */ |
||||
/* */ |
||||
/* Database of font features pre-defined by Apple Computer, Inc. */ |
||||
/* http://developer.apple.com/fonts/Registry/ */ |
||||
/* (specification only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXFEATREG_H__ |
||||
#define __GXFEATREG_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef struct GX_Feature_RegistryRec_ *GX_Feature_Registry; |
||||
|
||||
FT_LOCAL( GX_Feature_Registry ) gx_get_feature_registry( FT_UShort feature_type ); |
||||
FT_LOCAL( FT_UShort ) gx_feature_registry_get_value(GX_Feature_Registry featreg); |
||||
FT_LOCAL( const FT_String * ) gx_feature_registry_get_name( GX_Feature_Registry featreg ); |
||||
FT_LOCAL( FT_Bool ) gx_feature_registry_is_setting_exclusive( GX_Feature_Registry featreg ); |
||||
FT_LOCAL( const FT_String * ) gx_feature_registry_get_setting_name( GX_Feature_Registry featreg, FT_UShort nth ); |
||||
FT_LOCAL( FT_UShort ) gx_feature_registry_count_setting ( GX_Feature_Registry featreg ); |
||||
|
||||
FT_END_HEADER |
||||
#endif /* Not def: __GXFEATREG_H__ */ |
||||
|
||||
/* END */ |
@ -0,0 +1,762 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlayout.c */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX based layout engine(body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
|
||||
#include FT_LIST_H |
||||
#include FT_GXLAYOUT_H |
||||
#include FT_INTERNAL_FTL_TYPES_H |
||||
|
||||
#include "gxltypes.h" |
||||
#include "gxtypes.h" |
||||
#include "gxaccess.h" |
||||
#include "gxutils.h" |
||||
#include "gxlookuptbl.h" |
||||
#include "gxfeatreg.h" |
||||
#include "gxlfeatreg.h" |
||||
#include "gxerrors.h" |
||||
|
||||
static int gxl_feature_compare (const void * a, const void * b); |
||||
static FT_Error gxl_feature_initialize_for_mort ( GXL_Feature feature, |
||||
FT_Memory memory, |
||||
GX_Mort mort,
|
||||
GX_Feat feat, |
||||
FT_UShort * index ); |
||||
static FT_Error gxl_feature_initialize_for_morx ( GXL_Feature feature, |
||||
FT_Memory memory, |
||||
GX_Morx morx,
|
||||
GX_Feat feat, |
||||
FT_UShort * index ); |
||||
/*
|
||||
* FEAT |
||||
*/ |
||||
FT_LOCAL_DEF ( GXL_Setting ) |
||||
gxl_feature_get_setting_by_value (GXL_Feature feature, FT_UShort value) |
||||
{ |
||||
FT_Int i; |
||||
if ( feature->exclusive.exclusive ) |
||||
{ |
||||
if ( value == feature->exclusive.setting->value ) |
||||
return feature->exclusive.setting; |
||||
} |
||||
else |
||||
{ |
||||
for ( i = 0; i < feature->nSettings; i++ ) |
||||
{ |
||||
if ( value == feature->setting[i].value ) |
||||
return &feature->setting[i]; |
||||
} |
||||
} |
||||
return NULL; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( GXL_Feature ) |
||||
gxl_features_request_get_feature_by_type ( GXL_FeaturesRequest request, |
||||
FT_UShort featureType ) |
||||
{ |
||||
GXL_Feature feature = NULL; |
||||
int i; |
||||
for ( i = 0; i < request->nFeatures; i++ ) |
||||
{ |
||||
if ( request->feature[i].value == featureType ) |
||||
{ |
||||
feature = &request->feature[i]; |
||||
break; |
||||
} |
||||
} |
||||
return feature; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( void ) |
||||
gxl_features_request_free( GXL_FeaturesRequest request, FT_Memory memory ) |
||||
{ |
||||
FT_Int i; |
||||
GXL_Feature feature; |
||||
|
||||
for ( i = request->nFeatures; i > 0; i-- ) |
||||
{ |
||||
feature = &(request->feature[i - 1]); |
||||
FT_FREE( feature->setting ); |
||||
} |
||||
FT_FREE ( request->feature ); |
||||
FT_FREE ( request ); |
||||
} |
||||
|
||||
static GXL_Setting |
||||
gxl_setting_get_exclusive_setting( GXL_Setting setting ) |
||||
{ |
||||
return setting->feature->exclusive.setting; |
||||
} |
||||
|
||||
static void |
||||
gxl_setting_set_exclusive_setting( GXL_Setting setting ) |
||||
{ |
||||
setting->feature->exclusive.setting = setting;
|
||||
} |
||||
|
||||
static void |
||||
gxl_setting_set_exclusive_state( GXL_Setting setting , FT_Bool state ) |
||||
{ |
||||
if ( state ) |
||||
gxl_setting_set_exclusive_setting ( setting ); |
||||
} |
||||
|
||||
static FT_Bool |
||||
gxl_setting_get_exclusive_state ( GXL_Setting setting ) |
||||
{ |
||||
if ( gxl_setting_get_exclusive_setting (setting) == setting ) |
||||
return 1; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
FT_EXPORT ( void ) |
||||
GXL_FeaturesRequest_Set_Initial_State ( GXL_FeaturesRequest request, |
||||
GXL_Initial_State initial_state ) |
||||
{ |
||||
FT_ASSERT( request ); |
||||
request->initial_state = initial_state; |
||||
} |
||||
|
||||
FT_EXPORT ( GXL_Initial_State ) |
||||
GXL_FeaturesRequest_Get_Initial_State ( GXL_FeaturesRequest request ) |
||||
{ |
||||
FT_ASSERT( request ); |
||||
return request->initial_state; |
||||
} |
||||
|
||||
FT_EXPORT_DEF ( FT_ULong ) |
||||
GXL_FeaturesRequest_Get_Feature_Count ( GXL_FeaturesRequest request ) |
||||
{ |
||||
if ( request ) |
||||
return request->nFeatures; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
FT_EXPORT_DEF ( GXL_Feature ) |
||||
GXL_FeaturesRequest_Get_Feature ( GXL_FeaturesRequest request,
|
||||
FT_ULong index) |
||||
{ |
||||
GXL_Feature feature = NULL; |
||||
if ( index < GXL_FeaturesRequest_Get_Feature_Count ( request ) ) |
||||
feature = &(request->feature[index]); |
||||
return feature; |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
GXL_Feature_Get_Name ( GXL_Feature feature, |
||||
FT_UShort platform_id, |
||||
FT_UShort encoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ) |
||||
{ |
||||
GXL_Font font; |
||||
FT_Face face; |
||||
font = (GXL_Font)feature->request->root.font; |
||||
face = font->root.face; |
||||
|
||||
if ( ! face ) |
||||
return GX_Err_Invalid_Face_Handle; |
||||
|
||||
if ( ! feature->name.string ) |
||||
return gx_get_name_from_id ( face, |
||||
feature->name.index, |
||||
platform_id, encoding_id, language_id, |
||||
aname ); |
||||
else |
||||
{ |
||||
aname->platform_id = 0; |
||||
aname->encoding_id = 0; |
||||
aname->language_id = 0; |
||||
aname->name_id = 0; |
||||
aname->string = (FT_Byte*)feature->name.string; |
||||
aname->string_len = ft_strlen ( feature->name.string ); |
||||
return GX_Err_Ok; |
||||
} |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_UShort ) |
||||
GXL_Feature_Get_Setting_Count ( GXL_Feature feature ) |
||||
{ |
||||
return feature->nSettings; |
||||
} |
||||
|
||||
|
||||
FT_EXPORT_DEF( GXL_Setting ) |
||||
GXL_Feature_Get_Setting ( GXL_Feature feature, |
||||
FT_ULong index ) |
||||
{ |
||||
GXL_Setting setting = NULL; |
||||
if ( index < feature->nSettings ) |
||||
setting = &feature->setting[index]; |
||||
return setting; |
||||
} |
||||
|
||||
FT_EXPORT_DEF ( FT_Bool ) |
||||
GXL_Feature_Is_Setting_Exclusive ( GXL_Feature feature ) |
||||
{ |
||||
return feature->exclusive.exclusive; |
||||
} |
||||
|
||||
|
||||
FT_EXPORT_DEF( FT_Bool ) |
||||
GXL_Setting_Get_State ( GXL_Setting setting ) |
||||
{ |
||||
GXL_Feature feature = setting->feature; |
||||
if ( GXL_Feature_Is_Setting_Exclusive ( feature ) ) |
||||
return gxl_setting_get_exclusive_state ( setting ); |
||||
else |
||||
return gx_feat_setting_state(setting->value); |
||||
} |
||||
|
||||
FT_EXPORT_DEF( FT_Error ) |
||||
GXL_Setting_Get_Name ( GXL_Setting setting,
|
||||
FT_UShort platform_id, |
||||
FT_UShort encoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ) |
||||
{ |
||||
GXL_Font font = (GXL_Font)setting->feature->request->root.font; |
||||
FT_Face face = font->root.face; |
||||
|
||||
if ( ! setting->name.string ) |
||||
return gx_get_name_from_id ( face, |
||||
setting->name.index, |
||||
platform_id, encoding_id, language_id, |
||||
aname ); |
||||
else |
||||
{ |
||||
aname->platform_id = 0; |
||||
aname->encoding_id = 0; |
||||
aname->language_id = 0; |
||||
aname->name_id = 0; |
||||
aname->string = (FT_Byte*)setting->name.string; |
||||
aname->string_len = ft_strlen ( setting->name.string ); |
||||
return GX_Err_Ok; |
||||
} |
||||
} |
||||
|
||||
FT_EXPORT_DEF( void ) |
||||
GXL_Setting_Set_State ( GXL_Setting setting,
|
||||
FT_Bool state ) |
||||
{ |
||||
if ( setting->feature->exclusive.exclusive ) |
||||
gxl_setting_set_exclusive_state( setting, state ); |
||||
else if ( state ) |
||||
setting->value = gx_feat_setting_on( setting->value ); |
||||
else |
||||
setting->value = gx_feat_setting_off( setting->value ); |
||||
} |
||||
|
||||
/*
|
||||
* Substitution |
||||
*/ |
||||
static int |
||||
gxl_feature_compare (const void * a, const void * b) |
||||
{ |
||||
return (FT_Long)((GXL_Feature)a)->value - (FT_Long)((GXL_Feature)b)->value; |
||||
} |
||||
|
||||
typedef struct gxl_feature_initialize_for_mort_data_rec_ |
||||
{ |
||||
FT_Int count; |
||||
GXL_Feature feature; |
||||
GX_Feat feat; |
||||
FT_Memory memory; |
||||
} gxl_feature_initialize_for_mort_data_rec, *gxl_feature_initialize_for_mort_data; |
||||
|
||||
|
||||
static FT_Error |
||||
gxl_feature_initialize_for_mort_cb ( GX_MetamorphosisFeatureTable feat_Subtbl, FT_Pointer user ) |
||||
{ |
||||
FT_Error error; |
||||
GX_Feature_Registry featreg; |
||||
gxl_feature_initialize_for_mort_data data = user; |
||||
FT_Int i; |
||||
|
||||
if ( gx_feat_has_feature_type ( data->feat, feat_Subtbl->featureType ) ) |
||||
{ /* In feat table? */ |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
for ( i = 0; i < data->count; i ++ ) |
||||
{ /* Duplication check */ |
||||
if ( data->feature[i].value == feat_Subtbl->featureType ) |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
if (!( featreg = gx_get_feature_registry ( feat_Subtbl->featureType ) )) |
||||
{ /* Not in feature_registry */ |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
error = gxl_feature_registry_fill_feature( featreg, data->memory, &(data->feature[data->count]) ); |
||||
if ( error ) |
||||
goto Exit; |
||||
data->count++; |
||||
Exit: |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gxl_feature_initialize_for_mort ( GXL_Feature feature, |
||||
FT_Memory memory, |
||||
GX_Mort mort,
|
||||
GX_Feat feat, |
||||
FT_UShort * index ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Int i; |
||||
gxl_feature_initialize_for_mort_data_rec data; |
||||
data.count = 0; |
||||
data.feature = feature; |
||||
data.feat = feat; |
||||
data.memory = memory; |
||||
|
||||
error = gx_mort_foreach_feature ( mort, gxl_feature_initialize_for_mort_cb, &data ); |
||||
if ( error ) |
||||
{ |
||||
for ( i = data.count; i > 0; i-- ) |
||||
FT_FREE (feature[i - 1].setting); |
||||
return error; |
||||
} |
||||
else |
||||
{ |
||||
*index = data.count; |
||||
return GX_Err_Ok ; |
||||
} |
||||
} |
||||
|
||||
typedef struct gxl_feature_initialize_for_morx_data_rec_ |
||||
{ |
||||
FT_Int count; |
||||
GXL_Feature feature; |
||||
GX_Feat feat; |
||||
FT_Memory memory; |
||||
} gxl_feature_initialize_for_morx_data_rec, *gxl_feature_initialize_for_morx_data; |
||||
|
||||
|
||||
static FT_Error |
||||
gxl_feature_initialize_for_morx_cb ( GX_MetamorphosisFeatureTable feat_Subtbl, FT_Pointer user ) |
||||
{ |
||||
FT_Error error; |
||||
GX_Feature_Registry featreg; |
||||
gxl_feature_initialize_for_morx_data data = user; |
||||
FT_Int i; |
||||
|
||||
if ( gx_feat_has_feature_type ( data->feat, feat_Subtbl->featureType ) ) |
||||
return GX_Err_Ok; |
||||
|
||||
for ( i = 0; i < data->count; i ++ ) |
||||
{ /* Duplication check */ |
||||
if ( data->feature[i].value == feat_Subtbl->featureType ) |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
featreg = gx_get_feature_registry ( feat_Subtbl->featureType ); |
||||
if ( ! featreg ) |
||||
return GX_Err_Ok; |
||||
|
||||
error = gxl_feature_registry_fill_feature( featreg, data->memory, &(data->feature[data->count]) ); |
||||
if ( error ) |
||||
return error; |
||||
data->count++; |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
static FT_Error |
||||
gxl_feature_initialize_for_morx ( GXL_Feature feature, |
||||
FT_Memory memory, |
||||
GX_Morx morx,
|
||||
GX_Feat feat, |
||||
FT_UShort * index ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Int i; |
||||
gxl_feature_initialize_for_morx_data_rec data; |
||||
data.count = 0; |
||||
data.feature = feature; |
||||
data.feat = feat; |
||||
data.memory = memory; |
||||
error = gx_morx_foreach_feature ( morx, gxl_feature_initialize_for_morx_cb, &data ); |
||||
if ( error ) |
||||
{ |
||||
for ( i = data.count; i > 0; i-- ) |
||||
FT_FREE (feature[i - 1].setting); |
||||
return error; |
||||
} |
||||
else |
||||
{ |
||||
*index = data.count; |
||||
return GX_Err_Ok ; |
||||
} |
||||
} |
||||
|
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
gxl_get_font ( FT_Face face, FTL_Font * font) |
||||
{ |
||||
*font = ((GX_Face)face)->extra.data; |
||||
|
||||
if ( *font ) |
||||
return FT_Err_Ok; |
||||
else |
||||
return GX_Err_Invalid_Face_Handle; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FTL_EngineType ) |
||||
gxl_get_engine_type ( FT_Face face ) |
||||
{ |
||||
return FTL_TRUETYPEGX_ENGINE; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
gxl_new_features_request( FT_Face face, FTL_FeaturesRequest * ftl_request) |
||||
{ |
||||
FT_Memory memory = face->driver->root.memory; |
||||
FT_Error error; |
||||
GXL_Font font; |
||||
GXL_FeaturesRequest request; |
||||
|
||||
GX_Feat feat; |
||||
GX_Mort mort; |
||||
GX_Morx morx; |
||||
|
||||
GXL_Feature feature; |
||||
GXL_Setting setting; |
||||
FT_UShort default_setting_index; |
||||
GXL_Setting default_setting; |
||||
FT_UShort infeat_feat_count, inmort_feat_count = 0, inmorx_feat_count = 0; |
||||
|
||||
FT_Int i_feat, i_setting, j_feat, i_mort, i_morx; |
||||
|
||||
if (( error = gxl_get_font ( face, (FTL_Font*)&font ) )) |
||||
return error; |
||||
|
||||
if ( FT_NEW ( request ) ) |
||||
goto Exit; |
||||
if (( error = FTL_FeaturesRequest_Init ( face, (FTL_FeaturesRequest)request ) )) |
||||
{ |
||||
FT_FREE( request ); |
||||
goto Exit; |
||||
} |
||||
|
||||
request->initial_state = GXL_START_OF_TEXT_STATE; |
||||
|
||||
feat = font->feat; |
||||
mort = font->mort; |
||||
morx = font->morx; |
||||
|
||||
if ( !feat ) |
||||
{ |
||||
error = FT_Err_Ok; |
||||
(request)->nFeatures = 0; |
||||
(request)->feature = NULL; |
||||
*ftl_request = (FTL_FeaturesRequest)request; |
||||
goto Exit; |
||||
} |
||||
|
||||
if ( mort ) |
||||
inmort_feat_count = gx_mort_count_feat_not_in_feat( mort, feat ); |
||||
|
||||
if ( morx ) |
||||
inmorx_feat_count = gx_morx_count_feat_not_in_feat( morx, feat ); |
||||
|
||||
if ( ( mort == NULL ) && ( morx == NULL ) ) |
||||
{ |
||||
error = GX_Err_Missing_Glyph_Substitution_Data; |
||||
goto Failure_request; |
||||
} |
||||
|
||||
infeat_feat_count = feat->featureNameCount; |
||||
request->nFeatures = infeat_feat_count + inmort_feat_count + inmorx_feat_count; |
||||
|
||||
if ( FT_NEW_ARRAY ( request->feature, request->nFeatures ) ) |
||||
goto Failure_request; |
||||
for ( i_feat = 0; i_feat < infeat_feat_count; i_feat++ ) |
||||
{ |
||||
feature = (&request->feature[i_feat]); |
||||
feature->value = feat->names[i_feat].feature; |
||||
feature->exclusive.exclusive = ((feat->names[i_feat].featureFlags) |
||||
& GX_FEAT_MASK_EXCLUSIVE_SETTINGS) |
||||
? 1: 0; |
||||
feature->exclusive.setting = NULL; /* dummy */ |
||||
feature->name.index = feat->names[i_feat].nameIndex; |
||||
feature->name.string = NULL; |
||||
feature->request = request; |
||||
feature->nSettings = feat->names[i_feat].nSettings; |
||||
if ( FT_NEW_ARRAY ( feature->setting, feature->nSettings ) ) |
||||
goto Failure_loop_feat; |
||||
for ( i_setting = 0; i_setting < feature->nSettings; i_setting++ ) |
||||
{ |
||||
setting = &feature->setting[i_setting]; |
||||
setting->value = feat->names[i_feat].settingName[i_setting].setting; |
||||
setting->name.index = feat->names[i_feat].settingName[i_setting].nameIndex; |
||||
setting->name.string = NULL; |
||||
setting->feature = feature; |
||||
} |
||||
if ( feature->exclusive.exclusive ) |
||||
{ |
||||
default_setting_index = 0; |
||||
if ( (feat->names[i_feat].featureFlags)&GX_FEAT_MASK_DYNAMIC_DEFAULT ) |
||||
default_setting_index = (feat->names[i_feat].featureFlags)&GX_FEAT_MASK_DEFAULT_SETTING; |
||||
default_setting = &feature->setting[default_setting_index]; |
||||
if ( default_setting_index >= feature->nSettings ) |
||||
{ |
||||
error = GX_Err_Invalid_File_Format; |
||||
goto Failure_loop_feat; |
||||
} |
||||
GXL_Setting_Set_State ( default_setting, 1 );
|
||||
} |
||||
else if ( feat->names[i_feat].featureFlags&GX_FEAT_MASK_DYNAMIC_DEFAULT ) |
||||
{ |
||||
FT_Bool state; |
||||
default_setting_index = feat->names[i_feat].featureFlags&GX_FEAT_MASK_DEFAULT_SETTING; |
||||
|
||||
if ( default_setting_index < feature->nSettings ) |
||||
{ |
||||
default_setting = &feature->setting[default_setting_index]; |
||||
state = 1; |
||||
} |
||||
else if ( default_setting_index == 1 ) |
||||
{ |
||||
/* If default_setting_index is 1 but nSettings is also 1,
|
||||
there is not setting for default_setting_index in the |
||||
font file. In this case setting[0] should be off. */ |
||||
default_setting = &feature->setting[0]; |
||||
state = 0; |
||||
} |
||||
else
|
||||
{ |
||||
error = GX_Err_Invalid_File_Format; |
||||
goto Failure_loop_feat; |
||||
} |
||||
GXL_Setting_Set_State ( default_setting, state ); |
||||
} |
||||
else |
||||
{ /* TODO: getting from mort's and morx's default? */ |
||||
default_setting_index = 0; |
||||
default_setting = &feature->setting[default_setting_index]; |
||||
GXL_Setting_Set_State ( default_setting, 1 ); |
||||
} |
||||
} |
||||
|
||||
if ( inmort_feat_count ) |
||||
{ |
||||
inmort_feat_count = 0; |
||||
feature = (&request->feature[i_feat]); |
||||
if (( error = gxl_feature_initialize_for_mort (feature, memory, mort, feat, &inmort_feat_count) )) |
||||
goto Failure_loop_feat; |
||||
|
||||
for ( i_mort = 0; i_mort < inmort_feat_count; i_mort++ ) |
||||
feature[i_mort].request = request; |
||||
|
||||
i_feat += inmort_feat_count; |
||||
request->nFeatures = i_feat; |
||||
feature = (&request->feature[inmort_feat_count]); |
||||
} |
||||
|
||||
if ( inmorx_feat_count ) |
||||
{ |
||||
inmorx_feat_count = 0; |
||||
feature = (&(request)->feature[i_feat]); |
||||
if (( error = gxl_feature_initialize_for_morx (feature, memory, morx, feat, &inmorx_feat_count) )) |
||||
goto Failure_loop_feat; |
||||
|
||||
for ( i_morx = 0; i_morx < inmorx_feat_count; i_morx++ ) |
||||
feature[i_morx].request = request; |
||||
i_feat += inmorx_feat_count; |
||||
request->nFeatures = i_feat; |
||||
} |
||||
|
||||
if ( inmort_feat_count || inmorx_feat_count ) |
||||
{ |
||||
ft_qsort(request->feature,
|
||||
request->nFeatures,
|
||||
sizeof (*(request->feature)),
|
||||
gxl_feature_compare ); |
||||
for ( i_feat = 0; i_feat < request->nFeatures; i_feat++ ) |
||||
{ |
||||
feature = &request->feature[i_feat]; |
||||
for ( i_setting = 0; i_setting < feature->nSettings; i_setting++ ) |
||||
feature->setting[i_setting].feature = feature; |
||||
} |
||||
} |
||||
*ftl_request = (FTL_FeaturesRequest)request; |
||||
Exit: |
||||
return error; |
||||
Failure_loop_feat: |
||||
for ( j_feat = i_feat; j_feat > 0; j_feat-- ) |
||||
FT_FREE( request->feature[j_feat - 1].setting ); |
||||
Failure_request: |
||||
FT_FREE(request); |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
gxl_done_features_request( FTL_FeaturesRequest request) |
||||
{ |
||||
FTL_Font font; |
||||
FT_Face face; |
||||
|
||||
FT_Memory memory; |
||||
|
||||
FT_ASSERT( request ); |
||||
font = request->font; |
||||
FT_ASSERT( font ); |
||||
face = font->face; |
||||
if ( !face ) |
||||
return GX_Err_Invalid_Argument; |
||||
memory = face->driver->root.memory; |
||||
gxl_features_request_free( (GXL_FeaturesRequest)request, memory ); |
||||
return FTL_FeaturesRequest_Finalize ( request ); |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Error )
|
||||
gxl_copy_features_request( FTL_FeaturesRequest from, |
||||
FTL_FeaturesRequest to) |
||||
{ |
||||
FT_Error error; |
||||
FT_Int i_feat, i_setting; |
||||
GXL_Feature from_feature, to_feature; |
||||
GXL_Setting from_setting, to_setting; |
||||
|
||||
if (( error = FTL_FeaturesRequest_Copy( from, to ) )) |
||||
return error; |
||||
|
||||
for ( i_feat = 0; i_feat < ((GXL_FeaturesRequest)from)->nFeatures; i_feat++ ) |
||||
{ |
||||
from_feature = GXL_FeaturesRequest_Get_Feature((GXL_FeaturesRequest)from,
|
||||
i_feat); |
||||
to_feature = GXL_FeaturesRequest_Get_Feature((GXL_FeaturesRequest)to,
|
||||
i_feat); |
||||
|
||||
for ( i_setting = 0;
|
||||
i_setting < GXL_Feature_Get_Setting_Count(from_feature);
|
||||
i_setting++ ) |
||||
{ |
||||
from_setting = GXL_Feature_Get_Setting ( from_feature, i_setting ); |
||||
to_setting = GXL_Feature_Get_Setting ( to_feature, i_setting ); |
||||
GXL_Setting_Set_State(to_setting, |
||||
GXL_Setting_Get_State(from_setting)); |
||||
} |
||||
} |
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_UShort ) |
||||
gxl_get_ligature_caret_count ( FT_Face face, |
||||
FT_UShort glyphID ) |
||||
{ |
||||
FTL_Font font; |
||||
GX_Lcar lcar; |
||||
GX_LigCaretClassEntry class_entry; |
||||
|
||||
if ( FTL_Get_Font( face, &font ) ) |
||||
return 0; |
||||
lcar = ((GXL_Font)font)->lcar; |
||||
if ( !lcar ) |
||||
return 0; |
||||
class_entry = gx_lcar_get( lcar, glyphID ); |
||||
if ( class_entry ) |
||||
return class_entry->count; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
/* TODO: return an error */ |
||||
FT_LOCAL_DEF ( FT_UShort ) |
||||
gxl_get_ligature_caret_division( FT_Face face,
|
||||
FT_UShort glyph_id,
|
||||
FT_UShort nth ) |
||||
{ |
||||
FTL_Font font; |
||||
GX_Lcar lcar; |
||||
GX_LigCaretClassEntry class_entry; |
||||
FT_UShort partials; |
||||
FTL_Direction direction; |
||||
FT_Outline *outline; |
||||
FT_Vector point; |
||||
if ( FTL_Get_Font( face, &font ) ) |
||||
return 0; |
||||
|
||||
lcar = ((GXL_Font)font)->lcar; |
||||
if ( !lcar ) |
||||
return 0; |
||||
|
||||
class_entry = gx_lcar_get( lcar, glyph_id ); |
||||
if ( !class_entry ) |
||||
return 0; |
||||
if ( nth >= class_entry->count ) |
||||
return 0; |
||||
|
||||
partials = class_entry->partials[nth]; |
||||
if ( lcar->format == GX_LCAR_DISTANCE ) |
||||
return partials; |
||||
|
||||
/* font -> feature_requst -> direction */ |
||||
direction = FTL_Get_FeaturesRequest_Direction ( font->features_request ); |
||||
|
||||
/* glyph_id -> glyph -> outline -> point -> x or y */ |
||||
if ( FT_Load_Glyph ( face, glyph_id,
|
||||
FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP ) ) |
||||
return 0; |
||||
|
||||
outline = &face->glyph->outline; |
||||
if ( ! ( partials < outline->n_points ) ) |
||||
return 0; |
||||
point = outline->points[partials]; |
||||
|
||||
/* TODO: Are the unit for the outline and that
|
||||
for ligature caret same? */ |
||||
if ( direction == FTL_HORIZONTAL ) |
||||
return (FT_UShort)point.x; |
||||
else |
||||
return (FT_UShort)point.y; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
gxl_substitute_glyphs ( FT_Face face, |
||||
FTL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ) |
||||
{ |
||||
FT_Error error; |
||||
GXL_Font font; |
||||
GX_Mort mort; |
||||
GX_Morx morx; |
||||
|
||||
if (( error = FTL_Get_Font ( face, (FTL_Font*)&font ))) |
||||
return error; |
||||
|
||||
mort = font->mort; |
||||
morx = font->morx; |
||||
if ( mort ) |
||||
return gx_mort_substitute_glyph(mort, (GXL_FeaturesRequest)request, in, out ); |
||||
else if ( morx ) |
||||
return gx_morx_substitute_glyph(morx, (GXL_FeaturesRequest)request, in, out ); |
||||
else |
||||
return FT_Err_Invalid_Argument; |
||||
} |
||||
|
||||
/* END */ |
@ -0,0 +1,87 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlfeatreg.c */ |
||||
/* */ |
||||
/* High level interface for the font feature registry(body) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include "gxlfeatreg.h" |
||||
#include "gxltypes.h" |
||||
#include "gxaccess.h" |
||||
|
||||
#undef FT_COMPONENT |
||||
#define FT_COMPONENT trace_gxlayout |
||||
|
||||
FT_LOCAL_DEF( FT_Error ) |
||||
gxl_feature_registry_fill_feature(GX_Feature_Registry featreg, |
||||
FT_Memory memory, |
||||
GXL_Feature feature) |
||||
{ |
||||
FT_Error error = GX_Err_Ok; |
||||
FT_Int i; |
||||
|
||||
feature->value = gx_feature_registry_get_value( featreg ); |
||||
feature->request = NULL; /* for debug */ |
||||
feature->name.string = gx_feature_registry_get_name( featreg ); |
||||
if ( !feature->name.string ) |
||||
{ |
||||
FT_ERROR(("Broken feature is used to lookup feature registry\n")); |
||||
error = GX_Err_Invalid_Argument; |
||||
goto Exit; |
||||
} |
||||
FT_TRACE3(("Name from feature registry: %s\n", feature->name.string)); |
||||
feature->name.index = 0; /* for debug */ |
||||
feature->nSettings = gx_feature_registry_count_setting ( featreg ); |
||||
if ( FT_NEW_ARRAY( feature->setting, feature->nSettings ) ) |
||||
goto Exit; |
||||
|
||||
feature->exclusive.exclusive = gx_feature_registry_is_setting_exclusive ( featreg ); |
||||
|
||||
for ( i = 0; i < feature->nSettings; i++ ) |
||||
{ |
||||
if ( feature->exclusive.exclusive ) |
||||
feature->setting[i].value = i; |
||||
else |
||||
{ |
||||
feature->setting[i].value = 2*i; |
||||
if ( i != 0) |
||||
feature->setting[i].value = gx_feat_setting_off ( feature->setting[i].value ); |
||||
}
|
||||
feature->setting[i].name.string = gx_feature_registry_get_setting_name( featreg, i ); |
||||
if ( ! feature->setting[i].name.string ) |
||||
{ |
||||
FT_ERROR(("Broken setting is used to lookup feature registry: feature=%s\n", |
||||
feature->name.string)); |
||||
error = GX_Err_Invalid_Argument; |
||||
goto Failure; |
||||
} |
||||
feature->setting[i].name.index = 0; /* for debug */ |
||||
feature->setting[i].feature = feature; |
||||
} |
||||
if ( feature->exclusive.exclusive ) |
||||
feature->exclusive.setting = &feature->setting[0]; |
||||
else |
||||
feature->exclusive.setting = NULL; |
||||
Exit:
|
||||
return error; |
||||
Failure: |
||||
FT_FREE( feature->setting ); |
||||
return error; |
||||
} |
||||
|
||||
/* END */ |
@ -0,0 +1,42 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlfeatreg.h */ |
||||
/* */ |
||||
/* High level interface for the font feature registry(specification) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXLFEATREG_H__ |
||||
#define __GXLFEATREG_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_TYPES_H |
||||
#include "gxltypes.h" |
||||
#include "gxfeatreg.h" |
||||
|
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
FT_LOCAL( FT_Error ) gxl_feature_registry_fill_feature(GX_Feature_Registry featreg, |
||||
FT_Memory memory, |
||||
GXL_Feature feature); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXLFEATREG_H__ */ |
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,112 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxload.h */ |
||||
/* */ |
||||
/* Functions load AAT/TrueTypeGX tables(specification) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXLOAD_H__ |
||||
#define __GXLOAD_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
#include "gxtypes.h" |
||||
#include "gxltypes.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
#define gx_table_load(face,stream,tag,FONT) \ |
||||
(error = gx_face_load_##tag (face, stream, FONT->tag), \
|
||||
FONT->tag->root.font = (error? NULL: FONT), \
|
||||
FONT->tag->root.done_table = (error? NULL: FONT->tag->root.done_table), \
|
||||
error) |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_table_done ( GX_Table table, FT_Memory memory ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_feat( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Feat feat ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_trak( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Trak trak ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_kern( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Kern kern ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_prop( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Prop prop ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_opbd( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Opbd opbd ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_lcar( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Lcar lcar ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_bsln( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Bsln bsln ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_mort( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Mort mort ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_morx( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Morx morx ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_fmtx( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Fmtx fmtx ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_fdsc( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Fdsc fdsc ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_just( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Just just ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_fvar ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_Fvar fvar ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXLOAD_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,691 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlookuptbl.c */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX lookup table related types and functions */ |
||||
/* (body) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_STREAM_H |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include "gxlookuptbl.h" |
||||
#include "gxerrors.h" |
||||
|
||||
typedef FT_Error (*gx_LookupTable_loader) ( GX_LookupTable lookup_table, |
||||
FT_Stream stream ); |
||||
typedef void (*gx_LookupTable_finalizer) ( FT_Memory memory, |
||||
GX_LookupTable lookup_table ); |
||||
typedef FT_Error (*gx_LookupTable_traverser) ( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ); |
||||
|
||||
static FT_Error |
||||
gx_load_BinSrchHeader( FT_Stream stream, |
||||
GX_BinSrchHeader header ) |
||||
{ |
||||
FT_Error error; |
||||
const FT_Frame_Field fields[] = |
||||
{ |
||||
#undef FT_STRUCTURE |
||||
#define FT_STRUCTURE GX_BinSrchHeaderRec |
||||
FT_FRAME_START( 10 ), |
||||
FT_FRAME_USHORT (unitSize), |
||||
FT_FRAME_USHORT (nUnits), |
||||
FT_FRAME_USHORT (searchRange), |
||||
FT_FRAME_USHORT (entrySelector), |
||||
FT_FRAME_USHORT (rangeShift), |
||||
FT_FRAME_END |
||||
}; |
||||
|
||||
FT_STREAM_READ_FIELDS( fields, header ); |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_LookupTable_load_raw_values ( FT_Stream stream, |
||||
FT_Long value_count, |
||||
GX_LookupValue value_slot ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Long i; |
||||
|
||||
for ( i = 0; i < value_count; i++) |
||||
{ |
||||
value_slot[i].extra.any = NULL; |
||||
error = FT_READ_SHORT(value_slot[i].raw.s); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_LookupTable_load_segment_generic( GX_LookupTable lookup_table, |
||||
FT_Stream stream ) |
||||
|
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = stream->memory; |
||||
GX_LookupTable_Segment segment_table = lookup_table->fsHeader.segment_generic; |
||||
GX_BinSrchHeaderRec binSrchHeader = segment_table->binSrchHeader; |
||||
GX_LookupSegment segment; |
||||
FT_Long i; |
||||
|
||||
if ( FT_NEW_ARRAY( segment, binSrchHeader.nUnits ) ) |
||||
return error; |
||||
|
||||
for ( i = 0; i < binSrchHeader.nUnits; i++ ) |
||||
{ |
||||
error = FT_READ_USHORT(segment[i].lastGlyph); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
error = FT_READ_USHORT(segment[i].firstGlyph); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
error = gx_LookupTable_load_raw_values(stream, 1, &(segment[i].value)); |
||||
if ( error ) |
||||
goto Failure; |
||||
} |
||||
segment_table->segments = segment; |
||||
return error; |
||||
Failure: |
||||
FT_FREE(segment); |
||||
return error; |
||||
} |
||||
|
||||
static void |
||||
gx_LookupTable_free_segment_generic( FT_Memory memory, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
GX_LookupTable_Segment segment_table = lookup_table->fsHeader.segment_generic; |
||||
FT_FREE(segment_table->segments); |
||||
segment_table->segments = NULL; |
||||
} |
||||
|
||||
|
||||
static FT_Error |
||||
gx_LookupTable_load_single_table( GX_LookupTable lookup_table, |
||||
FT_Stream stream ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = stream->memory; |
||||
GX_LookupTable_Single_Table single_table = lookup_table->fsHeader.single_table; |
||||
GX_BinSrchHeaderRec binSrchHeader = single_table->binSrchHeader; |
||||
GX_LookupSingle single; |
||||
FT_Long i; |
||||
|
||||
if ( FT_NEW_ARRAY( single, binSrchHeader.nUnits ) ) |
||||
return error; |
||||
|
||||
for ( i = 0; i < binSrchHeader.nUnits; i++ ) |
||||
{ |
||||
error = FT_READ_USHORT(single[i].glyph); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
gx_LookupTable_load_raw_values(stream, 1, &(single[i].value)); |
||||
if ( error ) |
||||
goto Failure; |
||||
} |
||||
single_table->entries = single; |
||||
|
||||
return error; |
||||
Failure: |
||||
FT_FREE(single); |
||||
single_table->entries = NULL; |
||||
return error; |
||||
} |
||||
|
||||
static void |
||||
gx_LookupTable_free_single_table( FT_Memory memory, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
GX_LookupTable_Single_Table single_table = lookup_table->fsHeader.single_table; |
||||
|
||||
FT_FREE(single_table->entries); |
||||
single_table->entries = NULL; |
||||
} |
||||
|
||||
static FT_Error
|
||||
gx_LookupTable_load_binSrch( GX_LookupTable lookup_table, |
||||
FT_Stream stream ) |
||||
{ |
||||
FT_Error error = GX_Err_Ok; |
||||
FT_Memory memory = stream->memory; |
||||
GX_LookupTable_BinSrch binSrch; |
||||
gx_LookupTable_loader lookuptable_loader; |
||||
|
||||
switch (lookup_table->format) |
||||
{ |
||||
case GX_LOOKUPTABLE_SEGMENT_SINGLE: |
||||
case GX_LOOKUPTABLE_SEGMENT_ARRAY: |
||||
lookuptable_loader = gx_LookupTable_load_segment_generic; |
||||
break; |
||||
case GX_LOOKUPTABLE_SINGLE_TABLE: |
||||
lookuptable_loader = gx_LookupTable_load_single_table; |
||||
break; |
||||
default: |
||||
return GX_Err_Invalid_Table; |
||||
} |
||||
|
||||
if ( FT_MEM_NEW (binSrch) ) |
||||
return error; |
||||
|
||||
binSrch->dummy = NULL; |
||||
error = gx_load_BinSrchHeader( stream, &(binSrch->binSrchHeader) ); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
lookup_table->fsHeader.bin_srch = binSrch; |
||||
error = lookuptable_loader ( lookup_table, stream ); |
||||
if ( error ) |
||||
{ |
||||
lookup_table->fsHeader.bin_srch = NULL; |
||||
goto Failure; |
||||
} |
||||
|
||||
return error; |
||||
|
||||
Failure: |
||||
FT_FREE ( binSrch ); |
||||
return error; |
||||
} |
||||
|
||||
static void |
||||
gx_LookupTable_free_binSrch ( FT_Memory memory, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
GX_LookupTable_BinSrch binSrch = lookup_table->fsHeader.bin_srch; |
||||
gx_LookupTable_finalizer finalizer; |
||||
|
||||
switch (lookup_table->format) |
||||
{ |
||||
case GX_LOOKUPTABLE_SEGMENT_SINGLE: |
||||
case GX_LOOKUPTABLE_SEGMENT_ARRAY: |
||||
finalizer = gx_LookupTable_free_segment_generic; |
||||
break; |
||||
case GX_LOOKUPTABLE_SINGLE_TABLE: |
||||
finalizer = gx_LookupTable_free_single_table; |
||||
break; |
||||
default: |
||||
finalizer = NULL; |
||||
} |
||||
FT_ASSERT(finalizer); |
||||
|
||||
finalizer ( memory, lookup_table ); |
||||
binSrch->dummy = NULL;
|
||||
FT_FREE ( lookup_table->fsHeader.bin_srch ); |
||||
lookup_table->fsHeader.bin_srch = NULL; |
||||
} |
||||
|
||||
static FT_Error
|
||||
gx_LookupTable_load_simple_array( GX_LookupTable lookup_table, |
||||
FT_Stream stream ) |
||||
|
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = stream->memory; |
||||
GX_LookupValue value_slot; |
||||
|
||||
if ( FT_NEW_ARRAY (value_slot, lookup_table->num_glyphs) ) |
||||
return error; |
||||
error = gx_LookupTable_load_raw_values ( stream,
|
||||
lookup_table->num_glyphs, |
||||
value_slot ); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
lookup_table->fsHeader.simple_array = value_slot; |
||||
return error; |
||||
|
||||
Failure: |
||||
FT_FREE( value_slot ); |
||||
return error; |
||||
} |
||||
|
||||
static void
|
||||
gx_LookupTable_free_simple_array( FT_Memory memory, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
FT_FREE ( lookup_table->fsHeader.simple_array ); |
||||
lookup_table->fsHeader.simple_array = NULL; |
||||
} |
||||
|
||||
static FT_Error
|
||||
gx_LookupTable_load_trimmed_array( GX_LookupTable lookup_table, |
||||
FT_Stream stream ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = stream->memory; |
||||
FT_Short firstGlyph, glyphCount; |
||||
GX_LookupTable_Trimmed_Array trimmed_array; |
||||
GX_LookupValue value_slot; |
||||
|
||||
error = FT_READ_USHORT(firstGlyph); |
||||
if ( error )
|
||||
return error; |
||||
|
||||
error = FT_READ_USHORT(glyphCount); |
||||
if ( error ) |
||||
return error; |
||||
|
||||
if ( FT_ALLOC (trimmed_array,
|
||||
sizeof (*trimmed_array) + sizeof(*trimmed_array->valueArray) * glyphCount) ) |
||||
return error; |
||||
trimmed_array->firstGlyph = firstGlyph; |
||||
trimmed_array->glyphCount = glyphCount; |
||||
trimmed_array->valueArray = NULL; |
||||
value_slot =(GX_LookupValue)(((char *)trimmed_array) + sizeof (*trimmed_array)); |
||||
error = gx_LookupTable_load_raw_values ( stream, glyphCount, value_slot ); |
||||
if ( error ) |
||||
goto Failure; |
||||
|
||||
lookup_table->fsHeader.trimmed_array = trimmed_array; |
||||
trimmed_array->valueArray = value_slot;
|
||||
return error; |
||||
|
||||
Failure: |
||||
FT_FREE( trimmed_array ); |
||||
lookup_table->fsHeader.trimmed_array = NULL; |
||||
return error; |
||||
} |
||||
|
||||
static void
|
||||
gx_LookupTable_free_trimmed_array( FT_Memory memory, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
GX_LookupTable_Trimmed_Array trimmed_array; |
||||
|
||||
trimmed_array = lookup_table->fsHeader.trimmed_array; |
||||
trimmed_array->valueArray = NULL; |
||||
FT_FREE(trimmed_array); |
||||
lookup_table->fsHeader.trimmed_array = NULL; |
||||
} |
||||
|
||||
|
||||
FT_LOCAL_DEF( FT_Error ) |
||||
gx_face_load_LookupTable ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_LookupTable lookup_table ) |
||||
{ |
||||
FT_Error error; |
||||
gx_LookupTable_loader loader; |
||||
|
||||
lookup_table->position = FT_STREAM_POS(); |
||||
lookup_table->num_glyphs = face->root.num_glyphs; |
||||
lookup_table->fsHeader.any = NULL; |
||||
error = FT_READ_SHORT(lookup_table->format); |
||||
if ( error ) |
||||
return error; |
||||
|
||||
switch ( lookup_table->format ) |
||||
{ |
||||
case GX_LOOKUPTABLE_SIMPLE_ARRAY: |
||||
loader = gx_LookupTable_load_simple_array; |
||||
break; |
||||
case GX_LOOKUPTABLE_TRIMMED_ARRAY: |
||||
loader = gx_LookupTable_load_trimmed_array; |
||||
break; |
||||
default: |
||||
loader = gx_LookupTable_load_binSrch; |
||||
} |
||||
|
||||
error = (*loader)( lookup_table, stream ); |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( void ) |
||||
gx_LookupTable_free ( GX_LookupTable lookup_table, |
||||
FT_Memory memory ) |
||||
{ |
||||
gx_LookupTable_finalizer finalizer; |
||||
|
||||
switch ( lookup_table->format ) |
||||
{ |
||||
case GX_LOOKUPTABLE_SIMPLE_ARRAY: |
||||
finalizer = gx_LookupTable_free_simple_array; |
||||
break; |
||||
case GX_LOOKUPTABLE_TRIMMED_ARRAY: |
||||
finalizer = gx_LookupTable_free_trimmed_array; |
||||
break; |
||||
default: |
||||
finalizer = gx_LookupTable_free_binSrch; |
||||
} |
||||
finalizer ( memory, lookup_table ); |
||||
} |
||||
|
||||
|
||||
static FT_Error |
||||
gx_LookupTable_traverse_simple_array( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ) |
||||
{ |
||||
FT_Long i; |
||||
FT_Error error = GX_Err_Ok; |
||||
|
||||
if ( funcs->simple_array_func ) |
||||
{ |
||||
for ( i = 0; i < lookup_table->num_glyphs; i++ ) |
||||
{ |
||||
error = (* funcs->simple_array_func)(lookup_table->format,
|
||||
i, |
||||
&((lookup_table->fsHeader.simple_array)[i]), |
||||
user); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
}
|
||||
else if ( funcs->generic_func ) |
||||
{ |
||||
for ( i = 0; i < lookup_table->num_glyphs; i++ ) |
||||
{ |
||||
error = (* funcs->generic_func)(lookup_table->format,
|
||||
&((lookup_table->fsHeader.simple_array)[i]), |
||||
user); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else |
||||
error = GX_Err_Ok; |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_LookupTable_traverse_segment_generic( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ) |
||||
{ |
||||
FT_Error error = GX_Err_Ok; |
||||
GX_LookupTable_Segment segment_table = lookup_table->fsHeader.segment_generic; |
||||
GX_BinSrchHeader header = &(segment_table->binSrchHeader); |
||||
GX_LookupSegment segment; |
||||
GX_LookupTable_Segment_Func segment_func; |
||||
FT_Long i; |
||||
|
||||
if ( lookup_table->format == GX_LOOKUPTABLE_SEGMENT_SINGLE ) |
||||
segment_func = funcs->segment_single_func; |
||||
else if ( lookup_table->format == GX_LOOKUPTABLE_SEGMENT_ARRAY) |
||||
segment_func = funcs->segment_array_func; |
||||
else |
||||
segment_func = NULL; |
||||
|
||||
if ( segment_func ) |
||||
{ |
||||
for ( i = 0; i < header->nUnits; i++ ) |
||||
{ |
||||
segment = &(segment_table->segments[i]); |
||||
error = (*segment_func)( lookup_table->format, |
||||
segment->lastGlyph, |
||||
segment->firstGlyph, |
||||
&(segment->value), |
||||
user ); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else if ( funcs->generic_func ) |
||||
{ |
||||
for ( i = 0; i < header->nUnits; i++ ) |
||||
{ |
||||
segment = &(segment_table->segments[i]); |
||||
error = (*funcs->generic_func)( lookup_table->format, |
||||
&(segment->value), |
||||
user ); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else |
||||
error = GX_Err_Ok; |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_LookupTable_traverse_single_table ( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ) |
||||
{ |
||||
FT_Error error = GX_Err_Ok; |
||||
GX_LookupTable_Single_Table single_table; |
||||
GX_LookupSingle entries; |
||||
GX_BinSrchHeader binSrchHeader; |
||||
FT_Long i; |
||||
|
||||
single_table = lookup_table->fsHeader.single_table; |
||||
entries = single_table->entries; |
||||
binSrchHeader = &(single_table->binSrchHeader); |
||||
|
||||
if ( funcs->single_table_func ) |
||||
{ |
||||
for ( i = 0; i < binSrchHeader->nUnits; i++ ) |
||||
{ |
||||
error = (*funcs->single_table_func) ( lookup_table->format, |
||||
entries[i].glyph, |
||||
&(entries[i].value), |
||||
user ); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else if ( funcs->generic_func ) |
||||
{ |
||||
for ( i = 0; i < binSrchHeader->nUnits; i++ ) |
||||
{ |
||||
error = (* funcs->generic_func) ( lookup_table->format, |
||||
&(entries[i].value), |
||||
user ); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else |
||||
error = GX_Err_Ok; |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_LookupTable_traverse_trimmed_array( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ) |
||||
{ |
||||
FT_Error error = GX_Err_Ok; |
||||
FT_Long i; |
||||
GX_LookupTable_Trimmed_Array trimmed_array = lookup_table->fsHeader.trimmed_array; |
||||
|
||||
if ( funcs->trimmed_array_func ) |
||||
{ |
||||
for ( i = 0; i < trimmed_array->glyphCount; i++ ) |
||||
{ |
||||
error = (* funcs->trimmed_array_func)(lookup_table->format, |
||||
i, |
||||
trimmed_array->firstGlyph, |
||||
trimmed_array->glyphCount, |
||||
&(trimmed_array->valueArray[i]), |
||||
user); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else if ( funcs->generic_func ) |
||||
{ |
||||
for ( i = 0; i < trimmed_array->glyphCount; i++ ) |
||||
{ |
||||
error = (* funcs->generic_func)(lookup_table->format, |
||||
&(trimmed_array->valueArray[i]), |
||||
user); |
||||
if ( error ) |
||||
return error; |
||||
} |
||||
} |
||||
else |
||||
error = GX_Err_Ok; |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
gx_LookupTable_traverse_low( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user ) |
||||
{ |
||||
gx_LookupTable_traverser traverser; |
||||
|
||||
switch (lookup_table->format) |
||||
{ |
||||
case GX_LOOKUPTABLE_SIMPLE_ARRAY: |
||||
traverser = gx_LookupTable_traverse_simple_array; |
||||
break; |
||||
case GX_LOOKUPTABLE_SEGMENT_SINGLE: |
||||
case GX_LOOKUPTABLE_SEGMENT_ARRAY: |
||||
traverser = gx_LookupTable_traverse_segment_generic; |
||||
break; |
||||
case GX_LOOKUPTABLE_SINGLE_TABLE: |
||||
traverser = gx_LookupTable_traverse_single_table; |
||||
break; |
||||
case GX_LOOKUPTABLE_TRIMMED_ARRAY: |
||||
traverser = gx_LookupTable_traverse_trimmed_array; |
||||
break; |
||||
default: |
||||
traverser = NULL; |
||||
} |
||||
FT_ASSERT(traverser); |
||||
return (*traverser) ( lookup_table, funcs, user ); |
||||
} |
||||
|
||||
static int |
||||
lookup_lookup_segment (const void *keyval, const void *datum) |
||||
{ |
||||
const GX_LookupSegment segment = (const GX_LookupSegment)datum; |
||||
FT_UShort glyph = *(FT_UShort*)keyval; |
||||
|
||||
if ( glyph < segment->firstGlyph ) |
||||
return -1; |
||||
else if ( segment->lastGlyph < glyph ) |
||||
return 1; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
static int |
||||
lookup_lookup_single(const void *keyval, const void *datum) |
||||
{ |
||||
const GX_LookupSingle entry = (const GX_LookupSingle)datum; |
||||
FT_UShort glyph = *(FT_UShort*)keyval; |
||||
if ( glyph < entry->glyph ) |
||||
return -1; |
||||
else if ( entry->glyph < glyph ) |
||||
return 1; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
FT_LOCAL_DEF( GX_LookupResultRec ) |
||||
gx_LookupTable_lookup ( GX_LookupTable lookup_table, |
||||
FT_UShort glyph ) |
||||
{ |
||||
GX_LookupResultRec result; |
||||
|
||||
GX_LookupTable_Segment segment_table; |
||||
GX_LookupSegment segment; |
||||
|
||||
GX_LookupTable_Single_Table single_table; |
||||
GX_LookupSingle entry; |
||||
|
||||
GX_LookupTable_Trimmed_Array trimmed_array; |
||||
FT_Long trimmed_index; |
||||
|
||||
void * bs_key = &glyph; |
||||
void * bs_base; |
||||
size_t bs_n; |
||||
size_t bs_size; |
||||
|
||||
int (* bs_cmp)(const void* keyval, const void* datum); |
||||
|
||||
result.firstGlyph = GX_LOOKUP_RESULT_NO_FIRST_GLYPH;
|
||||
result.value = NULL; |
||||
switch ( lookup_table->format ) |
||||
{ |
||||
case GX_LOOKUPTABLE_SIMPLE_ARRAY: |
||||
if ( glyph < lookup_table->num_glyphs ) |
||||
result.value = &((lookup_table->fsHeader.simple_array) [glyph]); |
||||
break; |
||||
case GX_LOOKUPTABLE_SEGMENT_SINGLE: |
||||
case GX_LOOKUPTABLE_SEGMENT_ARRAY: |
||||
segment_table = lookup_table->fsHeader.segment_generic; |
||||
bs_base = segment_table->segments; |
||||
bs_n = segment_table->binSrchHeader.nUnits; |
||||
bs_size = sizeof (*segment_table->segments); |
||||
bs_cmp = lookup_lookup_segment; |
||||
segment = ft_bsearch( bs_key, bs_base, bs_n, bs_size, bs_cmp ); |
||||
if ( segment ) |
||||
{ |
||||
result.value = &segment->value; |
||||
if ( ( lookup_table->format == GX_LOOKUPTABLE_SEGMENT_ARRAY ) ) |
||||
result.firstGlyph = segment->firstGlyph; |
||||
} |
||||
return result; |
||||
case GX_LOOKUPTABLE_SINGLE_TABLE: |
||||
single_table = lookup_table->fsHeader.single_table; |
||||
bs_base = single_table->entries; |
||||
bs_n = single_table->binSrchHeader.nUnits; |
||||
bs_size = sizeof (*single_table->entries); |
||||
bs_cmp = lookup_lookup_single; |
||||
entry = ft_bsearch( bs_key, bs_base, bs_n, bs_size, bs_cmp ); |
||||
if ( entry ) |
||||
result.value = &(entry->value); |
||||
break; |
||||
case GX_LOOKUPTABLE_TRIMMED_ARRAY: |
||||
trimmed_array = lookup_table->fsHeader.trimmed_array; |
||||
if ( glyph < trimmed_array->firstGlyph ) |
||||
break; |
||||
|
||||
trimmed_index = glyph - trimmed_array->firstGlyph; |
||||
if ( trimmed_index < trimmed_array->glyphCount ) |
||||
result.value = &(trimmed_array->valueArray[trimmed_index]); |
||||
break; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_LookupTable_traverse_high ( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Glyph_Func func, |
||||
FT_Pointer user) |
||||
{ |
||||
FT_Error error; |
||||
FT_UShort glyph; |
||||
GX_LookupResultRec result; |
||||
|
||||
for ( glyph = 0; glyph < 0xFFFF; glyph++ ) |
||||
{ |
||||
result = gx_LookupTable_lookup ( lookup_table, glyph ); |
||||
if ( result.value == NULL) |
||||
continue ; |
||||
|
||||
if (( error = func( glyph, result.value, result.firstGlyph, user ) )) |
||||
return error; |
||||
} |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,125 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxlookuptbl.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX lookup table related types and functions */ |
||||
/* (specification) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXLOOKUPTBL_H__ |
||||
#define __GXLOOKUPTBL_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_TRUETYPE_TYPES_H |
||||
#include "gxtypes.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
|
||||
typedef FT_Error
|
||||
(* GX_LookupTable_Generic_Func) ( GX_LookupTable_Format format, |
||||
GX_LookupValue value, |
||||
FT_Pointer user ); |
||||
|
||||
typedef FT_Error
|
||||
(* GX_LookupTable_Simple_Array_Func) ( GX_LookupTable_Format format, |
||||
FT_UShort index, |
||||
GX_LookupValue value, |
||||
FT_Pointer user ); |
||||
typedef FT_Error |
||||
(* GX_LookupTable_Segment_Func) ( GX_LookupTable_Format format, |
||||
FT_UShort lastGlyph, |
||||
FT_UShort firstGlyph, |
||||
GX_LookupValue value, |
||||
FT_Pointer user ); |
||||
typedef FT_Error |
||||
(* GX_LookupTable_Single_Table_Func) ( GX_LookupTable_Format format, |
||||
FT_UShort glyph, |
||||
GX_LookupValue value, |
||||
FT_Pointer user ); |
||||
typedef FT_Error |
||||
(* GX_LookupTable_Trimmed_Array_Func) ( GX_LookupTable_Format format, |
||||
FT_UShort index, |
||||
FT_UShort firstGlyph, |
||||
FT_UShort lastGlyph, |
||||
GX_LookupValue value, |
||||
FT_Pointer user ); |
||||
|
||||
#define GX_LOOKUP_TABLE_FUNC_ZERO {NULL, NULL, NULL, NULL, NULL, NULL} |
||||
typedef struct GX_LookupTable_FuncsRec_ |
||||
{ |
||||
/* If a function suitable for the lookup format is given, use
|
||||
it. If not, use `generic_func'. If both a function suitable for |
||||
the lookup format and `generic_func' are not given(= NULL), do |
||||
nothing */ |
||||
GX_LookupTable_Generic_Func generic_func; |
||||
/* -------------------------------------------------------------- */ |
||||
GX_LookupTable_Simple_Array_Func simple_array_func; |
||||
GX_LookupTable_Segment_Func segment_single_func; |
||||
GX_LookupTable_Segment_Func segment_array_func; |
||||
GX_LookupTable_Single_Table_Func single_table_func; |
||||
GX_LookupTable_Trimmed_Array_Func trimmed_array_func; |
||||
} GX_LookupTable_FuncsRec, *GX_LookupTable_Funcs; |
||||
|
||||
typedef struct GX_LookupResultRec_ |
||||
{ |
||||
/* `value' is NULL if a value for the glyph cannot be found. */ |
||||
GX_LookupValue value; |
||||
|
||||
/* `firstGlyph' is given only if the target lookup table
|
||||
format is Segement array. If the format is other than |
||||
Segement array, GX_LOOKUP_RESULT_NO_FIRST_GLYPH is set
|
||||
to `firstGlyph'. */ |
||||
#define GX_LOOKUP_RESULT_NO_FIRST_GLYPH -1 |
||||
FT_Long firstGlyph; |
||||
} GX_LookupResultRec, *GX_LookupResult; |
||||
|
||||
typedef FT_Error |
||||
(* GX_LookupTable_Glyph_Func) ( FT_UShort glyph, |
||||
GX_LookupValue value, |
||||
FT_Long firstGlyph, |
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_face_load_LookupTable ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_LookupTable lookup_table ); |
||||
|
||||
FT_LOCAL( void ) |
||||
gx_LookupTable_free ( GX_LookupTable lookup_table, |
||||
FT_Memory memory ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_LookupTable_traverse_low( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Funcs funcs, |
||||
FT_Pointer user); |
||||
|
||||
FT_LOCAL ( GX_LookupResultRec ) |
||||
gx_LookupTable_lookup ( GX_LookupTable lookup_table, |
||||
FT_UShort glyph ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_LookupTable_traverse_high ( GX_LookupTable lookup_table, |
||||
GX_LookupTable_Glyph_Func func, |
||||
FT_Pointer user); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXLOOKUPTBL_H__ */ |
||||
|
||||
/* END */ |
@ -0,0 +1,119 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxltypes.h */ |
||||
/* */ |
||||
/* Data types of AAT/TrueTypeGX based layout engine */ |
||||
/* (specification) */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXLTYPES_H__ |
||||
#define __GXLTYPES_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_TRUETYPE_TYPES_H |
||||
#include FT_INTERNAL_FTL_TYPES_H |
||||
#include FT_GXLAYOUT_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef enum |
||||
{ |
||||
GXL_ASCENDING = 0, |
||||
GXL_DESCENDING = 1 |
||||
} GXL_Order; |
||||
|
||||
typedef struct GXL_Feature_ExclusiveRec_ |
||||
{ |
||||
FT_Bool exclusive; |
||||
GXL_Setting setting; |
||||
} GXL_Feature_ExclusiveRec, *GXL_Feature_Exclusive; |
||||
|
||||
typedef struct GXL_NameRec_ |
||||
{ |
||||
const FT_String * string; |
||||
FT_Short index; |
||||
} GXL_NameRec, *GXL_Name; |
||||
|
||||
typedef struct GXL_SettingRec_ |
||||
{ |
||||
FT_UShort value; |
||||
GXL_NameRec name; |
||||
GXL_Feature feature; |
||||
} GXL_SettingRec; /* *GXL_Setting; */ |
||||
|
||||
typedef struct GXL_FeatureRec_ |
||||
{ |
||||
GXL_FeaturesRequest request; |
||||
FT_UShort value; |
||||
GXL_Feature_ExclusiveRec exclusive; |
||||
GXL_NameRec name; |
||||
FT_UShort nSettings; |
||||
GXL_Setting setting; |
||||
} GXL_FeatureRec; /* , * GXL_Feature; */ |
||||
|
||||
typedef struct GXL_FeaturesRequestRec_ |
||||
{ |
||||
FTL_FeaturesRequestRec root; |
||||
GXL_Initial_State initial_state; |
||||
FT_ULong nFeatures; |
||||
GXL_Feature feature; |
||||
} GXL_FeaturesRequestRec; /* , *GXL_FeaturesRequest; */ |
||||
|
||||
|
||||
FT_LOCAL ( void ) |
||||
gxl_features_request_free( GXL_FeaturesRequest request, FT_Memory memory ); |
||||
|
||||
FT_LOCAL ( GXL_Setting ) |
||||
gxl_feature_get_setting_by_value (GXL_Feature feature, FT_UShort value); |
||||
|
||||
FT_LOCAL ( GXL_Feature ) |
||||
gxl_features_request_get_feature_by_type ( GXL_FeaturesRequest request, |
||||
FT_UShort featureType ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gxl_get_font ( FT_Face face, FTL_Font * font); |
||||
|
||||
FT_LOCAL ( FTL_EngineType ) |
||||
gxl_get_engine_type ( FT_Face face ); |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
gxl_new_features_request( FT_Face face, FTL_FeaturesRequest * request); |
||||
FT_LOCAL ( FT_Error )
|
||||
gxl_done_features_request( FTL_FeaturesRequest request); |
||||
FT_LOCAL ( FT_Error )
|
||||
gxl_copy_features_request( FTL_FeaturesRequest from, |
||||
FTL_FeaturesRequest to); |
||||
FT_LOCAL ( FT_UShort ) |
||||
gxl_get_ligature_caret_count ( FT_Face face, |
||||
FT_UShort glyphID ); |
||||
FT_LOCAL ( FT_UShort ) |
||||
gxl_get_ligature_caret_division( FT_Face face,
|
||||
FT_UShort glyphID,
|
||||
FT_UShort nth ); |
||||
FT_LOCAL ( FT_Error ) |
||||
gxl_substitute_glyphs ( FT_Face face, |
||||
FTL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXLTYPES_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,335 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxobjs.c */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX objects manager (body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include FT_INTERNAL_STREAM_H |
||||
#include FT_TRUETYPE_TAGS_H |
||||
#include FT_LIST_H |
||||
#include FT_ERRORS_H |
||||
#include FT_LAYOUT_H |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_SERVICE_LAYOUT_H |
||||
#include FT_GXLAYOUT_H |
||||
#include "gxobjs.h" |
||||
#include "gxload.h" |
||||
#include "gxerrors.h" |
||||
#include "gxdriver.h" |
||||
#include "gxaccess.h" |
||||
#include "gxltypes.h" |
||||
|
||||
|
||||
extern const FT_Driver_ClassRec tt_driver_class; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */ |
||||
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ |
||||
/* messages during execution. */ |
||||
/* */ |
||||
#undef FT_COMPONENT |
||||
#define FT_COMPONENT trace_gxobjs |
||||
|
||||
static FT_Error |
||||
gx_face_init( FT_Stream stream, |
||||
GX_Face face, |
||||
FT_Int face_index, |
||||
FT_Int num_params, |
||||
FT_Parameter* params ); |
||||
|
||||
static FT_Error |
||||
gx_font_load ( GX_Face face ); |
||||
|
||||
static void |
||||
gx_font_done( void * object ); |
||||
|
||||
static FT_Module_Interface |
||||
gx_module_get_interface ( FT_Module module, |
||||
const char* gx_interface ); |
||||
|
||||
static FT_Error |
||||
gx_face_get_kerning( FT_Face face, |
||||
FT_UInt left_glyph, |
||||
FT_UInt right_glyph, |
||||
FT_Vector* kerning ); |
||||
|
||||
static const FT_Service_LayoutRec gx_service_layout = |
||||
{ |
||||
(FTL_Get_Font_Func) gxl_get_font, |
||||
(FTL_Get_EngineType_Func) gxl_get_engine_type, |
||||
(FTL_New_FeaturesRequest_Func) gxl_new_features_request, |
||||
(FTL_Done_FeaturesRequest_Func) gxl_done_features_request, |
||||
(FTL_Copy_FeaturesRequest_Func) gxl_copy_features_request, |
||||
(FTL_Get_LigatureCaret_Count_Func) gxl_get_ligature_caret_count, |
||||
(FTL_Get_LigatureCaret_Division_Func) gxl_get_ligature_caret_division, |
||||
(FTL_Substitute_Glyphs_Func) gxl_substitute_glyphs |
||||
}; |
||||
|
||||
static const FT_ServiceDescRec gx_services[] = |
||||
{ |
||||
{ FT_SERVICE_ID_LAYOUT, &gx_service_layout }, |
||||
{ NULL, NULL } |
||||
}; |
||||
|
||||
FT_LOCAL_DEF( FT_Error ) |
||||
gx_driver_init( GX_Driver driver ) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
const void * module_name; |
||||
FT_Driver gx_driver_root = &driver->root; |
||||
FT_Driver_Class gx_driver_class = gx_driver_root->clazz; |
||||
|
||||
module_name = gx_driver_class->root.module_name; |
||||
|
||||
*gx_driver_class = tt_driver_class; |
||||
driver->root.clazz->root.module_name = module_name; |
||||
|
||||
if (( error = ((FT_Module_Class*)gx_driver_class)->module_init( (FT_Module)driver ) )) |
||||
return error; |
||||
|
||||
gx_driver_class->init_face = (FT_Face_InitFunc)gx_face_init; |
||||
gx_driver_class->get_kerning = gx_face_get_kerning; |
||||
((FT_Module_Class*)gx_driver_class)->get_interface = gx_module_get_interface; |
||||
|
||||
return GX_Err_Ok; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_face_init( FT_Stream stream, |
||||
GX_Face face, |
||||
FT_Int face_index, |
||||
FT_Int num_params, |
||||
FT_Parameter* params ) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
/* TODO */ |
||||
error = tt_driver_class.init_face ( stream, (FT_Face)face, face_index, num_params, params ); |
||||
if ( error ) |
||||
goto Exit; |
||||
|
||||
error = gx_font_load ( face ); |
||||
if ( error ) |
||||
goto Exit; |
||||
Exit: |
||||
return error; |
||||
} |
||||
|
||||
#define NEW_TABLE(tag) \ |
||||
do \
|
||||
{ \
|
||||
if ( FT_NEW( font->tag ) ) \
|
||||
goto Exit; \
|
||||
\
|
||||
FT_TRACE2 (( "\tloading %s...", #tag )); \
|
||||
error = gx_table_load(face,stream,tag,font); \
|
||||
if ( error ) \
|
||||
{ \
|
||||
if ( !(face->goto_table( face, TTAG_##tag, stream, 0 )) ) \
|
||||
FT_TRACE2(("no table\n")); \
|
||||
else if ( (TTAG_kern == TTAG_##tag) && \
|
||||
(font->kern->version == 1) ) \
|
||||
FT_TRACE2(("old kern\n")); \
|
||||
else \
|
||||
FT_TRACE2(("failed\n")); \
|
||||
FT_FREE ( font->tag ); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
FT_TRACE2(("successful\n")); \
|
||||
tables[set_index++] = (GX_Table)font->tag; \
|
||||
} \
|
||||
} while (0) |
||||
|
||||
#define DONE_TABLE(tag) \ |
||||
do \
|
||||
{ \
|
||||
if ( font->tag ) \
|
||||
{ \
|
||||
gx_table_done ( (GX_Table)font->tag, memory ); \
|
||||
FT_FREE(font->tag); \
|
||||
} \
|
||||
} while ( 0 ) |
||||
|
||||
|
||||
static FT_Error |
||||
gx_font_load( GX_Face face ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Stream stream = face->root.stream; |
||||
FT_Memory memory = stream->memory; |
||||
GXL_Font font; |
||||
|
||||
#define nTABLES 12 |
||||
GX_Table tables[nTABLES]; |
||||
FT_Int init_index, set_index = 0; |
||||
|
||||
GXL_FeaturesRequest features_request; |
||||
|
||||
for ( init_index = 0; init_index < nTABLES; init_index++ ) |
||||
tables[init_index] = NULL; |
||||
|
||||
if ( face->extra.data ) |
||||
{ |
||||
error = GX_Err_Busy_Extra_Data; |
||||
goto Exit; |
||||
} |
||||
|
||||
if ( FT_NEW(font) ) |
||||
goto Exit; |
||||
|
||||
if (( error = FTL_Font_Init ( (FTL_Font)font, (FT_Face)face ) )) |
||||
goto Failure; |
||||
|
||||
NEW_TABLE(feat); |
||||
NEW_TABLE(mort); |
||||
NEW_TABLE(morx); |
||||
|
||||
NEW_TABLE(trak); |
||||
NEW_TABLE(kern); |
||||
NEW_TABLE(prop); |
||||
NEW_TABLE(lcar); |
||||
NEW_TABLE(opbd); |
||||
NEW_TABLE(bsln); |
||||
NEW_TABLE(fmtx); |
||||
NEW_TABLE(fdsc); |
||||
NEW_TABLE(just); |
||||
|
||||
NEW_TABLE(fvar); |
||||
|
||||
error = FT_Err_Unknown_File_Format; |
||||
|
||||
if ((( font->mort ) || ( font->morx )) |
||||
&& ( font->feat )) |
||||
{ |
||||
face->root.face_flags |= FT_FACE_FLAG_GLYPH_SUBSTITUTION; |
||||
error = GX_Err_Ok; |
||||
} |
||||
if ( font->kern )
|
||||
{ |
||||
face->root.face_flags |= FT_FACE_FLAG_KERNING; |
||||
error = GX_Err_Ok; |
||||
} |
||||
|
||||
if ( error == GX_Err_Ok ) |
||||
{ |
||||
face->extra.finalizer = gx_font_done; |
||||
face->extra.data = font; |
||||
if (( error = FTL_New_FeaturesRequest ( (FT_Face)face,
|
||||
(FTL_FeaturesRequest*)(&features_request) ) )) |
||||
goto Failure; |
||||
} |
||||
else |
||||
goto Failure; |
||||
Exit: |
||||
return error; |
||||
Failure: |
||||
for ( ; set_index > 0; set_index--) |
||||
{ |
||||
if ( tables[set_index - 1] ) |
||||
{ |
||||
gx_table_done(tables[set_index - 1], memory); |
||||
FT_FREE(tables[set_index - 1]); |
||||
} |
||||
} |
||||
FT_FREE(font); |
||||
face->extra.finalizer = NULL; |
||||
face->extra.data = NULL; |
||||
return error; |
||||
} |
||||
|
||||
static void |
||||
gx_font_done( void * object ) |
||||
{ |
||||
GXL_Font font = object; |
||||
FT_Face face = font->root.face; |
||||
FT_Memory memory = face->driver->root.memory; /* TODO */ |
||||
|
||||
DONE_TABLE(mort); |
||||
DONE_TABLE(morx); |
||||
DONE_TABLE(feat); |
||||
DONE_TABLE(trak); |
||||
DONE_TABLE(kern); |
||||
DONE_TABLE(prop); |
||||
DONE_TABLE(bsln); |
||||
DONE_TABLE(lcar); |
||||
DONE_TABLE(opbd); |
||||
DONE_TABLE(fmtx); |
||||
DONE_TABLE(fdsc); |
||||
DONE_TABLE(just); |
||||
DONE_TABLE(fvar); |
||||
|
||||
FTL_Font_Finalize((FTL_Font)font); |
||||
FT_FREE(object); |
||||
} |
||||
|
||||
static FT_Module_Interface |
||||
gx_module_get_interface( FT_Module module, |
||||
const char* gx_interface ) |
||||
{ |
||||
FT_Module_Interface gx; |
||||
|
||||
gx = ft_service_list_lookup( gx_services, gx_interface ); |
||||
if ( gx ) |
||||
return gx; |
||||
|
||||
/* TODO */ |
||||
if ( tt_driver_class.root.get_interface ) |
||||
return tt_driver_class.root.get_interface( module, gx_interface ); |
||||
return NULL; |
||||
} |
||||
|
||||
static FT_Error |
||||
gx_face_get_kerning( FT_Face face, |
||||
FT_UInt left_glyph, |
||||
FT_UInt right_glyph, |
||||
FT_Vector* kerning ) |
||||
{ |
||||
FT_Error error; |
||||
FTL_Font font; |
||||
GX_Kern kern; |
||||
FTL_Direction dir; |
||||
FTL_FeaturesRequest request; |
||||
|
||||
kerning->x = 0; |
||||
kerning->y = 0; |
||||
|
||||
if (( error = FTL_Get_Font ( face, &font ) )) |
||||
return error; |
||||
|
||||
kern = ((GXL_Font)font)->kern; |
||||
if ( !kern ) |
||||
/* Run old kerning handler */ |
||||
return tt_driver_class.get_kerning ( face, left_glyph, right_glyph, kerning ); |
||||
|
||||
FTL_Font_Get_Current_FeaturesRequest( font, &request ); |
||||
dir = FTL_Get_FeaturesRequest_Direction ( request ); |
||||
|
||||
return gx_kern_get_pair_kerning(kern,
|
||||
left_glyph, right_glyph,
|
||||
dir, |
||||
kerning); |
||||
} |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,53 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxobjs.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX objects manager (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
|
||||
#ifndef __GXOBJS_H__ |
||||
#define __GXOBJS_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_INTERNAL_TRUETYPE_TYPES_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef struct GX_DriverRec_ |
||||
{ |
||||
FT_DriverRec root; |
||||
TT_ExecContext context; |
||||
TT_GlyphZoneRec zone; |
||||
void* extension_component; |
||||
} GX_DriverRec, *GX_Driver; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* Driver functions */ |
||||
/* */ |
||||
FT_LOCAL( FT_Error ) |
||||
gx_driver_init( GX_Driver driver ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* __GXOBJS_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,128 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxstatetbl.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX state table related types and functions */ |
||||
/* (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
|
||||
#ifndef __GXSTATETBL_H_ |
||||
#define __GXSTATETBL_H_ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_TYPES_H |
||||
#include "gxtypes.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/* - GX_StateTable_Entry_Loader
|
||||
Fill entry_subtable->glyphOffsets and
|
||||
update stream to read next entry_subtable. */ |
||||
typedef FT_Error
|
||||
(* GX_StateTable_Entry_Loader) ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_EntrySubtable entry_subtable, |
||||
FT_Pointer user ); |
||||
typedef void |
||||
(* GX_StateTable_Entry_Finalizer) ( FT_Memory memory, |
||||
GX_EntrySubtable entry_subtable, |
||||
FT_Pointer user ); |
||||
|
||||
typedef FT_Error |
||||
(* GX_StateTable_Entry_Action) ( GX_EntrySubtable entry_subtable, |
||||
FT_Pointer user ); |
||||
|
||||
#define GX_STATE_TABLE_ENTRY_LOAD_FUNCS_ZERO {NULL, NULL} |
||||
typedef struct GX_StateTable_Entry_Load_FuncsRec_ |
||||
{ |
||||
GX_StateTable_Entry_Loader loader; |
||||
GX_StateTable_Entry_Finalizer finalizer; |
||||
} GX_StateTable_Entry_Load_FuncsRec, *GX_StateTable_Entry_Load_Funcs; |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_StateTable ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_StateTable state_table, |
||||
GX_StateTable_Entry_Load_Funcs funcs, |
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL ( void ) |
||||
gx_StateTable_free ( GX_StateTable state_table, |
||||
FT_Memory memory, |
||||
GX_StateTable_Entry_Finalizer finalizer, |
||||
FT_Pointer user ); |
||||
|
||||
/* If action returns value other than FT_Err_Ok, the traverse stops
|
||||
at that point and returns. */ |
||||
#if 0 |
||||
FT_LOCAL ( FT_Error ) |
||||
gx_StateTable_traverse_entries( GX_StateTable state_table, |
||||
GX_StateTable_Entry_Action action, |
||||
FT_Pointer user ); |
||||
#endif /* 0 */ |
||||
|
||||
|
||||
FT_LOCAL ( FT_Byte ) |
||||
gx_StateTable_get_class ( GX_StateTable state_table, |
||||
FT_UShort glyph ); |
||||
|
||||
FT_LOCAL ( GX_EntrySubtable ) |
||||
gx_StateTable_get_entry_subtable ( GX_StateTable state_table, |
||||
FT_UShort current_state, |
||||
FT_Byte class_code ); |
||||
|
||||
#define GX_XSTATE_TABLE_ENTRY_LOAD_FUNCS_ZERO {NULL, NULL} |
||||
typedef GX_StateTable_Entry_Load_FuncsRec GX_XStateTable_Entry_Load_FuncsRec; |
||||
typedef GX_StateTable_Entry_Load_Funcs GX_XStateTable_Entry_Load_Funcs; |
||||
typedef GX_StateTable_Entry_Loader GX_XStateTable_Entry_Loader; |
||||
typedef GX_StateTable_Entry_Finalizer GX_XStateTable_Entry_Finalizer; |
||||
typedef GX_StateTable_Entry_Action GX_XStateTable_Entry_Action; |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_face_load_XStateTable ( GX_Face face, |
||||
FT_Stream stream, |
||||
GX_XStateTable state_table, |
||||
GX_XStateTable_Entry_Load_Funcs funcs, |
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
gx_XStateTable_traverse_entries( GX_XStateTable state_table, |
||||
GX_XStateTable_Entry_Action action, |
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL ( void ) |
||||
gx_XStateTable_free ( GX_XStateTable state_table, |
||||
FT_Memory memory, |
||||
GX_XStateTable_Entry_Finalizer finalizer, |
||||
FT_Pointer user ); |
||||
|
||||
FT_LOCAL ( FT_UShort ) |
||||
gx_XStateTable_get_class ( GX_XStateTable state_table, |
||||
FT_UShort glyph ); |
||||
|
||||
FT_LOCAL ( GX_EntrySubtable ) |
||||
gx_XStateTable_get_entry_subtable ( GX_XStateTable state_table, |
||||
FT_UShort current_state, |
||||
FT_UShort class_code ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXSTATETBL_H_ */ |
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,129 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxutils.c */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX private utility functions (body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
|
||||
#include "gxerrors.h" |
||||
#include "gxutils.h" |
||||
#include "gxobjs.h" |
||||
|
||||
|
||||
FT_LOCAL_DEF( FT_Int ) |
||||
gx_zero_shift_bits ( FT_ULong mask ) |
||||
{ |
||||
FT_Int i = 0; |
||||
for ( i = 0; !(mask & (0x1L << i)); i++) |
||||
; /* Do nothing */ |
||||
return i; |
||||
} |
||||
|
||||
FT_LOCAL_DEF( FT_Long ) |
||||
gx_mask_zero_shift ( FT_ULong value, FT_ULong mask ) |
||||
{ |
||||
FT_Int shift_bits = gx_zero_shift_bits( mask ); |
||||
return ((value & mask) >> shift_bits); |
||||
} |
||||
|
||||
FT_LOCAL_DEF( FT_Long ) |
||||
gx_sign_extend ( FT_ULong value, FT_ULong mask ) |
||||
{ |
||||
/* Copied from icu/source/layout/LigatureSubstProc.cpp */ |
||||
#define ExtendedComplement(m) ((FT_Long) (~((FT_ULong) (m)))) |
||||
#define SignBit(m) ((ExtendedComplement(m) >> 1) & (m)) |
||||
#define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) |
||||
return SignExtend(value,mask); |
||||
} |
||||
|
||||
|
||||
/* Generic */ |
||||
FT_LOCAL_DEF( FT_Error ) |
||||
gx_get_name_from_id ( FT_Face face, |
||||
FT_UShort name_id, |
||||
FT_UShort platform_id, |
||||
FT_UShort encoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ) |
||||
{ |
||||
FT_Int i; |
||||
FT_UInt nnames = FT_Get_Sfnt_Name_Count ((FT_Face)face); |
||||
FT_Bool any_id = ( (platform_id == 0) && |
||||
(encoding_id == 0) && |
||||
(language_id == 0) )? 1: 0; |
||||
for ( i = 0; i < nnames; i++ ) |
||||
{ |
||||
if ( FT_Get_Sfnt_Name((FT_Face)face, i, aname) ) |
||||
continue ; |
||||
if ( ( aname->name_id == name_id ) && |
||||
( any_id ||
|
||||
( ( aname->platform_id == platform_id ) && |
||||
( aname->encoding_id == encoding_id ) &&
|
||||
( aname->language_id == language_id ) ))) |
||||
return GX_Err_Ok; |
||||
} |
||||
return GX_Err_Invalid_Argument; |
||||
} |
||||
|
||||
|
||||
FT_LOCAL_DEF ( FT_UShort ) |
||||
gx_feat_setting_on ( FT_UShort setting ) |
||||
{ |
||||
if ( !gx_feat_setting_state ( setting ) ) |
||||
return setting -1; |
||||
else |
||||
return setting; |
||||
|
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_UShort ) |
||||
gx_feat_setting_off ( FT_UShort setting ) |
||||
{ |
||||
if ( gx_feat_setting_state ( setting ) ) |
||||
return setting + 1; |
||||
else |
||||
return setting; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FT_Bool ) |
||||
gx_feat_setting_state ( FT_UShort setting ) |
||||
{
|
||||
/* odd => off */ |
||||
if ( setting % 2 ) |
||||
return 0; /* odd => off */ |
||||
else |
||||
return 1; /* even => on */ |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( void ) |
||||
gx_glyphs_array_reverse( FTL_Glyph glyphs, FT_ULong length ) |
||||
{ |
||||
FT_ULong i, j; |
||||
FTL_GlyphRec tmp; |
||||
for ( i = 0, j = length -1; i < j; i++, j-- ) |
||||
{ |
||||
tmp = glyphs[i]; |
||||
glyphs[i] = glyphs[j]; |
||||
glyphs[j] = tmp; |
||||
} |
||||
} |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,73 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxutils.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX private utility functions (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GXUTILS_H__ |
||||
#define __GXUTILS_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_TYPES_H |
||||
#include FT_SFNT_NAMES_H |
||||
#include FT_LAYOUT_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
FT_LOCAL( FT_Int ) gx_zero_shift_bits ( FT_ULong mask ); |
||||
FT_LOCAL( FT_Long ) gx_mask_zero_shift ( FT_ULong value,
|
||||
FT_ULong mask ); |
||||
FT_LOCAL( FT_Long ) gx_sign_extend ( FT_ULong value,
|
||||
FT_ULong mask ); |
||||
|
||||
FT_LOCAL( FT_Error ) gx_get_name_from_id ( FT_Face face, |
||||
FT_UShort name_id, |
||||
FT_UShort platform_id, |
||||
FT_UShort encoding_id, |
||||
FT_UShort language_id, |
||||
FT_SfntName *aname ); |
||||
|
||||
FT_LOCAL( FT_UShort ) gx_feat_setting_on ( FT_UShort setting ); |
||||
FT_LOCAL( FT_UShort ) gx_feat_setting_off ( FT_UShort setting ); |
||||
FT_LOCAL( FT_Bool ) gx_feat_setting_state ( FT_UShort setting ); |
||||
|
||||
FT_LOCAL ( void ) gx_glyphs_array_reverse ( FTL_Glyph glyphs,
|
||||
FT_ULong length ); |
||||
|
||||
#ifdef FT_DEBUG_LEVEL_ERROR |
||||
|
||||
#define GX_ASSERT_NOT_REACHED() \ |
||||
do \
|
||||
{ \
|
||||
FT_Panic( "should not be reached to line %d of file %s\n", \
|
||||
__LINE__, __FILE__ ); \
|
||||
} while ( 0 ) |
||||
|
||||
#else /* !FT_DEBUG_LEVEL_ERROR */ |
||||
|
||||
#define GX_ASSERT_NOT_REACHED() do ; while ( 0 ) |
||||
|
||||
#endif /* !FT_DEBUG_LEVEL_ERROR */ |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GXUTILS_H__ */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,99 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxvm.h */ |
||||
/* */ |
||||
/* AAT/TrueTypeGX glyph substitution automaton (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __GX_VM_H__ |
||||
#define __GX_VM_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
#include "gxtypes.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/*
|
||||
* Mort |
||||
*/ |
||||
FT_LOCAL( FT_Error ) |
||||
gx_rearrangement_subst ( GX_MetamorphosisRearrangementBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_contextual_subst( GX_MetamorphosisContextualBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_ligature_subst( GX_MetamorphosisLigatureBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_noncontextual_subst( GX_MetamorphosisNoncontextualBody body, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_insertion_subst( GX_MetamorphosisInsertionBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
/*
|
||||
* Morx |
||||
*/ |
||||
#define gx_xnoncontextual_subst gx_noncontextual_subst |
||||
FT_LOCAL( FT_Error ) |
||||
gx_xcontextual_subst( GX_XMetamorphosisContextualBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_xligature_subst( GX_XMetamorphosisLigatureBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_xinsertion_subst( GX_XMetamorphosisInsertionBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
FT_LOCAL( FT_Error ) |
||||
gx_xrearrangement_subst ( GX_XMetamorphosisRearrangementBody body, |
||||
GXL_Initial_State initial_state, |
||||
FTL_Glyphs_Array garray ); |
||||
|
||||
/*
|
||||
* Kern |
||||
*/ |
||||
FT_LOCAL( FT_Error ) |
||||
gx_contextual_kerning_calc ( GX_KerningSubtableFormat1Body kern_fmt1, |
||||
FTL_Glyphs_Array garray, |
||||
FTL_Direction dir, |
||||
FT_Bool cross_stream, |
||||
GXL_Initial_State initial_state, |
||||
FT_Vector * kerning ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __GX_VM_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,33 @@ |
||||
#
|
||||
# FreeType 2 AAT/TrueTypeGX module definition
|
||||
#
|
||||
|
||||
# Copyright 2004 by RedHat K.K.
|
||||
# This file is derived from cff/module.mk.
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# FreeType 2 CFF module definition
|
||||
#
|
||||
|
||||
|
||||
# Copyright 1996-2000 by
|
||||
# David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# Development of the code in module.mk is support of
|
||||
# Information-technology Promotion Agency, Japan.
|
||||
|
||||
make_module_list: add_gx_driver |
||||
|
||||
add_gx_driver: |
||||
$(OPEN_DRIVER)gx_driver_class$(CLOSE_DRIVER)
|
||||
$(ECHO_DRIVER)gx $(ECHO_DRIVER_DESC)AAT/TrueTypeGX fonts$(ECHO_DRIVER_DONE)
|
||||
|
||||
# EOF
|
@ -0,0 +1,96 @@ |
||||
#
|
||||
# FreeType 2 AAT/TrueTypeGX driver configuration rules
|
||||
#
|
||||
|
||||
|
||||
# Copyright 2004 by RedHat K.K.
|
||||
# This file is derived from cff/rules.mk.
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# FreeType 2 OpenType/CFF driver configuration rules
|
||||
#
|
||||
|
||||
# Copyright 1996-2000, 2001, 2003 by
|
||||
# David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# Development of the code in rules.mk is support of
|
||||
# Information-technology Promotion Agency, Japan.
|
||||
|
||||
# AAT/TrueTypeGX driver directory
|
||||
#
|
||||
GX_DIR := $(SRC_DIR)/gxlayout
|
||||
|
||||
|
||||
GX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GX_DIR))
|
||||
|
||||
|
||||
# GX driver sources (i.e., C files)
|
||||
#
|
||||
GX_DRV_SRC := $(GX_DIR)/gxobjs.c \
|
||||
$(GX_DIR)/gxload.c \
|
||||
$(GX_DIR)/gxdriver.c \
|
||||
$(GX_DIR)/gxlookuptbl.c \
|
||||
$(GX_DIR)/gxstatetbl.c \
|
||||
$(GX_DIR)/gxutils.c \
|
||||
$(GX_DIR)/gxlayout.c \
|
||||
$(GX_DIR)/gxfeatreg.c \
|
||||
$(GX_DIR)/gxlfeatreg.c \
|
||||
$(GX_DIR)/gxaccess.c \
|
||||
$(GX_DIR)/gxvm.c \
|
||||
$(GX_DIR)/gxdump.c
|
||||
|
||||
# GX driver headers
|
||||
#
|
||||
GX_DRV_H := $(GX_DIR)/gxdriver.h \
|
||||
$(GX_DIR)/gxload.h \
|
||||
$(GX_DIR)/gxlookuptbl.h \
|
||||
$(GX_DIR)/gxobjs.h \
|
||||
$(GX_DIR)/gxstatetbl.h \
|
||||
$(GX_DIR)/gxutils.h \
|
||||
$(GX_DIR)/gxfeatreg.h \
|
||||
$(GX_DIR)/gxlfeatreg.h \
|
||||
$(GX_DIR)/gxaccess.h \
|
||||
$(GX_DIR)/gxerrors.h \
|
||||
$(GX_DIR)/gxvm.h \
|
||||
$(GX_DIR)/gxdump.h
|
||||
|
||||
# GX driver object(s)
|
||||
#
|
||||
# GX_DRV_OBJ_M is used during `multi' builds
|
||||
# GX_DRV_OBJ_S is used during `single' builds
|
||||
#
|
||||
GX_DRV_OBJ_M := $(GX_DRV_SRC:$(GX_DIR)/%.c=$(OBJ_DIR)/%.$O)
|
||||
GX_DRV_OBJ_S := $(OBJ_DIR)/gx.$O
|
||||
|
||||
# GX driver source file for single build
|
||||
#
|
||||
GX_DRV_SRC_S := $(GX_DIR)/gx.c
|
||||
|
||||
|
||||
# GX driver - single object
|
||||
#
|
||||
$(GX_DRV_OBJ_S): $(GX_DRV_SRC_S) $(GX_DRV_SRC) $(FREETYPE_H) $(GX_DRV_H) |
||||
$(GX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GX_DRV_SRC_S))
|
||||
|
||||
|
||||
# GX driver - multiple objects
|
||||
#
|
||||
$(OBJ_DIR)/%.$O: $(GX_DIR)/%.c $(FREETYPE_H) $(GX_DRV_H) |
||||
$(GX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
|
||||
|
||||
|
||||
# update main driver object lists
|
||||
#
|
||||
DRV_OBJS_S += $(GX_DRV_OBJ_S)
|
||||
DRV_OBJS_M += $(GX_DRV_OBJ_M)
|
||||
|
||||
|
||||
# EOF
|
@ -0,0 +1,145 @@ |
||||
This directory contains new otlayout, opentype adapter for ftlayout |
||||
interface. Old otlayout is developed by FreeType developers and not |
||||
completed yet. This new otlayout is not completed but works. |
||||
|
||||
New otlayout supports only gsub table. the glyph substitution for |
||||
Japanese vertical layout is tested. gpos table is not supported. |
||||
The languages other than Japanese is not tested yet by us. |
||||
|
||||
The files in this directory are come from different places. |
||||
|
||||
1. FreeType1/TrueTypeOpen support (via pango) |
||||
2. Pango/opentype |
||||
3. developed at RedHat K.K. supported by Information Technology Promotion Agency, Japan. |
||||
4. glib/gunicode.h |
||||
5. freetype2/otlayout(old otlayout) directory in FreeType CVS repository |
||||
|
||||
The files in 5. are not used in new otlayout. |
||||
|
||||
This new otlayout is experimental in all aspects. |
||||
One of the biggest issue is that the symbols coming from 1. |
||||
and 2. have global scope; you cannot link gtk/pango library |
||||
with new otlayout. The symbol may be conflicted. |
||||
|
||||
1. The file coming from FreeType1/TrueTypeOpen support (via pango) |
||||
------------------------------------------------------------------------ |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
|
||||
ftxgdef.c |
||||
ftxgdef.h |
||||
ftxgpos.c |
||||
ftxgpos.h |
||||
ftxgsub.c |
||||
ftxgsub.h |
||||
ftxopen.c |
||||
ftxopen.h |
||||
ftxopenf.h |
||||
|
||||
2. The file coming from Pango/opentype |
||||
------------------------------------------------------------------------ |
||||
* Copyright (C) 2003 Red Hat, Inc |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
|
||||
ot-array.c |
||||
ot-array.h |
||||
ot-info.c |
||||
ot-info.h |
||||
ot-ruleset.c |
||||
ot-ruleset.h |
||||
ot-types.h |
||||
|
||||
3. The file developed at RedHat K.K. supported by IPA |
||||
------------------------------------------------------------------------ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
|
||||
ot.c |
||||
otdriver.c |
||||
otdriver.h |
||||
oterrors.h |
||||
otlayout.c |
||||
otobjs.c |
||||
otobjs.h |
||||
otltypes.h |
||||
substmain.c |
||||
rules.mk |
||||
otdemo.c |
||||
demo.mk |
||||
|
||||
4. glib/gunicode.h |
||||
------------------------------------------------------------------------ |
||||
* Copyright (C) 1999, 2000 Tom Tromey |
||||
* Copyright 2000 Red Hat, Inc. |
||||
* |
||||
* The Gnome Library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public License as |
||||
* published by the Free Software Foundation; either version 2 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* The Gnome Library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with the Gnome Library; see the file COPYING.LIB. If not, |
||||
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
|
||||
ot-unicode.c |
||||
ot-unicode.h |
||||
|
||||
5. The file coming from old otlayout |
||||
------------------------------------------------------------------------ |
||||
otlayout.h |
||||
otlbase.c |
||||
otlbase.h |
||||
otlcommn.c |
||||
otlcommn.h |
||||
otlconf.h |
||||
otlgdef.c |
||||
otlgdef.h |
||||
otlgpos.c |
||||
otlgpos.h |
||||
otlgsub.c |
||||
otlgsub.h |
||||
otljstf.c |
||||
otljstf.h |
||||
otlparse.c |
||||
otlparse.h |
||||
otltable.h |
||||
otltags.h |
||||
otlutils.h |
||||
|
||||
Sun Feb 1 18:24:10 2004 |
||||
Masatake YAMATO, RedHat K.K. |
||||
<jet@gyve.org> or <yamato@redhat.com> |
||||
|
||||
|
@ -0,0 +1,41 @@ |
||||
#
|
||||
# demo.mk --- Makefile for OpenType driver demo program
|
||||
#
|
||||
# Copyright 2004 by Masatake YAMATO and RedHat K.K.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
#
|
||||
########################################################################
|
||||
|
||||
# Development of the code in demo.mk is support of
|
||||
# Information-technology Promotion Agency, Japan.
|
||||
|
||||
SHELL=/bin/bash
|
||||
|
||||
POPT_LIBS=-lpopt
|
||||
|
||||
CFLAGS=-c -O0 -g -I../../include -Wall -std=c99
|
||||
LIBS=-Xlinker -rpath -Xlinker ../../objs/.libs -lz $(POPT_LIBS)
|
||||
########################################################################
|
||||
OTOBJ=../../objs/.libs/libfreetype.so
|
||||
|
||||
DEMOBIN=otdemo
|
||||
DEMOOBJ=otdemo.o
|
||||
DEMOSRC=otdemo.c
|
||||
|
||||
########################################################################
|
||||
all: $(DEMOBIN) |
||||
$(DEMOBIN): $(OTOBJ) $(DEMOOBJ) |
||||
$(CC) -o $(@) $(LIBS) $^
|
||||
|
||||
$(DEMOOBJ): $(DEMOSRC) $(OTOBJ) |
||||
|
||||
$(OTOBJ): *.c *.h |
||||
(cd ../../; make)
|
||||
########################################################################
|
||||
clean: |
||||
rm -f $(DEMOBIN) $(DEMOOBJ) core.*
|
@ -0,0 +1,89 @@ |
||||
|
||||
#ifndef FTERRCOMPAT_H |
||||
#define FTERRCOMPAT_H |
||||
|
||||
/* #include <config.h> */ |
||||
#define FREETYPE_MAJOR 2 |
||||
#define FREETYPE_MINOR 1 |
||||
|
||||
#define TT_Err_Ok FT_Err_Ok |
||||
#define TT_Err_Invalid_Argument FT_Err_Invalid_Argument |
||||
#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle |
||||
#define TT_Err_Table_Missing FT_Err_Table_Missing |
||||
|
||||
/* Compat macros for name changes in FreeType 2.1.0
|
||||
*/ |
||||
#if (FREETYPE_MAJOR == 2) && (FREETYPE_MINOR >= 1) |
||||
|
||||
#define FILE_Pos() FT_STREAM_POS() |
||||
#define FILE_Seek( position ) FT_STREAM_SEEK( position) |
||||
|
||||
#define ACCESS_Frame( size ) FT_FRAME_ENTER( size ) |
||||
#define FORGET_Frame() FT_FRAME_EXIT() |
||||
|
||||
#define GET_Char() FT_GET_CHAR() |
||||
#define GET_Byte() FT_GET_BYTE() |
||||
#define GET_Short() FT_GET_SHORT() |
||||
#define GET_UShort() FT_GET_USHORT() |
||||
#define GET_Offset() FT_GET_OFF3() |
||||
#define GET_UOffset() FT_GET_UOFF3() |
||||
#define GET_Long() FT_GET_LONG() |
||||
#define GET_ULong() FT_GET_ULONG() |
||||
#define GET_Tag4() FT_GET_TAG4() |
||||
|
||||
/* Macro definitions to avoid bogus warnings about strict
|
||||
* aliasing. These make code generation worse, so we only |
||||
* use them when necessary |
||||
*/ |
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) |
||||
#define ALLOC_ARRAY( _pointer_, _count_, _type_ ) ({ \ |
||||
int result; \
|
||||
void *_tmp_; \
|
||||
result = FT_SET_ERROR ( FT_MEM_ALLOC_ARRAY ( _tmp_, \
|
||||
_count_, \
|
||||
_type_ ) ); \
|
||||
_pointer_ = _tmp_; \
|
||||
result; \
|
||||
}) |
||||
|
||||
/* FT_MEM_REALLOC macro broken in 2.1.0 */ |
||||
#define REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) ({ \ |
||||
int result; \
|
||||
void *_tmp_ = _pointer_; \
|
||||
result = FT_SET_ERROR ( FT_MEM_REALLOC( _tmp_, \
|
||||
(_old_) * sizeof ( _type_ ), \
|
||||
(_new_) * sizeof ( _type_ ) ) ); \
|
||||
_pointer_ = _tmp_; \
|
||||
result; \
|
||||
}) |
||||
|
||||
#define FREE( _pointer_ ) ({ \ |
||||
void *_tmp_ = _pointer_; \
|
||||
FT_FREE ( _tmp_ ); \
|
||||
_pointer_ = _tmp_; \
|
||||
}) |
||||
#define ALLOC( _pointer_, _size_ ) ({ \ |
||||
int result; \
|
||||
void *_tmp_; \
|
||||
result = FT_ALLOC( _tmp_, _size_ ); \
|
||||
_pointer_ = _tmp_; \
|
||||
result; \
|
||||
}) |
||||
#else |
||||
#define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ |
||||
FT_SET_ERROR (FT_MEM_ALLOC_ARRAY( _pointer_, _count_, _type_)) |
||||
|
||||
/* FT_MEM_REALLOC macro broken in 2.1.0 */ |
||||
#define REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ |
||||
FT_SET_ERROR ( FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( _type_ ), \
|
||||
(_new_) * sizeof ( _type_ ) ) ) |
||||
|
||||
#define FREE( _pointer_ ) FT_FREE( _pointer_ ) |
||||
#define ALLOC( _pointer_, _size_ ) FT_ALLOC( _pointer_, _size_ ) |
||||
#endif /* gcc >= 3.3 */ |
||||
|
||||
#define MEM_Copy( dest, source, count ) FT_MEM_COPY( dest, source, count ) |
||||
|
||||
#endif /* freetype >= 2.1.0 */ |
||||
|
||||
#endif /* FTERRCOMPAT_H */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,224 @@ |
||||
/*******************************************************************
|
||||
* |
||||
* ftxgdef.h |
||||
* |
||||
* TrueType Open GDEF table support |
||||
* |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
* |
||||
******************************************************************/ |
||||
|
||||
#ifndef FTXOPEN_H |
||||
#error "Don't include this file! Use ftxopen.h instead." |
||||
#endif |
||||
|
||||
#ifndef FTXGDEF_H |
||||
#define FTXGDEF_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#define TTO_Err_Invalid_GDEF_SubTable_Format 0x1030 |
||||
#define TTO_Err_Invalid_GDEF_SubTable 0x1031 |
||||
|
||||
|
||||
/* GDEF glyph classes */ |
||||
|
||||
#define UNCLASSIFIED_GLYPH 0 |
||||
#define SIMPLE_GLYPH 1 |
||||
#define LIGATURE_GLYPH 2 |
||||
#define MARK_GLYPH 3 |
||||
#define COMPONENT_GLYPH 4 |
||||
|
||||
/* GDEF glyph properties, corresponding to class values 1-4. Note that
|
||||
TTO_COMPONENT has no corresponding flag in the LookupFlag field. */ |
||||
|
||||
#define TTO_BASE_GLYPH 0x0002 |
||||
#define TTO_LIGATURE 0x0004 |
||||
#define TTO_MARK 0x0008 |
||||
#define TTO_COMPONENT 0x0010 |
||||
|
||||
|
||||
/* Attachment related structures */ |
||||
|
||||
struct TTO_AttachPoint_ |
||||
{ |
||||
FT_UShort PointCount; /* size of the PointIndex array */ |
||||
FT_UShort* PointIndex; /* array of contour points */ |
||||
}; |
||||
|
||||
typedef struct TTO_AttachPoint_ TTO_AttachPoint; |
||||
|
||||
|
||||
struct TTO_AttachList_ |
||||
{ |
||||
FT_Bool loaded; |
||||
|
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort GlyphCount; /* number of glyphs with
|
||||
attachments */ |
||||
TTO_AttachPoint* AttachPoint; /* array of AttachPoint tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_AttachList_ TTO_AttachList; |
||||
|
||||
|
||||
/* Ligature Caret related structures */ |
||||
|
||||
struct TTO_CaretValueFormat1_ |
||||
{ |
||||
FT_Short Coordinate; /* x or y value (in design units) */ |
||||
}; |
||||
|
||||
typedef struct TTO_CaretValueFormat1_ TTO_CaretValueFormat1; |
||||
|
||||
|
||||
struct TTO_CaretValueFormat2_ |
||||
{ |
||||
FT_UShort CaretValuePoint; /* contour point index on glyph */ |
||||
}; |
||||
|
||||
typedef struct TTO_CaretValueFormat2_ TTO_CaretValueFormat2; |
||||
|
||||
|
||||
struct TTO_CaretValueFormat3_ |
||||
{ |
||||
FT_Short Coordinate; /* x or y value (in design units) */ |
||||
TTO_Device Device; /* Device table for x or y value */ |
||||
}; |
||||
|
||||
typedef struct TTO_CaretValueFormat3_ TTO_CaretValueFormat3; |
||||
|
||||
|
||||
struct TTO_CaretValueFormat4_ |
||||
{ |
||||
FT_UShort IdCaretValue; /* metric ID */ |
||||
}; |
||||
|
||||
typedef struct TTO_CaretValueFormat4_ TTO_CaretValueFormat4; |
||||
|
||||
|
||||
struct TTO_CaretValue_ |
||||
{ |
||||
FT_UShort CaretValueFormat; /* 1, 2, 3, or 4 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_CaretValueFormat1 cvf1; |
||||
TTO_CaretValueFormat2 cvf2; |
||||
TTO_CaretValueFormat3 cvf3; |
||||
TTO_CaretValueFormat4 cvf4; |
||||
} cvf; |
||||
}; |
||||
|
||||
typedef struct TTO_CaretValue_ TTO_CaretValue; |
||||
|
||||
|
||||
struct TTO_LigGlyph_ |
||||
{ |
||||
FT_Bool loaded; |
||||
|
||||
FT_UShort CaretCount; /* number of caret values */ |
||||
TTO_CaretValue* CaretValue; /* array of caret values */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigGlyph_ TTO_LigGlyph; |
||||
|
||||
|
||||
struct TTO_LigCaretList_ |
||||
{ |
||||
FT_Bool loaded; |
||||
|
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort LigGlyphCount; /* number of ligature glyphs */ |
||||
TTO_LigGlyph* LigGlyph; /* array of LigGlyph tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigCaretList_ TTO_LigCaretList; |
||||
|
||||
|
||||
/* The `NewGlyphClasses' field is not defined in the TTO specification.
|
||||
We use it for fonts with a constructed `GlyphClassDef' structure |
||||
(i.e., which don't have a GDEF table) to collect glyph classes |
||||
assigned during the lookup process. The number of arrays in this |
||||
pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth |
||||
array then contains the glyph class values of the glyphs not covered |
||||
by the ClassRangeRecords structures with index n-1 and n. We store |
||||
glyph class values for four glyphs in a single array element. |
||||
|
||||
`LastGlyph' is identical to the number of glyphs minus one in the |
||||
font; we need it only if `NewGlyphClasses' is not NULL (to have an |
||||
upper bound for the last array). |
||||
|
||||
Note that we first store the file offset to the `MarkAttachClassDef' |
||||
field (which has been introduced in OpenType 1.2) -- since the |
||||
`Version' field value hasn't been increased to indicate that we have |
||||
one more field for some obscure reason, we must parse the GSUB table |
||||
to find out whether class values refer to this table. Only then we |
||||
can finally load the MarkAttachClassDef structure if necessary. */ |
||||
|
||||
struct TTO_GDEFHeader_ |
||||
{ |
||||
FT_Memory memory; |
||||
FT_ULong offset; |
||||
|
||||
FT_Fixed Version; |
||||
|
||||
TTO_ClassDefinition GlyphClassDef; |
||||
TTO_AttachList AttachList; |
||||
TTO_LigCaretList LigCaretList; |
||||
FT_ULong MarkAttachClassDef_offset; |
||||
TTO_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */ |
||||
|
||||
FT_UShort LastGlyph; |
||||
FT_UShort** NewGlyphClasses; |
||||
}; |
||||
|
||||
typedef struct TTO_GDEFHeader_ TTO_GDEFHeader; |
||||
typedef struct TTO_GDEFHeader_* TTO_GDEF; |
||||
|
||||
|
||||
/* finally, the GDEF API */ |
||||
|
||||
/* EXPORT_DEF
|
||||
FT_Error TT_Init_GDEF_Extension( TT_Engine engine ); */ |
||||
|
||||
EXPORT_FUNC |
||||
FT_Error TT_New_GDEF_Table( FT_Face face, |
||||
TTO_GDEFHeader** retptr ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Load_GDEF_Table( FT_Face face, |
||||
TTO_GDEFHeader** gdef ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Done_GDEF_Table ( TTO_GDEFHeader* gdef ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GDEF_Get_Glyph_Property( TTO_GDEFHeader* gdef, |
||||
FT_UShort glyphID, |
||||
FT_UShort* property ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GDEF_Build_ClassDefinition( TTO_GDEFHeader* gdef, |
||||
FT_UShort num_glyphs, |
||||
FT_UShort glyph_count, |
||||
FT_UShort* glyph_array, |
||||
FT_UShort* class_array ); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* FTXGDEF_H */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,859 @@ |
||||
/*******************************************************************
|
||||
* |
||||
* ftxgpos.h |
||||
* |
||||
* TrueType Open GPOS table support |
||||
* |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
* |
||||
******************************************************************/ |
||||
|
||||
#ifndef FTXOPEN_H |
||||
#error "Don't include this file! Use ftxopen.h instead." |
||||
#endif |
||||
|
||||
#ifndef FTXGPOS_H |
||||
#define FTXGPOS_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#define TTO_Err_Invalid_GPOS_SubTable_Format 0x1020 |
||||
#define TTO_Err_Invalid_GPOS_SubTable 0x1021 |
||||
|
||||
|
||||
/* Lookup types for glyph positioning */ |
||||
|
||||
#define GPOS_LOOKUP_SINGLE 1 |
||||
#define GPOS_LOOKUP_PAIR 2 |
||||
#define GPOS_LOOKUP_CURSIVE 3 |
||||
#define GPOS_LOOKUP_MARKBASE 4 |
||||
#define GPOS_LOOKUP_MARKLIG 5 |
||||
#define GPOS_LOOKUP_MARKMARK 6 |
||||
#define GPOS_LOOKUP_CONTEXT 7 |
||||
#define GPOS_LOOKUP_CHAIN 8 |
||||
#define GPOS_LOOKUP_EXTENSION 9 |
||||
|
||||
|
||||
/* A pointer to a function which loads a glyph. Its parameters are
|
||||
the same as in a call to TT_Load_Glyph() -- if no glyph loading |
||||
function will be registered with TTO_GPOS_Register_Glyph_Function(), |
||||
TT_Load_Glyph() will be called indeed. The purpose of this function |
||||
pointer is to provide a hook for caching glyph outlines and sbits |
||||
(using the instance's generic pointer to hold the data). |
||||
|
||||
If for some reason no outline data is available (e.g. for an |
||||
embedded bitmap glyph), _glyph->outline.n_points should be set to |
||||
zero. _glyph can be computed with |
||||
|
||||
_glyph = HANDLE_Glyph( glyph ) */ |
||||
|
||||
typedef FT_Error (*TTO_GlyphFunction)(FT_Face face, |
||||
FT_UInt glyphIndex, |
||||
FT_Int loadFlags ); |
||||
|
||||
|
||||
/* A pointer to a function which accesses the PostScript interpreter.
|
||||
Multiple Master fonts need this interface to convert a metric ID |
||||
(as stored in an OpenType font version 1.2 or higher) `metric_id' |
||||
into a metric value (returned in `metric_value'). |
||||
|
||||
`data' points to the user-defined structure specified during a |
||||
call to TT_GPOS_Register_MM_Function(). |
||||
|
||||
`metric_value' must be returned as a scaled value (but shouldn't |
||||
be rounded). */ |
||||
|
||||
typedef FT_Error (*TTO_MMFunction)(FT_Face face, |
||||
FT_UShort metric_id, |
||||
FT_Pos* metric_value, |
||||
void* data ); |
||||
|
||||
|
||||
struct TTO_GPOSHeader_ |
||||
{ |
||||
FT_Memory memory; |
||||
|
||||
FT_Fixed Version; |
||||
|
||||
TTO_ScriptList ScriptList; |
||||
TTO_FeatureList FeatureList; |
||||
TTO_LookupList LookupList; |
||||
|
||||
TTO_GDEFHeader* gdef; |
||||
|
||||
/* the next field is used for a callback function to get the
|
||||
glyph outline. */ |
||||
|
||||
TTO_GlyphFunction gfunc; |
||||
|
||||
/* this is OpenType 1.2 -- Multiple Master fonts need this
|
||||
callback function to get various metric values from the |
||||
PostScript interpreter. */ |
||||
|
||||
TTO_MMFunction mmfunc; |
||||
void* data; |
||||
}; |
||||
|
||||
typedef struct TTO_GPOSHeader_ TTO_GPOSHeader; |
||||
typedef struct TTO_GPOSHeader_* TTO_GPOS; |
||||
|
||||
|
||||
/* shared tables */ |
||||
|
||||
struct TTO_ValueRecord_ |
||||
{ |
||||
FT_Short XPlacement; /* horizontal adjustment for
|
||||
placement */ |
||||
FT_Short YPlacement; /* vertical adjustment for
|
||||
placement */ |
||||
FT_Short XAdvance; /* horizontal adjustment for
|
||||
advance */ |
||||
FT_Short YAdvance; /* vertical adjustment for
|
||||
advance */ |
||||
TTO_Device XPlacementDevice; /* device table for horizontal
|
||||
placement */ |
||||
TTO_Device YPlacementDevice; /* device table for vertical
|
||||
placement */ |
||||
TTO_Device XAdvanceDevice; /* device table for horizontal
|
||||
advance */ |
||||
TTO_Device YAdvanceDevice; /* device table for vertical
|
||||
advance */ |
||||
FT_UShort XIdPlacement; /* horizontal placement metric ID */ |
||||
FT_UShort YIdPlacement; /* vertical placement metric ID */ |
||||
FT_UShort XIdAdvance; /* horizontal advance metric ID */ |
||||
FT_UShort YIdAdvance; /* vertical advance metric ID */ |
||||
}; |
||||
|
||||
typedef struct TTO_ValueRecord_ TTO_ValueRecord; |
||||
|
||||
|
||||
/* Mask values to scan the value format of the ValueRecord structure.
|
||||
We always expand compressed ValueRecords of the font. */ |
||||
|
||||
#define HAVE_X_PLACEMENT 0x0001 |
||||
#define HAVE_Y_PLACEMENT 0x0002 |
||||
#define HAVE_X_ADVANCE 0x0004 |
||||
#define HAVE_Y_ADVANCE 0x0008 |
||||
#define HAVE_X_PLACEMENT_DEVICE 0x0010 |
||||
#define HAVE_Y_PLACEMENT_DEVICE 0x0020 |
||||
#define HAVE_X_ADVANCE_DEVICE 0x0040 |
||||
#define HAVE_Y_ADVANCE_DEVICE 0x0080 |
||||
#define HAVE_X_ID_PLACEMENT 0x0100 |
||||
#define HAVE_Y_ID_PLACEMENT 0x0200 |
||||
#define HAVE_X_ID_ADVANCE 0x0400 |
||||
#define HAVE_Y_ID_ADVANCE 0x0800 |
||||
|
||||
|
||||
struct TTO_AnchorFormat1_ |
||||
{ |
||||
FT_Short XCoordinate; /* horizontal value */ |
||||
FT_Short YCoordinate; /* vertical value */ |
||||
}; |
||||
|
||||
typedef struct TTO_AnchorFormat1_ TTO_AnchorFormat1; |
||||
|
||||
|
||||
struct TTO_AnchorFormat2_ |
||||
{ |
||||
FT_Short XCoordinate; /* horizontal value */ |
||||
FT_Short YCoordinate; /* vertical value */ |
||||
FT_UShort AnchorPoint; /* index to glyph contour point */ |
||||
}; |
||||
|
||||
typedef struct TTO_AnchorFormat2_ TTO_AnchorFormat2; |
||||
|
||||
|
||||
struct TTO_AnchorFormat3_ |
||||
{ |
||||
FT_Short XCoordinate; /* horizontal value */ |
||||
FT_Short YCoordinate; /* vertical value */ |
||||
TTO_Device XDeviceTable; /* device table for X coordinate */ |
||||
TTO_Device YDeviceTable; /* device table for Y coordinate */ |
||||
}; |
||||
|
||||
typedef struct TTO_AnchorFormat3_ TTO_AnchorFormat3; |
||||
|
||||
|
||||
struct TTO_AnchorFormat4_ |
||||
{ |
||||
FT_UShort XIdAnchor; /* horizontal metric ID */ |
||||
FT_UShort YIdAnchor; /* vertical metric ID */ |
||||
}; |
||||
|
||||
typedef struct TTO_AnchorFormat4_ TTO_AnchorFormat4; |
||||
|
||||
|
||||
struct TTO_Anchor_ |
||||
{ |
||||
FT_UShort PosFormat; /* 1, 2, 3, or 4 -- 0 indicates
|
||||
that there is no Anchor table */ |
||||
|
||||
union |
||||
{ |
||||
TTO_AnchorFormat1 af1; |
||||
TTO_AnchorFormat2 af2; |
||||
TTO_AnchorFormat3 af3; |
||||
TTO_AnchorFormat4 af4; |
||||
} af; |
||||
}; |
||||
|
||||
typedef struct TTO_Anchor_ TTO_Anchor; |
||||
|
||||
|
||||
struct TTO_MarkRecord_ |
||||
{ |
||||
FT_UShort Class; /* mark class */ |
||||
TTO_Anchor MarkAnchor; /* anchor table */ |
||||
}; |
||||
|
||||
typedef struct TTO_MarkRecord_ TTO_MarkRecord; |
||||
|
||||
|
||||
struct TTO_MarkArray_ |
||||
{ |
||||
FT_UShort MarkCount; /* number of MarkRecord tables */ |
||||
TTO_MarkRecord* MarkRecord; /* array of MarkRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_MarkArray_ TTO_MarkArray; |
||||
|
||||
|
||||
/* LookupType 1 */ |
||||
|
||||
struct TTO_SinglePosFormat1_ |
||||
{ |
||||
TTO_ValueRecord Value; /* ValueRecord for all covered
|
||||
glyphs */ |
||||
}; |
||||
|
||||
typedef struct TTO_SinglePosFormat1_ TTO_SinglePosFormat1; |
||||
|
||||
|
||||
struct TTO_SinglePosFormat2_ |
||||
{ |
||||
FT_UShort ValueCount; /* number of ValueRecord tables */ |
||||
TTO_ValueRecord* Value; /* array of ValueRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_SinglePosFormat2_ TTO_SinglePosFormat2; |
||||
|
||||
|
||||
struct TTO_SinglePos_ |
||||
{ |
||||
FT_UShort PosFormat; /* 1 or 2 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
|
||||
FT_UShort ValueFormat; /* format of ValueRecord table */ |
||||
|
||||
union |
||||
{ |
||||
TTO_SinglePosFormat1 spf1; |
||||
TTO_SinglePosFormat2 spf2; |
||||
} spf; |
||||
}; |
||||
|
||||
typedef struct TTO_SinglePos_ TTO_SinglePos; |
||||
|
||||
|
||||
/* LookupType 2 */ |
||||
|
||||
struct TTO_PairValueRecord_ |
||||
{ |
||||
FT_UShort SecondGlyph; /* glyph ID for second glyph */ |
||||
TTO_ValueRecord Value1; /* pos. data for first glyph */ |
||||
TTO_ValueRecord Value2; /* pos. data for second glyph */ |
||||
}; |
||||
|
||||
typedef struct TTO_PairValueRecord_ TTO_PairValueRecord; |
||||
|
||||
|
||||
struct TTO_PairSet_ |
||||
{ |
||||
FT_UShort PairValueCount; |
||||
/* number of PairValueRecord tables */ |
||||
TTO_PairValueRecord* PairValueRecord; |
||||
/* array of PairValueRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PairSet_ TTO_PairSet; |
||||
|
||||
|
||||
struct TTO_PairPosFormat1_ |
||||
{ |
||||
FT_UShort PairSetCount; /* number of PairSet tables */ |
||||
TTO_PairSet* PairSet; /* array of PairSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PairPosFormat1_ TTO_PairPosFormat1; |
||||
|
||||
|
||||
struct TTO_Class2Record_ |
||||
{ |
||||
TTO_ValueRecord Value1; /* pos. data for first glyph */ |
||||
TTO_ValueRecord Value2; /* pos. data for second glyph */ |
||||
}; |
||||
|
||||
typedef struct TTO_Class2Record_ TTO_Class2Record; |
||||
|
||||
|
||||
struct TTO_Class1Record_ |
||||
{ |
||||
TTO_Class2Record* Class2Record; /* array of Class2Record tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_Class1Record_ TTO_Class1Record; |
||||
|
||||
|
||||
struct TTO_PairPosFormat2_ |
||||
{ |
||||
TTO_ClassDefinition ClassDef1; /* class def. for first glyph */ |
||||
TTO_ClassDefinition ClassDef2; /* class def. for second glyph */ |
||||
FT_UShort Class1Count; /* number of classes in ClassDef1
|
||||
table */ |
||||
FT_UShort Class2Count; /* number of classes in ClassDef2
|
||||
table */ |
||||
TTO_Class1Record* Class1Record; /* array of Class1Record tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PairPosFormat2_ TTO_PairPosFormat2; |
||||
|
||||
|
||||
struct TTO_PairPos_ |
||||
{ |
||||
FT_UShort PosFormat; /* 1 or 2 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort ValueFormat1; /* format of ValueRecord table
|
||||
for first glyph */ |
||||
FT_UShort ValueFormat2; /* format of ValueRecord table
|
||||
for second glyph */ |
||||
|
||||
union |
||||
{ |
||||
TTO_PairPosFormat1 ppf1; |
||||
TTO_PairPosFormat2 ppf2; |
||||
} ppf; |
||||
}; |
||||
|
||||
typedef struct TTO_PairPos_ TTO_PairPos; |
||||
|
||||
|
||||
/* LookupType 3 */ |
||||
|
||||
struct TTO_EntryExitRecord_ |
||||
{ |
||||
TTO_Anchor EntryAnchor; /* entry Anchor table */ |
||||
TTO_Anchor ExitAnchor; /* exit Anchor table */ |
||||
}; |
||||
|
||||
|
||||
typedef struct TTO_EntryExitRecord_ TTO_EntryExitRecord; |
||||
|
||||
struct TTO_CursivePos_ |
||||
{ |
||||
FT_UShort PosFormat; /* always 1 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort EntryExitCount; |
||||
/* number of EntryExitRecord tables */ |
||||
TTO_EntryExitRecord* EntryExitRecord; |
||||
/* array of EntryExitRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_CursivePos_ TTO_CursivePos; |
||||
|
||||
|
||||
/* LookupType 4 */ |
||||
|
||||
struct TTO_BaseRecord_ |
||||
{ |
||||
TTO_Anchor* BaseAnchor; /* array of base glyph anchor
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_BaseRecord_ TTO_BaseRecord; |
||||
|
||||
|
||||
struct TTO_BaseArray_ |
||||
{ |
||||
FT_UShort BaseCount; /* number of BaseRecord tables */ |
||||
TTO_BaseRecord* BaseRecord; /* array of BaseRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_BaseArray_ TTO_BaseArray; |
||||
|
||||
|
||||
struct TTO_MarkBasePos_ |
||||
{ |
||||
FT_UShort PosFormat; /* always 1 */ |
||||
TTO_Coverage MarkCoverage; /* mark glyph coverage table */ |
||||
TTO_Coverage BaseCoverage; /* base glyph coverage table */ |
||||
FT_UShort ClassCount; /* number of mark classes */ |
||||
TTO_MarkArray MarkArray; /* mark array table */ |
||||
TTO_BaseArray BaseArray; /* base array table */ |
||||
}; |
||||
|
||||
typedef struct TTO_MarkBasePos_ TTO_MarkBasePos; |
||||
|
||||
|
||||
/* LookupType 5 */ |
||||
|
||||
struct TTO_ComponentRecord_ |
||||
{ |
||||
TTO_Anchor* LigatureAnchor; /* array of ligature glyph anchor
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ComponentRecord_ TTO_ComponentRecord; |
||||
|
||||
|
||||
struct TTO_LigatureAttach_ |
||||
{ |
||||
FT_UShort ComponentCount; |
||||
/* number of ComponentRecord tables */ |
||||
TTO_ComponentRecord* ComponentRecord; |
||||
/* array of ComponentRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigatureAttach_ TTO_LigatureAttach; |
||||
|
||||
|
||||
struct TTO_LigatureArray_ |
||||
{ |
||||
FT_UShort LigatureCount; /* number of LigatureAttach tables */ |
||||
TTO_LigatureAttach* LigatureAttach; |
||||
/* array of LigatureAttach tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigatureArray_ TTO_LigatureArray; |
||||
|
||||
|
||||
struct TTO_MarkLigPos_ |
||||
{ |
||||
FT_UShort PosFormat; /* always 1 */ |
||||
TTO_Coverage MarkCoverage; /* mark glyph coverage table */ |
||||
TTO_Coverage LigatureCoverage; |
||||
/* ligature glyph coverage table */ |
||||
FT_UShort ClassCount; /* number of mark classes */ |
||||
TTO_MarkArray MarkArray; /* mark array table */ |
||||
TTO_LigatureArray LigatureArray; /* ligature array table */ |
||||
}; |
||||
|
||||
typedef struct TTO_MarkLigPos_ TTO_MarkLigPos; |
||||
|
||||
|
||||
/* LookupType 6 */ |
||||
|
||||
struct TTO_Mark2Record_ |
||||
{ |
||||
TTO_Anchor* Mark2Anchor; /* array of mark glyph anchor
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_Mark2Record_ TTO_Mark2Record; |
||||
|
||||
|
||||
struct TTO_Mark2Array_ |
||||
{ |
||||
FT_UShort Mark2Count; /* number of Mark2Record tables */ |
||||
TTO_Mark2Record* Mark2Record; /* array of Mark2Record tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_Mark2Array_ TTO_Mark2Array; |
||||
|
||||
|
||||
struct TTO_MarkMarkPos_ |
||||
{ |
||||
FT_UShort PosFormat; /* always 1 */ |
||||
TTO_Coverage Mark1Coverage; /* first mark glyph coverage table */ |
||||
TTO_Coverage Mark2Coverage; /* second mark glyph coverave table */ |
||||
FT_UShort ClassCount; /* number of combining mark classes */ |
||||
TTO_MarkArray Mark1Array; /* MarkArray table for first mark */ |
||||
TTO_Mark2Array Mark2Array; /* MarkArray table for second mark */ |
||||
}; |
||||
|
||||
typedef struct TTO_MarkMarkPos_ TTO_MarkMarkPos; |
||||
|
||||
|
||||
/* needed by both lookup type 7 and 8 */ |
||||
|
||||
struct TTO_PosLookupRecord_ |
||||
{ |
||||
FT_UShort SequenceIndex; /* index into current
|
||||
glyph sequence */ |
||||
FT_UShort LookupListIndex; /* Lookup to apply to that pos. */ |
||||
}; |
||||
|
||||
typedef struct TTO_PosLookupRecord_ TTO_PosLookupRecord; |
||||
|
||||
|
||||
/* LookupType 7 */ |
||||
|
||||
struct TTO_PosRule_ |
||||
{ |
||||
FT_UShort GlyphCount; /* total number of input glyphs */ |
||||
FT_UShort PosCount; /* number of PosLookupRecord tables */ |
||||
FT_UShort* Input; /* array of input glyph IDs */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of PosLookupRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PosRule_ TTO_PosRule; |
||||
|
||||
|
||||
struct TTO_PosRuleSet_ |
||||
{ |
||||
FT_UShort PosRuleCount; /* number of PosRule tables */ |
||||
TTO_PosRule* PosRule; /* array of PosRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PosRuleSet_ TTO_PosRuleSet; |
||||
|
||||
|
||||
struct TTO_ContextPosFormat1_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort PosRuleSetCount; /* number of PosRuleSet tables */ |
||||
TTO_PosRuleSet* PosRuleSet; /* array of PosRuleSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextPosFormat1_ TTO_ContextPosFormat1; |
||||
|
||||
|
||||
struct TTO_PosClassRule_ |
||||
{ |
||||
FT_UShort GlyphCount; /* total number of context classes */ |
||||
FT_UShort PosCount; /* number of PosLookupRecord tables */ |
||||
FT_UShort* Class; /* array of classes */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of PosLookupRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PosClassRule_ TTO_PosClassRule; |
||||
|
||||
|
||||
struct TTO_PosClassSet_ |
||||
{ |
||||
FT_UShort PosClassRuleCount; |
||||
/* number of PosClassRule tables */ |
||||
TTO_PosClassRule* PosClassRule; /* array of PosClassRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_PosClassSet_ TTO_PosClassSet; |
||||
|
||||
|
||||
/* The `MaxContextLength' field is not defined in the TTO specification
|
||||
but simplifies the implementation of this format. It holds the |
||||
maximal context length used in the context rules. */ |
||||
|
||||
struct TTO_ContextPosFormat2_ |
||||
{ |
||||
FT_UShort MaxContextLength; |
||||
/* maximal context length */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
TTO_ClassDefinition ClassDef; /* ClassDef table */ |
||||
FT_UShort PosClassSetCount; |
||||
/* number of PosClassSet tables */ |
||||
TTO_PosClassSet* PosClassSet; /* array of PosClassSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextPosFormat2_ TTO_ContextPosFormat2; |
||||
|
||||
|
||||
struct TTO_ContextPosFormat3_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of input glyphs */ |
||||
FT_UShort PosCount; /* number of PosLookupRecord tables */ |
||||
TTO_Coverage* Coverage; /* array of Coverage tables */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of PosLookupRecord tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextPosFormat3_ TTO_ContextPosFormat3; |
||||
|
||||
|
||||
struct TTO_ContextPos_ |
||||
{ |
||||
FT_UShort PosFormat; /* 1, 2, or 3 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_ContextPosFormat1 cpf1; |
||||
TTO_ContextPosFormat2 cpf2; |
||||
TTO_ContextPosFormat3 cpf3; |
||||
} cpf; |
||||
}; |
||||
|
||||
typedef struct TTO_ContextPos_ TTO_ContextPos; |
||||
|
||||
|
||||
/* LookupType 8 */ |
||||
|
||||
struct TTO_ChainPosRule_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* total number of backtrack glyphs */ |
||||
FT_UShort* Backtrack; /* array of backtrack glyph IDs */ |
||||
FT_UShort InputGlyphCount; |
||||
/* total number of input glyphs */ |
||||
FT_UShort* Input; /* array of input glyph IDs */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* total number of lookahead glyphs */ |
||||
FT_UShort* Lookahead; /* array of lookahead glyph IDs */ |
||||
FT_UShort PosCount; /* number of PosLookupRecords */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of PosLookupRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainPosRule_ TTO_ChainPosRule; |
||||
|
||||
|
||||
struct TTO_ChainPosRuleSet_ |
||||
{ |
||||
FT_UShort ChainPosRuleCount; |
||||
/* number of ChainPosRule tables */ |
||||
TTO_ChainPosRule* ChainPosRule; /* array of ChainPosRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainPosRuleSet_ TTO_ChainPosRuleSet; |
||||
|
||||
|
||||
struct TTO_ChainContextPosFormat1_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort ChainPosRuleSetCount; |
||||
/* number of ChainPosRuleSet tables */ |
||||
TTO_ChainPosRuleSet* ChainPosRuleSet; |
||||
/* array of ChainPosRuleSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextPosFormat1_ TTO_ChainContextPosFormat1; |
||||
|
||||
|
||||
struct TTO_ChainPosClassRule_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* total number of backtrack
|
||||
classes */ |
||||
FT_UShort* Backtrack; /* array of backtrack classes */ |
||||
FT_UShort InputGlyphCount; |
||||
/* total number of context classes */ |
||||
FT_UShort* Input; /* array of context classes */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* total number of lookahead
|
||||
classes */ |
||||
FT_UShort* Lookahead; /* array of lookahead classes */ |
||||
FT_UShort PosCount; /* number of PosLookupRecords */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of substitution lookups */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainPosClassRule_ TTO_ChainPosClassRule; |
||||
|
||||
|
||||
struct TTO_ChainPosClassSet_ |
||||
{ |
||||
FT_UShort ChainPosClassRuleCount; |
||||
/* number of ChainPosClassRule
|
||||
tables */ |
||||
TTO_ChainPosClassRule* ChainPosClassRule; |
||||
/* array of ChainPosClassRule
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainPosClassSet_ TTO_ChainPosClassSet; |
||||
|
||||
|
||||
/* The `MaxXXXLength' fields are not defined in the TTO specification
|
||||
but simplifies the implementation of this format. It holds the |
||||
maximal context length used in the specific context rules. */ |
||||
|
||||
struct TTO_ChainContextPosFormat2_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
|
||||
FT_UShort MaxBacktrackLength; |
||||
/* maximal backtrack length */ |
||||
TTO_ClassDefinition BacktrackClassDef; |
||||
/* BacktrackClassDef table */ |
||||
FT_UShort MaxInputLength; |
||||
/* maximal input length */ |
||||
TTO_ClassDefinition InputClassDef; |
||||
/* InputClassDef table */ |
||||
FT_UShort MaxLookaheadLength; |
||||
/* maximal lookahead length */ |
||||
TTO_ClassDefinition LookaheadClassDef; |
||||
/* LookaheadClassDef table */ |
||||
|
||||
FT_UShort ChainPosClassSetCount; |
||||
/* number of ChainPosClassSet
|
||||
tables */ |
||||
TTO_ChainPosClassSet* ChainPosClassSet; |
||||
/* array of ChainPosClassSet
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextPosFormat2_ TTO_ChainContextPosFormat2; |
||||
|
||||
|
||||
struct TTO_ChainContextPosFormat3_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* number of backtrack glyphs */ |
||||
TTO_Coverage* BacktrackCoverage; |
||||
/* array of backtrack Coverage
|
||||
tables */ |
||||
FT_UShort InputGlyphCount; |
||||
/* number of input glyphs */ |
||||
TTO_Coverage* InputCoverage; |
||||
/* array of input coverage
|
||||
tables */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* number of lookahead glyphs */ |
||||
TTO_Coverage* LookaheadCoverage; |
||||
/* array of lookahead coverage
|
||||
tables */ |
||||
FT_UShort PosCount; /* number of PosLookupRecords */ |
||||
TTO_PosLookupRecord* PosLookupRecord; |
||||
/* array of substitution lookups */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextPosFormat3_ TTO_ChainContextPosFormat3; |
||||
|
||||
|
||||
struct TTO_ChainContextPos_ |
||||
{ |
||||
FT_UShort PosFormat; /* 1, 2, or 3 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_ChainContextPosFormat1 ccpf1; |
||||
TTO_ChainContextPosFormat2 ccpf2; |
||||
TTO_ChainContextPosFormat3 ccpf3; |
||||
} ccpf; |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextPos_ TTO_ChainContextPos; |
||||
|
||||
|
||||
union TTO_GPOS_SubTable_ |
||||
{ |
||||
TTO_SinglePos single; |
||||
TTO_PairPos pair; |
||||
TTO_CursivePos cursive; |
||||
TTO_MarkBasePos markbase; |
||||
TTO_MarkLigPos marklig; |
||||
TTO_MarkMarkPos markmark; |
||||
TTO_ContextPos context; |
||||
TTO_ChainContextPos chain; |
||||
}; |
||||
|
||||
typedef union TTO_GPOS_SubTable_ TTO_GPOS_SubTable; |
||||
|
||||
|
||||
/* This `string object' is much simpler compared to TTO_GSUB_String.
|
||||
A call to TTO_GPOS_Apply_String() will allocate it. */ |
||||
|
||||
struct TTO_GPOS_Data_ |
||||
{ |
||||
FT_Pos x_pos; |
||||
FT_Pos y_pos; |
||||
FT_Pos x_advance; |
||||
FT_Pos y_advance; |
||||
FT_UShort back; /* number of glyphs to go back
|
||||
for drawing current glyph */ |
||||
FT_Bool new_advance; /* if set, the advance width values are
|
||||
absolute, i.e., they won't be |
||||
added to the original glyph's value |
||||
but rather replace them. */ |
||||
}; |
||||
|
||||
typedef struct TTO_GPOS_Data_ TTO_GPOS_Data; |
||||
|
||||
|
||||
/* finally, the GPOS API */ |
||||
|
||||
/* EXPORT_DEF
|
||||
FT_Export ( FT_Error ) TT_Init_GPOS_Extension( TT_Engine engine ); */ |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Load_GPOS_Table( FT_Face face, |
||||
TTO_GPOSHeader** gpos, |
||||
TTO_GDEFHeader* gdef ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Done_GPOS_Table( TTO_GPOSHeader* gpos ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Select_Script( TTO_GPOSHeader* gpos, |
||||
FT_ULong script_tag, |
||||
FT_UShort* script_index ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Select_Language( TTO_GPOSHeader* gpos, |
||||
FT_ULong language_tag, |
||||
FT_UShort script_index, |
||||
FT_UShort* language_index, |
||||
FT_UShort* req_feature_index ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Select_Feature( TTO_GPOSHeader* gpos, |
||||
FT_ULong feature_tag, |
||||
FT_UShort script_index, |
||||
FT_UShort language_index, |
||||
FT_UShort* feature_index ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Query_Scripts( TTO_GPOSHeader* gpos, |
||||
FT_ULong** script_tag_list ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Query_Languages( TTO_GPOSHeader* gpos, |
||||
FT_UShort script_index, |
||||
FT_ULong** language_tag_list ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Query_Features( TTO_GPOSHeader* gpos, |
||||
FT_UShort script_index, |
||||
FT_UShort language_index, |
||||
FT_ULong** feature_tag_list ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Add_Feature( TTO_GPOSHeader* gpos, |
||||
FT_UShort feature_index, |
||||
FT_UShort property ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Clear_Features( TTO_GPOSHeader* gpos ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Register_Glyph_Function( TTO_GPOSHeader* gpos, |
||||
TTO_GlyphFunction gfunc ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Register_MM_Function( TTO_GPOSHeader* gpos, |
||||
TTO_MMFunction mmfunc, |
||||
void* data ); |
||||
|
||||
/* If `dvi' is TRUE, glyph contour points for anchor points and device
|
||||
tables are ignored -- you will get device independent values. */ |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GPOS_Apply_String( FT_Face face, |
||||
TTO_GPOSHeader* gpos, |
||||
FT_UShort load_flags, |
||||
TTO_GSUB_String* in, |
||||
TTO_GPOS_Data** out, |
||||
FT_Bool dvi, |
||||
FT_Bool r2l ); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* FTXGPOS_H */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,613 @@ |
||||
/*******************************************************************
|
||||
* |
||||
* ftxgsub.h |
||||
* |
||||
* TrueType Open GSUB table support |
||||
* |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
* |
||||
******************************************************************/ |
||||
|
||||
#ifndef FTXOPEN_H |
||||
#error "Don't include this file! Use ftxopen.h instead." |
||||
#endif |
||||
|
||||
#ifndef FTXGSUB_H |
||||
#define FTXGSUB_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#define TTO_Err_Invalid_GSUB_SubTable_Format 0x1010 |
||||
#define TTO_Err_Invalid_GSUB_SubTable 0x1011 |
||||
|
||||
|
||||
/* Lookup types for glyph substitution */ |
||||
|
||||
#define GSUB_LOOKUP_SINGLE 1 |
||||
#define GSUB_LOOKUP_MULTIPLE 2 |
||||
#define GSUB_LOOKUP_ALTERNATE 3 |
||||
#define GSUB_LOOKUP_LIGATURE 4 |
||||
#define GSUB_LOOKUP_CONTEXT 5 |
||||
#define GSUB_LOOKUP_CHAIN 6 |
||||
#define GSUB_LOOKUP_EXTENSION 7 |
||||
|
||||
|
||||
/* Use this if a feature applies to all glyphs */ |
||||
|
||||
#define ALL_GLYPHS 0xFFFF |
||||
|
||||
|
||||
/* A pointer to a function which selects the alternate glyph. `pos' is
|
||||
the position of the glyph with index `glyphID', `num_alternates' |
||||
gives the number of alternates in the `alternates' array. `data' |
||||
points to the user-defined structure specified during a call to |
||||
TT_GSUB_Register_Alternate_Function(). The function must return an |
||||
index into the `alternates' array. */ |
||||
|
||||
typedef FT_UShort (*TTO_AltFunction)(FT_ULong pos, |
||||
FT_UShort glyphID, |
||||
FT_UShort num_alternates, |
||||
FT_UShort* alternates, |
||||
void* data ); |
||||
|
||||
|
||||
struct TTO_GSUBHeader_ |
||||
{ |
||||
FT_Memory memory; |
||||
|
||||
FT_ULong offset; |
||||
|
||||
FT_Fixed Version; |
||||
|
||||
TTO_ScriptList ScriptList; |
||||
TTO_FeatureList FeatureList; |
||||
TTO_LookupList LookupList; |
||||
|
||||
TTO_GDEFHeader* gdef; |
||||
|
||||
/* the next two fields are used for an alternate substitution callback
|
||||
function to select the proper alternate glyph. */ |
||||
|
||||
TTO_AltFunction altfunc; |
||||
void* data; |
||||
}; |
||||
|
||||
typedef struct TTO_GSUBHeader_ TTO_GSUBHeader; |
||||
typedef struct TTO_GSUBHeader_* TTO_GSUB; |
||||
|
||||
|
||||
/* LookupType 1 */ |
||||
|
||||
struct TTO_SingleSubstFormat1_ |
||||
{ |
||||
FT_Short DeltaGlyphID; /* constant added to get
|
||||
substitution glyph index */ |
||||
}; |
||||
|
||||
typedef struct TTO_SingleSubstFormat1_ TTO_SingleSubstFormat1; |
||||
|
||||
|
||||
struct TTO_SingleSubstFormat2_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of glyph IDs in
|
||||
Substitute array */ |
||||
FT_UShort* Substitute; /* array of substitute glyph IDs */ |
||||
}; |
||||
|
||||
typedef struct TTO_SingleSubstFormat2_ TTO_SingleSubstFormat2; |
||||
|
||||
|
||||
struct TTO_SingleSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* 1 or 2 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
|
||||
union |
||||
{ |
||||
TTO_SingleSubstFormat1 ssf1; |
||||
TTO_SingleSubstFormat2 ssf2; |
||||
} ssf; |
||||
}; |
||||
|
||||
typedef struct TTO_SingleSubst_ TTO_SingleSubst; |
||||
|
||||
|
||||
/* LookupType 2 */ |
||||
|
||||
struct TTO_Sequence_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of glyph IDs in the
|
||||
Substitute array */ |
||||
FT_UShort* Substitute; /* string of glyph IDs to
|
||||
substitute */ |
||||
}; |
||||
|
||||
typedef struct TTO_Sequence_ TTO_Sequence; |
||||
|
||||
|
||||
struct TTO_MultipleSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* always 1 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort SequenceCount; /* number of Sequence tables */ |
||||
TTO_Sequence* Sequence; /* array of Sequence tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_MultipleSubst_ TTO_MultipleSubst; |
||||
|
||||
|
||||
/* LookupType 3 */ |
||||
|
||||
struct TTO_AlternateSet_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of glyph IDs in the
|
||||
Alternate array */ |
||||
FT_UShort* Alternate; /* array of alternate glyph IDs */ |
||||
}; |
||||
|
||||
typedef struct TTO_AlternateSet_ TTO_AlternateSet; |
||||
|
||||
|
||||
struct TTO_AlternateSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* always 1 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort AlternateSetCount; |
||||
/* number of AlternateSet tables */ |
||||
TTO_AlternateSet* AlternateSet; /* array of AlternateSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_AlternateSubst_ TTO_AlternateSubst; |
||||
|
||||
|
||||
/* LookupType 4 */ |
||||
|
||||
struct TTO_Ligature_ |
||||
{ |
||||
FT_UShort LigGlyph; /* glyphID of ligature
|
||||
to substitute */ |
||||
FT_UShort ComponentCount; /* number of components in ligature */ |
||||
FT_UShort* Component; /* array of component glyph IDs */ |
||||
}; |
||||
|
||||
typedef struct TTO_Ligature_ TTO_Ligature; |
||||
|
||||
|
||||
struct TTO_LigatureSet_ |
||||
{ |
||||
FT_UShort LigatureCount; /* number of Ligature tables */ |
||||
TTO_Ligature* Ligature; /* array of Ligature tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigatureSet_ TTO_LigatureSet; |
||||
|
||||
|
||||
struct TTO_LigatureSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* always 1 */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort LigatureSetCount; /* number of LigatureSet tables */ |
||||
TTO_LigatureSet* LigatureSet; /* array of LigatureSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_LigatureSubst_ TTO_LigatureSubst; |
||||
|
||||
|
||||
/* needed by both lookup type 5 and 6 */ |
||||
|
||||
struct TTO_SubstLookupRecord_ |
||||
{ |
||||
FT_UShort SequenceIndex; /* index into current
|
||||
glyph sequence */ |
||||
FT_UShort LookupListIndex; /* Lookup to apply to that pos. */ |
||||
}; |
||||
|
||||
typedef struct TTO_SubstLookupRecord_ TTO_SubstLookupRecord; |
||||
|
||||
|
||||
/* LookupType 5 */ |
||||
|
||||
struct TTO_SubRule_ |
||||
{ |
||||
FT_UShort GlyphCount; /* total number of input glyphs */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecord
|
||||
tables */ |
||||
FT_UShort* Input; /* array of input glyph IDs */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of SubstLookupRecord
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_SubRule_ TTO_SubRule; |
||||
|
||||
|
||||
struct TTO_SubRuleSet_ |
||||
{ |
||||
FT_UShort SubRuleCount; /* number of SubRule tables */ |
||||
TTO_SubRule* SubRule; /* array of SubRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_SubRuleSet_ TTO_SubRuleSet; |
||||
|
||||
|
||||
struct TTO_ContextSubstFormat1_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort SubRuleSetCount; /* number of SubRuleSet tables */ |
||||
TTO_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextSubstFormat1_ TTO_ContextSubstFormat1; |
||||
|
||||
|
||||
struct TTO_SubClassRule_ |
||||
{ |
||||
FT_UShort GlyphCount; /* total number of context classes */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecord
|
||||
tables */ |
||||
FT_UShort* Class; /* array of classes */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of SubstLookupRecord
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_SubClassRule_ TTO_SubClassRule; |
||||
|
||||
|
||||
struct TTO_SubClassSet_ |
||||
{ |
||||
FT_UShort SubClassRuleCount; |
||||
/* number of SubClassRule tables */ |
||||
TTO_SubClassRule* SubClassRule; /* array of SubClassRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_SubClassSet_ TTO_SubClassSet; |
||||
|
||||
|
||||
/* The `MaxContextLength' field is not defined in the TTO specification
|
||||
but simplifies the implementation of this format. It holds the |
||||
maximal context length used in the context rules. */ |
||||
|
||||
struct TTO_ContextSubstFormat2_ |
||||
{ |
||||
FT_UShort MaxContextLength; |
||||
/* maximal context length */ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
TTO_ClassDefinition ClassDef; /* ClassDef table */ |
||||
FT_UShort SubClassSetCount; |
||||
/* number of SubClassSet tables */ |
||||
TTO_SubClassSet* SubClassSet; /* array of SubClassSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextSubstFormat2_ TTO_ContextSubstFormat2; |
||||
|
||||
|
||||
struct TTO_ContextSubstFormat3_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of input glyphs */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecords */ |
||||
TTO_Coverage* Coverage; /* array of Coverage tables */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of substitution lookups */ |
||||
}; |
||||
|
||||
typedef struct TTO_ContextSubstFormat3_ TTO_ContextSubstFormat3; |
||||
|
||||
|
||||
struct TTO_ContextSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* 1, 2, or 3 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_ContextSubstFormat1 csf1; |
||||
TTO_ContextSubstFormat2 csf2; |
||||
TTO_ContextSubstFormat3 csf3; |
||||
} csf; |
||||
}; |
||||
|
||||
typedef struct TTO_ContextSubst_ TTO_ContextSubst; |
||||
|
||||
|
||||
/* LookupType 6 */ |
||||
|
||||
struct TTO_ChainSubRule_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* total number of backtrack glyphs */ |
||||
FT_UShort* Backtrack; /* array of backtrack glyph IDs */ |
||||
FT_UShort InputGlyphCount; |
||||
/* total number of input glyphs */ |
||||
FT_UShort* Input; /* array of input glyph IDs */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* total number of lookahead glyphs */ |
||||
FT_UShort* Lookahead; /* array of lookahead glyph IDs */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecords */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of SubstLookupRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainSubRule_ TTO_ChainSubRule; |
||||
|
||||
|
||||
struct TTO_ChainSubRuleSet_ |
||||
{ |
||||
FT_UShort ChainSubRuleCount; |
||||
/* number of ChainSubRule tables */ |
||||
TTO_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainSubRuleSet_ TTO_ChainSubRuleSet; |
||||
|
||||
|
||||
struct TTO_ChainContextSubstFormat1_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
FT_UShort ChainSubRuleSetCount; |
||||
/* number of ChainSubRuleSet tables */ |
||||
TTO_ChainSubRuleSet* ChainSubRuleSet; |
||||
/* array of ChainSubRuleSet tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextSubstFormat1_ TTO_ChainContextSubstFormat1; |
||||
|
||||
|
||||
struct TTO_ChainSubClassRule_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* total number of backtrack
|
||||
classes */ |
||||
FT_UShort* Backtrack; /* array of backtrack classes */ |
||||
FT_UShort InputGlyphCount; |
||||
/* total number of context classes */ |
||||
FT_UShort* Input; /* array of context classes */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* total number of lookahead
|
||||
classes */ |
||||
FT_UShort* Lookahead; /* array of lookahead classes */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecords */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of substitution lookups */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainSubClassRule_ TTO_ChainSubClassRule; |
||||
|
||||
|
||||
struct TTO_ChainSubClassSet_ |
||||
{ |
||||
FT_UShort ChainSubClassRuleCount; |
||||
/* number of ChainSubClassRule
|
||||
tables */ |
||||
TTO_ChainSubClassRule* ChainSubClassRule; |
||||
/* array of ChainSubClassRule
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainSubClassSet_ TTO_ChainSubClassSet; |
||||
|
||||
|
||||
/* The `MaxXXXLength' fields are not defined in the TTO specification
|
||||
but simplifies the implementation of this format. It holds the |
||||
maximal context length used in the specific context rules. */ |
||||
|
||||
struct TTO_ChainContextSubstFormat2_ |
||||
{ |
||||
TTO_Coverage Coverage; /* Coverage table */ |
||||
|
||||
FT_UShort MaxBacktrackLength; |
||||
/* maximal backtrack length */ |
||||
TTO_ClassDefinition BacktrackClassDef; |
||||
/* BacktrackClassDef table */ |
||||
FT_UShort MaxInputLength; |
||||
/* maximal input length */ |
||||
TTO_ClassDefinition InputClassDef; |
||||
/* InputClassDef table */ |
||||
FT_UShort MaxLookaheadLength; |
||||
/* maximal lookahead length */ |
||||
TTO_ClassDefinition LookaheadClassDef; |
||||
/* LookaheadClassDef table */ |
||||
|
||||
FT_UShort ChainSubClassSetCount; |
||||
/* number of ChainSubClassSet
|
||||
tables */ |
||||
TTO_ChainSubClassSet* ChainSubClassSet; |
||||
/* array of ChainSubClassSet
|
||||
tables */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextSubstFormat2_ TTO_ChainContextSubstFormat2; |
||||
|
||||
|
||||
struct TTO_ChainContextSubstFormat3_ |
||||
{ |
||||
FT_UShort BacktrackGlyphCount; |
||||
/* number of backtrack glyphs */ |
||||
TTO_Coverage* BacktrackCoverage; |
||||
/* array of backtrack Coverage
|
||||
tables */ |
||||
FT_UShort InputGlyphCount; |
||||
/* number of input glyphs */ |
||||
TTO_Coverage* InputCoverage; |
||||
/* array of input coverage
|
||||
tables */ |
||||
FT_UShort LookaheadGlyphCount; |
||||
/* number of lookahead glyphs */ |
||||
TTO_Coverage* LookaheadCoverage; |
||||
/* array of lookahead coverage
|
||||
tables */ |
||||
FT_UShort SubstCount; /* number of SubstLookupRecords */ |
||||
TTO_SubstLookupRecord* SubstLookupRecord; |
||||
/* array of substitution lookups */ |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextSubstFormat3_ TTO_ChainContextSubstFormat3; |
||||
|
||||
|
||||
struct TTO_ChainContextSubst_ |
||||
{ |
||||
FT_UShort SubstFormat; /* 1, 2, or 3 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_ChainContextSubstFormat1 ccsf1; |
||||
TTO_ChainContextSubstFormat2 ccsf2; |
||||
TTO_ChainContextSubstFormat3 ccsf3; |
||||
} ccsf; |
||||
}; |
||||
|
||||
typedef struct TTO_ChainContextSubst_ TTO_ChainContextSubst; |
||||
|
||||
|
||||
union TTO_GSUB_SubTable_ |
||||
{ |
||||
TTO_SingleSubst single; |
||||
TTO_MultipleSubst multiple; |
||||
TTO_AlternateSubst alternate; |
||||
TTO_LigatureSubst ligature; |
||||
TTO_ContextSubst context; |
||||
TTO_ChainContextSubst chain; |
||||
}; |
||||
|
||||
typedef union TTO_GSUB_SubTable_ TTO_GSUB_SubTable; |
||||
|
||||
|
||||
/* A simple string object. It can both `send' and `receive' data.
|
||||
In case of sending, `length' and `pos' will be used. In case of |
||||
receiving, `pos' points to the first free slot, and `allocated' |
||||
specifies the amount of allocated memory (and the `length' field |
||||
will be ignored). The routine TT_Add_String() will increase the |
||||
amount of memory if necessary. After end of receive, `length' |
||||
should be set to the value of `pos', and `pos' will be set to zero. |
||||
|
||||
`properties' (which is treated as a bit field) gives the glyph's |
||||
properties: If a certain bit is set for a glyph, the feature which |
||||
has the same bit set in its property value is applied. |
||||
|
||||
`components' is an internal array which tracks components of |
||||
ligatures. We need this for MarkToLigature Attachment Positioning |
||||
Subtables (in GPOS) together with `ligIDs' (which is used to mark |
||||
ligatures and the skipped glyphs during a ligature lookup). |
||||
`max_ligID' is increased after a successful ligature lookup. |
||||
|
||||
NEVER modify any elements of the structure! You should rather copy |
||||
its contents if necessary. |
||||
|
||||
TT_Add_String() will also handle allocation; you should use |
||||
free() in case you want to destroy the arrays in the object. */ |
||||
|
||||
struct TTO_GSUB_String_ |
||||
{ |
||||
FT_Memory memory; |
||||
|
||||
FT_ULong length; |
||||
FT_ULong pos; |
||||
FT_ULong allocated; |
||||
FT_UShort* string; |
||||
FT_UShort* properties; |
||||
FT_UShort* components; |
||||
FT_UShort max_ligID; |
||||
FT_UShort* ligIDs; |
||||
FT_Int* logClusters; |
||||
}; |
||||
|
||||
typedef struct TTO_GSUB_String_ TTO_GSUB_String; |
||||
|
||||
|
||||
/* finally, the GSUB API */ |
||||
|
||||
/* EXPORT_DEF
|
||||
TT_Error TT_Init_GSUB_Extension( TT_Engine engine ); */ |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Load_GSUB_Table( FT_Face face, |
||||
TTO_GSUBHeader** gsub, |
||||
TTO_GDEFHeader* gdef ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_Done_GSUB_Table( TTO_GSUBHeader* gsub ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Select_Script( TTO_GSUBHeader* gsub, |
||||
FT_ULong script_tag, |
||||
FT_UShort* script_index ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Select_Language( TTO_GSUBHeader* gsub, |
||||
FT_ULong language_tag, |
||||
FT_UShort script_index, |
||||
FT_UShort* language_index, |
||||
FT_UShort* req_feature_index ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Select_Feature( TTO_GSUBHeader* gsub, |
||||
FT_ULong feature_tag, |
||||
FT_UShort script_index, |
||||
FT_UShort language_index, |
||||
FT_UShort* feature_index ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Query_Scripts( TTO_GSUBHeader* gsub, |
||||
FT_ULong** script_tag_list ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Query_Languages( TTO_GSUBHeader* gsub, |
||||
FT_UShort script_index, |
||||
FT_ULong** language_tag_list ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Query_Features( TTO_GSUBHeader* gsub, |
||||
FT_UShort script_index, |
||||
FT_UShort language_index, |
||||
FT_ULong** feature_tag_list ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Add_Feature( TTO_GSUBHeader* gsub, |
||||
FT_UShort feature_index, |
||||
FT_UShort property ); |
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Clear_Features( TTO_GSUBHeader* gsub ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Register_Alternate_Function( TTO_GSUBHeader* gsub, |
||||
TTO_AltFunction altfunc, |
||||
void* data ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_String_New( FT_Memory memory, |
||||
TTO_GSUB_String **result ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_String_Set_Length( TTO_GSUB_String *str, |
||||
FT_ULong new_length); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_String_Done( TTO_GSUB_String *str ); |
||||
|
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Apply_String( TTO_GSUBHeader* gsub, |
||||
TTO_GSUB_String* in, |
||||
TTO_GSUB_String* out ); |
||||
|
||||
EXPORT_DEF |
||||
FT_Error TT_GSUB_Add_String( TTO_GSUB_String* in, |
||||
FT_UShort num_in, |
||||
TTO_GSUB_String* out, |
||||
FT_UShort num_out, |
||||
FT_UShort* glyph_data, |
||||
FT_UShort component, |
||||
FT_UShort ligID ); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* FTXGSUB_H */ |
||||
|
||||
|
||||
/* END */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,314 @@ |
||||
/*******************************************************************
|
||||
* |
||||
* ftxopen.h |
||||
* |
||||
* TrueType Open support. |
||||
* |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
* |
||||
* This file should be included by the application. Nevertheless, |
||||
* the table specific APIs (and structures) are located in files like |
||||
* ftxgsub.h or ftxgpos.h; these header files are read by ftxopen.h . |
||||
* |
||||
******************************************************************/ |
||||
|
||||
#ifndef FTXOPEN_H |
||||
#define FTXOPEN_H |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#define EXPORT_DEF static |
||||
#define EXPORT_FUNC static |
||||
|
||||
#define TTO_MAX_NESTING_LEVEL 100 |
||||
|
||||
#define TTO_Err_Invalid_SubTable_Format 0x1000 |
||||
#define TTO_Err_Invalid_SubTable 0x1001 |
||||
#define TTO_Err_Not_Covered 0x1002 |
||||
#define TTO_Err_Too_Many_Nested_Contexts 0x1003 |
||||
#define TTO_Err_No_MM_Interpreter 0x1004 |
||||
#define TTO_Err_Empty_Script 0x1005 |
||||
|
||||
|
||||
/* Script list related structures */ |
||||
|
||||
struct TTO_LangSys_ |
||||
{ |
||||
FT_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */ |
||||
FT_UShort ReqFeatureIndex; /* required FeatureIndex */ |
||||
FT_UShort FeatureCount; /* number of Feature indices */ |
||||
FT_UShort* FeatureIndex; /* array of Feature indices */ |
||||
}; |
||||
|
||||
typedef struct TTO_LangSys_ TTO_LangSys; |
||||
|
||||
|
||||
struct TTO_LangSysRecord_ |
||||
{ |
||||
FT_ULong LangSysTag; /* LangSysTag identifier */ |
||||
TTO_LangSys LangSys; /* LangSys table */ |
||||
}; |
||||
|
||||
typedef struct TTO_LangSysRecord_ TTO_LangSysRecord; |
||||
|
||||
|
||||
struct TTO_Script_ |
||||
{ |
||||
TTO_LangSys DefaultLangSys; /* DefaultLangSys table */ |
||||
FT_UShort LangSysCount; /* number of LangSysRecords */ |
||||
TTO_LangSysRecord* LangSysRecord; /* array of LangSysRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_Script_ TTO_Script; |
||||
|
||||
|
||||
struct TTO_ScriptRecord_ |
||||
{ |
||||
FT_ULong ScriptTag; /* ScriptTag identifier */ |
||||
TTO_Script Script; /* Script table */ |
||||
}; |
||||
|
||||
typedef struct TTO_ScriptRecord_ TTO_ScriptRecord; |
||||
|
||||
|
||||
struct TTO_ScriptList_ |
||||
{ |
||||
FT_UShort ScriptCount; /* number of ScriptRecords */ |
||||
TTO_ScriptRecord* ScriptRecord; /* array of ScriptRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_ScriptList_ TTO_ScriptList; |
||||
|
||||
|
||||
/* Feature list related structures */ |
||||
|
||||
struct TTO_Feature_ |
||||
{ |
||||
FT_UShort FeatureParams; /* always 0 for TT Open 1.0 */ |
||||
FT_UShort LookupListCount; /* number of LookupList indices */ |
||||
FT_UShort* LookupListIndex; /* array of LookupList indices */ |
||||
}; |
||||
|
||||
typedef struct TTO_Feature_ TTO_Feature; |
||||
|
||||
|
||||
struct TTO_FeatureRecord_ |
||||
{ |
||||
FT_ULong FeatureTag; /* FeatureTag identifier */ |
||||
TTO_Feature Feature; /* Feature table */ |
||||
}; |
||||
|
||||
typedef struct TTO_FeatureRecord_ TTO_FeatureRecord; |
||||
|
||||
|
||||
struct TTO_FeatureList_ |
||||
{ |
||||
FT_UShort FeatureCount; /* number of FeatureRecords */ |
||||
TTO_FeatureRecord* FeatureRecord; /* array of FeatureRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_FeatureList_ TTO_FeatureList; |
||||
|
||||
|
||||
/* Lookup list related structures */ |
||||
|
||||
struct TTO_SubTable_; /* defined below after inclusion
|
||||
of ftxgsub.h and ftxgpos.h */ |
||||
typedef struct TTO_SubTable_ TTO_SubTable; |
||||
|
||||
|
||||
struct TTO_Lookup_ |
||||
{ |
||||
FT_UShort LookupType; /* Lookup type */ |
||||
FT_UShort LookupFlag; /* Lookup qualifiers */ |
||||
FT_UShort SubTableCount; /* number of SubTables */ |
||||
TTO_SubTable* SubTable; /* array of SubTables */ |
||||
}; |
||||
|
||||
typedef struct TTO_Lookup_ TTO_Lookup; |
||||
|
||||
|
||||
/* The `Properties' field is not defined in the TTO specification but
|
||||
is needed for processing lookups. If properties[n] is > 0, the |
||||
functions TT_GSUB_Apply_String() resp. TT_GPOS_Apply_String() will |
||||
process Lookup[n] for glyphs which have the specific bit not set in |
||||
the `properties' field of the input string object. */ |
||||
|
||||
struct TTO_LookupList_ |
||||
{ |
||||
FT_UShort LookupCount; /* number of Lookups */ |
||||
TTO_Lookup* Lookup; /* array of Lookup records */ |
||||
FT_UShort* Properties; /* array of flags */ |
||||
}; |
||||
|
||||
typedef struct TTO_LookupList_ TTO_LookupList; |
||||
|
||||
|
||||
/* Possible LookupFlag bit masks. `IGNORE_SPECIAL_MARKS' comes from the
|
||||
OpenType 1.2 specification; RIGHT_TO_LEFT has been (re)introduced in |
||||
OpenType 1.3 -- if set, the last glyph in a cursive attachment |
||||
sequence has to be positioned on the baseline -- regardless of the |
||||
writing direction. */ |
||||
|
||||
#define RIGHT_TO_LEFT 0x0001 |
||||
#define IGNORE_BASE_GLYPHS 0x0002 |
||||
#define IGNORE_LIGATURES 0x0004 |
||||
#define IGNORE_MARKS 0x0008 |
||||
#define IGNORE_SPECIAL_MARKS 0xFF00 |
||||
|
||||
|
||||
struct TTO_CoverageFormat1_ |
||||
{ |
||||
FT_UShort GlyphCount; /* number of glyphs in GlyphArray */ |
||||
FT_UShort* GlyphArray; /* array of glyph IDs */ |
||||
}; |
||||
|
||||
typedef struct TTO_CoverageFormat1_ TTO_CoverageFormat1; |
||||
|
||||
|
||||
struct TTO_RangeRecord_ |
||||
{ |
||||
FT_UShort Start; /* first glyph ID in the range */ |
||||
FT_UShort End; /* last glyph ID in the range */ |
||||
FT_UShort StartCoverageIndex; /* coverage index of first
|
||||
glyph ID in the range */ |
||||
}; |
||||
|
||||
typedef struct TTO_RangeRecord_ TTO_RangeRecord; |
||||
|
||||
|
||||
struct TTO_CoverageFormat2_ |
||||
{ |
||||
FT_UShort RangeCount; /* number of RangeRecords */ |
||||
TTO_RangeRecord* RangeRecord; /* array of RangeRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_CoverageFormat2_ TTO_CoverageFormat2; |
||||
|
||||
|
||||
struct TTO_Coverage_ |
||||
{ |
||||
FT_UShort CoverageFormat; /* 1 or 2 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_CoverageFormat1 cf1; |
||||
TTO_CoverageFormat2 cf2; |
||||
} cf; |
||||
}; |
||||
|
||||
typedef struct TTO_Coverage_ TTO_Coverage; |
||||
|
||||
|
||||
struct TTO_ClassDefFormat1_ |
||||
{ |
||||
FT_UShort StartGlyph; /* first glyph ID of the
|
||||
ClassValueArray */ |
||||
FT_UShort GlyphCount; /* size of the ClassValueArray */ |
||||
FT_UShort* ClassValueArray; /* array of class values */ |
||||
}; |
||||
|
||||
typedef struct TTO_ClassDefFormat1_ TTO_ClassDefFormat1; |
||||
|
||||
|
||||
struct TTO_ClassRangeRecord_ |
||||
{ |
||||
FT_UShort Start; /* first glyph ID in the range */ |
||||
FT_UShort End; /* last glyph ID in the range */ |
||||
FT_UShort Class; /* applied to all glyphs in range */ |
||||
}; |
||||
|
||||
typedef struct TTO_ClassRangeRecord_ TTO_ClassRangeRecord; |
||||
|
||||
|
||||
struct TTO_ClassDefFormat2_ |
||||
{ |
||||
FT_UShort ClassRangeCount; |
||||
/* number of ClassRangeRecords */ |
||||
TTO_ClassRangeRecord* ClassRangeRecord; |
||||
/* array of ClassRangeRecords */ |
||||
}; |
||||
|
||||
typedef struct TTO_ClassDefFormat2_ TTO_ClassDefFormat2; |
||||
|
||||
|
||||
/* The `Defined' field is not defined in the TTO specification but
|
||||
apparently needed for processing fonts like trado.ttf: This font |
||||
refers to a class which contains not a single element. We map such |
||||
classes to class 0. */ |
||||
|
||||
struct TTO_ClassDefinition_ |
||||
{ |
||||
FT_Bool loaded; |
||||
|
||||
FT_Bool* Defined; /* array of Booleans.
|
||||
If Defined[n] is FALSE, |
||||
class n contains no glyphs. */ |
||||
FT_UShort ClassFormat; /* 1 or 2 */ |
||||
|
||||
union |
||||
{ |
||||
TTO_ClassDefFormat1 cd1; |
||||
TTO_ClassDefFormat2 cd2; |
||||
} cd; |
||||
}; |
||||
|
||||
typedef struct TTO_ClassDefinition_ TTO_ClassDefinition; |
||||
|
||||
|
||||
struct TTO_Device_ |
||||
{ |
||||
FT_UShort StartSize; /* smallest size to correct */ |
||||
FT_UShort EndSize; /* largest size to correct */ |
||||
FT_UShort DeltaFormat; /* DeltaValue array data format:
|
||||
1, 2, or 3 */ |
||||
FT_UShort* DeltaValue; /* array of compressed data */ |
||||
}; |
||||
|
||||
typedef struct TTO_Device_ TTO_Device; |
||||
|
||||
|
||||
#include "ftxgdef.h" |
||||
#include "ftxgsub.h" |
||||
#include "ftxgpos.h" |
||||
|
||||
|
||||
struct TTO_SubTable_ |
||||
{ |
||||
union |
||||
{ |
||||
TTO_GSUB_SubTable gsub; |
||||
TTO_GPOS_SubTable gpos; |
||||
} st; |
||||
}; |
||||
|
||||
|
||||
enum TTO_Type_ |
||||
{ |
||||
GSUB, |
||||
GPOS |
||||
}; |
||||
|
||||
typedef enum TTO_Type_ TTO_Type; |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* FTXOPEN_H */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,163 @@ |
||||
/*******************************************************************
|
||||
* |
||||
* ftxopenf.h |
||||
* |
||||
* internal TrueType Open functions |
||||
* |
||||
* Copyright 1996-2000 by |
||||
* David Turner, Robert Wilhelm, and Werner Lemberg. |
||||
* |
||||
* This file is part of the FreeType project, and may only be used |
||||
* modified and distributed under the terms of the FreeType project |
||||
* license, LICENSE.TXT. By continuing to use, modify, or distribute |
||||
* this file you indicate that you have read the license and |
||||
* understand and accept it fully. |
||||
* |
||||
******************************************************************/ |
||||
|
||||
#ifndef FTXOPENF_H |
||||
#define FTXOPENF_H |
||||
|
||||
#include "ftxopen.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* functions from ftxopen.c */ |
||||
|
||||
FT_Error Load_ScriptList( TTO_ScriptList* sl, |
||||
FT_Stream stream ); |
||||
FT_Error Load_FeatureList( TTO_FeatureList* fl, |
||||
FT_Stream input ); |
||||
FT_Error Load_LookupList( TTO_LookupList* ll, |
||||
FT_Stream input, |
||||
TTO_Type type ); |
||||
|
||||
FT_Error Load_Coverage( TTO_Coverage* c, |
||||
FT_Stream input ); |
||||
FT_Error Load_ClassDefinition( TTO_ClassDefinition* cd, |
||||
FT_UShort limit, |
||||
FT_Stream input ); |
||||
FT_Error Load_EmptyClassDefinition( TTO_ClassDefinition* cd, |
||||
FT_Stream input ); |
||||
FT_Error Load_Device( TTO_Device* d, |
||||
FT_Stream input ); |
||||
|
||||
void Free_ScriptList( TTO_ScriptList* sl,
|
||||
FT_Memory memory ); |
||||
void Free_FeatureList( TTO_FeatureList* fl, |
||||
FT_Memory memory ); |
||||
void Free_LookupList( TTO_LookupList* ll, |
||||
TTO_Type type, |
||||
FT_Memory memory ); |
||||
|
||||
void Free_Coverage( TTO_Coverage* c, |
||||
FT_Memory memory ); |
||||
void Free_ClassDefinition( TTO_ClassDefinition* cd, |
||||
FT_Memory memory ); |
||||
void Free_Device( TTO_Device* d, |
||||
FT_Memory memory ); |
||||
|
||||
|
||||
/* functions from ftxgsub.c */ |
||||
|
||||
FT_Error Load_SingleSubst( TTO_SingleSubst* ss, |
||||
FT_Stream input ); |
||||
FT_Error Load_MultipleSubst( TTO_MultipleSubst* ms, |
||||
FT_Stream input ); |
||||
FT_Error Load_AlternateSubst( TTO_AlternateSubst* as, |
||||
FT_Stream input ); |
||||
FT_Error Load_LigatureSubst( TTO_LigatureSubst* ls, |
||||
FT_Stream input ); |
||||
FT_Error Load_ContextSubst( TTO_ContextSubst* cs, |
||||
FT_Stream input ); |
||||
FT_Error Load_ChainContextSubst( TTO_ChainContextSubst* ccs, |
||||
FT_Stream input ); |
||||
|
||||
void Free_SingleSubst( TTO_SingleSubst* ss, |
||||
FT_Memory memory ); |
||||
void Free_MultipleSubst( TTO_MultipleSubst* ms, |
||||
FT_Memory memory ); |
||||
void Free_AlternateSubst( TTO_AlternateSubst* as, |
||||
FT_Memory memory ); |
||||
void Free_LigatureSubst( TTO_LigatureSubst* ls, |
||||
FT_Memory memory ); |
||||
void Free_ContextSubst( TTO_ContextSubst* cs, |
||||
FT_Memory memory ); |
||||
void Free_ChainContextSubst( TTO_ChainContextSubst* ccs, |
||||
FT_Memory memory ); |
||||
|
||||
|
||||
/* functions from ftxgpos.c */ |
||||
|
||||
FT_Error Load_SinglePos( TTO_SinglePos* sp, |
||||
FT_Stream input ); |
||||
FT_Error Load_PairPos( TTO_PairPos* pp, |
||||
FT_Stream input ); |
||||
FT_Error Load_CursivePos( TTO_CursivePos* cp, |
||||
FT_Stream input ); |
||||
FT_Error Load_MarkBasePos( TTO_MarkBasePos* mbp, |
||||
FT_Stream input ); |
||||
FT_Error Load_MarkLigPos( TTO_MarkLigPos* mlp, |
||||
FT_Stream input ); |
||||
FT_Error Load_MarkMarkPos( TTO_MarkMarkPos* mmp, |
||||
FT_Stream input ); |
||||
FT_Error Load_ContextPos( TTO_ContextPos* cp, |
||||
FT_Stream input ); |
||||
FT_Error Load_ChainContextPos( TTO_ChainContextPos* ccp, |
||||
FT_Stream input ); |
||||
|
||||
void Free_SinglePos( TTO_SinglePos* sp, |
||||
FT_Memory memory ); |
||||
void Free_PairPos( TTO_PairPos* pp, |
||||
FT_Memory memory ); |
||||
void Free_CursivePos( TTO_CursivePos* cp, |
||||
FT_Memory memory ); |
||||
void Free_MarkBasePos( TTO_MarkBasePos* mbp, |
||||
FT_Memory memory ); |
||||
void Free_MarkLigPos( TTO_MarkLigPos* mlp, |
||||
FT_Memory memory ); |
||||
void Free_MarkMarkPos( TTO_MarkMarkPos* mmp, |
||||
FT_Memory memory ); |
||||
void Free_ContextPos( TTO_ContextPos* cp, |
||||
FT_Memory memory ); |
||||
void Free_ChainContextPos( TTO_ChainContextPos* ccp, |
||||
FT_Memory memory ); |
||||
/* query functions */ |
||||
|
||||
FT_Error Coverage_Index( TTO_Coverage* c, |
||||
FT_UShort glyphID, |
||||
FT_UShort* index ); |
||||
FT_Error Get_Class( TTO_ClassDefinition* cd, |
||||
FT_UShort glyphID, |
||||
FT_UShort* class, |
||||
FT_UShort* index ); |
||||
FT_Error Get_Device( TTO_Device* d, |
||||
FT_UShort size, |
||||
FT_Short* value ); |
||||
|
||||
|
||||
/* functions from ftxgdef.c */ |
||||
|
||||
FT_Error Add_Glyph_Property( TTO_GDEFHeader* gdef, |
||||
FT_UShort glyphID, |
||||
FT_UShort property ); |
||||
|
||||
FT_Error Check_Property( TTO_GDEFHeader* gdef, |
||||
FT_UShort index, |
||||
FT_UShort flags, |
||||
FT_UShort* property ); |
||||
|
||||
#define CHECK_Property( gdef, index, flags, property ) \ |
||||
( ( error = Check_Property( (gdef), (index), (flags), \
|
||||
(property) ) ) != TT_Err_Ok ) |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* FTXOPENF_H */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,22 @@ |
||||
#
|
||||
# FreeType 2 GX module definition
|
||||
#
|
||||
|
||||
|
||||
# Copyright 1996-2000 by
|
||||
# David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
|
||||
|
||||
make_module_list: add_ot_driver |
||||
|
||||
add_ot_driver: |
||||
$(OPEN_DRIVER)ot_driver_class$(CLOSE_DRIVER)
|
||||
$(ECHO_DRIVER)ot $(ECHO_DRIVER_DESC)OpenType fonts$(ECHO_DRIVER_DONE)
|
||||
|
||||
# EOF
|
@ -0,0 +1,93 @@ |
||||
/* OTArray
|
||||
* |
||||
* Copyright (C) 2003 Red Hat. |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#include "ot-array.h" |
||||
#include FT_INTERNAL_MEMORY_H |
||||
#include FT_CONFIG_STANDARD_LIBRARY_H |
||||
|
||||
#define OT_REALLOC_ARRAY( _pointer_, _old_, _new_, eltsize ) \ |
||||
FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, \
|
||||
(_old_) * eltsize, \
|
||||
(_new_) * eltsize ) ) |
||||
|
||||
FT_LOCAL_DEF( OTArray * )
|
||||
OT_Array_New ( FT_UInt element_size, FT_Memory memory ) |
||||
{ |
||||
FT_Error error; |
||||
OTArray * array; |
||||
|
||||
if ( FT_NEW ( array ) ) |
||||
return NULL; |
||||
|
||||
array->data = NULL; |
||||
array->length = 0; |
||||
array->allocated = 0; |
||||
array->element_size = element_size; |
||||
array->memory = memory; |
||||
return OT_Array_Set_Size ( array, 4 ); |
||||
} |
||||
|
||||
FT_LOCAL_DEF( void )
|
||||
OT_Array_Free ( OTArray * array ) |
||||
{ |
||||
FT_Memory memory = array->memory; |
||||
FT_FREE( array->data ); |
||||
FT_FREE( array ); |
||||
} |
||||
|
||||
FT_LOCAL_DEF( OTArray * )
|
||||
OT_Array_Set_Size ( OTArray * array, FT_UInt length ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = array->memory; |
||||
|
||||
if ( length > array->allocated ) |
||||
{ |
||||
if ( OT_REALLOC_ARRAY(array->data, |
||||
array->allocated, |
||||
length, |
||||
array->element_size) ) |
||||
return NULL; |
||||
array->allocated = length; |
||||
} |
||||
array->length = length; |
||||
return array; |
||||
} |
||||
|
||||
FT_LOCAL_DEF( void ) |
||||
OT_Array_Sort ( OTArray * array, OT_Array_Comapre_Func func ) |
||||
{ |
||||
ft_qsort ( array->data, array->length, array->element_size, func ); |
||||
} |
||||
|
||||
FT_LOCAL_DEF( OTArray * ) |
||||
OT_Array_Append_Val ( OTArray * array, FT_Pointer newval ) |
||||
{ |
||||
FT_UInt index; |
||||
FT_Pointer dest; |
||||
|
||||
if ( !OT_Array_Set_Size( array, array->length + 1 ) ) |
||||
return NULL; |
||||
|
||||
index = array->length - 1; |
||||
dest = array->data + ( index * array->element_size ); |
||||
FT_MEM_COPY ( dest, newval, array->element_size ); |
||||
return array; |
||||
} |
@ -0,0 +1,50 @@ |
||||
/* OTArray
|
||||
* |
||||
* Copyright (C) 2003 Red Hat, Inc. |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#ifndef __OT_ARRAY_H__ |
||||
#define __OT_ARRAY_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef struct _OTArray OTArray;
|
||||
typedef FT_Int (*OT_Array_Comapre_Func) (const void * a, const void * b ); |
||||
|
||||
struct _OTArray |
||||
{ |
||||
FT_Char * data; |
||||
FT_UInt length; |
||||
FT_UInt element_size; |
||||
FT_UInt allocated; |
||||
FT_Memory memory; |
||||
}; |
||||
|
||||
FT_LOCAL( OTArray * ) OT_Array_New ( FT_UInt element_size, FT_Memory memory ); |
||||
FT_LOCAL( void ) OT_Array_Free ( OTArray * array ); |
||||
FT_LOCAL( OTArray * ) OT_Array_Set_Size ( OTArray * array, FT_UInt length ); |
||||
FT_LOCAL( void ) OT_Array_Sort ( OTArray * array, OT_Array_Comapre_Func func ); |
||||
FT_LOCAL( OTArray * ) OT_Array_Append_Val ( OTArray * array, FT_Pointer newval ); |
||||
#define OT_Array_Index(array, type, index) (((type*)((array)->data))[(index)]) |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __OT_ARRAY_H__ */ |
@ -0,0 +1,762 @@ |
||||
/*
|
||||
* ot-info.c: Store tables for OpenType |
||||
* |
||||
* Copyright (C) 2003 Red Hat K.K. |
||||
* Copyright (C) 2000 Red Hat Software |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#include "ot-info.h" |
||||
#include "ot-ruleset.h" |
||||
#include "ot-unicode.h" |
||||
#include "fterrcompat.h" |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_MODULE_H |
||||
|
||||
|
||||
#define noINFO_DEBUG_MEMORY |
||||
|
||||
enum |
||||
{ |
||||
INFO_LOADED_GDEF = 1 << 0, |
||||
INFO_LOADED_GSUB = 1 << 1, |
||||
INFO_LOADED_GPOS = 1 << 2 |
||||
}; |
||||
|
||||
|
||||
static FT_Error ot_table_check( FT_Face face ); |
||||
OTInfo * |
||||
ot_info_new ( FT_Face face ) |
||||
{ |
||||
FT_Error error; |
||||
OTInfo *info; |
||||
FT_Memory memory; |
||||
|
||||
if ( ot_table_check( face ) )
|
||||
return NULL; |
||||
|
||||
memory = FT_FACE_MEMORY( face ); |
||||
if ( FT_NEW ( info ) ) |
||||
return NULL; |
||||
|
||||
ot_info_setup (info); |
||||
|
||||
return info; |
||||
} |
||||
|
||||
static FT_Error |
||||
ot_table_check( FT_Face face ) |
||||
{ |
||||
FT_Stream stream = face->stream; |
||||
TT_Face tt_face = (TT_Face)face; |
||||
|
||||
FT_Error error_gdef, error_gpos, error_gsub; |
||||
|
||||
error_gdef = tt_face->goto_table( tt_face, TTAG_GDEF, stream, 0 ); |
||||
error_gsub = tt_face->goto_table( tt_face, TTAG_GSUB, stream, 0 ); |
||||
error_gpos = tt_face->goto_table( tt_face, TTAG_GPOS, stream, 0 ); |
||||
|
||||
if ( (!error_gdef) || (!error_gsub) || (!error_gpos) ) |
||||
return FT_Err_Ok; |
||||
else |
||||
return OT_Err_Unknown_File_Format; |
||||
} |
||||
|
||||
OTInfo * |
||||
ot_info_delete (OTInfo *info) |
||||
{ |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
if (info) { |
||||
ot_info_release (info); |
||||
FT_FREE( info ); |
||||
} |
||||
|
||||
return NULL; |
||||
} |
||||
|
||||
OTInfo * |
||||
ot_info_ref (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL ); |
||||
FT_ASSERT (info->refcount > 0); |
||||
|
||||
info->refcount += 1; |
||||
|
||||
return info; |
||||
} |
||||
|
||||
OTInfo * |
||||
ot_info_unref (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL); |
||||
FT_ASSERT (info->refcount > 0); |
||||
|
||||
info->refcount -= 1; |
||||
|
||||
if (info->refcount == 0) { |
||||
ot_info_delete (info); |
||||
return NULL; |
||||
} |
||||
|
||||
return info; |
||||
} |
||||
|
||||
#ifdef INFO_DEBUG_MEMORY |
||||
static int ot_info_count = 0; |
||||
#endif |
||||
|
||||
OTInfo * |
||||
ot_info_setup (OTInfo *info) |
||||
{ |
||||
|
||||
#ifdef INFO_DEBUG_MEMORY |
||||
ot_info_count++; |
||||
FT_Message ("ot_info_setup: %d\n", ot_info_count); |
||||
#endif |
||||
info->refcount = 1; |
||||
|
||||
info->gsub = NULL; |
||||
info->gdef = NULL; |
||||
info->gpos = NULL; |
||||
info->ruleset = NULL; |
||||
|
||||
return info; |
||||
} |
||||
|
||||
OTInfo * |
||||
ot_info_release (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL); |
||||
|
||||
#ifdef INFO_DEBUG_MEMORY |
||||
ot_info_count--; |
||||
FT_Message ("ot_info_release: %d\n", ot_info_count); |
||||
#endif |
||||
if (info->gdef) |
||||
{ |
||||
TT_Done_GDEF_Table (info->gdef); |
||||
info->gdef = NULL; |
||||
} |
||||
if (info->gsub) |
||||
{ |
||||
TT_Done_GSUB_Table (info->gsub); |
||||
info->gsub = NULL; |
||||
} |
||||
if (info->gpos) |
||||
{ |
||||
TT_Done_GPOS_Table (info->gpos); |
||||
info->gpos = NULL; |
||||
} |
||||
|
||||
if (info->ruleset) |
||||
{ |
||||
ot_ruleset_delete (info->ruleset); |
||||
info->ruleset = NULL; |
||||
} |
||||
return info; |
||||
} |
||||
|
||||
/* static int info_count = 0; */ |
||||
void |
||||
ot_info_finalizer (void *object) |
||||
{ |
||||
FT_Face face = object;
|
||||
OTInfo *info = face->generic.data; |
||||
|
||||
ot_info_unref (info); |
||||
info->face = NULL; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_get_ruleset |
||||
* |
||||
* @returns: the #OTRulset for @info. This object will |
||||
* have the same lifetime as OTInfo. |
||||
*
|
||||
* Returns the #OTRuleset structure for the info. |
||||
*/ |
||||
OTRuleset * |
||||
ot_info_get_ruleset (OTInfo *info) |
||||
{ |
||||
if (! info->ruleset) { |
||||
info->ruleset = ot_ruleset_new (info); |
||||
} |
||||
|
||||
return info->ruleset; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_get: |
||||
* @face: a #FT_Face. |
||||
* @returns: the #OTInfo for @face. This object will |
||||
* have the same lifetime as FT_Face. |
||||
*
|
||||
* Returns the #OTInfo structure for the given FreeType font. |
||||
* |
||||
* Since: 1.2 |
||||
**/ |
||||
OTInfo * |
||||
ot_info_get (FT_Face face) |
||||
{ |
||||
OTInfo *info; |
||||
|
||||
if (face->generic.data) |
||||
return face->generic.data; |
||||
else |
||||
{ |
||||
info = ot_info_new ( face ); |
||||
if ( info ) { |
||||
face->generic.data = info; |
||||
face->generic.finalizer = ot_info_finalizer; |
||||
info->face = face; |
||||
} |
||||
} |
||||
|
||||
return info; |
||||
} |
||||
|
||||
/* There must be be a better way to do this
|
||||
*/ |
||||
static FT_Bool |
||||
is_truetype (FT_Face face) |
||||
{ |
||||
return (
|
||||
(strcmp (FT_MODULE_CLASS (face->driver)->module_name, "truetype") == 0) |
||||
|| (strcmp (FT_MODULE_CLASS (face->driver)->module_name, "ot") == 0) |
||||
); |
||||
} |
||||
|
||||
typedef struct _GlyphInfo GlyphInfo; |
||||
|
||||
struct _GlyphInfo { |
||||
FT_UShort glyph; |
||||
FT_UShort class; |
||||
}; |
||||
|
||||
static int |
||||
compare_glyph_info (const void * a, |
||||
const void * b) |
||||
{ |
||||
const GlyphInfo *info_a = a; |
||||
const GlyphInfo *info_b = b; |
||||
|
||||
return (info_a->glyph < info_b->glyph) ? -1 : |
||||
(info_a->glyph == info_b->glyph) ? 0 : 1; |
||||
} |
||||
|
||||
/* Make a guess at the appropriate class for a glyph given
|
||||
* a character code that maps to the glyph |
||||
*/ |
||||
|
||||
static FT_Bool |
||||
set_unicode_charmap (FT_Face face) |
||||
{ |
||||
int charmap; |
||||
|
||||
for (charmap = 0; charmap < face->num_charmaps; charmap++) |
||||
if (face->charmaps[charmap]->encoding == ft_encoding_unicode) |
||||
{ |
||||
FT_Error error = FT_Set_Charmap(face, face->charmaps[charmap]); |
||||
return error == FT_Err_Ok; |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
/* Synthesize a GDEF table using the font's charmap and the
|
||||
* unicode property database. We'll fill in class definitions |
||||
* for glyphs not in the charmap as we walk through the tables. |
||||
*/ |
||||
static void |
||||
synthesize_class_def (OTInfo *info) |
||||
{ |
||||
OTArray *glyph_infos; |
||||
FT_UShort *glyph_indices; |
||||
FT_UShort *classes; |
||||
FT_ULong charcode; |
||||
FT_UInt glyph; |
||||
int i, j; |
||||
FT_CharMap old_charmap; |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
|
||||
old_charmap = info->face->charmap; |
||||
|
||||
if (!old_charmap || !old_charmap->encoding != ft_encoding_unicode) |
||||
if (!set_unicode_charmap (info->face)) |
||||
return; |
||||
|
||||
glyph_infos = OT_Array_New ( sizeof (GlyphInfo), memory ); |
||||
|
||||
/* Collect all the glyphs in the charmap, and guess
|
||||
* the appropriate classes for them |
||||
*/ |
||||
charcode = FT_Get_First_Char (info->face, &glyph); |
||||
while (glyph != 0) |
||||
{ |
||||
GlyphInfo glyph_info; |
||||
|
||||
if (glyph <= 65535) |
||||
{ |
||||
glyph_info.glyph = glyph; |
||||
glyph_info.class = ot_get_glyph_class (charcode); |
||||
|
||||
OT_Array_Append_Val ( glyph_infos, &glyph_info ); |
||||
} |
||||
|
||||
charcode = FT_Get_Next_Char (info->face, charcode, &glyph); |
||||
} |
||||
|
||||
/* Sort and remove duplicates
|
||||
*/ |
||||
OT_Array_Sort ( glyph_infos, compare_glyph_info ); |
||||
FT_ALLOC_ARRAY( glyph_indices, glyph_infos->length, FT_UShort ); |
||||
FT_ALLOC_ARRAY( classes, glyph_infos->length, FT_UShort ); |
||||
|
||||
for (i = 0, j = 0; i < glyph_infos->length; i++) |
||||
{ |
||||
GlyphInfo *info = &OT_Array_Index (glyph_infos, GlyphInfo, i); |
||||
|
||||
if (j == 0 || info->glyph != glyph_indices[j - 1]) |
||||
{ |
||||
glyph_indices[j] = info->glyph; |
||||
classes[j] = info->class; |
||||
|
||||
j++; |
||||
} |
||||
} |
||||
|
||||
OT_Array_Free ( glyph_infos ); |
||||
|
||||
TT_GDEF_Build_ClassDefinition (info->gdef, info->face->num_glyphs, j, |
||||
glyph_indices, classes); |
||||
FT_FREE( glyph_indices ); |
||||
FT_FREE( classes ); |
||||
|
||||
if (old_charmap && info->face->charmap != old_charmap) |
||||
FT_Set_Charmap (info->face, old_charmap); |
||||
} |
||||
|
||||
TTO_GDEF
|
||||
ot_info_get_gdef (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!(info->loaded & INFO_LOADED_GDEF)) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
info->loaded |= INFO_LOADED_GDEF; |
||||
|
||||
if (is_truetype (info->face)) |
||||
{ |
||||
error = TT_Load_GDEF_Table (info->face, &info->gdef); |
||||
|
||||
if (error && error != TT_Err_Table_Missing) |
||||
FT_ERROR (("Error loading GDEF table %d", error)); |
||||
|
||||
if (!info->gdef) |
||||
error = TT_New_GDEF_Table (info->face, &info->gdef); |
||||
|
||||
if (info->gdef && !info->gdef->GlyphClassDef.loaded) |
||||
synthesize_class_def (info); |
||||
} |
||||
} |
||||
|
||||
return info->gdef; |
||||
} |
||||
|
||||
TTO_GSUB |
||||
ot_info_get_gsub (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!(info->loaded & INFO_LOADED_GSUB)) |
||||
{ |
||||
FT_Error error; |
||||
TTO_GDEF gdef = ot_info_get_gdef (info); |
||||
|
||||
info->loaded |= INFO_LOADED_GSUB; |
||||
|
||||
if (is_truetype (info->face)) |
||||
{ |
||||
error = TT_Load_GSUB_Table (info->face, &info->gsub, gdef); |
||||
|
||||
if (error && error != TT_Err_Table_Missing) |
||||
FT_ERROR (("Error loading GSUB table %d", error)); |
||||
} |
||||
} |
||||
|
||||
return info->gsub; |
||||
} |
||||
|
||||
TTO_GPOS |
||||
ot_info_get_gpos (OTInfo *info) |
||||
{ |
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!(info->loaded & INFO_LOADED_GPOS)) |
||||
{ |
||||
FT_Error error; |
||||
TTO_GDEF gdef = ot_info_get_gdef (info); |
||||
|
||||
info->loaded |= INFO_LOADED_GPOS; |
||||
|
||||
if (is_truetype (info->face)) |
||||
{ |
||||
error = TT_Load_GPOS_Table (info->face, &info->gpos, gdef); |
||||
|
||||
if (error && error != TT_Err_Table_Missing) |
||||
FT_ERROR (("Error loading GPOS table %d", error)); |
||||
} |
||||
} |
||||
|
||||
return info->gpos; |
||||
} |
||||
|
||||
static FT_Bool |
||||
get_tables (OTInfo *info, |
||||
OTTableType table_type, |
||||
TTO_ScriptList **script_list, |
||||
TTO_FeatureList **feature_list) |
||||
{ |
||||
if (table_type == OT_TABLE_GSUB) |
||||
{ |
||||
TTO_GSUB gsub = ot_info_get_gsub (info); |
||||
|
||||
if (!gsub) |
||||
return FALSE; |
||||
else |
||||
{ |
||||
if (script_list) |
||||
*script_list = &gsub->ScriptList; |
||||
if (feature_list) |
||||
*feature_list = &gsub->FeatureList; |
||||
return TRUE; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
TTO_GPOS gpos = ot_info_get_gpos (info); |
||||
|
||||
if (!gpos) |
||||
return FALSE; |
||||
else |
||||
{ |
||||
if (script_list) |
||||
*script_list = &gpos->ScriptList; |
||||
if (feature_list) |
||||
*feature_list = &gpos->FeatureList; |
||||
return TRUE; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_find_script: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @script_tag: the tag of the script to find. |
||||
* @script_index: location to store the index of the script, or %NULL. |
||||
* @returns: %TRUE if the script was found. |
||||
*
|
||||
* Finds the index of a script. |
||||
**/ |
||||
FT_Bool
|
||||
ot_info_find_script (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag script_tag, |
||||
FT_UInt *script_index) |
||||
{ |
||||
TTO_ScriptList *script_list; |
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, NULL)) |
||||
return FALSE; |
||||
|
||||
for (i=0; i < script_list->ScriptCount; i++) |
||||
{ |
||||
if (script_list->ScriptRecord[i].ScriptTag == script_tag) |
||||
{ |
||||
if (script_index) |
||||
*script_index = i; |
||||
|
||||
return TRUE; |
||||
} |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_find_language: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @script_index: the index of the script whose languages are searched. |
||||
* @language_tag: the tag of the language to find. |
||||
* @language_index: location to store the index of the language, or %NULL. |
||||
* @required_feature_index: location to store the required feature index of
|
||||
* the language, or %NULL. |
||||
* @returns: %TRUE if the language was found. |
||||
*
|
||||
* Finds the index of a language and its required feature index.
|
||||
**/ |
||||
FT_Bool |
||||
ot_info_find_language (OTInfo *info, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag, |
||||
FT_UInt *language_index, |
||||
FT_UInt *required_feature_index) |
||||
{ |
||||
TTO_ScriptList *script_list; |
||||
TTO_Script *script; |
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, NULL)) |
||||
return FALSE; |
||||
|
||||
FT_ASSERT (script_index < script_list->ScriptCount); |
||||
|
||||
script = &script_list->ScriptRecord[script_index].Script; |
||||
|
||||
for (i = 0; i < script->LangSysCount; i++) |
||||
{ |
||||
if (script->LangSysRecord[i].LangSysTag == language_tag) |
||||
{ |
||||
if (language_index) |
||||
*language_index = i; |
||||
if (required_feature_index) |
||||
*required_feature_index = script->LangSysRecord[i].LangSys.ReqFeatureIndex; |
||||
return TRUE; |
||||
} |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_find_feature: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @feature_tag: the tag of the feature to find. |
||||
* @script_index: the index of the script. |
||||
* @language_index: the index of the language whose features are searched, |
||||
* or 0xffff to use the default language of the script. |
||||
* @feature_index: location to store the index of the feature, or %NULL.
|
||||
* @returns: %TRUE if the feature was found. |
||||
*
|
||||
* Finds the index of a feature. |
||||
**/ |
||||
FT_Bool |
||||
ot_info_find_feature (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag feature_tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index, |
||||
FT_UInt *feature_index) |
||||
{ |
||||
TTO_ScriptList *script_list; |
||||
TTO_FeatureList *feature_list; |
||||
TTO_Script *script; |
||||
TTO_LangSys *lang_sys; |
||||
|
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, &feature_list)) |
||||
return FALSE; |
||||
|
||||
FT_ASSERT (script_index < script_list->ScriptCount); |
||||
|
||||
script = &script_list->ScriptRecord[script_index].Script; |
||||
|
||||
if (language_index == 0xffff) |
||||
lang_sys = &script->DefaultLangSys; |
||||
else |
||||
{ |
||||
FT_ASSERT (language_index < script->LangSysCount); |
||||
lang_sys = &script->LangSysRecord[language_index].LangSys; |
||||
} |
||||
|
||||
for (i = 0; i < lang_sys->FeatureCount; i++) |
||||
{ |
||||
FT_UShort index = lang_sys->FeatureIndex[i]; |
||||
|
||||
if (feature_list->FeatureRecord[index].FeatureTag == feature_tag) |
||||
{ |
||||
if (feature_index) |
||||
*feature_index = index; |
||||
|
||||
return TRUE; |
||||
} |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_list_scripts: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @returns: a newly-allocated array containing the tags of the |
||||
* available scripts. |
||||
* |
||||
* Obtains the list of available scripts.
|
||||
**/ |
||||
OTTag * |
||||
ot_info_list_scripts (OTInfo *info, |
||||
OTTableType table_type) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
OTTag *result; |
||||
TTO_ScriptList *script_list; |
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, NULL)) |
||||
return NULL; |
||||
if ( FT_ALLOC_ARRAY ( result,
|
||||
script_list->ScriptCount + 1,
|
||||
OTTag ) ) |
||||
return NULL; |
||||
|
||||
for (i=0; i < script_list->ScriptCount; i++) |
||||
result[i] = script_list->ScriptRecord[i].ScriptTag; |
||||
|
||||
result[i] = 0; |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_list_languages: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @script_index: the index of the script to list languages for. |
||||
* @language_tag: unused parameter. |
||||
* @returns: a newly-allocated array containing the tags of the |
||||
* available languages. |
||||
*
|
||||
* Obtains the list of available languages for a given script. |
||||
**/
|
||||
OTTag * |
||||
ot_info_list_languages (OTInfo *info, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
OTTag *result; |
||||
TTO_ScriptList *script_list; |
||||
TTO_Script *script; |
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, NULL)) |
||||
return NULL; |
||||
|
||||
FT_ASSERT (script_index < script_list->ScriptCount); |
||||
|
||||
script = &script_list->ScriptRecord[script_index].Script; |
||||
|
||||
if ( FT_ALLOC_ARRAY ( result,
|
||||
script->LangSysCount + 1,
|
||||
OTTag ) ) |
||||
return NULL; |
||||
|
||||
for (i = 0; i < script->LangSysCount; i++) |
||||
result[i] = script->LangSysRecord[i].LangSysTag; |
||||
|
||||
result[i] = 0; |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/**
|
||||
* ot_info_list_features: |
||||
* @info: a #OTInfo. |
||||
* @table_type: the table type to obtain information about. |
||||
* @tag: unused parameter. |
||||
* @script_index: the index of the script to obtain information about.
|
||||
* @language_index: the indes of the language to list features for, or |
||||
* 0xffff, to list features for the default language of the script. |
||||
* @returns: a newly-allocated array containing the tags of the available |
||||
* features.
|
||||
* |
||||
* Obtains the list of features for the given language of the given script. |
||||
**/ |
||||
OTTag * |
||||
ot_info_list_features (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
OTTag *result; |
||||
|
||||
TTO_ScriptList *script_list; |
||||
TTO_FeatureList *feature_list; |
||||
TTO_Script *script; |
||||
TTO_LangSys *lang_sys; |
||||
|
||||
int i; |
||||
|
||||
FT_ASSERT (info != NULL); |
||||
|
||||
if (!get_tables (info, table_type, &script_list, &feature_list)) |
||||
return NULL; |
||||
|
||||
FT_ASSERT (script_index < script_list->ScriptCount); |
||||
|
||||
script = &script_list->ScriptRecord[script_index].Script; |
||||
|
||||
if (language_index == 0xffff) |
||||
lang_sys = &script->DefaultLangSys; |
||||
else |
||||
{ |
||||
FT_ASSERT (language_index < script->LangSysCount); |
||||
lang_sys = &script->LangSysRecord[language_index].LangSys; |
||||
} |
||||
|
||||
if ( FT_ALLOC_ARRAY ( result,
|
||||
lang_sys->FeatureCount + 1, |
||||
OTTag ) ) |
||||
return NULL; |
||||
|
||||
for (i = 0; i < lang_sys->FeatureCount; i++) |
||||
{ |
||||
FT_UShort index = lang_sys->FeatureIndex[i]; |
||||
|
||||
result[i] = feature_list->FeatureRecord[index].FeatureTag; |
||||
} |
||||
|
||||
result[i] = 0; |
||||
|
||||
return result; |
||||
} |
@ -0,0 +1,103 @@ |
||||
/* OTInfo
|
||||
* |
||||
* Copyright (C) 2000 Red Hat Software |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#ifndef __OT_INFO_H__ |
||||
#define __OT_INFO_H__ |
||||
|
||||
#include "ftxopen.h" |
||||
#include "ot-types.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif /* __cplusplus */ |
||||
|
||||
|
||||
struct _OTInfo |
||||
{ |
||||
FT_Int refcount; |
||||
|
||||
FT_UInt loaded; |
||||
|
||||
FT_Face face; |
||||
|
||||
TTO_GSUB gsub; |
||||
TTO_GDEF gdef; |
||||
TTO_GPOS gpos; |
||||
|
||||
OTRuleset *ruleset; |
||||
}; |
||||
|
||||
/* Don't use these directly */ |
||||
|
||||
OTInfo *ot_info_new ( FT_Face face ); |
||||
OTInfo *ot_info_delete (OTInfo *info); |
||||
|
||||
OTInfo *ot_info_ref (OTInfo *info); |
||||
OTInfo *ot_info_unref (OTInfo *info); |
||||
|
||||
OTInfo *ot_info_setup (OTInfo *info); |
||||
OTInfo *ot_info_release (OTInfo *info); |
||||
|
||||
/* Member access */ |
||||
|
||||
TTO_GDEF ot_info_get_gdef (OTInfo *info); |
||||
TTO_GSUB ot_info_get_gsub (OTInfo *info); |
||||
TTO_GPOS ot_info_get_gpos (OTInfo *info); |
||||
|
||||
OTRuleset *ot_info_get_ruleset (OTInfo *info); |
||||
|
||||
OTInfo *ot_info_get (FT_Face face); |
||||
|
||||
FT_Bool ot_info_find_script (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag script_tag, |
||||
FT_UInt *script_index); |
||||
FT_Bool ot_info_find_language (OTInfo *info, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag, |
||||
FT_UInt *language_index, |
||||
FT_UInt *required_feature_index); |
||||
FT_Bool ot_info_find_feature (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag feature_tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index, |
||||
FT_UInt *feature_index); |
||||
|
||||
OTTag *ot_info_list_scripts (OTInfo *info, |
||||
OTTableType table_type); |
||||
OTTag *ot_info_list_languages (OTInfo *info, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag); |
||||
OTTag *ot_info_list_features (OTInfo *info, |
||||
OTTableType table_type, |
||||
OTTag tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif /* __cplusplus */ |
||||
|
||||
|
||||
#endif /* __OT_INFO_H__ */ |
@ -0,0 +1,312 @@ |
||||
/*
|
||||
* ot-ruleset.c: Shaping using OpenType features |
||||
* |
||||
* Copyright (C) 2000 Red Hat Software |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#include "ot-ruleset.h" |
||||
#include "ot-info.h" |
||||
|
||||
#define noRULESET_DEBUG_MEMORY |
||||
|
||||
#include FT_INTERNAL_MEMORY_H /* For FT_Free() */ |
||||
|
||||
#define OT_SCALE_26_6 (OT_SCALE / (1<<6)) |
||||
#define OT_UNITS_26_6(d) (OT_SCALE_26_6 * (d)) |
||||
|
||||
typedef struct _OTRule OTRule; |
||||
|
||||
struct _OTRule { |
||||
FT_ULong property_bit; |
||||
FT_UShort feature_index; |
||||
FT_UInt table_type : 1; |
||||
}; |
||||
|
||||
OTRuleset * |
||||
ot_ruleset_new (OTInfo *info) |
||||
{ |
||||
OTRuleset *ruleset; |
||||
|
||||
ruleset = malloc (sizeof (OTRuleset)); |
||||
|
||||
ot_ruleset_setup (ruleset, info); |
||||
|
||||
return ruleset; |
||||
} |
||||
|
||||
OTRuleset * |
||||
ot_ruleset_delete (OTRuleset *ruleset) |
||||
{ |
||||
if (ruleset) { |
||||
ot_ruleset_release (ruleset); |
||||
free (ruleset); |
||||
} |
||||
|
||||
return NULL; |
||||
} |
||||
|
||||
#ifdef RULESET_DEBUG_MEMORY |
||||
static ot_ruleset_count = 0; |
||||
#endif |
||||
|
||||
OTRuleset * |
||||
ot_ruleset_setup (OTRuleset *ruleset, OTInfo *info) |
||||
{ |
||||
FT_Memory memory = FT_FACE_MEMORY( info->face ); |
||||
FT_ASSERT (ruleset != NULL); |
||||
|
||||
#ifdef RULESET_DEBUG_MEMORY |
||||
ot_ruleset_count++; |
||||
FT_Message("ot_ruleset_setup: %d\n", ot_ruleset_count); |
||||
#endif |
||||
ruleset->info = info; |
||||
|
||||
ruleset->rules = OT_Array_New ( sizeof (OTRule), memory ); |
||||
|
||||
return ruleset; |
||||
} |
||||
|
||||
OTRuleset * |
||||
ot_ruleset_release (OTRuleset *ruleset) |
||||
{ |
||||
#ifdef RULESET_DEBUG_MEMORY |
||||
ot_ruleset_count--; |
||||
FT_Message("ot_ruleset_release: %d\n", ot_ruleset_count); |
||||
#endif |
||||
if (ruleset->rules) { |
||||
OT_Array_Free ( ruleset->rules ); |
||||
ruleset->rules = NULL; |
||||
} |
||||
|
||||
if (ruleset->info) { |
||||
ruleset->info = NULL; |
||||
} |
||||
|
||||
return NULL; |
||||
} |
||||
|
||||
void |
||||
ot_ruleset_copy ( OTRuleset * from, OTRuleset * to ) |
||||
{ |
||||
OTArray *from_array; |
||||
OTArray *to_array; |
||||
FT_UInt from_length; |
||||
FT_UInt i; |
||||
|
||||
to->info = from->info; |
||||
from_array = from->rules; |
||||
from_length = from_array->length; |
||||
to_array = to->rules; |
||||
OT_Array_Set_Size( to_array, from_length ); |
||||
for ( i = 0; i < from_length; i++ ) |
||||
OT_Array_Index(to_array, OTRule, i) = OT_Array_Index(from_array, OTRule, i); |
||||
} |
||||
|
||||
/**
|
||||
* ot_ruleset_add_feature: |
||||
* @ruleset: a #OTRuleset. |
||||
* @table_type: the table type to add a feature to. |
||||
* @feature_index: the index of the feature to add. |
||||
* @property_bit: the property bit to use for this feature.
|
||||
* |
||||
* Adds a feature to the ruleset. See ot_ruleset_shape() |
||||
* for an explanation of @property_bit. |
||||
**/ |
||||
void |
||||
ot_ruleset_add_feature (OTRuleset *ruleset, OTTableType table_type, FT_UInt feature_index, FT_ULong property_bit) |
||||
{ |
||||
OTRule tmp_rule; |
||||
|
||||
FT_ASSERT (ruleset != NULL); |
||||
|
||||
tmp_rule.table_type = table_type; |
||||
tmp_rule.feature_index = feature_index; |
||||
tmp_rule.property_bit = property_bit; |
||||
|
||||
OT_Array_Append_Val (ruleset->rules, &tmp_rule); |
||||
} |
||||
|
||||
/**
|
||||
* ot_ruleset_shape: |
||||
* @ruleset: a #OTRuleset. |
||||
* @glyphs: a pointer to a #OTGlyphString. |
||||
* |
||||
* Shapes a string of glyphs with the given properties according to @ruleset. |
||||
**/ |
||||
OTGlyphString * |
||||
ot_ruleset_shape ( OTRuleset *ruleset, OTGlyphString *glyphs ) |
||||
{
|
||||
FT_Error error; |
||||
int i; |
||||
int last_cluster; |
||||
int result; |
||||
|
||||
TTO_GSUB gsub = NULL; |
||||
TTO_GPOS gpos = NULL; |
||||
|
||||
TTO_GSUB_String *in_string = NULL; |
||||
TTO_GSUB_String *out_string = NULL; |
||||
TTO_GSUB_String *result_string = NULL; |
||||
|
||||
FT_Bool need_gsub = 0; |
||||
FT_Bool need_gpos = 0; |
||||
|
||||
FT_ASSERT (ruleset != NULL); |
||||
|
||||
for (i = 0; i < ruleset->rules->length; i++) |
||||
{ |
||||
OTRule *rule = &OT_Array_Index (ruleset->rules, OTRule, i); |
||||
|
||||
if (rule->table_type == OT_TABLE_GSUB) |
||||
need_gsub = 1; |
||||
else
|
||||
need_gpos = 1; |
||||
} |
||||
|
||||
if (need_gsub) |
||||
{ |
||||
gsub = ot_info_get_gsub (ruleset->info); |
||||
|
||||
if (gsub) |
||||
TT_GSUB_Clear_Features (gsub); |
||||
} |
||||
|
||||
if (need_gpos) |
||||
{ |
||||
gpos = ot_info_get_gpos (ruleset->info); |
||||
|
||||
if (gpos) |
||||
TT_GPOS_Clear_Features (gpos); |
||||
} |
||||
|
||||
for (i = 0; i < ruleset->rules->length; i++) |
||||
{ |
||||
OTRule *rule = &OT_Array_Index (ruleset->rules, OTRule, i); |
||||
|
||||
if (rule->table_type == OT_TABLE_GSUB) |
||||
{ |
||||
if (gsub) |
||||
TT_GSUB_Add_Feature (gsub, rule->feature_index, rule->property_bit); |
||||
} |
||||
else |
||||
{ |
||||
if (gpos) |
||||
TT_GPOS_Add_Feature (gpos, rule->feature_index, rule->property_bit); |
||||
} |
||||
} |
||||
|
||||
if (!gsub && !gpos) |
||||
return glyphs; |
||||
|
||||
result = TT_GSUB_String_New (ruleset->info->face->memory, &in_string); |
||||
FT_ASSERT (result == FT_Err_Ok); |
||||
|
||||
result = TT_GSUB_String_Set_Length (in_string, glyphs->length); |
||||
FT_ASSERT (result == FT_Err_Ok); |
||||
|
||||
for (i = 0; i < glyphs->length; i++) |
||||
{ |
||||
in_string->string[i] = glyphs->glyphs[i].gid; |
||||
in_string->properties[i] = glyphs->glyphs[i].ot_prop; |
||||
#if 0 |
||||
in_string->logClusters[i] = glyphs->log_clusters[i]; |
||||
#endif |
||||
} |
||||
in_string->max_ligID = i; |
||||
|
||||
if (gsub) |
||||
{ |
||||
result = TT_GSUB_String_New (ruleset->info->face->memory, |
||||
&out_string); |
||||
FT_ASSERT (result == FT_Err_Ok); |
||||
result_string = out_string; |
||||
|
||||
TT_GSUB_Apply_String (gsub, in_string, out_string); |
||||
} |
||||
else |
||||
result_string = in_string; |
||||
|
||||
#if 0 /* TODO: implement this using nr-glyphs */
|
||||
if (gpos) |
||||
{ |
||||
TTO_GPOS_Data *outgpos = NULL; |
||||
|
||||
if (!TT_GPOS_Apply_String (ruleset->info->face, gpos, 0, result_string, &outgpos, |
||||
FALSE /* enable device-dependant values */, |
||||
FALSE /* Even though this might be r2l text, RTL is handled elsewhere */)) |
||||
{ |
||||
for (i = 0; i < result_string->length; i++) |
||||
{ |
||||
FT_Pos x_pos = outgpos[i].x_pos; |
||||
FT_Pos y_pos = outgpos[i].y_pos; |
||||
int back = i; |
||||
int j; |
||||
|
||||
while (outgpos[back].back != 0) |
||||
{ |
||||
back -= outgpos[back].back; |
||||
x_pos += outgpos[back].x_pos; |
||||
y_pos += outgpos[back].y_pos; |
||||
} |
||||
|
||||
for (j = back; j < i; j++) |
||||
glyphs->glyphs[i].geometry.x_offset -= glyphs->glyphs[j].geometry.width; |
||||
|
||||
glyphs->glyphs[i].geometry.x_offset += OT_UNITS_26_6(x_pos); |
||||
glyphs->glyphs[i].geometry.y_offset += OT_UNITS_26_6(y_pos); |
||||
|
||||
if (outgpos[i].new_advance) |
||||
glyphs->glyphs[i].geometry.width = OT_UNITS_26_6(outgpos[i].x_advance); |
||||
else |
||||
glyphs->glyphs[i].geometry.width += OT_UNITS_26_6(outgpos[i].x_advance); |
||||
} |
||||
|
||||
FT_Free(gpos->memory, (void *)outgpos); |
||||
} |
||||
} |
||||
#endif |
||||
|
||||
if (glyphs->length != result_string->length) |
||||
{ |
||||
if (( error = FTL_Set_Glyphs_Array_Length( glyphs, result_string->length ) )) |
||||
return glyphs; |
||||
} |
||||
|
||||
last_cluster = -1; |
||||
for (i = 0; i < result_string->length; i++) |
||||
{ |
||||
glyphs->glyphs[i].gid = result_string->string[i]; |
||||
/* TODO: Other fields */ |
||||
#if 0 /* TODO: */
|
||||
glyphs->log_clusters[i] = result_string->logClusters[i]; |
||||
if (glyphs->log_clusters[i] != last_cluster) |
||||
glyphs->glyphs[i].attr.is_cluster_start = 1; |
||||
else |
||||
glyphs->glyphs[i].attr.is_cluster_start = 0; |
||||
|
||||
last_cluster = glyphs->log_clusters[i]; |
||||
#endif |
||||
} |
||||
|
||||
if (in_string) |
||||
TT_GSUB_String_Done (in_string); |
||||
if (out_string) |
||||
TT_GSUB_String_Done (out_string); |
||||
|
||||
return glyphs; |
||||
} |
@ -0,0 +1,64 @@ |
||||
/*
|
||||
* ot-ruleset.h: Shaping using OpenType features |
||||
* |
||||
* Copyright (C) 2000 Red Hat Software |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#ifndef __OT_RULESET_H__ |
||||
#define __OT_RULESET_H__ |
||||
|
||||
#include "ftxopen.h" |
||||
#include "ot-types.h" |
||||
#include "ot-array.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif /* __cplusplus */ |
||||
|
||||
struct _OTRuleset |
||||
{ |
||||
OTArray *rules; |
||||
OTInfo *info; |
||||
}; |
||||
|
||||
/* Dynamic lifecycle */ |
||||
|
||||
OTRuleset *ot_ruleset_new (OTInfo *info); |
||||
OTRuleset *ot_ruleset_delete (OTRuleset *ruleset); |
||||
|
||||
/* Automatic lifecycle */ |
||||
|
||||
OTRuleset *ot_ruleset_setup (OTRuleset *ruleset, OTInfo *info); |
||||
OTRuleset *ot_ruleset_release (OTRuleset *ruleset); |
||||
|
||||
void ot_ruleset_copy ( OTRuleset * from, OTRuleset * to ); |
||||
|
||||
void ot_ruleset_add_feature (OTRuleset *ruleset, |
||||
OTTableType table_type, |
||||
FT_UInt feature_index, |
||||
FT_ULong property_bit); |
||||
OTGlyphString *ot_ruleset_shape ( OTRuleset *ruleset, |
||||
OTGlyphString *glyphs ); |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif /* __cplusplus */ |
||||
|
||||
|
||||
#endif /* __OT_RULESET_H__ */ |
@ -0,0 +1,39 @@ |
||||
/* ot-types.h
|
||||
* |
||||
* Copyright (C) 2000 Red Hat Software |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Library General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Library General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Library General Public |
||||
* License along with this library; if not, write to the |
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#ifndef __OT_TYPES_H__ |
||||
#define __OT_TYPES_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LAYOUT_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif /* __cplusplus */ |
||||
|
||||
typedef struct _OTInfo OTInfo; |
||||
typedef struct _OTRuleset OTRuleset; |
||||
typedef FTL_Glyphs_ArrayRec OTGlyphString; |
||||
#ifdef __cplusplus |
||||
} |
||||
#endif /* __cplusplus */ |
||||
|
||||
|
||||
#endif /* __OT_TYPES_H__ */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@ |
||||
/* ot-unicode.[ch] are copied from gunicode.[ch] */ |
||||
|
||||
/* gunicode.h - Unicode manipulation functions
|
||||
* |
||||
* Copyright (C) 1999, 2000 Tom Tromey |
||||
* Copyright 2000 Red Hat, Inc. |
||||
* |
||||
* The Gnome Library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public License as |
||||
* published by the Free Software Foundation; either version 2 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* The Gnome Library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with the Gnome Library; see the file COPYING.LIB. If not, |
||||
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||
* Boston, MA 02111-1307, USA. |
||||
*/ |
||||
|
||||
#ifndef __OT_UNICODE_H__ |
||||
#define __OT_UNICODE_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
/* 3: Mark glyph (non-spacing combining glyph),
|
||||
1: Base glyph (single character, spacing glyph) */ |
||||
|
||||
FT_LOCAL(FT_UShort) ot_get_glyph_class(FT_ULong charcode); |
||||
|
||||
FT_END_HEADER |
||||
#endif /* Not def: __OT_UNICODE_H__ */ |
||||
|
@ -0,0 +1,42 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* ot.c */ |
||||
/* */ |
||||
/* FreeType OpenType driver component (body only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#define FT_MAKE_OPTION_SINGLE_OBJECT |
||||
|
||||
#include <ft2build.h> |
||||
|
||||
#include "otdriver.c" |
||||
#include "otobjs.c" |
||||
#include "otlayout.c" |
||||
|
||||
#include "ftxgsub.c" |
||||
#include "ftxgdef.c" |
||||
#include "ftxgpos.c" |
||||
#include "ftxopen.c" |
||||
|
||||
#include "ot-info.c" |
||||
#include "ot-ruleset.c" |
||||
|
||||
#include "ot-array.c" |
||||
#include "ot-unicode.c" |
||||
|
||||
/* END */ |
@ -0,0 +1,211 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otdemo.c */ |
||||
/* */ |
||||
/* Demo program for FreeType/OpenType font driver implementation (body).*/ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LAYOUT_H |
||||
#include FT_OTLAYOUT_H |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <popt.h> |
||||
|
||||
/* KANA specific implementation */ |
||||
|
||||
/* Script */ |
||||
#define OT_SCRIPT_KANA FT_MAKE_TAG('k', 'a', 'n', 'a') |
||||
|
||||
/* Language */ |
||||
#define OT_LANGUAGE_JAPANESE FT_MAKE_TAG('J', 'A', 'N', ' ') |
||||
|
||||
/* Feature */ |
||||
#define OT_FEATURE_VERT FT_MAKE_TAG('v', 'e', 'r', 't') |
||||
#define OT_FEATURE_VRT2 FT_MAKE_TAG('v', 'r', 't', '2') |
||||
|
||||
/* Property bit */ |
||||
enum { |
||||
OT_VERT = 1 << 0, |
||||
OT_VRT2 = 1 << 1 |
||||
}; |
||||
|
||||
/* Property */ |
||||
enum { |
||||
OT_VERT_P = (~OT_VERT) & (~OT_VRT2) |
||||
}; |
||||
|
||||
void doit(FT_Face face); |
||||
|
||||
int |
||||
main(int argc, char ** argv) |
||||
{ |
||||
FT_Library library; |
||||
FT_Face face; |
||||
poptContext optCon; |
||||
int rc; |
||||
const char * file; |
||||
static int arg_memprof = 0; |
||||
|
||||
struct poptOption optTable [] = { |
||||
{ "memprof", 'm', POPT_ARG_NONE, &arg_memprof, 0, "Enter to infinite loop to run under memprof", ""}, |
||||
POPT_AUTOHELP |
||||
POPT_TABLEEND |
||||
}; |
||||
|
||||
FTL_EngineType engine_type; |
||||
|
||||
optCon = poptGetContext(argv[0], argc, (const char **)argv, optTable, 0); |
||||
poptSetOtherOptionHelp(optCon, "[options] otfont\n");
|
||||
rc = poptReadDefaultConfig (optCon, 0);
|
||||
if (rc < 0) |
||||
{ |
||||
fprintf(stderr, "Fail to read .popt config file: %s\n", |
||||
poptStrerror(rc)); |
||||
exit (1); |
||||
} |
||||
while ((rc = poptGetNextOpt(optCon)) > 0)
|
||||
if (rc != -1) |
||||
{ |
||||
fprintf(stderr, "bad argument %s: %s\n", |
||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS), |
||||
poptStrerror(rc)); |
||||
exit (1); |
||||
} |
||||
|
||||
if (FT_Init_FreeType (&library)) |
||||
{ |
||||
fprintf(stderr, "Error in %s\n", "FT_Init_FreeType"); |
||||
exit (1); |
||||
} |
||||
|
||||
file = poptGetArg(optCon); |
||||
if (!file) |
||||
{ |
||||
poptPrintHelp(optCon, stderr, 0); |
||||
exit(1); |
||||
} |
||||
|
||||
if ( FT_New_Face (library, file, 0, &face) ) |
||||
{ |
||||
fprintf(stderr, "Error in %s: %s\n", "FT_New_Face", file); |
||||
exit (1); |
||||
} |
||||
|
||||
|
||||
if ( !( face->face_flags & FT_FACE_FLAG_GLYPH_SUBSTITUTION) ) |
||||
{ |
||||
fprintf(stderr, "Abort: No substitution table for the face\n"); |
||||
exit(1); |
||||
} |
||||
|
||||
if ( FTL_Query_EngineType( face, &engine_type ) |
||||
|| ( engine_type != FTL_OPENTYPE_ENGINE ) ) |
||||
{ |
||||
fprintf(stderr, "No OT table is existed: %s\n", file); |
||||
exit ( 1 ); |
||||
} |
||||
|
||||
doit( face ); |
||||
|
||||
if ( FT_Done_Face ( face ) ) |
||||
fprintf(stderr, "Error in %s: %s\n", "FT_Done_Face", file); |
||||
if ( FT_Done_FreeType (library) ) |
||||
{ |
||||
fprintf(stderr, "Error in %s\n", "FT_Done_FreeType"); |
||||
exit(1); |
||||
} |
||||
if ( arg_memprof || getenv("_MEMPROF_SOCKET") ) |
||||
{ |
||||
fprintf(stderr, "Enter infinite loop for memprof\n"); |
||||
while (1); |
||||
} |
||||
return 0; |
||||
}
|
||||
|
||||
void |
||||
doit(FT_Face face) |
||||
{ |
||||
FTL_FeaturesRequest request; |
||||
FT_UInt script_index, feature_index; |
||||
FT_Memory memory = face->stream->memory; |
||||
FTL_Glyphs_Array in, out; |
||||
FT_Int i; |
||||
if ( FTL_New_FeaturesRequest( face, &request ) ) |
||||
{ |
||||
fprintf(stderr, "error: %s\n", "FTL_New_FeaturesRequest"); |
||||
return ; |
||||
} |
||||
if ( !OTL_FeaturesRequest_Find_Script ( (OTL_FeaturesRequest)request, |
||||
OT_TABLE_GSUB, |
||||
OT_SCRIPT_KANA, |
||||
&script_index ) ) |
||||
{ |
||||
fprintf(stderr, "cannot find script: %s\n",
|
||||
"OTL_FeaturesRequest_Find_Script");
|
||||
return ; |
||||
} |
||||
|
||||
if ( !OTL_FeaturesRequest_Find_Feature( (OTL_FeaturesRequest)request, |
||||
OT_TABLE_GSUB, |
||||
OT_FEATURE_VERT, |
||||
script_index, |
||||
0xffff, /* default language system */ |
||||
&feature_index ) ) |
||||
{ |
||||
fprintf(stderr, "cannot find feature: %s\n",
|
||||
"OTL_FeaturesRequest_Find_Feature"); |
||||
return ; |
||||
} |
||||
OTL_FeaturesRequest_Add_Feature ( (OTL_FeaturesRequest)request, |
||||
OT_TABLE_GSUB, |
||||
feature_index, |
||||
OT_VERT ); |
||||
|
||||
if ( FTL_New_Glyphs_Array ( memory, &in ) |
||||
|| FTL_New_Glyphs_Array ( memory, &out ) ) |
||||
{ |
||||
fprintf(stderr, "mem error: %s\n", "FTL_New_Glyphs_Array"); |
||||
return ; |
||||
} |
||||
if ( FTL_Set_Glyphs_Array_Length ( in, 14751 ) ) |
||||
{ |
||||
fprintf(stderr, "mem error: %s\n",
|
||||
"FTL_Set_Glyphs_Array_Length"); |
||||
return ; |
||||
} |
||||
|
||||
for ( i = 0; i < 14751; i++ ) |
||||
{ |
||||
in->glyphs[i].gid = i; |
||||
in->glyphs[i].ot_prop = OT_VERT_P; |
||||
} |
||||
FTL_Activate_FeaturesRequest( request ); |
||||
FTL_Substitute_Glyphs ( face, in, out ); |
||||
|
||||
for ( i = 0; i < 14751; i++ ) |
||||
{ |
||||
if ( out->glyphs[i].gid != i ) |
||||
fprintf( stdout, "%d => %u\n", i, out->glyphs[i].gid ); |
||||
} |
||||
FTL_Done_Glyphs_Array ( out ); |
||||
FTL_Done_Glyphs_Array ( in ); |
||||
FTL_Done_FeaturesRequest ( request ); |
||||
} |
||||
|
||||
/* END */ |
@ -0,0 +1,100 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otdriver.c */ |
||||
/* */ |
||||
/* High-level OpenType driver interface (body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_FREETYPE_H |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include "otdriver.h" |
||||
#include "otobjs.h" |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */ |
||||
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ |
||||
/* messages during execution. */ |
||||
/* */ |
||||
#undef FT_COMPONENT |
||||
#define FT_COMPONENT trace_otdriver |
||||
|
||||
/* The FT_DriverInterface structure is defined in ftdriver.h.
|
||||
* ----------------------------------------------------------------------- |
||||
* Almost all fields should be initialized in ot_driver_init. |
||||
*/ |
||||
|
||||
FT_CALLBACK_TABLE_DEF |
||||
const FT_Driver_ClassRec ot_driver_class = |
||||
{ |
||||
/* FT_Module_Class */ |
||||
{ |
||||
/* module_flags, copyied from ttdriver.c */ |
||||
FT_MODULE_FONT_DRIVER | |
||||
FT_MODULE_DRIVER_SCALABLE | |
||||
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER |
||||
FT_MODULE_DRIVER_HAS_HINTER, |
||||
#else |
||||
0, |
||||
#endif |
||||
/* module_size, copyied from ttdriver.c */ |
||||
sizeof (OT_DriverRec), |
||||
/* module_name */ |
||||
"ot", |
||||
/* module_version */ |
||||
0x10000L, |
||||
/* module_requires */ |
||||
0x20000L, |
||||
|
||||
/* module_interface */ |
||||
NULL, |
||||
|
||||
/* module_init */ |
||||
(FT_Module_Constructor) ot_driver_init, |
||||
|
||||
/* module_done */ |
||||
(FT_Module_Destructor) NULL, |
||||
|
||||
/* get_interface */ |
||||
(FT_Module_Requester) NULL, |
||||
}, |
||||
|
||||
/* now the specific driver fields */ |
||||
0, |
||||
0, |
||||
0, |
||||
|
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
|
||||
NULL, |
||||
NULL, |
||||
|
||||
NULL, |
||||
|
||||
NULL, |
||||
NULL, |
||||
NULL, |
||||
}; |
||||
|
||||
/* END */ |
@ -0,0 +1,41 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otdriver.h */ |
||||
/* */ |
||||
/* High-level OpenType driver interface (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __OTDRIVER_H__ |
||||
#define __OTDRIVER_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_DRIVER_H |
||||
|
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
|
||||
FT_CALLBACK_TABLE |
||||
const FT_Driver_ClassRec ot_driver_class; |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* __OTDRIVER_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,45 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* gxerrors.h */ |
||||
/* */ |
||||
/* OT error codes (specification only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* This file is used to define the OT error enumeration constants. */ |
||||
/* */ |
||||
/*************************************************************************/ |
||||
|
||||
#ifndef __OTERRORS_H__ |
||||
#define __OTERRORS_H__ |
||||
|
||||
#include FT_MODULE_ERRORS_H |
||||
|
||||
#undef __FTERRORS_H__ |
||||
|
||||
#define FT_ERR_PREFIX OT_Err_ |
||||
#define FT_ERR_BASE FT_Mod_Err_OT |
||||
|
||||
|
||||
#include FT_ERRORS_H |
||||
|
||||
#endif /* __OTERRORS_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,269 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otlayout.c */ |
||||
/* */ |
||||
/* OpenType based layout engine(body). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
/*
|
||||
* Experimental: No support for gpos now. |
||||
*/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_LIST_H |
||||
#include FT_OTLAYOUT_H |
||||
|
||||
#include "otltypes.h" |
||||
#include "ot-types.h" |
||||
#include "ot-ruleset.h" |
||||
#include "ot-info.h" |
||||
#include "oterrors.h" |
||||
|
||||
FT_LOCAL_DEF ( FT_Error ) |
||||
otl_get_font ( FT_Face face, FTL_Font * font) |
||||
{ |
||||
*font = ((OT_Face)face)->extra.data; |
||||
|
||||
if ( *font ) |
||||
return FT_Err_Ok; |
||||
else |
||||
return OT_Err_Invalid_Face_Handle; |
||||
} |
||||
|
||||
FT_LOCAL_DEF ( FTL_EngineType ) |
||||
otl_get_engine_type ( FT_Face face ) |
||||
{ |
||||
return FTL_OPENTYPE_ENGINE; |
||||
} |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_new_features_request( FT_Face face, FTL_FeaturesRequest * ftl_request) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY(face); |
||||
OTL_Font font; |
||||
OTL_FeaturesRequest request; |
||||
|
||||
if (( error = otl_get_font ( face, (FTL_Font*)&font ) )) |
||||
goto Exit; |
||||
|
||||
if ( FT_NEW(request) ) |
||||
goto Exit; |
||||
|
||||
request->ruleset = ot_ruleset_new ( font->info ); |
||||
if ( !request->ruleset ) |
||||
{ |
||||
error = OT_Err_Invalid_Argument; /* ??? */ |
||||
goto Failure; |
||||
} |
||||
|
||||
if (( error = FTL_FeaturesRequest_Init ( face, (FTL_FeaturesRequest)request ) )) |
||||
goto Failure; |
||||
*ftl_request = (FTL_FeaturesRequest)request; |
||||
Exit: |
||||
return error;
|
||||
Failure: |
||||
if ( request->ruleset ) |
||||
ot_ruleset_delete( request->ruleset ); |
||||
FT_FREE( request ); |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_done_features_request( FTL_FeaturesRequest request) |
||||
{ |
||||
FT_Error error; |
||||
FTL_Font font; |
||||
FT_Face face; |
||||
FT_Memory memory; |
||||
|
||||
FT_ASSERT( request ); |
||||
font = FTL_FEATURES_REQUEST_FONT ( request ); |
||||
|
||||
FT_ASSERT( font ); |
||||
face = FTL_FONT_FACE(font); |
||||
|
||||
if ( !face ) |
||||
return OT_Err_Invalid_Argument; |
||||
memory = FT_FACE_MEMORY( face ); |
||||
ot_ruleset_delete ( ((OTL_FeaturesRequest)request)->ruleset ); |
||||
error = FTL_FeaturesRequest_Finalize ( request ); |
||||
FT_FREE( request ); /* broken */ |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_copy_features_request( FTL_FeaturesRequest from, |
||||
FTL_FeaturesRequest to) |
||||
{ |
||||
FT_Error error; |
||||
ot_ruleset_copy(((OTL_FeaturesRequest)from)->ruleset, ((OTL_FeaturesRequest)to)->ruleset); |
||||
error = FTL_FeaturesRequest_Copy( from, to ); |
||||
return error; |
||||
} |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
otl_substitute_glyphs ( FT_Face face, |
||||
FTL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ) |
||||
{ |
||||
FT_Error error = FT_Err_Ok; |
||||
if (( error = FTL_Copy_Glyphs_Array ( in, out ) )) |
||||
return error; |
||||
ot_ruleset_shape ( ((OTL_FeaturesRequest)request)->ruleset, out ); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Script ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
OTTag script_tag, |
||||
FT_UInt *script_index) |
||||
{ |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
return ot_info_find_script ( font->info,
|
||||
table_type,
|
||||
script_tag,
|
||||
script_index ) |
||||
? 1: 0; |
||||
|
||||
} |
||||
|
||||
FT_EXPORT( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Language ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
OTTag language_tag, |
||||
FT_UInt *language_index, |
||||
FT_UInt *required_feature_index ) |
||||
{ |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
return ot_info_find_language ( font->info,
|
||||
table_type,
|
||||
script_index,
|
||||
language_tag, |
||||
language_index, |
||||
required_feature_index ) |
||||
? 1: 0; |
||||
} |
||||
|
||||
FT_EXPORT ( FT_Bool ) |
||||
OTL_FeaturesRequest_Find_Feature ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
OTTag feature_tag, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index, |
||||
FT_UInt *feature_index ) |
||||
{ |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
return ot_info_find_feature ( font->info,
|
||||
table_type, |
||||
feature_tag, |
||||
script_index,
|
||||
language_index, |
||||
feature_index ) |
||||
? 1: 0; |
||||
} |
||||
|
||||
FT_EXPORT ( OTL_Tag_List ) |
||||
OTL_FeaturesRequest_List_Scripts ( OTL_FeaturesRequest request, |
||||
OTTableType table_type ) |
||||
{ |
||||
FT_Error error; |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
FT_Face face = FTL_FONT_FACE(font); |
||||
FT_Memory memory = FT_FACE_MEMORY(face); |
||||
OTL_Tag_List tag_list; |
||||
if ( FT_NEW(tag_list) ) |
||||
return NULL; |
||||
|
||||
tag_list->request = request; |
||||
tag_list->tags = ot_info_list_scripts( font->info, table_type ); |
||||
return tag_list; |
||||
} |
||||
|
||||
FT_EXPORT ( OTL_Tag_List )
|
||||
OTL_FeaturesRequest_List_Languages ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index ) |
||||
{ |
||||
FT_Error error; |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
FT_Face face = FTL_FONT_FACE( font ); |
||||
FT_Memory memory = FT_FACE_MEMORY( face ); |
||||
OTL_Tag_List tag_list; |
||||
if ( FT_NEW(tag_list) ) |
||||
return NULL; |
||||
|
||||
tag_list->request = request; |
||||
tag_list->tags = ot_info_list_languages( font->info,
|
||||
table_type, |
||||
script_index, |
||||
0 ); |
||||
return tag_list; |
||||
} |
||||
|
||||
FT_EXPORT ( OTL_Tag_List ) |
||||
OTL_FeaturesRequest_List_Features ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt script_index, |
||||
FT_UInt language_index ) |
||||
{ |
||||
FT_Error error; |
||||
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request ); |
||||
FT_Face face = FTL_FONT_FACE(font); |
||||
FT_Memory memory = FT_FACE_MEMORY( face ); |
||||
OTL_Tag_List tag_list; |
||||
if ( FT_NEW(tag_list) ) |
||||
return NULL; |
||||
|
||||
tag_list->request = request; |
||||
tag_list->tags = ot_info_list_features( font->info, |
||||
table_type, |
||||
0, |
||||
script_index, |
||||
language_index ); |
||||
return tag_list; |
||||
} |
||||
|
||||
FT_EXPORT ( FT_Error ) |
||||
OTL_Tag_List_Done ( OTL_Tag_List taglist ) |
||||
{ |
||||
FTL_FeaturesRequest request = (FTL_FeaturesRequest)taglist->request; |
||||
FTL_Font font = FTL_FEATURES_REQUEST_FONT( request ); |
||||
FT_Face face = FTL_FONT_FACE(font); |
||||
FT_Memory memory = FT_FACE_MEMORY( face ); |
||||
FT_FREE ( taglist ); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
FT_EXPORT ( FT_Error ) |
||||
OTL_FeaturesRequest_Add_Feature ( OTL_FeaturesRequest request, |
||||
OTTableType table_type, |
||||
FT_UInt feature_index, |
||||
FT_ULong property_bit) |
||||
{ |
||||
ot_ruleset_add_feature( request->ruleset, |
||||
table_type, |
||||
feature_index, |
||||
property_bit ); |
||||
return FT_Err_Ok; |
||||
} |
||||
|
||||
/* END */ |
@ -0,0 +1,77 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otltypes.h */ |
||||
/* */ |
||||
/* Implicit data types of OpenType based layout engine */ |
||||
/* (For application developers but using implicitly, */ |
||||
/* specification only). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __OTLTYPES_H__ |
||||
#define __OTLTYPES_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_TRUETYPE_TYPES_H |
||||
#include FT_INTERNAL_FTL_TYPES_H |
||||
#include FT_OTLAYOUT_H |
||||
#include "ot-ruleset.h" |
||||
#include "ot-info.h" |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef TT_Face OT_Face; |
||||
|
||||
typedef struct OTL_FontRec_ |
||||
{ |
||||
FTL_FontRec root; |
||||
OTInfo * info; |
||||
} OTL_FontRec, *OTL_Font; |
||||
|
||||
typedef struct OTL_FeaturesRequestRec_ |
||||
{ |
||||
FTL_FeaturesRequestRec root; |
||||
OTRuleset *ruleset; |
||||
} OTL_FeaturesRequestRec; |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
otl_get_font ( FT_Face face, FTL_Font * font); |
||||
|
||||
FT_LOCAL_DEF ( FTL_EngineType ) |
||||
otl_get_engine_type ( FT_Face face ); |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_new_features_request( FT_Face face, FTL_FeaturesRequest * request); |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_done_features_request( FTL_FeaturesRequest request); |
||||
|
||||
FT_LOCAL ( FT_Error )
|
||||
otl_copy_features_request( FTL_FeaturesRequest from, |
||||
FTL_FeaturesRequest to); |
||||
|
||||
FT_LOCAL ( FT_Error ) |
||||
otl_substitute_glyphs ( FT_Face face, |
||||
FTL_FeaturesRequest request, |
||||
FTL_Glyphs_Array in, |
||||
FTL_Glyphs_Array out ); |
||||
FT_END_HEADER |
||||
|
||||
#endif /* Not def: __OTLTYPES_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,189 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otobjs.c */ |
||||
/* */ |
||||
/* OpenType objects manager (body). */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_DEBUG_H |
||||
#include FT_INTERNAL_STREAM_H |
||||
#include FT_TRUETYPE_TAGS_H |
||||
#include FT_LIST_H |
||||
#include FT_ERRORS_H |
||||
#include FT_LAYOUT_H |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_SERVICE_LAYOUT_H |
||||
#include FT_OTLAYOUT_H |
||||
#include "otobjs.h" |
||||
#include "ot-types.h" |
||||
#include "ot-info.h" |
||||
#include "oterrors.h" |
||||
#include "otdriver.h" |
||||
#include "otltypes.h" |
||||
|
||||
|
||||
extern const FT_Driver_ClassRec tt_driver_class; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */ |
||||
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ |
||||
/* messages during execution. */ |
||||
/* */ |
||||
#undef FT_COMPONENT |
||||
#define FT_COMPONENT trace_otobjs |
||||
|
||||
static FT_Error |
||||
ot_face_init( FT_Stream stream, |
||||
OT_Face face, |
||||
FT_Int face_index, |
||||
FT_Int num_params, |
||||
FT_Parameter* params ); |
||||
|
||||
static FT_Error |
||||
ot_font_load ( OT_Face face ); |
||||
|
||||
static void |
||||
ot_font_done( void * object ); |
||||
|
||||
static FT_Module_Interface |
||||
ot_module_get_interface ( FT_Module module, |
||||
const char* ot_interface ); |
||||
|
||||
static const FT_Service_LayoutRec ot_service_layout = |
||||
{ |
||||
(FTL_Get_Font_Func) otl_get_font, |
||||
(FTL_Get_EngineType_Func) otl_get_engine_type, |
||||
(FTL_New_FeaturesRequest_Func) otl_new_features_request, |
||||
(FTL_Done_FeaturesRequest_Func) otl_done_features_request, |
||||
(FTL_Copy_FeaturesRequest_Func) otl_copy_features_request, |
||||
(FTL_Get_LigatureCaret_Count_Func) NULL, /* TODO */ |
||||
(FTL_Get_LigatureCaret_Division_Func) NULL, /* TODO */ |
||||
(FTL_Substitute_Glyphs_Func) otl_substitute_glyphs
|
||||
}; |
||||
|
||||
static const FT_ServiceDescRec ot_services[] = |
||||
{ |
||||
{ FT_SERVICE_ID_LAYOUT, &ot_service_layout }, |
||||
{ NULL, NULL } |
||||
}; |
||||
|
||||
FT_LOCAL_DEF( FT_Error ) |
||||
ot_driver_init( OT_Driver driver ) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
const void * module_name; |
||||
FT_Driver ot_driver_root = &driver->root; |
||||
FT_Driver_Class ot_driver_class = ot_driver_root->clazz; |
||||
|
||||
module_name = ot_driver_class->root.module_name; |
||||
|
||||
*ot_driver_class = tt_driver_class; |
||||
driver->root.clazz->root.module_name = module_name; |
||||
|
||||
if (( error = ((FT_Module_Class*)ot_driver_class)->module_init( (FT_Module)driver ) )) |
||||
return error; |
||||
|
||||
ot_driver_class->init_face = (FT_Face_InitFunc)ot_face_init; |
||||
((FT_Module_Class*)ot_driver_class)->get_interface = ot_module_get_interface; |
||||
|
||||
return OT_Err_Ok; |
||||
} |
||||
|
||||
static FT_Error |
||||
ot_face_init( FT_Stream stream, |
||||
OT_Face face, |
||||
FT_Int face_index, |
||||
FT_Int num_params, |
||||
FT_Parameter* params ) |
||||
{ |
||||
FT_Error error; |
||||
|
||||
/* TODO */ |
||||
error = tt_driver_class.init_face ( stream, (FT_Face)face, face_index, num_params, params ); |
||||
if ( error ) |
||||
goto Exit; |
||||
|
||||
error = ot_font_load ( face ); |
||||
if ( error ) |
||||
goto Exit; |
||||
Exit: |
||||
return error; |
||||
} |
||||
|
||||
static FT_Error |
||||
ot_font_load( OT_Face face ) |
||||
{ |
||||
FT_Error error; |
||||
FT_Memory memory = FT_FACE_MEMORY( face ); |
||||
|
||||
OTL_Font font = NULL; |
||||
OTL_FeaturesRequest features_request; |
||||
OTInfo * ot_info; |
||||
|
||||
if ( face->extra.data ) |
||||
{ |
||||
error = OT_Err_Busy_Extra_Data; |
||||
goto Exit; |
||||
} |
||||
|
||||
ot_info = ot_info_get ( (FT_Face) face ); |
||||
if ( !ot_info ) |
||||
{ |
||||
error = OT_Err_Unknown_File_Format; |
||||
goto Exit; |
||||
} |
||||
|
||||
if ( FT_NEW ( font ) ) |
||||
goto Exit; |
||||
|
||||
font->info = ot_info; |
||||
if (( error = FTL_Font_Init ( (FTL_Font)font, (FT_Face)face ) )) |
||||
goto Failure; |
||||
|
||||
face->extra.finalizer = ot_font_done; |
||||
face->extra.data = font; |
||||
if (( error = FTL_New_FeaturesRequest ( (FT_Face)face,
|
||||
(FTL_FeaturesRequest*)(&features_request) ) )) |
||||
goto Failure; |
||||
face->root.face_flags |= FT_FACE_FLAG_GLYPH_SUBSTITUTION; /* ??? */ |
||||
error = OT_Err_Ok; |
||||
Exit: |
||||
return error; |
||||
Failure: |
||||
if ( font ) |
||||
FT_FREE( font ); |
||||
face->extra.finalizer = NULL; |
||||
face->extra.data = NULL; |
||||
return error; |
||||
} |
||||
|
||||
static void |
||||
ot_font_done( void * object ) |
||||
{ |
||||
OTL_Font font = object; |
||||
FT_Face face = FTL_FONT_FACE( font ); |
||||
FT_Memory memory = FT_FACE_MEMORY( face ); |
||||
|
||||
FTL_Font_Finalize((FTL_Font)font); |
||||
FT_FREE( object ); |
||||
} |
||||
|
||||
static FT_Module_Interface |
||||
ot_module_get_interface( FT_Module module, |
||||
const char* ot_interface ) |
||||
{ |
||||
FT_Module_Interface ot; |
||||
|
||||
ot = ft_service_list_lookup( ot_services, ot_interface ); |
||||
if ( ot ) |
||||
return ot; |
||||
|
||||
/* TODO */ |
||||
if ( tt_driver_class.root.get_interface ) |
||||
return tt_driver_class.root.get_interface( module, ot_interface ); |
||||
return NULL; |
||||
} |
@ -0,0 +1,52 @@ |
||||
/***************************************************************************/ |
||||
/* */ |
||||
/* otdriver.h */ |
||||
/* */ |
||||
/* OpenType objects manager (specification). */ |
||||
/* */ |
||||
/* Copyright 2003 by */ |
||||
/* Masatake YAMATO and Redhat K.K. */ |
||||
/* */ |
||||
/* This file may only be used, */ |
||||
/* modified, and distributed under the terms of the FreeType project */ |
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||||
/* this file you indicate that you have read the license and */ |
||||
/* understand and accept it fully. */ |
||||
/* */ |
||||
/***************************************************************************/ |
||||
|
||||
/***************************************************************************/ |
||||
/* Development of the code in this file is support of */ |
||||
/* Information-technology Promotion Agency, Japan. */ |
||||
/***************************************************************************/ |
||||
|
||||
#ifndef __OTOBJS_H__ |
||||
#define __OTOBJS_H__ |
||||
|
||||
#include <ft2build.h> |
||||
#include FT_INTERNAL_OBJECTS_H |
||||
#include FT_INTERNAL_TRUETYPE_TYPES_H |
||||
|
||||
FT_BEGIN_HEADER |
||||
|
||||
typedef struct OT_DriverRec_ |
||||
{ |
||||
FT_DriverRec root; |
||||
TT_ExecContext context; |
||||
TT_GlyphZoneRec zone; |
||||
void* extension_component; |
||||
} OT_DriverRec, *OT_Driver; |
||||
|
||||
/*************************************************************************/ |
||||
/* */ |
||||
/* Driver functions */ |
||||
/* */ |
||||
FT_LOCAL( FT_Error ) |
||||
ot_driver_init( OT_Driver driver ); |
||||
|
||||
FT_END_HEADER |
||||
|
||||
#endif /* __OTOBJS_H__ */ |
||||
|
||||
|
||||
/* END */ |
@ -0,0 +1,98 @@ |
||||
#
|
||||
# FreeType 2 OpneType driver configuration rules
|
||||
#
|
||||
|
||||
# Copyright 2004 by RedHat K.K.
|
||||
# This file is derived from cff/rules.mk.
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# FreeType 2 OpenType/CFF driver configuration rules
|
||||
#
|
||||
|
||||
# Copyright 1996-2000, 2001, 2003 by
|
||||
# David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
#
|
||||
# This file is part of the FreeType project, and may only be used, modified,
|
||||
# and distributed under the terms of the FreeType project license,
|
||||
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||
# indicate that you have read the license and understand and accept it
|
||||
# fully.
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# Development of the code in rules.mk is support of
|
||||
# Information-technology Promotion Agency, Japan.
|
||||
|
||||
# OpenType driver directory
|
||||
#
|
||||
OT_DIR := $(SRC_DIR)/otlayout
|
||||
|
||||
|
||||
OT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(OT_DIR))
|
||||
|
||||
|
||||
# OT driver sources (i.e., C files)
|
||||
#
|
||||
OT_DRV_SRC := $(OT_DIR)/otobjs.c \
|
||||
$(OT_DIR)/otlayout.c \
|
||||
$(OT_DIR)/otdriver.c \
|
||||
$(OT_DIR)/ftxgdef.c \
|
||||
$(OT_DIR)/ftxgpos.c \
|
||||
$(OT_DIR)/ftxopen.c \
|
||||
$(OT_DIR)/ftxgsub.c \
|
||||
$(OT_DIR)/ot-info.c \
|
||||
$(OT_DIR)/ot-ruleset.c \
|
||||
$(OT_DIR)/ot-array.c \
|
||||
$(OT_DIR)/ot-unicode.c
|
||||
|
||||
|
||||
# OT driver headers
|
||||
#
|
||||
OT_DRV_H := $(OT_DIR)/otdriver.h \
|
||||
$(OT_DIR)/fterrcompat.h \
|
||||
$(OT_DIR)/ftxgdef.h \
|
||||
$(OT_DIR)/ftxgpos.h \
|
||||
$(OT_DIR)/ftxgsub.h \
|
||||
$(OT_DIR)/ftxopen.h \
|
||||
$(OT_DIR)/ftxopenf.h \
|
||||
$(OT_DIR)/ot-info.h \
|
||||
$(OT_DIR)/ot-ruleset.h \
|
||||
$(OT_DIR)/ot-types.h \
|
||||
$(OT_DIR)/ot-array.h \
|
||||
$(OT_DIR)/otltypes.h \
|
||||
$(OT_DIR)/oterrors.h \
|
||||
$(OT_DIR)/otobjs.h \
|
||||
$(OT_DIR)/ot-unicode.h
|
||||
|
||||
# OT driver object(s)
|
||||
#
|
||||
# OT_DRV_OBJ_M is used during `multi' builds
|
||||
# OT_DRV_OBJ_S is used during `single' builds
|
||||
#
|
||||
OT_DRV_OBJ_M := $(OT_DRV_SRC:$(OT_DIR)/%.c=$(OBJ_DIR)/%.$O)
|
||||
OT_DRV_OBJ_S := $(OBJ_DIR)/ot.$O
|
||||
|
||||
# OT driver source file for single build
|
||||
#
|
||||
OT_DRV_SRC_S := $(OT_DIR)/ot.c
|
||||
|
||||
|
||||
# OT driver - single object
|
||||
#
|
||||
$(OT_DRV_OBJ_S): $(OT_DRV_SRC_S) $(OT_DRV_SRC) $(FREETYPE_H) $(OT_DRV_H) |
||||
$(OT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OT_DRV_SRC_S))
|
||||
|
||||
|
||||
# OT driver - multiple objects
|
||||
#
|
||||
$(OBJ_DIR)/%.$O: $(OT_DIR)/%.c $(FREETYPE_H) $(OT_DRV_H) |
||||
$(OT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
|
||||
|
||||
|
||||
# update main driver object lists
|
||||
#
|
||||
DRV_OBJS_S += $(OT_DRV_OBJ_S)
|
||||
DRV_OBJS_M += $(OT_DRV_OBJ_M)
|
||||
|
||||
|
||||
# EOF
|
Loading…
Reference in new issue