src/Makefile.am | 9 ++++-- src/hb-buffer-private.h | 3 +- src/hb-buffer.c | 30 +++++++++++--------- src/hb-common.h | 2 + src/hb-font.cc | 3 ++ src/hb-shape.c | 71 ++++++++++++++++++++++++++++++++++++------------ src/hb-unicode.c | 37 +++++++++++++++++++++++++ src/hb-unicode.h | 21 ++++++++++++++ 8 files changed, 142 insertions(+), 34 deletions(-)
New commits: commit 001fc2d2aa22f14302739fe4ca45f7535855e0fb Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 17:24:05 2009 +0100 Add TrueType kern support diff --git a/src/hb-shape.c b/src/hb-shape.c index 2ad9457..e641df4 100644 --- a/src/hb-shape.c +++ b/src/hb-shape.c @@ -49,6 +49,37 @@ hb_form_clusters (hb_buffer_t *buffer) IN_CLUSTER (buffer->in_pos) = IN_CLUSTER (buffer->in_pos - 1); } +static hb_direction_t +hb_ensure_native_direction (hb_buffer_t *buffer) +{ + hb_direction_t original_direction = buffer->direction; + + /* TODO vertical */ + if (HB_DIRECTION_IS_HORIZONTAL (original_direction) && + original_direction != _hb_script_get_horizontal_direction (buffer->script)) + { + hb_buffer_reverse_clusters (buffer); + buffer->direction ^= 1; + } + + return original_direction; +} + +static void +hb_mirror_chars (hb_buffer_t *buffer) +{ + unsigned int count; + hb_unicode_get_mirroring_func_t get_mirroring = buffer->unicode->get_mirroring; + + if (HB_DIRECTION_IS_FORWARD (buffer->direction)) + return; + + count = buffer->in_length; + for (buffer->in_pos = 0; buffer->in_pos < count; buffer->in_pos++) { + IN_CURGLYPH() = get_mirroring (IN_CURGLYPH()); + } +} + static void hb_map_glyphs (hb_font_t *font, hb_face_t *face, @@ -86,39 +117,25 @@ hb_position_default (hb_font_t *font, } } - -static hb_direction_t -hb_ensure_native_direction (hb_buffer_t *buffer) -{ - hb_direction_t original_direction = buffer->direction; - - /* TODO vertical */ - if (HB_DIRECTION_IS_HORIZONTAL (original_direction) && - original_direction != _hb_script_get_horizontal_direction (buffer->script)) - { - hb_buffer_reverse_clusters (buffer); - buffer->direction ^= 1; - } - - return original_direction; -} - static void -hb_mirror_chars (hb_buffer_t *buffer) +hb_truetype_kern (hb_font_t *font, + hb_face_t *face, + hb_buffer_t *buffer) { unsigned int count; - hb_unicode_get_mirroring_func_t get_mirroring = buffer->unicode->get_mirroring; - - if (HB_DIRECTION_IS_FORWARD (buffer->direction)) - return; count = buffer->in_length; - for (buffer->in_pos = 0; buffer->in_pos < count; buffer->in_pos++) { - IN_CURGLYPH() = get_mirroring (IN_CURGLYPH()); + for (buffer->in_pos = 1; buffer->in_pos < count; buffer->in_pos++) { + hb_position_t kern, kern1, kern2; + kern = hb_font_get_kerning (font, face, IN_GLYPH(buffer->in_pos - 1), IN_CURGLYPH()); + kern1 = kern >> 1; + kern2 = kern - kern1; + POSITION(buffer->in_pos - 1)->x_advance += kern1; + CURPOSITION()->x_advance += kern2; + CURPOSITION()->x_offset += kern2; } } - void hb_shape (hb_font_t *font, hb_face_t *face, @@ -127,6 +144,7 @@ hb_shape (hb_font_t *font, unsigned int num_features) { hb_direction_t original_direction; + hb_bool_t complex_positioning_applied; hb_form_clusters (buffer); original_direction = hb_ensure_native_direction (buffer); @@ -144,10 +162,14 @@ hb_shape (hb_font_t *font, hb_position_default (font, face, buffer); - /* GPOS / kern */ + /* GPOS */ + complex_positioning_applied = FALSE; if (HB_DIRECTION_IS_BACKWARD (buffer->direction)) hb_buffer_reverse (buffer); + if (!complex_positioning_applied) + hb_truetype_kern (font, face, buffer); + buffer->direction = original_direction; } commit 2c1b85cf66e5ecb7521b6018b76f0e161fb68967 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 16:29:17 2009 +0100 Direct unicode->get_mirroring directly diff --git a/src/hb-shape.c b/src/hb-shape.c index 74cab9e..2ad9457 100644 --- a/src/hb-shape.c +++ b/src/hb-shape.c @@ -107,14 +107,14 @@ static void hb_mirror_chars (hb_buffer_t *buffer) { unsigned int count; - hb_unicode_funcs_t *unicode = buffer->unicode; + hb_unicode_get_mirroring_func_t get_mirroring = buffer->unicode->get_mirroring; if (HB_DIRECTION_IS_FORWARD (buffer->direction)) return; count = buffer->in_length; for (buffer->in_pos = 0; buffer->in_pos < count; buffer->in_pos++) { - IN_CURGLYPH() = hb_unicode_get_mirroring (unicode, IN_CURGLYPH()); + IN_CURGLYPH() = get_mirroring (IN_CURGLYPH()); } } commit 6a2ef5aa5459def232708af30ef8a484906b868b Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 16:28:01 2009 +0100 Do mirroring diff --git a/src/hb-shape.c b/src/hb-shape.c index 2605af6..74cab9e 100644 --- a/src/hb-shape.c +++ b/src/hb-shape.c @@ -103,6 +103,21 @@ hb_ensure_native_direction (hb_buffer_t *buffer) return original_direction; } +static void +hb_mirror_chars (hb_buffer_t *buffer) +{ + unsigned int count; + hb_unicode_funcs_t *unicode = buffer->unicode; + + if (HB_DIRECTION_IS_FORWARD (buffer->direction)) + return; + + count = buffer->in_length; + for (buffer->in_pos = 0; buffer->in_pos < count; buffer->in_pos++) { + IN_CURGLYPH() = hb_unicode_get_mirroring (unicode, IN_CURGLYPH()); + } +} + void hb_shape (hb_font_t *font, @@ -116,7 +131,8 @@ hb_shape (hb_font_t *font, hb_form_clusters (buffer); original_direction = hb_ensure_native_direction (buffer); - /* do_mirroring (buffer); */ + hb_mirror_chars (buffer); + /* OT preprocess */ hb_map_glyphs (font, face, buffer); commit 0465e69832393cc1ed36508ec5d597fbab64877a Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 16:25:18 2009 +0100 Protect against NULL funcs diff --git a/src/hb-buffer.c b/src/hb-buffer.c index 9d4d518..4dd18ed 100644 --- a/src/hb-buffer.c +++ b/src/hb-buffer.c @@ -121,6 +121,9 @@ void hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, hb_unicode_funcs_t *unicode) { + if (!unicode) + unicode = &_hb_unicode_funcs_nil; + hb_unicode_funcs_reference (unicode); hb_unicode_funcs_destroy (buffer->unicode); buffer->unicode = unicode; diff --git a/src/hb-font.cc b/src/hb-font.cc index 1cffc91..b284477 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -385,6 +385,9 @@ hb_font_set_funcs (hb_font_t *font, if (font->destroy) font->destroy (font->user_data); + if (!klass) + klass = &_hb_font_funcs_nil; + hb_font_funcs_reference (klass); hb_font_funcs_destroy (font->klass); font->klass = klass; commit 5ceefa1d8dbd310570ea8d1c47107fe8d3dc96d9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 15:29:16 2009 +0100 Add hb_unicode_get_*() functions diff --git a/src/hb-unicode.c b/src/hb-unicode.c index d8ea0ea..a897f23 100644 --- a/src/hb-unicode.c +++ b/src/hb-unicode.c @@ -160,6 +160,43 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, } +hb_codepoint_t +hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode) +{ + return ufuncs->get_mirroring (unicode); +} + +hb_category_t +hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode) +{ + return ufuncs->get_general_category (unicode); +} + +hb_script_t +hb_unicode_get_script (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode) +{ + return ufuncs->get_script (unicode); +} + +unsigned int +hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode) +{ + return ufuncs->get_combining_class (unicode); +} + +unsigned int +hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode) +{ + return ufuncs->get_eastasian_width (unicode); +} + + + #define LTR HB_DIRECTION_LTR #define RTL HB_DIRECTION_RTL const hb_direction_t horiz_dir[] = diff --git a/src/hb-unicode.h b/src/hb-unicode.h index b7c3a75..6b63352 100644 --- a/src/hb-unicode.h +++ b/src/hb-unicode.h @@ -214,6 +214,27 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, hb_unicode_get_eastasian_width_func_t eastasian_width_func); +hb_codepoint_t +hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + +hb_category_t +hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + +hb_script_t +hb_unicode_get_script (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + +unsigned int +hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + +unsigned int +hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + + HB_END_DECLS #endif /* HB_UNICODE_H */ commit b8a53e44ce05911ce98b7cff34dee165e19d87ba Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 14:56:25 2009 +0100 We'll have to link to libstdc++ if linking to ICU, so disable test for now We have to get rid of the ICU in main lib. Still thinking about best way to do it. diff --git a/src/Makefile.am b/src/Makefile.am index 34af84f..ca6dc4d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -96,8 +96,11 @@ main_SOURCES = main.cc main_CPPFLAGS = $(HBCFLAGS) main_LDADD = libharfbuzz.la $(HBLIBS) -TESTS = \ - check-libstdc++.sh \ - $(NULL) +TESTS = + +if HAVE_ICU +else +TESTS += check-libstdc++.sh +endif -include $(top_srcdir)/git.mk commit 314905d7548d5be58354546d660754b807b6efb2 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 14:50:42 2009 +0100 Explicitly track whether the buffer has positions diff --git a/src/hb-buffer-private.h b/src/hb-buffer-private.h index 6ba1a21..821a481 100644 --- a/src/hb-buffer-private.h +++ b/src/hb-buffer-private.h @@ -76,7 +76,8 @@ struct _hb_buffer_t { unsigned int allocated; - hb_bool_t have_output; /* weather we have an output buffer going on */ + hb_bool_t have_output; /* whether we have an output buffer going on */ + hb_bool_t have_positions; /* whether we have positions */ unsigned int in_length; unsigned int out_length; unsigned int in_pos; diff --git a/src/hb-buffer.c b/src/hb-buffer.c index 723b8bd..9d4d518 100644 --- a/src/hb-buffer.c +++ b/src/hb-buffer.c @@ -177,6 +177,7 @@ void hb_buffer_clear (hb_buffer_t *buffer) { buffer->have_output = FALSE; + buffer->have_positions = FALSE; buffer->in_length = 0; buffer->out_length = 0; buffer->in_pos = 0; @@ -241,6 +242,7 @@ void _hb_buffer_clear_output (hb_buffer_t *buffer) { buffer->have_output = TRUE; + buffer->have_positions = FALSE; buffer->out_length = 0; buffer->out_pos = 0; buffer->out_string = buffer->in_string; @@ -251,6 +253,7 @@ hb_buffer_clear_positions (hb_buffer_t *buffer) { _hb_buffer_clear_output (buffer); buffer->have_output = FALSE; + buffer->have_positions = TRUE; if (HB_UNLIKELY (!buffer->positions)) { @@ -420,23 +423,21 @@ _hb_buffer_add_output_glyph (hb_buffer_t *buffer, void _hb_buffer_next_glyph (hb_buffer_t *buffer) { - if (!buffer->have_output) + if (buffer->have_output) { - buffer->in_pos++; - return; - } + if (buffer->out_string != buffer->in_string) + { + hb_buffer_ensure (buffer, buffer->out_pos + 1); + buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; + } + else if (buffer->out_pos != buffer->in_pos) + buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; - if (buffer->out_string != buffer->in_string) - { - hb_buffer_ensure (buffer, buffer->out_pos + 1); - buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; + buffer->out_pos++; + buffer->out_length = buffer->out_pos; } - else if (buffer->out_pos != buffer->in_pos) - buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; buffer->in_pos++; - buffer->out_pos++; - buffer->out_length = buffer->out_pos; } void @@ -470,7 +471,7 @@ hb_buffer_get_glyph_infos (hb_buffer_t *buffer) hb_glyph_position_t * hb_buffer_get_glyph_positions (hb_buffer_t *buffer) { - if (buffer->have_output || (buffer->in_length && !buffer->positions)) + if (!buffer->have_positions) hb_buffer_clear_positions (buffer); return (hb_glyph_position_t *) buffer->positions; commit 314b460d8a02ed4b2789ff527cf6c9bc19769114 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 20 13:58:50 2009 +0100 Add HB_DIRECTION_IS_FORWARD/BACKWARD diff --git a/src/hb-common.h b/src/hb-common.h index d07b204..25249cc 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -81,6 +81,8 @@ typedef enum _hb_direction_t { #define HB_DIRECTION_IS_HORIZONTAL(dir) ((dir) == HB_DIRECTION_LTR || (dir) == HB_DIRECTION_RTL) #define HB_DIRECTION_IS_VERTICAL(dir) ((dir) == HB_DIRECTION_TTB || (dir) == HB_DIRECTION_BTT) +#define HB_DIRECTION_IS_FORWARD(dir) ((dir) == HB_DIRECTION_LTR || (dir) == HB_DIRECTION_TTB) +#define HB_DIRECTION_IS_BACKWARD(dir) ((dir) == HB_DIRECTION_RTL || (dir) == HB_DIRECTION_BTT) #endif /* HB_COMMON_H */ diff --git a/src/hb-shape.c b/src/hb-shape.c index 197d4a0..2605af6 100644 --- a/src/hb-shape.c +++ b/src/hb-shape.c @@ -130,8 +130,7 @@ hb_shape (hb_font_t *font, /* GPOS / kern */ - /* TODO: Vertical */ - if (buffer->direction == HB_DIRECTION_RTL) + if (HB_DIRECTION_IS_BACKWARD (buffer->direction)) hb_buffer_reverse (buffer); buffer->direction = original_direction; _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz