[pango/harfbuzz-ng] [HB] One more step to go, for fully working GSUB and ChainContext
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng] [HB] One more step to go, for fully working GSUB and ChainContext
- Date: Mon, 18 May 2009 05:49:32 -0400 (EDT)
commit e1b4d68c0d4a6cf656288ba5d88419ce4b914228
Author: Behdad Esfahbod <behdad behdad org>
Date: Mon May 18 02:47:57 2009 -0400
[HB] One more step to go, for fully working GSUB and ChainContext
---
pango/opentype/hb-ot-layout-gsubgpos-private.h | 107 ++++++++++++++----------
1 files changed, 61 insertions(+), 46 deletions(-)
diff --git a/pango/opentype/hb-ot-layout-gsubgpos-private.h b/pango/opentype/hb-ot-layout-gsubgpos-private.h
index 6a35bc6..72df46c 100644
--- a/pango/opentype/hb-ot-layout-gsubgpos-private.h
+++ b/pango/opentype/hb-ot-layout-gsubgpos-private.h
@@ -168,12 +168,9 @@ static inline bool context_lookup (LOOKUP_ARGS_DEF,
USHORT inputCount, /* Including the first glyph (not matched) */
const USHORT input[], /* Array of input values--start with second glyph */
USHORT lookupCount,
- const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+ const LookupRecord lookupRecord[],
ContextLookupContext &context)
{
- unsigned int i, j;
- unsigned int count = inputCount;
-
return match_input (LOOKUP_ARGS,
inputCount, input,
context.funcs.match, context.match_data,
@@ -308,8 +305,12 @@ struct ContextFormat3 {
friend struct Context;
private:
+ inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
+
+ unsigned int index = (this+coverage[0]) (IN_CURGLYPH ());
+ if (G_LIKELY (index == NOT_COVERED))
+ return false;
- inline bool apply_coverage (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
const LookupRecord *lookupRecord = (const LookupRecord *)
((const char *) coverage +
sizeof (coverage[0]) * glyphCount);
@@ -325,15 +326,6 @@ struct ContextFormat3 {
context);
}
- inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
-
- unsigned int index = (this+coverage[0]) (IN_CURGLYPH ());
- if (G_LIKELY (index == NOT_COVERED))
- return false;
-
- return apply_coverage (LOOKUP_ARGS, apply_func);
- }
-
private:
USHORT format; /* Format identifier--format = 3 */
USHORT glyphCount; /* Number of glyphs in the input glyph
@@ -377,6 +369,26 @@ struct ChainContextLookupContext {
char *match_data[3];
};
+static inline bool chain_context_lookup (LOOKUP_ARGS_DEF,
+ USHORT backtrackCount,
+ const USHORT backtrack[],
+ USHORT inputCount, /* Including the first glyph (not matched) */
+ const USHORT input[], /* Array of input values--start with second glyph */
+ USHORT lookaheadCount,
+ const USHORT lookahead[],
+ USHORT lookupCount,
+ const LookupRecord lookupRecord[],
+ ChainContextLookupContext &context)
+{
+ return match_input (LOOKUP_ARGS,
+ inputCount, input,
+ context.funcs.match, context.match_data[1],
+ &context_length) &&
+ apply_lookup (LOOKUP_ARGS,
+ inputCount,
+ lookupCount, lookupRecord,
+ context.funcs.apply);
+}
struct ChainRule {
@@ -388,15 +400,18 @@ struct ChainRule {
((const char *) &backtrack + backtrack.get_size ());
const ArrayOf<USHORT> &lookahead = * (const ArrayOf<USHORT> *)
((const char *) &input + input.get_size ());
- const LookupRecord &lookupRecord = * (const LookupRecord *)
- ((const char *) &lookahead + lookahead.get_size ());
-// XXXXXXXXXXXXXXXXXX
-// return context_lookup (LOOKUP_ARGS,
-// inputCount,
-// input,
-// lookupCount,
-// record,
-// context);
+ 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,
+ context);
return false;
}
@@ -413,7 +428,7 @@ struct ChainRule {
lookaheadX; /* Array of lookahead values's (to be
* matched after the input sequence) */
ArrayOf<LookupRecord>
- lookupRecordX; /* Array of LookupRecords--in
+ lookupX; /* Array of LookupRecords--in
* design order) */
};
ASSERT_SIZE (ChainRule, 8);
@@ -526,38 +541,38 @@ struct ChainContextFormat3 {
private:
inline bool apply_coverage (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
+ }
+
+ inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
+
const OffsetArrayOf<Coverage> &input = * (const OffsetArrayOf<Coverage> *)
((const char *) &backtrack + backtrack.get_size ());
+
+ unsigned int index = (this+input[0]) (IN_CURGLYPH ());
+ if (G_LIKELY (index == NOT_COVERED))
+ return false;
+
const OffsetArrayOf<Coverage> &lookahead = * (const OffsetArrayOf<Coverage> *)
((const char *) &input + input.get_size ());
- const LookupRecord &lookupRecord = * (const LookupRecord *)
- ((const char *) &lookahead + lookahead.get_size ());
+ const ArrayOf<LookupRecord> &lookup = * (const ArrayOf<LookupRecord> *)
+ ((const char *) &lookahead + lookahead.get_size ());
struct ChainContextLookupContext context = {
{match_coverage, apply_func},
{(char *) this, (char *) this, (char *) this}
};
- /*
- XXXXXXXXXXXXXXXXXXXXX
- return context_lookup (LOOKUP_ARGS,
- glyphCount,
- (const USHORT *) (coverage + 1),
- lookupCount,
- record,
- context);
- */
+ 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,
+ context);
return false;
}
- inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
-
- /* XXX */
- unsigned int index = 0;//(this+coverage[0]) (IN_CURGLYPH ());
- if (G_LIKELY (index == NOT_COVERED))
- return false;
-
- return apply_coverage (LOOKUP_ARGS, apply_func);
- }
-
private:
USHORT format; /* Format identifier--format = 3 */
OffsetArrayOf<Coverage>
@@ -573,7 +588,7 @@ struct ChainContextFormat3 {
* in lookahead sequence, in glyph
* sequence order */
ArrayOf<LookupRecord>
- lookupRecordX; /* Array of LookupRecords--in
+ lookupX; /* Array of LookupRecords--in
* design order) */
};
ASSERT_SIZE (ChainContextFormat3, 10);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]