| #ifndef OLTYPES_H |
| #define OLTYPES_H |
| |
| #include <ftobjs.h> |
| #include <tttypes.h> |
| |
| /************************************************************* |
| * |
| * <Struct> OTL_Table |
| * |
| * <Description> |
| * The base table of most OpenType Layout sub-tables. |
| * Provides a simple way to scan a table for script, |
| * languages, features and lookups.. |
| * |
| * <Fields> |
| * num_scripts :: number of scripts in table's script list |
| * script_tags :: array of tags for each table script |
| * |
| * max_languages :: max number of languages for any script in |
| * the table. |
| * num_languages :: number of languages available for current script |
| * language_tags :: tags of all languages available for current script. |
| * |
| * max_features :: total number of features in table |
| * feature_tags :: tags of all features for current script/language |
| * features :: selection flags for all features in current script/lang |
| * |
| * max_lookups :: total number of lookups in table |
| * lookups :: selection flags for all lookups for current |
| * feature list. |
| * |
| ****************************************************************/ |
| |
| typedef enum OTL_Type_ |
| { |
| otl_type_none = 0, |
| otl_type_base, |
| otl_type_gdef, |
| otl_type_gpos, |
| otl_type_gsub, |
| otl_type_jstf |
| |
| } OTL_Type; |
| |
| |
| typedef struct OTL_Table_ |
| { |
| FT_Memory memory; |
| |
| TT_Int num_scripts; |
| TT_Tag* script_tags; |
| |
| TT_Int max_languages; |
| TT_Int num_languages; |
| TT_Tag* language_tags; |
| |
| TT_Int max_features; |
| TT_Tag* feature_tags; |
| TT_Bool* features; |
| |
| TT_Int max_lookups; |
| TT_Bool* lookups; |
| |
| TT_Byte* scripts_table; |
| TT_Long scripts_len; |
| |
| TT_Byte* features_table; |
| TT_Long* features_len; |
| |
| TT_Byte* lookups_table; |
| TT_Byte* lookups_len; |
| |
| TT_Byte* cur_script; /* current script */ |
| TT_Byte* cur_language; /* current language */ |
| |
| TT_Byte* cur_base_values; |
| TT_Byte* cur_min_max; |
| |
| OTL_Type otl_type; |
| |
| } OTL_Table; |
| |
| |
| typedef struct OTL_BaseCoord_ |
| { |
| TT_UShort format; |
| TT_Short coordinate; |
| TT_UShort ref_glyph; |
| TT_UShort ref_point; |
| TT_Byte* device; |
| |
| } OTL_BaseCoord; |
| |
| |
| typedef struct OTL_ValueRecord_ |
| { |
| TT_Vector placement; |
| TT_Vector advance; |
| |
| TT_Byte* device_pla_x; |
| TT_Byte* device_pla_y; |
| TT_Byte* device_adv_x; |
| TT_Byte* device_adv_y; |
| |
| } OTL_ValueRecord; |
| |
| |
| typedef struct OTL_Anchor_ |
| { |
| TT_UInt format; |
| TT_Vector coord; |
| TT_UInt anchor_point; |
| TT_Byte* device_x; |
| TT_Byte* device_y; |
| |
| } OTL_Anchor; |
| |
| LOCAL_DEF |
| TT_Error OTL_Table_Init( OTL_Table* table, |
| FT_Memory memory ); |
| |
| LOCAL_DEF |
| TT_Error OTL_Table_Set_Scripts( OTL_Table* table, |
| TT_Byte* bytes, |
| TT_Long len, |
| OTL_Type otl_type ); |
| |
| LOCAL_DEF |
| TT_Error OTL_Table_Set_Features( OTL_Table* table, |
| TT_Byte* bytes, |
| TT_Long len ); |
| |
| LOCAL_DEF |
| TT_Error OTL_Table_Set_Lookups( OTL_Table* table, |
| TT_Byte* bytes, |
| TT_Long len ); |
| |
| LOCAL_DEF |
| void OTL_Table_Done( OTL_Table* table ); |
| |
| |
| |
| /***************************************************** |
| * |
| * Typical uses: |
| * |
| * - after OTL_Table_Set_Scripts have been called : |
| * |
| * table->script_tags contains the list of tags of all |
| * scripts defined for this table. |
| * |
| * table->num_scripts is the number of scripts |
| * |
| */ |
| |
| /******************************************************** |
| * |
| * - after calling OTL_Table_Set_Features: |
| * |
| * table->max_features is the number of all features |
| * in the table |
| * |
| * table->feature_tags is the list of tags of all |
| * features in the table |
| * |
| * table->features[] is an array of boolean used to |
| * indicate which feature is active for a given script/language |
| * it is empty (zero-filled) by default. |
| * |
| */ |
| |
| /******************************************************************* |
| * |
| * - after calling OTL_Get_Languages_List(script_tag): |
| * |
| * table->num_languages is the number of language systems |
| * available for the script, including the default |
| * langsys if there is one |
| * |
| * table->language_tags contains the list of tags of all |
| * languages for the script. Note that the default langsys |
| * has tag "0" and is always placed first in "language_tags". |
| * |
| * |
| * |
| */ |
| LOCAL_DEF |
| void OTL_Get_Languages_List( OTL_Table* table, |
| TT_ULong script_tag ); |
| |
| |
| /******************************************************************* |
| * |
| * - after calling OTL_Get_Features_List(language_tag): |
| * |
| * table->features[] is an array of booleans used to indicate |
| * which features are active for the current script/language |
| * |
| * note that this function must be called after OTL_Get_Languages |
| * which remembers the last "script_tag" used.. |
| * |
| * A client application can change the table->features[] array |
| * to add or remove features from the list. |
| * |
| * |
| * |
| */ |
| LOCAL_DEF |
| void OTL_Get_Features_List( OTL_Table* table, |
| TT_ULong language_tag ); |
| |
| LOCAL_DEF |
| void OTL_Get_Baseline_Values( OTL_Table* table, |
| TT_ULong language_tag ); |
| |
| LOCAL_DEF |
| void OTL_Get_Justification( OTL_Table* table, |
| TT_ULong language_tag ); |
| |
| /******************************************************************* |
| * |
| * - after calling OTL_Get_Lookups_List(): |
| * |
| * The function uses the table->features[] array of boolean |
| * to determine which lookups must be processed. |
| * |
| * It fills the table->lookups[] array accordingly. It is also |
| * an array of booleans (one for each lookup). |
| * |
| * |
| */ |
| |
| LOCAL_DEF |
| void OTL_Get_Lookups_List( OTL_Table* table ); |
| |
| |
| /*************************************************************** |
| * |
| * So the whole thing looks like: |
| * |
| * |
| * 1. A client specifies a given script and requests available |
| * language through OTL_Get_Languages_List() |
| * |
| * 2. It selects the language tag it needs, then calls |
| * OTL_Get_Features_List() |
| * |
| * 3. It updates the list of active features if it needs to |
| * |
| * 4. It calls OTL_Get_Lookups_List() |
| * It now has a list of active lookups in "table->lookups[]" |
| * |
| * 5. The lookups are processed according to the table's type.. |
| * |
| */ |
| |
| |
| |
| |
| LOCAL_DEF |
| TT_Long OTL_Get_Coverage_Index( TT_Byte* coverage, |
| TT_UInt glyph_id ); |
| |
| LOCAL_DEF |
| TT_UInt OTL_Get_Glyph_Class( TT_Byte* class_def, |
| TT_UInt glyph_id ); |
| |
| LOCAL_DEF |
| TT_Int OTL_Get_Device_Adjustment( TT_Byte* device, |
| TT_UInt size ); |
| |
| LOCAL_DEF |
| void OTL_Get_Base_Coordinate( TT_Byte* base_coord, |
| OTL_BaseCoord* coord ); |
| |
| |
| LOCAL_DEF |
| TT_Int OTL_ValueRecord_Size( TT_UShort value_format ); |
| |
| |
| LOCAL_DEF |
| void OTL_Get_ValueRecord( TT_Byte* value_record, |
| TT_UShort value_format, |
| TT_Byte* pos_table, |
| OTL_ValueRecord* record ); |
| |
| |
| LOCAL_DEF |
| void OTL_Get_Anchor( TT_Byte* anchor_table, |
| OTL_Anchor* anchor ); |
| |
| |
| LOCAL_DEF |
| void OTL_Get_Mark( TT_Byte* mark_array, |
| TT_UInt index, |
| TT_UShort* clazz, |
| OTL_Anchor* anchor ); |
| |
| |
| |
| #define OTL_Byte(p) (p++, p[-1]) |
| |
| #define OTL_UShort(p) (p+=2, ((TT_UShort)p[-2] << 8) | p[-1]) |
| |
| #define OTL_ULong(p) (p+=4, ((TT_ULong)p[-4] << 24) | \ |
| ((TT_ULong)p[-3] << 16) | \ |
| ((TT_ULong)p[-2] << 8 ) | p[-1] ) |
| |
| #endif /* OLTYPES_H */ |