/******************************************************************* * * Copyright 1996-2000 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * Copyright 2006 Behdad Esfahbod * * This is part of HarfBuzz, an OpenType Layout engine library. * * See the file name COPYING for licensing information. * ******************************************************************/ #ifndef HARFBUZZ_GSUB_PRIVATE_H #define HARFBUZZ_GSUB_PRIVATE_H #include "harfbuzz-gsub.h" FT_BEGIN_HEADER typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable; /* LookupType 1 */ struct HB_SingleSubstFormat1_ { FT_Short DeltaGlyphID; /* constant added to get substitution glyph index */ }; typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1; struct HB_SingleSubstFormat2_ { FT_UShort GlyphCount; /* number of glyph IDs in Substitute array */ FT_UShort* Substitute; /* array of substitute glyph IDs */ }; typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; struct HB_SingleSubst_ { FT_UShort SubstFormat; /* 1 or 2 */ HB_Coverage Coverage; /* Coverage table */ union { HB_SingleSubstFormat1 ssf1; HB_SingleSubstFormat2 ssf2; } ssf; }; typedef struct HB_SingleSubst_ HB_SingleSubst; /* LookupType 2 */ struct HB_Sequence_ { FT_UShort GlyphCount; /* number of glyph IDs in the Substitute array */ FT_UShort* Substitute; /* string of glyph IDs to substitute */ }; typedef struct HB_Sequence_ HB_Sequence; struct HB_MultipleSubst_ { FT_UShort SubstFormat; /* always 1 */ HB_Coverage Coverage; /* Coverage table */ FT_UShort SequenceCount; /* number of Sequence tables */ HB_Sequence* Sequence; /* array of Sequence tables */ }; typedef struct HB_MultipleSubst_ HB_MultipleSubst; /* LookupType 3 */ struct HB_AlternateSet_ { FT_UShort GlyphCount; /* number of glyph IDs in the Alternate array */ FT_UShort* Alternate; /* array of alternate glyph IDs */ }; typedef struct HB_AlternateSet_ HB_AlternateSet; struct HB_AlternateSubst_ { FT_UShort SubstFormat; /* always 1 */ HB_Coverage Coverage; /* Coverage table */ FT_UShort AlternateSetCount; /* number of AlternateSet tables */ HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ }; typedef struct HB_AlternateSubst_ HB_AlternateSubst; /* LookupType 4 */ struct HB_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 HB_Ligature_ HB_Ligature; struct HB_LigatureSet_ { FT_UShort LigatureCount; /* number of Ligature tables */ HB_Ligature* Ligature; /* array of Ligature tables */ }; typedef struct HB_LigatureSet_ HB_LigatureSet; struct HB_LigatureSubst_ { FT_UShort SubstFormat; /* always 1 */ HB_Coverage Coverage; /* Coverage table */ FT_UShort LigatureSetCount; /* number of LigatureSet tables */ HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ }; typedef struct HB_LigatureSubst_ HB_LigatureSubst; /* needed by both lookup type 5 and 6 */ struct HB_SubstLookupRecord_ { FT_UShort SequenceIndex; /* index into current glyph sequence */ FT_UShort LookupListIndex; /* Lookup to apply to that pos. */ }; typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord; /* LookupType 5 */ struct HB_SubRule_ { FT_UShort GlyphCount; /* total number of input glyphs */ FT_UShort SubstCount; /* number of SubstLookupRecord tables */ FT_UShort* Input; /* array of input glyph IDs */ HB_SubstLookupRecord* SubstLookupRecord; /* array of SubstLookupRecord tables */ }; typedef struct HB_SubRule_ HB_SubRule; struct HB_SubRuleSet_ { FT_UShort SubRuleCount; /* number of SubRule tables */ HB_SubRule* SubRule; /* array of SubRule tables */ }; typedef struct HB_SubRuleSet_ HB_SubRuleSet; struct HB_ContextSubstFormat1_ { HB_Coverage Coverage; /* Coverage table */ FT_UShort SubRuleSetCount; /* number of SubRuleSet tables */ HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ }; typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; struct HB_SubClassRule_ { FT_UShort GlyphCount; /* total number of context classes */ FT_UShort SubstCount; /* number of SubstLookupRecord tables */ FT_UShort* Class; /* array of classes */ HB_SubstLookupRecord* SubstLookupRecord; /* array of SubstLookupRecord tables */ }; typedef struct HB_SubClassRule_ HB_SubClassRule; struct HB_SubClassSet_ { FT_UShort SubClassRuleCount; /* number of SubClassRule tables */ HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ }; typedef struct HB_SubClassSet_ HB_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 HB_ContextSubstFormat2_ { FT_UShort MaxContextLength; /* maximal context length */ HB_Coverage Coverage; /* Coverage table */ HB_ClassDefinition ClassDef; /* ClassDef table */ FT_UShort SubClassSetCount; /* number of SubClassSet tables */ HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ }; typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; struct HB_ContextSubstFormat3_ { FT_UShort GlyphCount; /* number of input glyphs */ FT_UShort SubstCount; /* number of SubstLookupRecords */ HB_Coverage* Coverage; /* array of Coverage tables */ HB_SubstLookupRecord* SubstLookupRecord; /* array of substitution lookups */ }; typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; struct HB_ContextSubst_ { FT_UShort SubstFormat; /* 1, 2, or 3 */ union { HB_ContextSubstFormat1 csf1; HB_ContextSubstFormat2 csf2; HB_ContextSubstFormat3 csf3; } csf; }; typedef struct HB_ContextSubst_ HB_ContextSubst; /* LookupType 6 */ struct HB_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 */ HB_SubstLookupRecord* SubstLookupRecord; /* array of SubstLookupRecords */ }; typedef struct HB_ChainSubRule_ HB_ChainSubRule; struct HB_ChainSubRuleSet_ { FT_UShort ChainSubRuleCount; /* number of ChainSubRule tables */ HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ }; typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; struct HB_ChainContextSubstFormat1_ { HB_Coverage Coverage; /* Coverage table */ FT_UShort ChainSubRuleSetCount; /* number of ChainSubRuleSet tables */ HB_ChainSubRuleSet* ChainSubRuleSet; /* array of ChainSubRuleSet tables */ }; typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; struct HB_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 */ HB_SubstLookupRecord* SubstLookupRecord; /* array of substitution lookups */ }; typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; struct HB_ChainSubClassSet_ { FT_UShort ChainSubClassRuleCount; /* number of ChainSubClassRule tables */ HB_ChainSubClassRule* ChainSubClassRule; /* array of ChainSubClassRule tables */ }; typedef struct HB_ChainSubClassSet_ HB_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 HB_ChainContextSubstFormat2_ { HB_Coverage Coverage; /* Coverage table */ FT_UShort MaxBacktrackLength; /* maximal backtrack length */ HB_ClassDefinition BacktrackClassDef; /* BacktrackClassDef table */ FT_UShort MaxInputLength; /* maximal input length */ HB_ClassDefinition InputClassDef; /* InputClassDef table */ FT_UShort MaxLookaheadLength; /* maximal lookahead length */ HB_ClassDefinition LookaheadClassDef; /* LookaheadClassDef table */ FT_UShort ChainSubClassSetCount; /* number of ChainSubClassSet tables */ HB_ChainSubClassSet* ChainSubClassSet; /* array of ChainSubClassSet tables */ }; typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; struct HB_ChainContextSubstFormat3_ { FT_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage tables */ FT_UShort InputGlyphCount; /* number of input glyphs */ HB_Coverage* InputCoverage; /* array of input coverage tables */ FT_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ HB_Coverage* LookaheadCoverage; /* array of lookahead coverage tables */ FT_UShort SubstCount; /* number of SubstLookupRecords */ HB_SubstLookupRecord* SubstLookupRecord; /* array of substitution lookups */ }; typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; struct HB_ChainContextSubst_ { FT_UShort SubstFormat; /* 1, 2, or 3 */ union { HB_ChainContextSubstFormat1 ccsf1; HB_ChainContextSubstFormat2 ccsf2; HB_ChainContextSubstFormat3 ccsf3; } ccsf; }; typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; /* LookupType 8 */ struct HB_ReverseChainContextSubst_ { FT_UShort SubstFormat; /* always 1 */ HB_Coverage Coverage; /* coverage table for input glyphs */ FT_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage tables */ FT_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage tables */ FT_UShort GlyphCount; /* number of Glyph IDs */ FT_UShort* Substitute; /* array of substitute Glyph ID */ }; typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst; union HB_GSUB_SubTable_ { HB_SingleSubst single; HB_MultipleSubst multiple; HB_AlternateSubst alternate; HB_LigatureSubst ligature; HB_ContextSubst context; HB_ChainContextSubst chain; HB_ReverseChainContextSubst reverse; }; FT_Error _HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, FT_Stream stream, FT_UShort lookup_type ); void _HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, FT_Memory memory, FT_UShort lookup_type ); FT_END_HEADER #endif /* HARFBUZZ_GSUB_PRIVATE_H */