blob: c9a0d6fd15ba98dd2a1937a47ea0c7837e22fa0f [file] [log] [blame]
/***************************************************************************/
/* */
/* gxtypes.h */
/* */
/* AAT/TrueTypeGX lower level type definitions */
/* (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 __GXTYPES_H__
#define __GXTYPES_H__
#include <ft2build.h>
#include FT_TYPES_H
#include FT_INTERNAL_TRUETYPE_TYPES_H
#include FT_INTERNAL_FTL_TYPES_H
FT_BEGIN_HEADER
/***************************************************************************/
/* Forward Declarations */
/***************************************************************************/
typedef TT_Face GX_Face;
typedef struct GXL_FontRec_ * GXL_Font;
typedef struct GX_TableRec_ * GX_Table;
typedef struct GX_MetamorphosisContextualPerGlyphRec_ *GX_MetamorphosisContextualPerGlyph;
typedef struct GX_MetamorphosisInsertionPerGlyphRec_ *GX_MetamorphosisInsertionPerGlyph;
typedef struct GX_XMetamorphosisContextualPerGlyphRec_ *GX_XMetamorphosisContextualPerGlyph;
typedef union GX_OpticalBoundsDataRec_ *GX_OpticalBoundsData;
typedef struct GX_LigCaretClassEntryRec_ *GX_LigCaretClassEntry;
typedef struct GX_LigCaretSegmentRec_ *GX_LigCaretSegment;
/***************************************************************************/
/* BinSrchHeader */
/***************************************************************************/
typedef struct GX_BinSrchHeaderRec_
{
FT_UShort unitSize;
FT_UShort nUnits;
FT_UShort searchRange;
FT_UShort entrySelector;
FT_UShort rangeShift;
} GX_BinSrchHeaderRec, *GX_BinSrchHeader;
/***************************************************************************/
/* LookupTable */
/***************************************************************************/
typedef union GX_LookupValueExtraDesc_
{
GX_OpticalBoundsData opbd_data;
GX_LigCaretClassEntry lcar_class_entry;
GX_LigCaretSegment lcar_segment;
FT_UShort *word;
FT_Pointer any;
} GX_LookupValueExtraDesc, *GX_LookupValueExtra;
typedef union GX_LookupValueRawDesc_
{
FT_UShort u;
FT_Short s;
} GX_LookupValueRawDesc, *GX_LookupValueRaw;
typedef struct GX_LookupValueRec_
{
GX_LookupValueRawDesc raw;
GX_LookupValueExtraDesc extra;
} GX_LookupValueRec, *GX_LookupValue;
typedef enum
{
GX_LOOKUPTABLE_SIMPLE_ARRAY = 0,
GX_LOOKUPTABLE_SEGMENT_SINGLE = 2,
GX_LOOKUPTABLE_SEGMENT_ARRAY = 4,
GX_LOOKUPTABLE_SINGLE_TABLE = 6,
GX_LOOKUPTABLE_TRIMMED_ARRAY = 8
} GX_LookupTable_Format;
typedef struct GX_LookupSegmentRec_
{
FT_UShort lastGlyph;
FT_UShort firstGlyph;
GX_LookupValueRec value;
} GX_LookupSegmentRec, *GX_LookupSegment;
typedef struct GX_LookupSingleRec_
{
FT_UShort glyph;
GX_LookupValueRec value;
} GX_LookupSingleRec, *GX_LookupSingle;
typedef struct GX_LookupTable_BinSrchRec_
{
GX_BinSrchHeaderRec binSrchHeader;
FT_Pointer dummy;
} GX_LookupTable_BinSrchRec, *GX_LookupTable_BinSrch;
typedef struct GX_LookupTable_SegmentRec_
{
GX_BinSrchHeaderRec binSrchHeader;
GX_LookupSegment segments;
} GX_LookupTable_SegmentRec, *GX_LookupTable_Segment;
typedef struct GX_LookupTable_Single_TableRec_
{
GX_BinSrchHeaderRec binSrchHeader;
GX_LookupSingle entries;
} GX_LookupTable_Single_TableRec, *GX_LookupTable_Single_Table;
typedef struct GX_LookupTable_Trimmed_ArrayRec_
{
FT_UShort firstGlyph;
FT_UShort glyphCount;
GX_LookupValue valueArray;
} GX_LookupTable_Trimmed_ArrayRec, *GX_LookupTable_Trimmed_Array;
typedef union GX_LookupFormatSpecificDesc_
{
GX_LookupValue simple_array;
GX_LookupTable_BinSrch bin_srch;
GX_LookupTable_Segment segment_generic;
GX_LookupTable_Segment segment_single;
GX_LookupTable_Segment segment_array;
GX_LookupTable_Single_Table single_table;
GX_LookupTable_Trimmed_Array trimmed_array;
FT_Pointer any;
} GX_LookupFormatSpecificDesc, *GX_LookupFormatSpecific;
typedef struct GX_LookupTableRec_
{
FT_ULong position; /* The file position of lookup table.
not in the spec but necessary to access format 4 datum.
Not only for debug. */
FT_Long num_glyphs; /* not in the spec but necessary to access format 0 */
FT_UShort format;
GX_LookupFormatSpecificDesc fsHeader;
} GX_LookupTableRec, *GX_LookupTable;
/***************************************************************************/
/* StateTable */
/***************************************************************************/
#define GX_STATE_HEADER_ADVANCE 8
typedef struct GX_StateHeaderRec_
{
FT_ULong position; /* The file position of state table. (not in the spec) */
FT_UShort stateSize;
FT_UShort classTable;
FT_UShort stateArray;
FT_UShort entryTable;
} GX_StateHeaderRec, *GX_StateHeader;
#define GX_DELETED_GLYPH_INDEX 0xFFFF
typedef enum
{
GX_CLASS_END_OF_TEXT = 0,
GX_CLASS_OUT_OF_BOUNDS = 1,
GX_CLASS_DELETED_GLYPH = 2,
GX_CLASS_END_OF_LINE = 3,
GX_CLASS_YOURS_START = 4
} GX_Predefined_ClassCode;
typedef struct GX_ClassSubtableRec_
{
FT_UShort firstGlyph;
FT_UShort nGlyphs;
FT_Byte *classArray;
} GX_ClassSubtableRec, * GX_ClassSubtable;
typedef union GX_EntrySubtablePerGlyphDesc_
{
GX_MetamorphosisContextualPerGlyph contextual;
GX_MetamorphosisInsertionPerGlyph insertion;
GX_XMetamorphosisContextualPerGlyph xcontextual;
FT_UShort ligActionIndex; /* For morx::ligatureSubtable */
FT_Pointer any;
} GX_EntrySubtablePerGlyphDesc, * GX_EntrySubtablePerGlyph;
typedef struct GX_EntrySubtableRec_
{
FT_UShort newState;
FT_UShort flags;
GX_EntrySubtablePerGlyphDesc glyphOffsets;
} GX_EntrySubtableRec, *GX_EntrySubtable;
typedef struct GX_StateTableRec_
{
GX_StateHeaderRec header;
FT_ULong nStates; /* Number of States. (not in the spec) */
FT_Byte nEntries; /* Number of entries. (not in the spec) */
GX_ClassSubtableRec class_subtable;
FT_Byte * state_array;
GX_EntrySubtable entry_subtable;
} GX_StateTableRec, *GX_StateTable;
/***************************************************************************/
/* Extended StateTable */
/***************************************************************************/
#define GX_XSTATE_HEADER_ADVANCE 16
typedef struct GX_XStateHeaderRec_
{
FT_ULong position; /* The file position of X state table. (not in the spec) */
FT_ULong nClasses;
FT_ULong classTableOffset;
FT_ULong stateArrayOffset;
FT_ULong entryTableOffset;
} GX_XStateHeaderRec, *GX_XStateHeader;
typedef struct GX_XStateTableRec_
{
GX_XStateHeaderRec header;
FT_ULong nStates; /* Number of States. (not in the spec) */
FT_Long nEntries; /* Number of entries. (not in the spec) */
GX_LookupTableRec class_subtable;
FT_UShort * state_array;
GX_EntrySubtable entry_subtable;
} GX_XStateTableRec, *GX_XStateTable;
/***************************************************************************/
/* GX_Table */
/***************************************************************************/
typedef void
(* GX_Table_Done_Func) ( GX_Table table, FT_Memory memory );
typedef struct GX_TableRec_
{
/* If the status of a tag is GX_LOAD_LAZY or
GX_LOAD_SUCCESSFUL, table position and length
should be available. The value might be useful
to debug.*/
GXL_Font font;
FT_ULong position;
FT_ULong length;
GX_Table_Done_Func done_table;
} GX_TableRec; /* , *GX_Table; */
/***************************************************************************/
/* FEAT */
/***************************************************************************/
typedef enum
{
GX_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000,
GX_FEAT_MASK_DYNAMIC_DEFAULT = 0x4000,
GX_FEAT_MASK_UNUSED = 0x3F00,
GX_FEAT_MASK_DEFAULT_SETTING = 0x00FF
} GX_FeatureFlagsMask ;
typedef struct GX_FeatureSettingNameRec_
{
FT_UShort setting;
FT_Short nameIndex;
} GX_FeatureSettingNameRec, *GX_FeatureSettingName;
typedef struct GX_FeatureNameRec_
{
FT_UShort feature;
FT_UShort nSettings;
FT_ULong settingTable;
FT_UShort featureFlags; /* use with GX_FeatureFlagsMask */
FT_Short nameIndex;
GX_FeatureSettingName settingName;
} GX_FeatureNameRec, *GX_FeatureName;
typedef struct GX_FeatRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort featureNameCount;
FT_UShort reserved1;
FT_ULong reserved2;
GX_FeatureName names; /* names[featureNameCount] */
} GX_FeatRec, *GX_Feat;
/***************************************************************************/
/* TRAK */
/***************************************************************************/
typedef struct GX_TrackTableEntryRec_
{
FT_Fixed track; /* MUST */
FT_UShort nameIndex; /* MUST */
FT_UShort offset; /* USED DURING LOADING */
FT_FWord *tracking_value; /* tracking_value[nSizes], MUST
* This field name, `tracking_value'
* is no appeared on the specification.
*/
} GX_TrackTableEntryRec, *GX_TrackTableEntry;
typedef struct GX_TrackDataRec_
{
FT_UShort nTracks; /* MUST */
FT_UShort nSizes; /* MUST */
FT_ULong sizeTableOffset; /* USED DURING LOADING */
GX_TrackTableEntry trackTable; /* MUST */
FT_Fixed *sizeTable; /* MUST, ???fixed32 */
} GX_TrackDataRec, *GX_TrackData;
typedef struct GX_TrakRec_
{
GX_TableRec root;
FT_Fixed version; /* ???fixed */
FT_UShort format;
FT_UShort horizOffset; /* USED DURING LOADING */
FT_UShort vertOffset; /* USED DURING LOADING */
FT_UShort reserved; /* ??? */
GX_TrackDataRec horizData; /* MUST */
GX_TrackDataRec vertData; /* MUST */
} GX_TrakRec, *GX_Trak;
/***************************************************************************/
/* PROP */
/***************************************************************************/
typedef enum
{
GX_PROP_MASK_FLOATER = 0x8000,
GX_PROP_MASK_HANG_OFF_LEFT_TOP = 0x4000,
GX_PROP_MASK_HANG_OFF_RIGHT_BOTTOM = 0x2000,
GX_PROP_MASK_USE_COMPLEMENTARY_BRACKET = 0x1000,
GX_PROP_MASK_COMPLEMENTARY_BRACKET_OFFSET = 0x0F00,
GX_PROP_MASK_ATTACHING_TO_RIGHT = 0x0080,
GX_PROP_MASK_RESERVED = 0x0060,
GX_PROP_MASK_DIRECTIONALITY_CLASS = 0x001F
} GX_PropertyMask ;
typedef struct GX_PropRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort format;
FT_UShort default_properties;
GX_LookupTableRec lookup_data;
} GX_PropRec, *GX_Prop;
/***************************************************************************/
/* OPBD */
/***************************************************************************/
#define GX_OPBD_NO_OPTICAL_EDGE -1
typedef enum
{
GX_OPBD_DISTANCE = 0,
GX_OPBD_CONTROL_POINTS = 1
} GX_OpticalBoundsFormat ;
typedef struct GX_OpbdRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort format;
GX_LookupTableRec lookup_data;
} GX_OpbdRec, *GX_Opbd;
typedef union GX_OpticalBoundsDataRec_
{
struct {
FT_FWord left_side;
FT_FWord top_side;
FT_FWord right_side;
FT_FWord bottom_side;
} distance;
struct {
FT_Short left_side;
FT_Short top_side;
FT_Short right_side;
FT_Short bottom_side;
} control_points;
} GX_OpticalBoundsDataRec;/*, *GX_OpticalBoundsData; */
/***************************************************************************/
/* LCAR */
/***************************************************************************/
typedef enum
{
GX_LCAR_DISTANCE = 0,
GX_LCAR_CONTROL_POINTS = 1
} GX_LigCaretFormat ;
typedef struct GX_LcarRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort format;
GX_LookupTableRec lookup;
} GX_LcarRec, *GX_Lcar;
/* Normally each value->extra in lookup points to GX_LigCaretClassEntry.
If lcar->format is GX_LOOKUPTABLE_SEGMENT_ARRAY, each value->extra
points to GX_LigCaretSegment data. */
typedef struct GX_LigCaretClassEntryRec_
{
FT_UShort count;
FT_Short *partials;
} GX_LigCaretClassEntryRec; /* , *GX_LigCaretClassEntry; */
typedef struct GX_LigCaretSegmentRec_
{
FT_UShort offset;
GX_LigCaretClassEntry class_entry;
} GX_LigCaretSegmentRec; /* , *GX_LigCaretSegment; */
/***************************************************************************/
/* BSLN */
/***************************************************************************/
#define GX_BSLN_VALUE_COUNT 32
#define GX_BSLN_VALUE_EMPTY 0xFFFF
typedef enum
{
GX_BSLN_VALUE_ROMAN_BASELINE = 0,
GX_BSLN_VALUE_IDEOGRAPHIC_CENTERED_BASELINE = 1,
GX_BSLN_VALUE_IDEOGRAPHIC_LOW_BASELINE = 2,
GX_BSLN_VALUE_HANGING_BASELINE = 3,
GX_BSLN_VALUE_MATH_BASELINE = 4
} GX_BaselinePredefinedValue;
typedef enum
{
GX_BSLN_FMT_DISTANCE_NO_MAPPING = 0,
GX_BSLN_FMT_DISTANCE_WITH_MAPPING = 1,
GX_BSLN_FMT_CONTROL_POINT_NO_MAPPING = 2,
GX_BSLN_FMT_CONTROL_POINT_WITH_MAPPING = 3
} GX_BaselineFormat;
typedef struct GX_BaselineFormat0PartRec_
{
FT_UShort deltas[GX_BSLN_VALUE_COUNT];
} GX_BaselineFormat0PartRec, *GX_BaselineFormat0Part;
typedef struct GX_BaselineFormat1PartRec_
{
FT_UShort deltas[GX_BSLN_VALUE_COUNT];
GX_LookupTableRec mappingData;
} GX_BaselineFormat1PartRec, *GX_BaselineFormat1Part;
typedef struct GX_BaselineFormat2PartRec_
{
FT_UShort stdGlyph;
FT_UShort ctlPoints[GX_BSLN_VALUE_COUNT];
} GX_BaselineFormat2PartRec, *GX_BaselineFormat2Part;
typedef struct GX_BaselineFormat3PartRec_
{
FT_UShort stdGlyph;
FT_UShort ctlPoints[GX_BSLN_VALUE_COUNT];
GX_LookupTableRec mappingData;
} GX_BaselineFormat3PartRec, *GX_BaselineFormat3Part;
typedef union GX_BaselinePartsDesc_
{
GX_BaselineFormat0Part fmt0;
GX_BaselineFormat1Part fmt1;
GX_BaselineFormat2Part fmt2;
GX_BaselineFormat3Part fmt3;
FT_Pointer any;
} GX_BaselinePartsDesc, *GX_BaselineParts;
typedef struct GX_BslnRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort format;
FT_UShort defaultBaseline;
GX_BaselinePartsDesc parts;
} GX_BslnRec, *GX_Bsln;
/***************************************************************************/
/* MORT */
/***************************************************************************/
typedef enum
{
GX_MORT_COVERAGE_HORIZONTAL_OR_VERTICAL_TEXT = 0x8000,
GX_MORT_COVERAGE_ORDER_OF_PROCESSING_GLYPH_ARRAY = 0x4000,
GX_MORT_COVERAGE_ORIENTATION_INDEPENDENT = 0x2000,
GX_MORT_COVERAGE_RESERVED = 0x1FF8,
GX_MORT_COVERAGE_SUBTABLE_TYPE = 0x0007
} GX_MetamorphosisCoverageMask;
typedef enum
{
GX_MORT_REARRANGEMENT_SUBTABLE = 0,
GX_MORT_CONTEXTUAL_SUBTABLE = 1,
GX_MORT_LIGATURE_SUBTABLE = 2,
GX_MORT_RESERVED_SUBTABLE = 3,
GX_MORT_NONCONTEXTUAL_SUBTABLE = 4,
GX_MORT_INSERTION_SUBTABLE = 5
} GX_MetamorphosisSubtableType;
typedef enum
{
GX_MORT_LIGATURE_FLAGS_SET_COMPONENT = 0x8000,
GX_MORT_LIGATURE_FLAGS_DONT_ADVANCE = 0x4000,
GX_MORT_LIGATURE_FLAGS_OFFSET = 0x3FFF
} GX_MetamorphosisLigatureFlagsMask;
#if 0
typedef enum
{
GX_MORT_LIGATURE_ACTION_LAST = 0x80000000,
GX_MORT_LIGATURE_ACTION_STORE = 0x40000000,
GX_MORT_LIGATURE_ACTION_OFFSET = 0x3FFFFFFF
} GX_MetamorphosisLigatureActionMask;
#else
typedef FT_ULong GX_MetamorphosisLigatureActionMask;
#define GX_MORT_LIGATURE_ACTION_LAST 0x80000000
#define GX_MORT_LIGATURE_ACTION_STORE 0x40000000
#define GX_MORT_LIGATURE_ACTION_OFFSET 0x3FFFFFFF
#endif /* 0 */
typedef enum
{
GX_MORT_CONTEXTUAL_FLAGS_SET_MARK = 0x8000,
GX_MORT_CONTEXTUAL_FLAGS_DONT_ADVANCE = 0x4000,
GX_MORT_CONTEXTUAL_FLAGS_RESERVED = 0x3FFF
} GX_MetamorphosisContextualFlagsMask;
typedef enum
{
GX_MORT_REARRANGEMENT_FLAGS_MARK_FIRST = 0x8000,
GX_MORT_REARRANGEMENT_FLAGS_DONT_ADVANCE = 0x4000,
GX_MORT_REARRANGEMENT_FLAGS_MARK_LAST = 0x2000,
GX_MORT_REARRANGEMENT_FLAGS_RESERVED = 0x1FF0,
GX_MORT_REARRANGEMENT_FLAGS_VERB = 0x000F
} GX_MetamorphosisRearrangementFlagsMask;
typedef enum
{
GX_MORT_REARRANGEMENT_VERB_NO_CHANGE = 0,
GX_MORT_REARRANGEMENT_VERB_Ax2xA = 1,
GX_MORT_REARRANGEMENT_VERB_xD2Dx = 2,
GX_MORT_REARRANGEMENT_VERB_AxD2DxA = 3,
GX_MORT_REARRANGEMENT_VERB_ABx2xAB = 4,
GX_MORT_REARRANGEMENT_VERB_ABx2xBA = 5,
GX_MORT_REARRANGEMENT_VERB_xCD2CDx = 6,
GX_MORT_REARRANGEMENT_VERB_xCD2DCx = 7,
GX_MORT_REARRANGEMENT_VERB_AxCD2CDxA = 8,
GX_MORT_REARRANGEMENT_VERB_AxCD2DCxA = 9,
GX_MORT_REARRANGEMENT_VERB_ABxD2DxAB = 10,
GX_MORT_REARRANGEMENT_VERB_ABxD2DxBA = 11,
GX_MORT_REARRANGEMENT_VERB_ABxCD2CDxAB = 12,
GX_MORT_REARRANGEMENT_VERB_ABxCD2CDxBA = 13,
GX_MORT_REARRANGEMENT_VERB_ABxCD2DCxAB = 14,
GX_MORT_REARRANGEMENT_VERB_ABxCD2DCxBA = 15
} GX_MetamorphosisRearrangementVerb;
typedef enum
{
GX_MORT_INSERTION_FLAGS_SET_MARK = 0x8000,
GX_MORT_INSERTION_FLAGS_DONT_ADVANCE = 0x4000,
GX_MORT_INSERTION_FLAGS_CURRENT_IS_KASHIDA_LIKE = 0x2000,
GX_MORT_INSERTION_FLAGS_MARKED_IS_KASHIDA_LIKE = 0x1000,
GX_MORT_INSERTION_FLAGS_CURRENT_INSERT_BEFORE = 0x0800,
GX_MORT_INSERTION_FLAGS_MARKED_INSERT_BEFORE = 0x0400,
GX_MORT_INSERTION_FLAGS_CURRENT_INSERT_COUNT = 0x03E0,
GX_MORT_INSERTION_FLAGS_MARKED_INSERT_COUNT = 0x001F
} GX_MetamorphosisInsertionFlagsMask;
/*
* Rearrangement
*/
typedef struct GX_MetamorphosisRearrangementBodyRec_
{
GX_StateTableRec state_table;
} GX_MetamorphosisRearrangementBodyRec, *GX_MetamorphosisRearrangementBody;
/*
* Contextual
*/
typedef struct GX_MetamorphosisContextualSubstitutionTableRec_
{
FT_UShort offset; /* known as substitutionTable in the spec. */
FT_UShort nGlyphIndexes; /* Not in the spec */
FT_UShort * glyph_indexes;
} GX_MetamorphosisContextualSubstitutionTableRec, *GX_MetamorphosisContextualSubstitutionTable;
typedef struct GX_MetamorphosisContextualBodyRec_
{
GX_StateTableRec state_table;
GX_MetamorphosisContextualSubstitutionTableRec substitutionTable;
} GX_MetamorphosisContextualBodyRec, *GX_MetamorphosisContextualBody;
typedef struct GX_MetamorphosisContextualPerGlyphRec_
{
/* The spec says that the type of next two variable should be FT_UShort,
However the input gid [197 202] for /Library/Fonts/KufiStandarGK.ttf on MacOSX
are not substituted well; the substitution for the marked glyph si failed
because the `markOffset' is too large(65522). So I will change the type to
FT_Short. You can walk through all codes related to this type changing by
$ grep "Was:FT_UShort" *.c *.h
As far as my reading, ICU also does the same. */
FT_Short markOffset; /* Was:FT_UShort */
FT_Short currentOffset; /* Was:FT_UShort */
} GX_MetamorphosisContextualPerGlyphRec;/*, *GX_MetamorphosisContextualPerGlyph; */
/*
* Ligature
*/
typedef struct GX_MetamorphosisLigatureActionTableRec_
{
FT_UShort offset; /* known as ligActionTable in the spec. */
FT_UShort nActions;
FT_ULong *body;
} GX_MetamorphosisLigatureActionTableRec, *GX_MetamorphosisLigatureActionTable;
typedef struct GX_MetamorphosisComponentTableRec_
{
FT_UShort offset; /* known as componentTable in the spec. */
FT_UShort nComponent;
FT_UShort *body;
} GX_MetamorphosisComponentTableRec, *GX_MetamorphosisComponentTable;
typedef struct GX_MetamorphosisLigatureTableRec_
{
FT_UShort offset; /* known as ligatureTable in the spec. */
FT_UShort nLigature;
FT_UShort *body;
} GX_MetamorphosisLigatureTableRec, *GX_MetamorphosisLigatureTable;
typedef struct GX_MetamorphosisLigatureBodyRec_
{
GX_StateTableRec state_table;
GX_MetamorphosisLigatureActionTableRec ligActionTable;
GX_MetamorphosisComponentTableRec componentTable;
GX_MetamorphosisLigatureTableRec ligatureTable;
} GX_MetamorphosisLigatureBodyRec, *GX_MetamorphosisLigatureBody;
/*
* Noncontextual
*/
typedef struct GX_MetamorphosisNoncontextualBodyRec_
{
GX_LookupTableRec lookup_table;
} GX_MetamorphosisNoncontextualBodyRec, *GX_MetamorphosisNoncontextualBody;
/*
* Insertion
*/
typedef struct GX_MetamorphosisInsertionBodyRec_
{
GX_StateTableRec state_table;
} GX_MetamorphosisInsertionBodyRec, *GX_MetamorphosisInsertionBody;
typedef struct GX_MetamorphosisInsertionListRec_
{
FT_UShort offset; /* known as currentInsertList,
or makedInsertList in the sepc. */
FT_UShort * glyphcodes; /* Not in spec explicitly */
} GX_MetamorphosisInsertionListRec, *GX_MetamorphosisInsertionList;
typedef struct GX_MetamorphosisInsertionPerGlyphRec_
{
GX_MetamorphosisInsertionListRec currentInsertList;
GX_MetamorphosisInsertionListRec markedInsertList;
} GX_MetamorphosisInsertionPerGlyphRec;/*, *GX_MetamorphosisInsertionPerGlyph; */
/*
* Generic
*/
typedef struct GX_MetamorphosisSubtableHeaderRec_
{
FT_ULong position; /* not in the spec, just for DEBUG */
FT_UShort length;
FT_UShort coverage;
FT_ULong subFeatureFlags;
} GX_MetamorphosisSubtableHeaderRec, *GX_MetamorphosisSubtableHeader;
typedef union GX_MetamorphosisSubtableBodyDesc_
{
GX_MetamorphosisRearrangementBody rearrangement;
GX_MetamorphosisContextualBody contextual;
GX_MetamorphosisLigatureBody ligature;
GX_MetamorphosisNoncontextualBody noncontextual;
GX_MetamorphosisInsertionBody insertion;
FT_Pointer any;
} GX_MetamorphosisSubtableBodyDesc, *GX_MetamorphosisSubtableBody;
typedef struct GX_MetamorphosisSubtableRec_
{
GX_MetamorphosisSubtableHeaderRec header;
GX_MetamorphosisSubtableBodyDesc body;
} GX_MetamorphosisSubtableRec, *GX_MetamorphosisSubtable;
typedef struct GX_MetamorphosisFeatureTableRec_
{
FT_UShort featureType;
FT_UShort featureSetting;
FT_ULong enableFlags;
FT_ULong disableFlags;
} GX_MetamorphosisFeatureTableRec, *GX_MetamorphosisFeatureTable;
typedef struct GX_MetamorphosisChainHeaderRec_
{
FT_ULong defaultFlags;
FT_ULong chainLength;
FT_UShort nFeatureEntries;
FT_UShort nSubtables;
} GX_MetamorphosisChainHeaderRec, *GX_MetamorphosisChainHeader;
typedef struct GX_MetamorphosisChainRec_
{
GX_MetamorphosisChainHeaderRec header;
GX_MetamorphosisFeatureTable feat_Subtbl;
GX_MetamorphosisSubtable chain_Subtbl;
} GX_MetamorphosisChainRec, *GX_MetamorphosisChain;
typedef struct GX_MortRec_
{
GX_TableRec root;
FT_Fixed version;
FT_ULong nChains;
GX_MetamorphosisChain chain;
} GX_MortRec, *GX_Mort;
/***************************************************************************/
/* MORX */
/***************************************************************************/
#define GX_MORX_REARRANGEMENT_SUBTABLE GX_MORT_REARRANGEMENT_SUBTABLE
#define GX_MORX_CONTEXTUAL_SUBTABLE GX_MORT_CONTEXTUAL_SUBTABLE
#define GX_MORX_LIGATURE_SUBTABLE GX_MORT_LIGATURE_SUBTABLE
#define GX_MORX_RESERVED_SUBTABLE GX_MORT_RESERVED_SUBTABLE
#define GX_MORX_NONCONTEXTUAL_SUBTABLE GX_MORT_NONCONTEXTUAL_SUBTABLE
#define GX_MORX_INSERTION_SUBTABLE GX_MORT_INSERTION_SUBTABLE
typedef GX_MetamorphosisFeatureTable GX_XMetamorphosisFeatureTable;
typedef GX_MetamorphosisFeatureTableRec GX_XMetamorphosisFeatureTableRec;
typedef GX_MetamorphosisSubtableType GX_XMetamorphosisSubtableType;
#if 0
typedef enum
{
GX_MORX_COVERAGE_HORIZONTAL_OR_VERTICAL_TEXT = 0x80000000,
GX_MORX_COVERAGE_ORDER_OF_PROCESSING_GLYPH_ARRAY = 0x40000000,
GX_MORX_COVERAGE_ORIENTATION_INDEPENDENT = 0x20000000,
GX_MORX_COVERAGE_RESERVED = 0x1FFFFF00,
GX_MORX_COVERAGE_SUBTABLE_TYPE = 0x000000FF
} GX_XMetamorphosisCoverageMask;
#else
typedef FT_ULong GX_XMetamorphosisCoverageMask;
#define GX_MORX_COVERAGE_HORIZONTAL_OR_VERTICAL_TEXT 0x80000000
#define GX_MORX_COVERAGE_ORDER_OF_PROCESSING_GLYPH_ARRAY 0x40000000
#define GX_MORX_COVERAGE_ORIENTATION_INDEPENDENT 0x20000000
#define GX_MORX_COVERAGE_RESERVED 0x1FFFFF00
#define GX_MORX_COVERAGE_SUBTABLE_TYPE 0x000000FF
#endif /* 0 */
/*
* Rearrangement
*/
typedef GX_MetamorphosisRearrangementVerb GX_XMetamorphosisRearrangementVerb;
typedef enum
{
GX_MORX_REARRANGEMENT_FLAGS_MARK_FIRST = GX_MORT_REARRANGEMENT_FLAGS_MARK_FIRST,
GX_MORX_REARRANGEMENT_FLAGS_DONT_ADVANCE = GX_MORT_REARRANGEMENT_FLAGS_DONT_ADVANCE,
GX_MORX_REARRANGEMENT_FLAGS_MARK_LAST = GX_MORT_REARRANGEMENT_FLAGS_MARK_LAST,
GX_MORX_REARRANGEMENT_FLAGS_RESERVED = GX_MORT_REARRANGEMENT_FLAGS_RESERVED,
GX_MORX_REARRANGEMENT_FLAGS_VERB = GX_MORT_REARRANGEMENT_FLAGS_VERB
} GX_XMetamorphosisRearrangementFlagsMask;
typedef struct GX_XMetamorphosisRearrangementBodyRec_
{
GX_XStateTableRec state_table;
} GX_XMetamorphosisRearrangementBodyRec, *GX_XMetamorphosisRearrangementBody;
/*
* Contextual
*/
typedef enum
{
GX_MORX_CONTEXTUAL_FLAGS_SET_MARK = GX_MORT_CONTEXTUAL_FLAGS_SET_MARK,
GX_MORX_CONTEXTUAL_FLAGS_DONT_ADVANCE = GX_MORT_CONTEXTUAL_FLAGS_DONT_ADVANCE,
GX_MORX_CONTEXTUAL_FLAGS_RESERVED = GX_MORT_CONTEXTUAL_FLAGS_RESERVED
} GX_XMetamorphosisContextualFlagsMask;
typedef struct GX_XMetamorphosisContextualSubstitutionTableRec_
{
FT_ULong offset;
FT_UShort nTables;
GX_LookupTable * lookupTables;
} GX_XMetamorphosisContextualSubstitutionTableRec, *GX_XMetamorphosisContextualSubstitutionTable;
typedef struct GX_XMetamorphosisContextualBodyRec_
{
GX_XStateTableRec state_table;
GX_XMetamorphosisContextualSubstitutionTableRec substitutionTable;
} GX_XMetamorphosisContextualBodyRec, *GX_XMetamorphosisContextualBody;
typedef struct GX_XMetamorphosisContextualPerGlyphRec_
{
FT_UShort markIndex;
FT_UShort currentIndex;
} GX_XMetamorphosisContextualPerGlyphRec;/*, *GX_XMetamorphosisContextualPerGlyph; */
/*
* Ligature
*/
#if 0
typedef enum
{
GX_MORX_LIGATURE_ACTION_LAST = GX_MORT_LIGATURE_ACTION_LAST,
GX_MORX_LIGATURE_ACTION_STORE = GX_MORT_LIGATURE_ACTION_STORE,
GX_MORX_LIGATURE_ACTION_OFFSET = GX_MORT_LIGATURE_ACTION_OFFSET
} GX_XMetamorphosisLigatureActionMask;
#else
typedef GX_MetamorphosisLigatureActionMask GX_XMetamorphosisLigatureActionMask;
#define GX_MORX_LIGATURE_ACTION_LAST GX_MORT_LIGATURE_ACTION_LAST
#define GX_MORX_LIGATURE_ACTION_STORE GX_MORT_LIGATURE_ACTION_STORE
#define GX_MORX_LIGATURE_ACTION_OFFSET GX_MORT_LIGATURE_ACTION_OFFSET
#endif /* 0 */
typedef enum
{
GX_MORX_LIGATURE_FLAGS_SET_COMPONENT = 0x8000,
GX_MORX_LIGATURE_FLAGS_DONT_ADVANCE = 0x4000,
GX_MORX_LIGATURE_FLAGS_PERFORM_ACTION = 0x2000,
GX_MORX_LIGATURE_FLAGS_RESERVED = 0x3FFF
} GX_XMetamorphosisLigatureFlagsMask;
typedef struct GX_XMetamorphosisLigatureActionTableRec_
{
FT_ULong offset; /* known as ligActionTable in the spec. */
FT_UShort nActions;
FT_ULong *body;
} GX_XMetamorphosisLigatureActionTableRec, *GX_XMetamorphosisLigatureActionTable;
typedef struct GX_XMetamorphosisComponentTableRec_
{
FT_ULong offset; /* known as componentTable in the spec. */
FT_UShort nComponent;
FT_UShort *body;
} GX_XMetamorphosisComponentTableRec, *GX_XMetamorphosisComponentTable;
typedef struct GX_XMetamorphosisLigatureTableRec_
{
FT_ULong offset; /* known as ligatureTable in the spec. */
FT_UShort nLigature;
FT_UShort *body;
} GX_XMetamorphosisLigatureTableRec, *GX_XMetamorphosisLigatureTable;
typedef struct GX_XMetamorphosisLigatureBodyRec_
{
GX_XStateTableRec state_table;
GX_XMetamorphosisLigatureActionTableRec ligActionTable;
GX_XMetamorphosisComponentTableRec componentTable;
GX_XMetamorphosisLigatureTableRec ligatureTable;
} GX_XMetamorphosisLigatureBodyRec, *GX_XMetamorphosisLigatureBody;
/*
* Noncontextual
*/
typedef GX_MetamorphosisNoncontextualBody GX_XMetamorphosisNoncontextualBody;
/*
* Insertion
*/
#define GX_MORX_NO_INSERTION ((FT_UShort)-1)
#define GX_MORX_NO_SUBSTITUTION ((FT_UShort)-1)
typedef GX_MetamorphosisInsertionPerGlyphRec GX_XMetamorphosisInsertionPerGlyphRec;
typedef GX_MetamorphosisInsertionPerGlyph GX_XMetamorphosisInsertionPerGlyph;
typedef GX_MetamorphosisInsertionListRec GX_XMetamorphosisInsertionListRec;
typedef GX_MetamorphosisInsertionList GX_XMetamorphosisInsertionList;
typedef struct GX_XMetamorphosisInsertionBodyRec_
{
GX_XStateTableRec state_table;
FT_ULong insertion_glyph_table;
} GX_XMetamorphosisInsertionBodyRec, * GX_XMetamorphosisInsertionBody;
typedef enum
{
GX_MORX_INSERTION_FLAGS_SET_MARK = GX_MORT_INSERTION_FLAGS_SET_MARK,
GX_MORX_INSERTION_FLAGS_DONT_ADVANCE = GX_MORT_INSERTION_FLAGS_DONT_ADVANCE,
GX_MORX_INSERTION_FLAGS_CURRENT_IS_KASHIDA_LIKE = GX_MORT_INSERTION_FLAGS_CURRENT_IS_KASHIDA_LIKE,
GX_MORX_INSERTION_FLAGS_MARKED_IS_KASHIDA_LIKE = GX_MORT_INSERTION_FLAGS_MARKED_IS_KASHIDA_LIKE,
GX_MORX_INSERTION_FLAGS_CURRENT_INSERT_BEFORE = GX_MORT_INSERTION_FLAGS_CURRENT_INSERT_BEFORE,
GX_MORX_INSERTION_FLAGS_MARKED_INSERT_BEFORE = GX_MORT_INSERTION_FLAGS_MARKED_INSERT_BEFORE,
GX_MORX_INSERTION_FLAGS_CURRENT_INSERT_COUNT = GX_MORT_INSERTION_FLAGS_CURRENT_INSERT_COUNT,
GX_MORX_INSERTION_FLAGS_MARKED_INSERT_COUNT = GX_MORT_INSERTION_FLAGS_MARKED_INSERT_COUNT
} GX_XMetamorphosisInsertionFlagsMask;
/*
* Generic
*/
typedef struct GX_XMetamorphosisSubtableHeaderRec_
{
FT_ULong position; /* not in the spec, just for DEBUG */
FT_ULong length;
FT_ULong coverage;
FT_ULong subFeatureFlags;
} GX_XMetamorphosisSubtableHeaderRec, *GX_XMetamorphosisSubtableHeader;
typedef union GX_XMetamorphosisSubtableBodyDesc_
{
GX_XMetamorphosisRearrangementBody rearrangement;
GX_XMetamorphosisContextualBody contextual;
GX_XMetamorphosisLigatureBody ligature;
GX_XMetamorphosisNoncontextualBody noncontextual;
GX_XMetamorphosisInsertionBody insertion;
FT_Pointer any;
} GX_XMetamorphosisSubtableBodyDesc, *GX_XMetamorphosisSubtableBody;
typedef struct GX_XMetamorphosisSubtableRec_
{
GX_XMetamorphosisSubtableHeaderRec header;
GX_XMetamorphosisSubtableBodyDesc body;
} GX_XMetamorphosisSubtableRec, *GX_XMetamorphosisSubtable;
typedef struct GX_XMetamorphosisChainHeaderRec_
{
FT_ULong defaultFlags;
FT_ULong chainLength;
FT_ULong nFeatureEntries;
FT_ULong nSubtables;
} GX_XMetamorphosisChainHeaderRec, *GX_XMetamorphosisChainHeader;
typedef struct GX_XMetamorphosisChainRec_
{
GX_XMetamorphosisChainHeaderRec header;
GX_XMetamorphosisFeatureTable feat_Subtbl;
GX_XMetamorphosisSubtable chain_Subtbl;
} GX_XMetamorphosisChainRec, *GX_XMetamorphosisChain;
typedef struct GX_MorxRec_
{
GX_TableRec root;
FT_Fixed version;
FT_ULong nChains;
GX_XMetamorphosisChain chain;
} GX_MorxRec, *GX_Morx;
/***************************************************************************/
/* FMTX */
/***************************************************************************/
typedef struct GX_FmtxRec_
{
GX_TableRec root;
FT_Fixed version;
FT_ULong glyphIndex;
FT_Byte horizontalBefore;
FT_Byte horizontalAfter;
FT_Byte horizontalCaretHead;
FT_Byte horizontalCaretBase;
FT_Byte verticalBefore;
FT_Byte verticalAfter;
FT_Byte verticalCaretHead;
FT_Byte verticalCaretBase;
} GX_FmtxRec, *GX_Fmtx;
/***************************************************************************/
/* FDSC */
/***************************************************************************/
typedef struct GX_FontDescriptorRec_
{
FT_ULong tag;
FT_Fixed value;
} GX_FontDescriptorRec, *GX_FontDescriptor;
typedef struct GX_FdscRec_
{
GX_TableRec root;
FT_Fixed version;
FT_ULong descriptorCount;
GX_FontDescriptor descriptor;
} GX_FdscRec, *GX_Fdsc;
/***************************************************************************/
/* JUST */
/***************************************************************************/
typedef enum
{
GX_JUST_STATE_FLAGS_SET_MARK = 0x8000,
GX_JUST_STATE_FLAGS_DONT_ADVANCE = 0x4000,
GX_JUST_STATE_FLAGS_MARK_CLASS = 0x3F80,
GX_JUST_STATE_FLAGS_CURRENT_CLASS = 0x007F
} GX_JustificationStateFlagsMask;
typedef struct GX_JustificationClassStateTableRec_
{
GX_MetamorphosisSubtableHeaderRec morphHeader;
GX_StateHeaderRec stHeader;
} GX_JustificationClassStateTableRec, *GX_JustificationClassStateTable;
typedef struct GX_JustificationHeaderRec_
{
FT_UShort justClassTableOffset;
FT_UShort wdcTableOffset;
FT_UShort pcTableOffset;
GX_LookupTableRec lookup_table;
} GX_JustificationHeaderRec, *GX_JustificationHeader;
typedef struct GX_JustRec_
{
GX_TableRec root;
FT_Fixed version;
FT_UShort format;
FT_UShort horizOffset;
FT_UShort vertOffset;
} GX_JustRec, *GX_Just;
/***************************************************************************/
/* KERN */
/***************************************************************************/
typedef enum
{
GX_KERN_COVERAGE_VERTICAL = 0x8000,
GX_KERN_COVERAGE_CROSS_STREAM = 0x4000,
GX_KERN_COVERAGE_VARIATION = 0x2000,
GX_KERN_COVERAGE_UNUSED_BITS = 0x1F00,
GX_KERN_COVERAGE_FORMAT_MASK = 0x00FF
} GX_KerningCoverageMask;
typedef enum
{
GX_KERN_FMT_ORDERED_LIST_OF_KERNING_PAIRS = 0,
GX_KERN_FMT_STATE_TABLE_FOR_CONTEXTUAL_KERNING = 1,
GX_KERN_FMT_SIMPLE_NXM_ARRAY_OF_KERNING_VALUES = 2,
GX_KERN_FMT_SIMPLE_NXM_ARRAY_OF_KERNING_INDICES = 3
} GX_KerningFormat;
typedef enum
{
GX_KERN_ACTION_PUSH = 0x8000,
GX_KERN_ACTION_DONT_ADVANCE = 0x4000,
GX_KERN_ACTION_VALUE_OFFSET = 0x3FFF
} GX_KerningFormat1Action;
typedef enum
{
GX_KERN_VALUE_END_LIST = 0x0001,
GX_KERN_VALUE_RESET_CROSS_STREAM = 0x8000
} GX_KerningFormat1ValueMask;
typedef struct GX_KerningSubtableHeaderRec_
{
FT_ULong position; /* Not in the spec but needed in fmt2 */
FT_ULong length;
FT_UShort coverage;
FT_UShort tupleIndex;
} GX_KerningSubtableHeaderRec, *GX_KerningSubtableHeader;
typedef struct GX_KerningSubtableFormat0EntryRec_
{
FT_UShort left;
FT_UShort right;
FT_Short value;
} GX_KerningSubtableFormat0EntryRec, *GX_KerningSubtableFormat0Entry;
typedef struct GX_KerningSubtableFormat0BodyRec_
{
FT_UShort nPairs;
FT_UShort searchRange;
FT_UShort entrySelector;
FT_UShort rangeShift;
GX_KerningSubtableFormat0Entry entries;
} GX_KerningSubtableFormat0BodyRec, * GX_KerningSubtableFormat0Body;
typedef struct GX_KerningSubtableFormat1BodyRec_
{
GX_StateTableRec state_table; /* stHeader written in the spec are included
in this field */
FT_UShort valueTable;
FT_ULong value_absolute_pos;
FT_ULong nValues; /* in FT_FWord counts */
FT_FWord *values;
} GX_KerningSubtableFormat1BodyRec, *GX_KerningSubtableFormat1Body;
typedef struct GX_KerningSubtableFormat2ClassTableRec_
{
FT_UShort firstGlyph;
FT_UShort nGlyphs;
FT_Byte max_class; /* Not in the spec but useful */
FT_Byte *classes;
} GX_KerningSubtableFormat2ClassTableRec, *GX_KerningSubtableFormat2ClassTable;
typedef struct GX_KerningSubtableFormat2BodyRec_
{
FT_UShort rowWidth;
FT_UShort leftClassTable;
FT_UShort rightClassTable;
FT_UShort array;
GX_KerningSubtableFormat2ClassTableRec leftClass;
GX_KerningSubtableFormat2ClassTableRec rightClass;
FT_FWord *values; /* The length is
leftClass.max_class + rightClass.max_class */
} GX_KerningSubtableFormat2BodyRec, *GX_KerningSubtableFormat2Body;
typedef struct GX_KerningSubtableFormat3BodyRec_
{
FT_UShort glyphCount;
FT_Byte kernValueCount;
FT_Byte leftClassCount;
FT_Byte rightClassCount;
FT_Byte flags;
FT_FWord *kernValue; /* [kernValueCount] */
FT_Byte *leftClass; /* [glyphCount] */
FT_Byte *rightClass; /* [glyphCount] */
FT_Byte *kernIndex; /* [leftClassCount * rightClassCount] */
} GX_KerningSubtableFormat3BodyRec, * GX_KerningSubtableFormat3Body;
typedef union GX_KerningSubtableBodyDesc_
{
GX_KerningSubtableFormat0Body fmt0;
GX_KerningSubtableFormat1Body fmt1;
GX_KerningSubtableFormat2Body fmt2;
GX_KerningSubtableFormat3Body fmt3;
FT_Pointer any;
} GX_KerningSubtableBodyDesc, *GX_KerningSubtableBody;
typedef struct GX_KerningSubtableRec_
{
GX_KerningSubtableHeaderRec header;
GX_KerningSubtableBodyDesc body;
} GX_KerningSubtableRec, *GX_KerningSubtable;
typedef struct GX_KernRec_
{
GX_TableRec root;
FT_Fixed version;
FT_ULong nTables;
GX_KerningSubtable subtables;
} GX_KernRec, *GX_Kern;
/***************************************************************************/
/* Generic */
/***************************************************************************/
typedef struct GXL_FontRec_
{
FTL_FontRec root;
GX_Feat feat;
GX_Mort mort;
GX_Morx morx;
GX_Trak trak;
GX_Kern kern;
GX_Prop prop;
GX_Lcar lcar;
GX_Opbd opbd;
GX_Bsln bsln;
GX_Fmtx fmtx;
GX_Fdsc fdsc;
GX_Just just;
} GXL_FontRec; /* *GX_Font; */
FT_END_HEADER
#endif /* Not def: __GXTYPES_H__ */
/* END */