[pango/harfbuzz-ng] [GSUB] Implement ReverseChainSingleSubst
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng] [GSUB] Implement ReverseChainSingleSubst
- Date: Mon, 18 May 2009 05:50:27 -0400 (EDT)
commit bba893b810b14c4e6bfc8cfded697fbe28282d35
Author: Behdad Esfahbod <behdad behdad org>
Date: Mon May 18 05:47:47 2009 -0400
[GSUB] Implement ReverseChainSingleSubst
GSUB is done!
---
pango/opentype/hb-ot-layout-gsub-private.h | 55 ++++++++++++++++++------
pango/opentype/hb-ot-layout-gsubgpos-private.h | 43 ++++++-------------
2 files changed, 54 insertions(+), 44 deletions(-)
diff --git a/pango/opentype/hb-ot-layout-gsub-private.h b/pango/opentype/hb-ot-layout-gsub-private.h
index dd929c0..da31a70 100644
--- a/pango/opentype/hb-ot-layout-gsub-private.h
+++ b/pango/opentype/hb-ot-layout-gsub-private.h
@@ -540,29 +540,56 @@ ASSERT_SIZE (ExtensionSubst, 2);
struct ReverseChainSingleSubstFormat1 {
- /* TODO */
+
+ friend struct ReverseChainSingleSubst;
+
+ private:
inline bool substitute (LOOKUP_ARGS_DEF) const {
+
+ if (HB_UNLIKELY (context_length != NO_CONTEXT))
+ return false; /* No chaining to this type */
+
+ unsigned int index = (this+coverage) (IN_CURGLYPH ());
+ if (HB_LIKELY (index == NOT_COVERED))
+ return false;
+
+ const OffsetArrayOf<Coverage> &lookahead = * (const OffsetArrayOf<Coverage> *)
+ ((const char *) &backtrack + backtrack.get_size ());
+ const ArrayOf<GlyphID> &substitute = * (const ArrayOf<GlyphID> *)
+ ((const char *) &lookahead + lookahead.get_size ());
+
+ if (match_backtrack (LOOKUP_ARGS,
+ backtrack.len, (USHORT *) backtrack.array,
+ match_coverage, (char *) this) &&
+ match_lookahead (LOOKUP_ARGS,
+ lookahead.len, (USHORT *) lookahead.array,
+ match_coverage, (char *) this,
+ 1))
+ {
+ IN_CURGLYPH() = substitute[index];
+ buffer->in_pos--; /* Reverse! */
+ return true;
+ }
+
return false;
}
private:
USHORT format; /* 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
+ OffsetTo<Coverage>
+ coverage; /* Offset to Coverage table--from
+ * beginning of table */
+ OffsetArrayOf<Coverage>
+ backtrack; /* Array of 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
+ OffsetArrayOf<Coverage>
+ lookaheadX; /* Array of coverage tables
+ * in lookahead sequence, in glyph
* sequence order */
- USHORT glyphCount; /* Number of GlyphIDs in the Substitute
- * array */
- GlyphID substituteGlyphs[]; /* Array of substitute
- * GlyphIDs--ordered by Coverage Index */
+ ArrayOf<GlyphID>
+ substituteX; /* Array of substitute
+ * GlyphIDs--ordered by Coverage Index */
};
ASSERT_SIZE (ReverseChainSingleSubstFormat1, 10);
diff --git a/pango/opentype/hb-ot-layout-gsubgpos-private.h b/pango/opentype/hb-ot-layout-gsubgpos-private.h
index 15d48bd..5e36a1f 100644
--- a/pango/opentype/hb-ot-layout-gsubgpos-private.h
+++ b/pango/opentype/hb-ot-layout-gsubgpos-private.h
@@ -221,11 +221,6 @@ static inline bool context_lookup (LOOKUP_ARGS_DEF,
const LookupRecord lookupRecord[],
ContextLookupContext &context)
{
- /* First guess */
- if (HB_UNLIKELY (buffer->in_pos + inputCount > buffer->in_length ||
- inputCount > context_length))
- return false;
-
return match_input (LOOKUP_ARGS,
inputCount, input,
context.funcs.match, context.match_data,
@@ -246,10 +241,8 @@ struct Rule {
((const char *) input +
sizeof (input[0]) * (inputCount ? inputCount - 1 : 0));
return context_lookup (LOOKUP_ARGS,
- inputCount,
- input,
- lookupCount,
- lookupRecord,
+ inputCount, input,
+ lookupCount, lookupRecord,
context);
}
@@ -374,10 +367,8 @@ struct ContextFormat3 {
(char *) this
};
return context_lookup (LOOKUP_ARGS,
- glyphCount,
- (const USHORT *) (coverage + 1),
- lookupCount,
- lookupRecord,
+ glyphCount, (const USHORT *) (coverage + 1),
+ lookupCount, lookupRecord,
context);
}
@@ -473,14 +464,10 @@ struct ChainRule {
const ArrayOf<LookupRecord> &lookup = * (const ArrayOf<LookupRecord> *)
((const char *) &lookahead + lookahead.get_size ());
return chain_context_lookup (LOOKUP_ARGS,
- backtrack.len,
- backtrack.array,
- input.len,
- input.array + 1,
- lookahead.len,
- lookahead.array,
- lookup.len,
- lookup.array,
+ backtrack.len, backtrack.array,
+ input.len, input.array + 1,
+ lookahead.len, lookahead.array,
+ lookup.len, lookup.array,
context);
return false;
}
@@ -623,7 +610,7 @@ struct ChainContextFormat3 {
return false;
const OffsetArrayOf<Coverage> &lookahead = * (const OffsetArrayOf<Coverage> *)
- ((const char *) &input + input.get_size ());
+ ((const char *) &input + input.get_size ());
const ArrayOf<LookupRecord> &lookup = * (const ArrayOf<LookupRecord> *)
((const char *) &lookahead + lookahead.get_size ());
struct ChainContextLookupContext context = {
@@ -631,14 +618,10 @@ struct ChainContextFormat3 {
{(char *) this, (char *) this, (char *) this}
};
return chain_context_lookup (LOOKUP_ARGS,
- backtrack.len,
- (USHORT *) backtrack.array,
- input.len,
- (USHORT *) input.array,
- lookahead.len,
- (USHORT *) lookahead.array,
- lookup.len,
- lookup.array,
+ backtrack.len, (USHORT *) backtrack.array,
+ input.len, (USHORT *) input.array,
+ lookahead.len, (USHORT *) lookahead.array,
+ lookup.len, lookup.array,
context);
return false;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]