[pango/harfbuzz-ng] [HB] Further modularize Context matching
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng] [HB] Further modularize Context matching
- Date: Mon, 18 May 2009 05:49:27 -0400 (EDT)
commit 21be5dfef4033ecd5e7c0f69fc2ca0038e2a8ea1
Author: Behdad Esfahbod <behdad behdad org>
Date: Mon May 18 02:36:18 2009 -0400
[HB] Further modularize Context matching
---
pango/opentype/hb-ot-layout-gsubgpos-private.h | 92 ++++++++++++++++--------
1 files changed, 63 insertions(+), 29 deletions(-)
diff --git a/pango/opentype/hb-ot-layout-gsubgpos-private.h b/pango/opentype/hb-ot-layout-gsubgpos-private.h
index 0a7281d..6a35bc6 100644
--- a/pango/opentype/hb-ot-layout-gsubgpos-private.h
+++ b/pango/opentype/hb-ot-layout-gsubgpos-private.h
@@ -55,6 +55,7 @@ struct ContextFuncs {
apply_lookup_func_t apply;
};
+
static inline bool match_glyph (hb_codepoint_t glyph_id, const USHORT &value, char *data) {
return glyph_id == value;
}
@@ -69,30 +70,14 @@ static inline bool match_coverage (hb_codepoint_t glyph_id, const USHORT &value,
return (data+coverage) (glyph_id) != NOT_COVERED;
}
-struct LookupRecord {
-
- USHORT sequenceIndex; /* Index into current glyph
- * sequence--first glyph = 0 */
- USHORT lookupListIndex; /* Lookup to apply to that
- * position--zero--based */
-};
-ASSERT_SIZE (LookupRecord, 4);
-
-
-/* Contextual lookups */
-
-struct ContextLookupContext {
- ContextFuncs funcs;
- char *match_data;
-};
-
-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 */
- ContextLookupContext &context) {
+static inline bool match_input (LOOKUP_ARGS_DEF,
+ USHORT inputCount, /* Including the first glyph (not matched) */
+ const USHORT input[], /* Array of input values--start with second glyph */
+ match_func_t match_func,
+ char *match_data,
+ unsigned int *context_length_out)
+{
unsigned int i, j;
unsigned int count = inputCount;
@@ -110,26 +95,47 @@ static inline bool context_lookup (LOOKUP_ARGS_DEF,
j++;
}
- if (HB_LIKELY (context.funcs.match (IN_GLYPH(j), input[i - 1], context.match_data)))
+ if (HB_LIKELY (match_func (IN_GLYPH(j), input[i - 1], match_data)))
return false;
}
/* XXX right? or j - buffer_inpos? */
- context_length = count;
+ *context_length_out = count;
+
+ return true;
+}
+
+
+struct LookupRecord {
+
+ USHORT sequenceIndex; /* Index into current glyph
+ * sequence--first glyph = 0 */
+ USHORT lookupListIndex; /* Lookup to apply to that
+ * position--zero--based */
+};
+ASSERT_SIZE (LookupRecord, 4);
+
+static inline bool apply_lookup (LOOKUP_ARGS_DEF,
+ USHORT inputCount, /* Including the first glyph */
+ USHORT lookupCount,
+ const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+ apply_lookup_func_t apply_func)
+{
+ unsigned int count = inputCount;
+ unsigned int record_count = lookupCount;
+ const LookupRecord *record = lookupRecord;
/* XXX We have to jump non-matching glyphs when applying too, right? */
/* XXX We don't support lookupRecord arrays that are not increasing:
* Should be easy for in_place ones at least. */
- unsigned int record_count = lookupCount;
- const LookupRecord *record = lookupRecord;
- for (i = 0; i < count;)
+ for (unsigned int i = 0; i < count;)
{
if (record_count && i == record->sequenceIndex)
{
unsigned int old_pos = buffer->in_pos;
/* Apply a lookup */
- bool done = context.funcs.apply (LOOKUP_ARGS, record->lookupListIndex);
+ bool done = apply_func (LOOKUP_ARGS, record->lookupListIndex);
record++;
record_count--;
@@ -150,6 +156,34 @@ static inline bool context_lookup (LOOKUP_ARGS_DEF,
return true;
}
+
+/* Contextual lookups */
+
+struct ContextLookupContext {
+ ContextFuncs funcs;
+ char *match_data;
+};
+
+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 */
+ ContextLookupContext &context)
+{
+ unsigned int i, j;
+ unsigned int count = inputCount;
+
+ return match_input (LOOKUP_ARGS,
+ inputCount, input,
+ context.funcs.match, context.match_data,
+ &context_length) &&
+ apply_lookup (LOOKUP_ARGS,
+ inputCount,
+ lookupCount, lookupRecord,
+ context.funcs.apply);
+}
+
struct Rule {
friend struct RuleSet;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]