From 5c6f5982d78e2d7fadc2fbb8b4f3a4be9420c59a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 21 Jul 2011 11:31:08 -0400 Subject: [PATCH] Towards normalization --- src/hb-ot-shape-normalize.cc | 33 ++++++++++++++++++++++----------- src/hb-ot-shape-private.hh | 3 ++- src/hb-ot-shape.cc | 4 +++- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc index 6d55a30..f6e962c 100644 --- a/src/hb-ot-shape-normalize.cc +++ b/src/hb-ot-shape-normalize.cc @@ -28,32 +28,41 @@ HB_BEGIN_DECLS -static void -handle_single_char_cluster (hb_ot_shape_context_t *c, - unsigned int i) +static bool +get_glyph (hb_ot_shape_context_t *c, unsigned int i) { hb_buffer_t *b = c->buffer; - hb_codepoint_t glyph; - if (hb_font_get_glyph (c->font, b->info[i].codepoint, 0, &glyph)) - return; + return hb_font_get_glyph (c->font, b->info[i].codepoint, 0, &b->info[i].intermittent_glyph()); +} + +static bool +handle_single_char_cluster (hb_ot_shape_context_t *c, + unsigned int i) +{ + if (get_glyph (c, i)) + return FALSE; /* Decompose */ + + return FALSE; } -static void +static bool handle_multi_char_cluster (hb_ot_shape_context_t *c, unsigned int i, unsigned int end) { /* If there's a variation-selector, give-up, it's just too hard. */ + return FALSE; } -void +bool _hb_normalize (hb_ot_shape_context_t *c) { hb_buffer_t *b = c->buffer; - + bool changed = FALSE; + unsigned int count = b->len; for (unsigned int i = 0; i < count;) { unsigned int end; @@ -61,11 +70,13 @@ _hb_normalize (hb_ot_shape_context_t *c) if (b->info[i].cluster != b->info[end].cluster) break; if (i + 1 == end) - handle_single_char_cluster (c, i); + changed |= handle_single_char_cluster (c, i); else - handle_multi_char_cluster (c, i, end); + changed |= handle_multi_char_cluster (c, i, end); i = end; } + + return changed; } HB_END_DECLS diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh index d64178a..03dd4ed 100644 --- a/src/hb-ot-shape-private.hh +++ b/src/hb-ot-shape-private.hh @@ -100,8 +100,9 @@ is_variation_selector (hb_codepoint_t unicode) } -HB_INTERNAL void _hb_normalize (hb_ot_shape_context_t *c); +HB_INTERNAL bool _hb_normalize (hb_ot_shape_context_t *c); +#define intermittent_glyph() var2.u32 HB_END_DECLS diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 50f2986..939bf4f 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -365,7 +365,9 @@ hb_ot_shape_execute_internal (hb_ot_shape_context_t *c) hb_ensure_native_direction (c); - _hb_normalize (c); + if (_hb_normalize (c)) + /* Buffer contents changed, reset unicode_props */ + hb_set_unicode_props (c); /* BUFFER: Set general_category and combining_class in var1 */ hb_ot_shape_setup_masks (c); /* BUFFER: Clobbers var2 */ -- 2.7.4