src/hb-ot-shape-fallback-private.hh | 5 + src/hb-ot-shape-fallback.cc | 98 +++++++++++++++++++++++++++--------- src/hb-ot-shape-private.hh | 6 ++ src/hb-ot-shape.cc | 4 + 4 files changed, 90 insertions(+), 23 deletions(-)
New commits: commit 1d581ec384bc1780995e32e1c44103af57596eda Author: Behdad Esfahbod <[email protected]> Date: Sat Sep 1 20:06:26 2012 -0400 [OT] Fallback-position ccc=0 Thai / Lao marks Not perfect, but so is fallback positioning in 2012... diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index b88fa83..8f7eb47 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -28,14 +28,53 @@ static unsigned int recategorize_combining_class (hb_codepoint_t u, - unsigned int modified_combining_class) + unsigned int klass) { - if (modified_combining_class >= 200) - return modified_combining_class; + if (klass >= 200) + return klass; - /* This should be kept in sync with modified combining class mapping - * from hb-unicode.cc. */ - switch (modified_combining_class) + /* Thai / Lao need some per-character work. */ + if ((u & ~0xFF) == 0x0E00) + { + if (unlikely (klass == 0)) + { + switch (u) + { + case 0x0E31: + case 0x0E34: + case 0x0E35: + case 0x0E36: + case 0x0E37: + case 0x0E47: + case 0x0E4C: + case 0x0E4D: + case 0x0E4E: + klass = HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT; + break; + + case 0x0EB1: + case 0x0EB4: + case 0x0EB5: + case 0x0EB6: + case 0x0EB7: + case 0x0EBB: + case 0x0ECC: + case 0x0ECD: + klass = HB_UNICODE_COMBINING_CLASS_ABOVE; + break; + + case 0x0EBC: + klass = HB_UNICODE_COMBINING_CLASS_BELOW; + break; + } + } else { + /* Thai virama is below-right */ + if (u == 0x0E3A) + klass = HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT; + } + } + + switch (klass) { /* Hebrew */ @@ -89,9 +128,6 @@ recategorize_combining_class (hb_codepoint_t u, /* Thai */ - /* Note: to be useful we also need to position U+0E3A that has ccc=9 (virama). - * But viramas can be both above and below based on the codepoint / script. */ - case HB_MODIFIED_COMBINING_CLASS_CCC103: /* sara u / sara uu */ return HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT; @@ -121,7 +157,7 @@ recategorize_combining_class (hb_codepoint_t u, } - return modified_combining_class; + return klass; } void commit 3992b5ec4cb43d114d87ff7ee2b992bcf819c9cd Author: Behdad Esfahbod <[email protected]> Date: Sat Sep 1 19:20:41 2012 -0400 Move code around diff --git a/src/hb-ot-shape-fallback-private.hh b/src/hb-ot-shape-fallback-private.hh index be96c4f..5e9cb06 100644 --- a/src/hb-ot-shape-fallback-private.hh +++ b/src/hb-ot-shape-fallback-private.hh @@ -36,4 +36,9 @@ HB_INTERNAL void _hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); +HB_INTERNAL void _hb_ot_shape_fallback_position_recategorize_marks (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + + #endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */ diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index abacfa3..b88fa83 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -26,21 +26,9 @@ #include "hb-ot-shape-fallback-private.hh" -static void -zero_mark_advances (hb_buffer_t *buffer, - unsigned int start, - unsigned int end) -{ - for (unsigned int i = start; i < end; i++) - if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) - { - buffer->pos[i].x_advance = 0; - buffer->pos[i].y_advance = 0; - } -} - static unsigned int -recategorize_combining_class (unsigned int modified_combining_class) +recategorize_combining_class (hb_codepoint_t u, + unsigned int modified_combining_class) { if (modified_combining_class >= 200) return modified_combining_class; @@ -136,6 +124,34 @@ recategorize_combining_class (unsigned int modified_combining_class) return modified_combining_class; } +void +_hb_ot_shape_fallback_position_recategorize_marks (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) { + unsigned int combining_class = _hb_glyph_info_get_modified_combining_class (&buffer->info[i]); + combining_class = recategorize_combining_class (buffer->info[i].codepoint, combining_class); + _hb_glyph_info_set_modified_combining_class (&buffer->info[i], combining_class); + } +} + + +static void +zero_mark_advances (hb_buffer_t *buffer, + unsigned int start, + unsigned int end) +{ + for (unsigned int i = start; i < end; i++) + if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) + { + buffer->pos[i].x_advance = 0; + buffer->pos[i].y_advance = 0; + } +} + static inline void position_mark (const hb_ot_shape_plan_t *plan, hb_font_t *font, @@ -259,7 +275,7 @@ position_around_base (const hb_ot_shape_plan_t *plan, for (unsigned int i = base + 1; i < end; i++) if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i])) { - unsigned int this_combining_class = recategorize_combining_class (_hb_glyph_info_get_modified_combining_class (&buffer->info[i])); + unsigned int this_combining_class = _hb_glyph_info_get_modified_combining_class (&buffer->info[i]); if (this_combining_class != last_combining_class) cluster_extents = base_extents; diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh index f856045..c4c368d 100644 --- a/src/hb-ot-shape-private.hh +++ b/src/hb-ot-shape-private.hh @@ -95,6 +95,12 @@ _hb_glyph_info_get_general_category (const hb_glyph_info_t *info) return (hb_unicode_general_category_t) (info->unicode_props0() & 0x7F); } +inline void +_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info, unsigned int modified_class) +{ + info->unicode_props1() = modified_class; +} + inline unsigned int _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) { diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 929406e..26b21ce 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -345,6 +345,10 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c) hb_ot_shape_setup_masks (c); + /* This is unfortunate to go here, but necessary... */ + if (!hb_ot_layout_has_positioning (c->face)) + _hb_ot_shape_fallback_position_recategorize_marks (c->plan, c->font, c->buffer); + hb_ot_map_glyphs_fast (c->buffer); HB_BUFFER_DEALLOCATE_VAR (c->buffer, glyph_index); _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
