diff options
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/include/otfcc/table/otl.h')
-rw-r--r-- | Build/source/texk/web2c/mfluadir/otfcc/include/otfcc/table/otl.h | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/include/otfcc/table/otl.h b/Build/source/texk/web2c/mfluadir/otfcc/include/otfcc/table/otl.h new file mode 100644 index 00000000000..87dab7f55c6 --- /dev/null +++ b/Build/source/texk/web2c/mfluadir/otfcc/include/otfcc/table/otl.h @@ -0,0 +1,257 @@ +#ifndef CARYLL_INCLUDE_TABLE_OTL_H +#define CARYLL_INCLUDE_TABLE_OTL_H + +#include "caryll/vector.h" +#include "table-common.h" +#include "otl/coverage.h" +#include "otl/classdef.h" + +typedef enum { + otl_type_unknown = 0, + + otl_type_gsub_unknown = 0x10, + otl_type_gsub_single = 0x11, + otl_type_gsub_multiple = 0x12, + otl_type_gsub_alternate = 0x13, + otl_type_gsub_ligature = 0x14, + otl_type_gsub_context = 0x15, + otl_type_gsub_chaining = 0x16, + otl_type_gsub_extend = 0x17, + otl_type_gsub_reverse = 0x18, + + otl_type_gpos_unknown = 0x20, + otl_type_gpos_single = 0x21, + otl_type_gpos_pair = 0x22, + otl_type_gpos_cursive = 0x23, + otl_type_gpos_markToBase = 0x24, + otl_type_gpos_markToLigature = 0x25, + otl_type_gpos_markToMark = 0x26, + otl_type_gpos_context = 0x27, + otl_type_gpos_chaining = 0x28, + otl_type_gpos_extend = 0x29 +} otl_LookupType; + +typedef union _otl_subtable otl_Subtable; +typedef struct _otl_lookup otl_Lookup; + +typedef struct { + pos_t dx; + pos_t dy; + pos_t dWidth; + pos_t dHeight; +} otl_PositionValue; + +// GSUB subtable formats +typedef struct { + OWNING otfcc_GlyphHandle from; + OWNING otfcc_GlyphHandle to; +} otl_GsubSingleEntry; +typedef caryll_Vector(otl_GsubSingleEntry) subtable_gsub_single; +extern caryll_VectorInterface(subtable_gsub_single, otl_GsubSingleEntry) iSubtable_gsub_single; + +typedef struct { + OWNING otfcc_GlyphHandle from; + OWNING otl_Coverage *to; +} otl_GsubMultiEntry; +typedef caryll_Vector(otl_GsubMultiEntry) subtable_gsub_multi; +extern caryll_VectorInterface(subtable_gsub_multi, otl_GsubMultiEntry) iSubtable_gsub_multi; + +typedef struct { + OWNING otl_Coverage *from; + OWNING otfcc_GlyphHandle to; +} otl_GsubLigatureEntry; +typedef caryll_Vector(otl_GsubLigatureEntry) subtable_gsub_ligature; +extern caryll_VectorInterface(subtable_gsub_ligature, + otl_GsubLigatureEntry) iSubtable_gsub_ligature; + +typedef enum { + otl_chaining_canonical = + 0, // The canonical form of chaining contextual substitution, one rule per subtable. + otl_chaining_poly = 1, // The multi-rule form, right after reading OTF. N rule per subtable. + otl_chaining_classified = + 2 // The classified intermediate form, for building TTF with compression. + // N rules, has classdefs, and coverage GID interpreted as class number. +} otl_chaining_type; + +typedef struct { + tableid_t index; + otfcc_LookupHandle lookup; +} otl_ChainLookupApplication; +typedef struct { + tableid_t matchCount; + tableid_t inputBegins; + tableid_t inputEnds; + OWNING otl_Coverage **match; + tableid_t applyCount; + OWNING otl_ChainLookupApplication *apply; +} otl_ChainingRule; +typedef struct { + otl_chaining_type type; + union { + otl_ChainingRule rule; // for type = otl_chaining_canonical + struct { // for type = otl_chaining_poly or otl_chaining_classified + tableid_t rulesCount; + OWNING otl_ChainingRule **rules; + OWNING otl_ClassDef *bc; + OWNING otl_ClassDef *ic; + OWNING otl_ClassDef *fc; + }; + }; +} subtable_chaining; +extern caryll_RefElementInterface(subtable_chaining) iSubtable_chaining; + +typedef struct { + tableid_t matchCount; + tableid_t inputIndex; + OWNING otl_Coverage **match; + OWNING otl_Coverage *to; +} subtable_gsub_reverse; +extern caryll_RefElementInterface(subtable_gsub_reverse) iSubtable_gsub_reverse; + +// GPOS subtable formats +typedef struct { + OWNING otfcc_GlyphHandle target; + OWNING otl_PositionValue value; +} otl_GposSingleEntry; +typedef caryll_Vector(otl_GposSingleEntry) subtable_gpos_single; +extern caryll_VectorInterface(subtable_gpos_single, otl_GposSingleEntry) iSubtable_gpos_single; + +typedef struct { + bool present; + pos_t x; + pos_t y; +} otl_Anchor; + +typedef struct { + OWNING otl_ClassDef *first; + OWNING otl_ClassDef *second; + OWNING otl_PositionValue **firstValues; + OWNING otl_PositionValue **secondValues; +} subtable_gpos_pair; +extern caryll_RefElementInterface(subtable_gpos_pair) iSubtable_gpos_pair; + +typedef struct { + OWNING otfcc_GlyphHandle target; + OWNING otl_Anchor enter; + OWNING otl_Anchor exit; +} otl_GposCursiveEntry; +typedef caryll_Vector(otl_GposCursiveEntry) subtable_gpos_cursive; +extern caryll_VectorInterface(subtable_gpos_cursive, otl_GposCursiveEntry) iSubtable_gpos_cursive; + +typedef struct { + OWNING otfcc_GlyphHandle glyph; + glyphclass_t markClass; + otl_Anchor anchor; +} otl_MarkRecord; +typedef caryll_Vector(otl_MarkRecord) otl_MarkArray; +extern caryll_VectorInterface(otl_MarkArray, otl_MarkRecord) otl_iMarkArray; + +typedef struct { + OWNING otfcc_GlyphHandle glyph; + OWNING otl_Anchor *anchors; +} otl_BaseRecord; +typedef caryll_Vector(otl_BaseRecord) otl_BaseArray; +extern caryll_VectorInterface(otl_BaseArray, otl_BaseRecord) otl_iBaseArray; + +typedef struct { + glyphclass_t classCount; + OWNING otl_MarkArray markArray; + otl_BaseArray baseArray; +} subtable_gpos_markToSingle; +extern caryll_RefElementInterface(subtable_gpos_markToSingle) iSubtable_gpos_markToSingle; + +typedef struct { + OWNING otfcc_GlyphHandle glyph; + glyphid_t componentCount; + OWNING otl_Anchor **anchors; +} otl_LigatureBaseRecord; +typedef caryll_Vector(otl_LigatureBaseRecord) otl_LigatureArray; +extern caryll_VectorInterface(otl_LigatureArray, otl_LigatureBaseRecord) otl_iLigatureArray; + +typedef struct { + glyphclass_t classCount; + OWNING otl_MarkArray markArray; + otl_LigatureArray ligArray; +} subtable_gpos_markToLigature; +extern caryll_RefElementInterface(subtable_gpos_markToLigature) iSubtable_gpos_markToLigature; + +typedef struct { + otl_LookupType type; + otl_Subtable *subtable; +} subtable_extend; + +typedef union _otl_subtable { + subtable_gsub_single gsub_single; + subtable_gsub_multi gsub_multi; + subtable_gsub_ligature gsub_ligature; + subtable_chaining chaining; + subtable_gsub_reverse gsub_reverse; + subtable_gpos_single gpos_single; + subtable_gpos_pair gpos_pair; + subtable_gpos_cursive gpos_cursive; + subtable_gpos_markToSingle gpos_markToSingle; + subtable_gpos_markToLigature gpos_markToLigature; + subtable_extend extend; +} otl_Subtable; + +typedef otl_Subtable *otl_SubtablePtr; +typedef caryll_Vector(otl_SubtablePtr) otl_SubtableList; +extern caryll_VectorInterfaceTypeName(otl_SubtableList) { + caryll_VectorInterfaceTrait(otl_SubtableList, otl_SubtablePtr); + void (*disposeDependent)(MODIFY otl_SubtableList *, const otl_Lookup *); +} +otl_iSubtableList; + +struct _otl_lookup { + sds name; + otl_LookupType type; + uint32_t _offset; + uint16_t flags; + OWNING otl_SubtableList subtables; +}; + +// owning lookup list +typedef OWNING otl_Lookup *otl_LookupPtr; +extern caryll_ElementInterface(otl_LookupPtr) otl_iLookupPtr; +typedef caryll_Vector(otl_LookupPtr) otl_LookupList; +extern caryll_VectorInterface(otl_LookupList, otl_LookupPtr) otl_iLookupList; + +// observe lookup list +typedef OBSERVE otl_Lookup *otl_LookupRef; +extern caryll_ElementInterface(otl_LookupRef) otl_iLookupRef; +typedef caryll_Vector(otl_LookupRef) otl_LookupRefList; +extern caryll_VectorInterface(otl_LookupRefList, otl_LookupRef) otl_iLookupRefList; + +typedef struct { + sds name; + OWNING otl_LookupRefList lookups; +} otl_Feature; +// owning feature list +typedef OWNING otl_Feature *otl_FeaturePtr; +extern caryll_ElementInterface(otl_FeaturePtr) otl_iFeaturePtr; +typedef caryll_Vector(otl_FeaturePtr) otl_FeatureList; +extern caryll_VectorInterface(otl_FeatureList, otl_FeaturePtr) otl_iFeatureList; +// observe feature list +typedef OBSERVE otl_Feature *otl_FeatureRef; +extern caryll_ElementInterface(otl_FeatureRef) otl_iFeatureRef; +typedef caryll_Vector(otl_FeatureRef) otl_FeatureRefList; +extern caryll_VectorInterface(otl_FeatureRefList, otl_FeatureRef) otl_iFeatureRefList; + +typedef struct { + sds name; + OWNING otl_FeatureRef requiredFeature; + OWNING otl_FeatureRefList features; +} otl_LanguageSystem; +typedef otl_LanguageSystem *otl_LanguageSystemPtr; +extern caryll_ElementInterface(otl_LanguageSystemPtr) otl_iLanguageSystem; +typedef caryll_Vector(otl_LanguageSystemPtr) otl_LangSystemList; +extern caryll_VectorInterface(otl_LangSystemList, otl_LanguageSystemPtr) otl_iLangSystemList; + +typedef struct { + otl_LookupList lookups; + otl_FeatureList features; + otl_LangSystemList languages; +} table_OTL; +extern caryll_RefElementInterface(table_OTL) table_iOTL; + +#endif |