[pango/harfbuzz-ng: 11/17] [GSUB] Towards Context subtitutes
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng: 11/17] [GSUB] Towards Context subtitutes
- Date: Tue, 12 May 2009 03:31:13 -0400 (EDT)
commit 5e2e37cbbb7612f595b9c8af72fe4709b2386857
Author: Behdad Esfahbod <behdad behdad org>
Date: Wed May 6 00:12:29 2009 -0400
[GSUB] Towards Context subtitutes
---
pango/opentype/hb-ot-layout-gsub-private.h | 137 ++++++++++++++++++++++------
1 files changed, 108 insertions(+), 29 deletions(-)
diff --git a/pango/opentype/hb-ot-layout-gsub-private.h b/pango/opentype/hb-ot-layout-gsub-private.h
index f697036..4b6aa16 100644
--- a/pango/opentype/hb-ot-layout-gsub-private.h
+++ b/pango/opentype/hb-ot-layout-gsub-private.h
@@ -578,24 +578,32 @@ struct SubstLookupRecord {
};
DEFINE_NULL_ASSERT_SIZE (SubstLookupRecord, 4);
-struct ContextSubstFormat1 {
- /* TODO */
+struct SubRule {
+
+ friend struct SubRuleSet;
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 */
+ DEFINE_ARRAY_TYPE (GlyphID, input, (glyphCount ? glyphCount - 1 : 0));
+ /* XXX */
+
+ 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 */
};
-ASSERT_SIZE (ContextSubstFormat1, 6);
+DEFINE_NULL_ASSERT_SIZE (SubRule, 4);
struct SubRuleSet {
- /* TODO */
+
+ friend struct ChainSubstFormat1;
+
+ private:
+ DEFINE_OFFSET_ARRAY_TYPE (SubRule, subRule, subRuleCount);
private:
USHORT subRuleCount; /* Number of SubRule tables */
@@ -605,23 +613,52 @@ struct SubRuleSet {
};
DEFINE_NULL_ASSERT_SIZE (SubRuleSet, 2);
-struct SubRule {
- /* TODO */
+struct ContextSubstFormat1 {
+
+ friend struct ContextSubst;
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 */
+ /* SubRuleSet tables, in Coverage Index order */
+ DEFINE_OFFSET_ARRAY_TYPE (SubRuleSet, subRuleSet, subRuleSetCount);
+ DEFINE_GET_ACCESSOR (Coverage, coverage, coverage);
+ DEFINE_GET_GLYPH_COVERAGE (glyph_coverage);
+
+ inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+
+ unsigned int property;
+ if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
+ return false;
+
+ hb_codepoint_t glyph_id = IN_CURGLYPH ();
+
+ unsigned int index = get_glyph_coverage (glyph_id);
+
+ //const SubRuleSet &lig_set = (*this)[index];
+ //return lig_set.substitute_ligature (SUBTABLE_SUBSTITUTE_ARGS, first_is_mark);
+ }
+
+ 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 */
};
-DEFINE_NULL_ASSERT_SIZE (SubRule, 4);
+ASSERT_SIZE (ContextSubstFormat1, 6);
struct ContextSubstFormat2 {
- /* TODO */
+
+ friend struct ContextSubst;
+
+ private:
+
+ inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+ return false;
+ }
private:
USHORT substFormat; /* Format identifier--format = 2 */
@@ -665,7 +702,14 @@ struct SubClassRule {
DEFINE_NULL_ASSERT_SIZE (SubClassRule, 4);
struct ContextSubstFormat3 {
- /* TODO */
+
+ friend struct ContextSubst;
+
+ private:
+
+ inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+ return false;
+ }
private:
USHORT substFormat; /* Format identifier--format = 3 */
@@ -681,6 +725,41 @@ struct ContextSubstFormat3 {
};
ASSERT_SIZE (ContextSubstFormat3, 6);
+struct ContextSubst {
+
+ friend struct SubstLookupSubTable;
+
+ private:
+
+ unsigned int get_size (void) const {
+ switch (u.substFormat) {
+ case 1: return sizeof (u.format1);
+ case 2: return sizeof (u.format2);
+ case 3: return sizeof (u.format3);
+ default:return sizeof (u.substFormat);
+ }
+ }
+
+ inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+ switch (u.substFormat) {
+ case 1: return u.format1.substitute (SUBTABLE_SUBSTITUTE_ARGS);
+ case 2: return u.format2.substitute (SUBTABLE_SUBSTITUTE_ARGS);
+ case 3: return u.format3.substitute (SUBTABLE_SUBSTITUTE_ARGS);
+ default:return false;
+ }
+ }
+
+ private:
+ union {
+ USHORT substFormat; /* Format identifier */
+ ContextSubstFormat1 format1;
+ ContextSubstFormat2 format2;
+ ContextSubstFormat3 format3;
+ } u;
+};
+DEFINE_NULL (ContextSubst, 2);
+
+
struct ChainContextSubstFormat1 {
/* TODO */
@@ -935,8 +1014,8 @@ struct SubstLookupSubTable {
case GSUB_Multiple: return u.multiple.get_size ();
case GSUB_Alternate: return u.alternate.get_size ();
case GSUB_Ligature: return u.ligature.get_size ();
- /*
case GSUB_Context:
+ /*
case GSUB_ChainingContext:
*/
case GSUB_Extension: return u.extension.get_size ();
@@ -954,8 +1033,8 @@ struct SubstLookupSubTable {
case GSUB_Multiple: return u.multiple.substitute (SUBTABLE_SUBSTITUTE_ARGS);
case GSUB_Alternate: return u.alternate.substitute (SUBTABLE_SUBSTITUTE_ARGS);
case GSUB_Ligature: return u.ligature.substitute (SUBTABLE_SUBSTITUTE_ARGS);
- /*
case GSUB_Context: return u.context.substitute (SUBTABLE_SUBSTITUTE_ARGS);
+ /*
case GSUB_ChainingContext: return u.chainingContext.substitute (SUBTABLE_SUBSTITUTE_ARGS);
*/
case GSUB_Extension: return u.extension.substitute (SUBTABLE_SUBSTITUTE_ARGS);
@@ -973,8 +1052,8 @@ struct SubstLookupSubTable {
MultipleSubst multiple;
AlternateSubst alternate;
LigatureSubst ligature;
- /*
ContextSubst context;
+ /*
ChainingContextSubst chainingContext;
*/
ExtensionSubst extension;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]