[pango/harfbuzz-ng] [GSUB] Finish ContextSubstFormat1
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng] [GSUB] Finish ContextSubstFormat1
- Date: Sun, 17 May 2009 19:48:30 -0400 (EDT)
commit 761d13a4ead9b627bbfa561ffbb667b6a5704a5e
Author: Behdad Esfahbod <behdad behdad org>
Date: Fri May 15 18:54:53 2009 -0400
[GSUB] Finish ContextSubstFormat1
---
pango/opentype/hb-ot-layout-gsub-private.h | 77 +++++++++++++++++++++------
pango/opentype/hb-ot-layout-private.h | 14 +++++
pango/opentype/hb-ot-layout.cc | 13 -----
3 files changed, 74 insertions(+), 30 deletions(-)
diff --git a/pango/opentype/hb-ot-layout-gsub-private.h b/pango/opentype/hb-ot-layout-gsub-private.h
index 568f14d..2bf1e9f 100644
--- a/pango/opentype/hb-ot-layout-gsub-private.h
+++ b/pango/opentype/hb-ot-layout-gsub-private.h
@@ -539,6 +539,13 @@ DEFINE_NULL (LigatureSubst, 2);
struct SubstLookupRecord {
+
+ friend struct SubRule;
+
+ private:
+ inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const;
+
+ private:
USHORT sequenceIndex; /* Index into current glyph
* sequence--first glyph = 0 */
USHORT lookupListIndex; /* Lookup to apply to that
@@ -563,6 +570,9 @@ struct SubRule {
context_length < count))
return false; /* Not enough glyphs in input or context */
+ /* XXX context_length should also be checked when skipping glyphs, right?
+ * What does context_length really mean, anyway? */
+
for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) {
while (!_hb_ot_layout_check_glyph_property (layout, IN_ITEM (j), lookup_flag, &property)) {
if (HB_UNLIKELY (j + count - i == buffer->in_length))
@@ -574,12 +584,35 @@ struct SubRule {
return false;
}
- /*
- return Do_ContextSubst( gsub, sr[k].GlyphCount,
- sr[k].SubstCount, sr[k].SubstLookupRecord,
- buffer,
- nesting_level );
- */
+ /* XXX right? or j - buffer_inpos? */
+ context_length = count;
+
+ unsigned int subst_count = substCount;
+ const SubstLookupRecord *subst = (const SubstLookupRecord *) ((const char *) input + sizeof (input[0]) * glyphCount);
+ for (i = 0; i < count;)
+ {
+ if ( subst_count && i == subst->sequenceIndex )
+ {
+ unsigned int old_pos = buffer->in_pos;
+
+ /* Do a substitution */
+ bool done = subst->substitute (SUBTABLE_SUBSTITUTE_ARGS);
+
+ subst++;
+ subst_count--;
+ i += buffer->in_pos - old_pos;
+
+ if (!done)
+ goto no_subst;
+ }
+ else
+ {
+ no_subst:
+ /* No substitution for this index */
+ _hb_buffer_copy_output_glyph (buffer);
+ i++;
+ }
+ }
}
@@ -1038,17 +1071,6 @@ struct SubstLookupSubTable {
};
-/* Out-of-class implementation for methods chaining */
-
-inline bool ExtensionSubstFormat1::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
- /* XXX either check in sanitize or here that the lookuptype is not 7 again,
- * or we can loop indefinitely. */
- return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (SUBTABLE_SUBSTITUTE_ARGS,
- get_type ());
-}
-
-
-
struct SubstLookup : Lookup {
inline const SubstLookupSubTable& get_subtable (unsigned int i) const {
@@ -1140,6 +1162,7 @@ struct SubstLookup : Lookup {
};
DEFINE_NULL_ALIAS (SubstLookup, Lookup);
+
/*
* GSUB
*/
@@ -1159,4 +1182,24 @@ struct GSUB : GSUBGPOS {
DEFINE_NULL_ALIAS (GSUB, GSUBGPOS);
+
+
+/* Out-of-class implementation for methods chaining */
+
+inline bool ExtensionSubstFormat1::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+ /* XXX either check in sanitize or here that the lookuptype is not 7 again,
+ * or we can loop indefinitely. */
+ return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (SUBTABLE_SUBSTITUTE_ARGS,
+ get_type ());
+}
+
+inline bool SubstLookupRecord::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+ const GSUB &gsub = *(layout->gsub);
+ const SubstLookup &l = gsub.get_lookup (lookupListIndex);
+
+ return l.substitute_once (layout, buffer, context_length, nesting_level_left);
+}
+
+
+
#endif /* HB_OT_LAYOUT_GSUB_PRIVATE_H */
diff --git a/pango/opentype/hb-ot-layout-private.h b/pango/opentype/hb-ot-layout-private.h
index c152edc..d7809d1 100644
--- a/pango/opentype/hb-ot-layout-private.h
+++ b/pango/opentype/hb-ot-layout-private.h
@@ -36,6 +36,20 @@
typedef unsigned int hb_ot_layout_class_t;
+struct _hb_ot_layout_t {
+ const struct GDEF *gdef;
+ const struct GSUB *gsub;
+ const struct /*XXX*/GSUBGPOS *gpos;
+
+ struct {
+ unsigned char *klasses;
+ unsigned int len;
+ } new_gdef;
+
+ /* TODO add max-nesting-level here? */
+};
+
+
/* XXX #define HB_OT_LAYOUT_INTERNAL static */
#define HB_OT_LAYOUT_INTERNAL
diff --git a/pango/opentype/hb-ot-layout.cc b/pango/opentype/hb-ot-layout.cc
index 6b7d47b..0cbc1bf 100644
--- a/pango/opentype/hb-ot-layout.cc
+++ b/pango/opentype/hb-ot-layout.cc
@@ -42,19 +42,6 @@
#include <string.h>
-struct _hb_ot_layout_t {
- const GDEF *gdef;
- const GSUB *gsub;
- const /*XXX*/GSUBGPOS *gpos;
-
- struct {
- unsigned char *klasses;
- unsigned int len;
- } new_gdef;
-
- /* TODO add max-nesting-level here? */
-};
-
hb_ot_layout_t *
hb_ot_layout_create (void)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]