From a16ecbf0564a6e2576da22c12827f3c0719da549 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 23 Jan 2008 17:01:55 -0500 Subject: [PATCH] Initial gsub stub --- src/hb-ot-layout-gdef-private.h | 4 + src/hb-ot-layout-gsub-private.h | 453 ++++++++++++++++++++++++++++++++++++++++ src/hb-ot-layout-open-private.h | 3 + src/main.cc | 1 + 4 files changed, 461 insertions(+) create mode 100644 src/hb-ot-layout-gsub-private.h diff --git a/src/hb-ot-layout-gdef-private.h b/src/hb-ot-layout-gdef-private.h index e05ea38..ce8b32e 100644 --- a/src/hb-ot-layout-gdef-private.h +++ b/src/hb-ot-layout-gdef-private.h @@ -27,6 +27,9 @@ #ifndef HB_OT_LAYOUT_GDEF_PRIVATE_H #define HB_OT_LAYOUT_GDEF_PRIVATE_H +#include "hb-private.h" +#include "hb-ot-layout.h" + #include "hb-ot-layout-open-private.h" @@ -205,6 +208,7 @@ struct GDEFHeader { static const hb_tag_t GDEFTag = HB_TAG ('G','D','E','F'); STATIC_DEFINE_GET_FOR_DATA (GDEFHeader); + /* XXX check version here */ DEFINE_ACCESSOR (ClassDef, get_glyph_class_def, glyphClassDef); DEFINE_ACCESSOR (AttachList, get_attach_list, attachList); diff --git a/src/hb-ot-layout-gsub-private.h b/src/hb-ot-layout-gsub-private.h new file mode 100644 index 0000000..c8a1900 --- /dev/null +++ b/src/hb-ot-layout-gsub-private.h @@ -0,0 +1,453 @@ +/* + * Copyright (C) 2007,2008 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_LAYOUT_GSUB_PRIVATE_H +#define HB_OT_LAYOUT_GSUB_PRIVATE_H + +#include "hb-private.h" +#include "hb-ot-layout.h" + +#include "hb-ot-layout-open-private.h" +#include "hb-ot-layout-gdef-private.h" + + +struct SingleSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + SHORT deltaGlyphID; /* Add to original GlyphID to get + * substitute GlyphID */ +}; +ASSERT_SIZE (SingleSubstFormat1, 6); + +struct SingleSubstFormat2 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 2 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT glyphCount; /* Number of GlyphIDs in the Substitute + * array */ + GlyphID substitute[]; /* Array of substitute + * GlyphIDs--ordered by Coverage Index */ +}; +ASSERT_SIZE (SingleSubstFormat2, 6); + +struct MultipleSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT sequenceCount; /* Number of Sequence table offsets in + * the Sequence array */ + Offset sequence[]; /* Array of offsets to Sequence + * tables--from beginning of + * Substitution table--ordered by + * Coverage Index */ +}; +ASSERT_SIZE (MultipleSubstFormat1, 6); + +struct Sequence { + /* TODO */ + + private: + USHORT glyphCount; /* Number of GlyphIDs in the Substitute + * array. This should always be + * greater than 0. */ + GlyphID substitute[]; /* String of GlyphIDs to substitute */ +}; +DEFINE_NULL_ASSERT_SIZE (Sequence, 2); + +struct AlternateSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT alternateSetCount; /* Number of AlternateSet tables */ + Offset alternateSet[]; /* Array of offsets to AlternateSet + * tables--from beginning of + * Substitution table--ordered by + * Coverage Index */ +}; +ASSERT_SIZE (AlternateSubstFormat1, 6); + +struct AlternateSet { + /* TODO */ + + private: + USHORT glyphCount; /* Number of GlyphIDs in the Alternate + * array */ + GlyphID alternate[]; /* Array of alternate GlyphIDs--in + * arbitrary order */ +}; +DEFINE_NULL_ASSERT_SIZE (AlternateSet, 2); + +struct LigatureSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT ligSetCount; /* Number of LigatureSet tables */ + Offset ligatureSet[]; /* Array of offsets to LigatureSet + * tables--from beginning of + * Substitution table--ordered by + * Coverage Index */ +}; +ASSERT_SIZE (LigatureSubstFormat1, 6); + +struct LigatureSet { + /* TODO */ + + private: + USHORT ligatureCount; /* Number of Ligature tables */ + Offset ligature[]; /* Array of offsets to Ligature + * tables--from beginning of + * LigatureSet table--ordered by + * preference */ +}; +DEFINE_NULL_ASSERT_SIZE (LigatureSet, 2); + +struct Ligature { + /* TODO */ + + private: + GlyphID ligGlyph; /* GlyphID of ligature to substitute */ + USHORT compCount; /* Number of components in the ligature */ + GlyphID component[]; /* Array of component GlyphIDs--start + * with the second component--ordered + * in writing direction */ +}; +DEFINE_NULL_ASSERT_SIZE (Ligature, 4); + +struct SubstLookupRecord { + /* TODO */ + + private: + USHORT sequenceIndex; /* Index into current glyph + * sequence--first glyph = 0 */ + USHORT lookupListIndex; /* Lookup to apply to that + * position--zero--based */ +}; +DEFINE_NULL_ASSERT_SIZE (SubstLookupRecord, 4); + +struct ContextSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT subRuleSetCount; /* Number of SubRuleSet tables--must + * equal GlyphCount in Coverage table */ + Offset subRuleSet[]; /* Array of offsets to SubRuleSet + * tables--from beginning of + * Substitution table--ordered by + * Coverage Index */ +}; +ASSERT_SIZE (ContextSubstFormat1, 6); + +struct SubRuleSet { + /* TODO */ + + private: + USHORT subRuleCount; /* Number of SubRule tables */ + Offset subRule[]; /* Array of offsets to SubRule + * tables--from beginning of SubRuleSet + * table--ordered by preference */ +}; +DEFINE_NULL_ASSERT_SIZE (SubRuleSet, 2); + +struct SubRule { + /* TODO */ + + private: + USHORT glyphCount; /* Total number of glyphs in input + * glyph sequence--includes the first + * glyph */ + USHORT substCount; /* Number of SubstLookupRecords */ + GlyphID input[]; /* Array of input GlyphIDs--start with + * second glyph */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order */ +}; +DEFINE_NULL_ASSERT_SIZE (SubRule, 4); + +struct ContextSubstFormat2 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 2 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + Offset classDef; /* Offset to glyph ClassDef table--from + * beginning of Substitution table */ + USHORT subClassSetCnt; /* Number of SubClassSet tables */ + Offset subClassSet[]; /* Array of offsets to SubClassSet + * tables--from beginning of + * Substitution table--ordered by + * class--may be NULL */ +}; +ASSERT_SIZE (ContextSubstFormat2, 8); + +struct SubClassSet { + /* TODO */ + + private: + USHORT subClassRuleCnt; /* Number of SubClassRule tables */ + Offset subClassRule[]; /* Array of offsets to SubClassRule + * tables--from beginning of + * SubClassSet--ordered by preference */ +}; +DEFINE_NULL_ASSERT_SIZE (SubClassSet, 2); + +struct SubClassRule { + /* TODO */ + + private: + USHORT glyphCount; /* Total number of classes + * specified for the context in the + * rule--includes the first class */ + USHORT substCount; /* Number of SubstLookupRecords */ + USHORT klass[]; /* Array of classes--beginning with the + * second class--to be matched to the + * input glyph class sequence */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order */ +}; +DEFINE_NULL_ASSERT_SIZE (SubClassRule, 4); + +struct ContextSubstFormat3 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 3 */ + USHORT glyphCount; /* Number of glyphs in the input glyph + * sequence */ + USHORT substCount; /* Number of SubstLookupRecords */ + Offset coverage[]; /* Array of offsets to Coverage + * table--from beginning of + * Substitution table--in glyph + * sequence order */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order */ +}; +ASSERT_SIZE (ContextSubstFormat3, 6); + +struct ChainContextSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + USHORT chainSubRuleSetCount; /* Number of ChainSubRuleSet + * tables--must equal GlyphCount in + * Coverage table */ + Offset chainSubRuleSet[]; /* Array of offsets to ChainSubRuleSet + * tables--from beginning of + * Substitution table--ordered by + * Coverage Index */ +}; +ASSERT_SIZE (ChainContextSubstFormat1, 6); + +struct ChainSubRuleSet { + /* TODO */ + + private: + USHORT chainSubRuleCount; /* Number of ChainSubRule tables */ + Offset chainSubRule[]; /* Array of offsets to ChainSubRule + * tables--from beginning of + * ChainSubRuleSet table--ordered + * by preference */ +}; +DEFINE_NULL_ASSERT_SIZE (ChainSubRuleSet, 2); + +struct ChainSubRule { + /* TODO */ + + private: + USHORT backtrackGlyphCount; /* Total number of glyphs in the + * backtrack sequence (number of + * glyphs to be matched before the + * first glyph) */ + GlyphID backtrack[]; /* Array of backtracking GlyphID's + * (to be matched before the input + * sequence) */ + USHORT inputGlyphCount; /* Total number of glyphs in the input + * sequence (includes the first glyph) */ + GlyphID input[]; /* Array of input GlyphIDs (start with + * second glyph) */ + USHORT lookaheadGlyphCount; /* Total number of glyphs in the look + * ahead sequence (number of glyphs to + * be matched after the input sequence) */ + GlyphID lookAhead[]; /* Array of lookahead GlyphID's (to be + * matched after the input sequence) */ + USHORT substCount; /* Number of SubstLookupRecords */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order) */ +}; +DEFINE_NULL_ASSERT_SIZE (ChainSubRule, 8); + +struct ChainContextSubstFormat2 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 2 */ + Offset coverage; /* Offset to Coverage table--from + * beginning of Substitution table */ + Offset backtrackClassDef; /* Offset to glyph ClassDef table + * containing backtrack sequence + * data--from beginning of Substitution + * table */ + Offset inputClassDef; /* Offset to glyph ClassDef + * table containing input sequence + * data--from beginning of Substitution + * table */ + Offset lookaheadClassDef; /* Offset to glyph ClassDef table + * containing lookahead sequence + * data--from beginning of Substitution + * table */ + USHORT chainSubClassSetCnt; /* Number of ChainSubClassSet tables */ + Offset chainSubClassSet[]; /* Array of offsets to ChainSubClassSet + * tables--from beginning of + * Substitution table--ordered by input + * class--may be NULL */ +}; +ASSERT_SIZE (ChainContextSubstFormat2, 12); + +struct ChainSubClassSet { + /* TODO */ + + private: + USHORT chainSubClassRuleCnt; /* Number of ChainSubClassRule tables */ + Offset chainSubClassRule[]; /* Array of offsets + * to ChainSubClassRule + * tables--from beginning of + * ChainSubClassSet--ordered by + * preference */ +}; +DEFINE_NULL_ASSERT_SIZE (ChainSubClassSet, 2); + +struct ChainSubClassRule { + /* TODO */ + + private: + USHORT backtrackGlyphCount; /* Total number of glyphs in the + * backtrack sequence (number of + * glyphs to be matched before the + * first glyph) */ + USHORT backtrack[]; /* Array of backtracking classes(to be + * matched before the input sequence) */ + USHORT inputGlyphCount; /* Total number of classes in the input + * sequence (includes the first class) */ + USHORT input[]; /* Array of input classes(start with + * second class; to be matched with + * the input glyph sequence) */ + USHORT lookaheadGlyphCount; /* Total number of classes in the + * look ahead sequence (number of + * classes to be matched after the + * input sequence) */ + USHORT lookAhead[]; /* Array of lookahead classes(to be + * matched after the input sequence) */ + USHORT substCount; /* Number of SubstLookupRecords */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order) */ +}; +DEFINE_NULL_ASSERT_SIZE (ChainSubClassRule, 8); + +struct ChainContextSubstFormat3 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 3 */ + USHORT backtrackGlyphCount; /* Number of glyphs in the backtracking + * sequence */ + Offset backtrackCoverage[]; /* Array of offsets to coverage tables + * in backtracking sequence, in glyph + * sequence order */ + USHORT inputGlyphCount; /* Number of glyphs in input sequence */ + Offset inputCoverage[]; /* Array of offsets to coverage + * tables in input sequence, in glyph + * sequence order */ + USHORT lookaheadGlyphCount; /* Number of glyphs in lookahead + * sequence */ + Offset lookaheadCoverage[]; /* Array of offsets to coverage tables + * in lookahead sequence, in glyph + * sequence order */ + USHORT substCount; /* Number of SubstLookupRecords */ + SubstLookupRecord substLookupRecord[];/* Array of SubstLookupRecords--in + * design order */ +}; +ASSERT_SIZE (ChainContextSubstFormat3, 10); + +struct ExtensionSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier. Set to 1. */ + USHORT extensionLookupType; /* Lookup type of subtable referenced + * by ExtensionOffset (i.e. the + * extension subtable). */ + ULONG extensionOffset; /* Offset to the extension subtable, + * of lookup type subtable. */ +}; +ASSERT_SIZE (ExtensionSubstFormat1, 8); + +struct ReverseChainSingleSubstFormat1 { + /* TODO */ + + private: + USHORT substFormat; /* Format identifier--format = 1 */ + Offset coverage; /* Offset to Coverage table -- from + * beginning of Substitution table */ + USHORT backtrackGlyphCount; /* Number of glyphs in the backtracking + * sequence */ + Offset backtrackCoverage[]; /* Array of offsets to coverage tables + * in backtracking sequence, in glyph + * sequence order */ + USHORT lookaheadGlyphCount; /* Number of glyphs in lookahead + * sequence */ + Offset lookaheadCoverage[]; /* Array of offsets to coverage tables + * in lookahead sequence, in glyph + * sequence order */ + USHORT glyphCount; /* Number of GlyphIDs in the Substitute + * array */ + GlyphID substitute[]; /* Array of substitute + * GlyphIDs--ordered by Coverage Index */ +}; +ASSERT_SIZE (ReverseChainSingleSubstFormat1, 10); + +#endif /* HB_OT_LAYOUT_GSUB_PRIVATE_H */ diff --git a/src/hb-ot-layout-open-private.h b/src/hb-ot-layout-open-private.h index bcd50e7..9cdb6e2 100644 --- a/src/hb-ot-layout-open-private.h +++ b/src/hb-ot-layout-open-private.h @@ -30,6 +30,7 @@ #include "hb-private.h" #include "hb-ot-layout.h" + /* * Int types */ @@ -335,6 +336,7 @@ DEFINE_NULL_ALIAS (OpenTypeFontFace, OffsetTable); struct TTCHeader { /* OpenTypeFontFaces, in no particular order */ DEFINE_OFFSET_ARRAY_TYPE (OffsetTable, offsetTable, numFonts); + /* XXX check version here */ private: Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ @@ -794,6 +796,7 @@ typedef struct GSUBGPOSHeader { static const hb_tag_t GPOSTag = HB_TAG ('G','P','O','S'); STATIC_DEFINE_GET_FOR_DATA (GSUBGPOSHeader); + /* XXX check version here */ DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list, get_script(i) */ DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list, get_feature(i) */ diff --git a/src/main.cc b/src/main.cc index 1efca5d..a670959 100644 --- a/src/main.cc +++ b/src/main.cc @@ -26,6 +26,7 @@ #include "hb-ot-layout-open-private.h" #include "hb-ot-layout-gdef-private.h" +#include "hb-ot-layout-gsub-private.h" #include #include -- 2.7.4