TODO | 4 configure.ac | 14 + src/Makefile.am | 27 ++ src/check-exported-symbols.sh | 40 +++ src/check-internal-symbols.sh | 12 - src/check-static-inits.sh | 10 src/hb-buffer-private.hh | 10 src/hb-buffer.h | 4 src/hb-common.cc | 15 - src/hb-common.h | 7 src/hb-font-private.hh | 29 ++ src/hb-font.cc | 63 ++---- src/hb-font.h | 2 src/hb-graphite2.cc | 4 src/hb-icu.h | 1 src/hb-old.cc | 2 src/hb-old/harfbuzz-external.h | 3 src/hb-ot-layout.cc | 6 src/hb-ot-layout.h | 1 src/hb-ot-shape-complex-indic.cc | 2 src/hb-ot-shape-fallback-private.hh | 39 +++ src/hb-ot-shape-fallback.cc | 274 ++++++++++++++++++++++++++ src/hb-ot-shape-position-fallback-private.hh | 39 --- src/hb-ot-shape-position-fallback.cc | 276 --------------------------- src/hb-ot-shape.cc | 12 - src/hb-shape-plan.cc | 6 src/hb-shape-plan.h | 2 src/hb-tt-font.cc | 166 ---------------- 28 files changed, 496 insertions(+), 574 deletions(-)
New commits: commit a02d86484be870615297abfc7be9f94645434762 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 18:04:29 2012 -0400 Add check-exported-symbols.sh And misc linking fixes. diff --git a/src/Makefile.am b/src/Makefile.am index d8f7502..5894b20 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -241,6 +241,7 @@ test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) dist_check_SCRIPTS = \ check-c-linkage-decls.sh \ check-header-guards.sh \ + check-exported-symbols.sh \ check-includes.sh \ check-internal-symbols.sh \ check-static-inits.sh \ diff --git a/src/check-exported-symbols.sh b/src/check-exported-symbols.sh new file mode 100755 index 0000000..a7d6f9b --- /dev/null +++ b/src/check-exported-symbols.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +test -z "$MAKE" && MAKE=make +stat=0 + +if which nm 2>/dev/null >/dev/null; then + : +else + echo "check-exported-symbols.sh: 'nm' not found; skipping test" + exit 77 +fi + +defs="harfbuzz.def" +$MAKE $defs > /dev/null +tested=false +for def in $defs; do + lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'` + so=.libs/lib${lib}.so + if test -f "$so"; then + echo "Checking that $so has the same symbol list as $def" + { + echo EXPORTS + nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' T _fini\>\| T _init\>' | cut -d' ' -f3 + stat=1 + # cheat: copy the last line from the def file! + tail -n1 "$def" + } | diff "$def" - >&2 || stat=1 + tested=true + fi +done +if ! $tested; then + echo "check-exported-symbols.sh: libharfbuzz shared library not found; skipping test" + exit 77 +fi + +exit $stat diff --git a/src/check-internal-symbols.sh b/src/check-internal-symbols.sh index 7ad5743..f48d144 100755 --- a/src/check-internal-symbols.sh +++ b/src/check-internal-symbols.sh @@ -19,7 +19,7 @@ for suffix in .so; do so=`echo .libs/libharfbuzz$suffix` if test -f "$so"; then echo "Checking that we are not exposing internal symbols" - if nm $so | grep ' [TW] ' | grep -v ' T _fini\>\| T _init\>\| T hb_'; then + if nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' T _fini\>\| T _init\>\| T hb_'; then echo "Ouch, internal symbols exposed" stat=1 fi diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 0dbf412..4f9a5af 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -57,7 +57,7 @@ indic_options_init (void) return u; } -inline indic_options_t +static inline indic_options_t indic_options (void) { static indic_options_union_t options; diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 4c055d3..d1e1d6c 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -40,7 +40,7 @@ #include "hb-set-private.hh" -hb_tag_t common_features[] = { +static hb_tag_t common_features[] = { HB_TAG('c','c','m','p'), HB_TAG('l','i','g','a'), HB_TAG('l','o','c','l'), @@ -50,7 +50,7 @@ hb_tag_t common_features[] = { }; -hb_tag_t horizontal_features[] = { +static hb_tag_t horizontal_features[] = { HB_TAG('c','a','l','t'), HB_TAG('c','l','i','g'), HB_TAG('c','u','r','s'), @@ -63,7 +63,7 @@ hb_tag_t horizontal_features[] = { * According to the spec, valt and vpal are also mutually exclusive. * But we apply them all for now. */ -hb_tag_t vertical_features[] = { +static hb_tag_t vertical_features[] = { HB_TAG('v','a','l','t'), HB_TAG('v','e','r','t'), HB_TAG('v','k','r','n'), commit 4c8ac4f47e95d2b266b2f64e75c55af8233b6b91 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 17:44:19 2012 -0400 Misc minor fixes diff --git a/src/check-internal-symbols.sh b/src/check-internal-symbols.sh index bc643da..7ad5743 100755 --- a/src/check-internal-symbols.sh +++ b/src/check-internal-symbols.sh @@ -14,18 +14,12 @@ else exit 77 fi -if which c++filt 2>/dev/null >/dev/null; then - cplusplusfilt=c++filt -else - cplusplusfilt=cat -fi - tested=false -for suffix in .so -*.dll; do +for suffix in .so; do so=`echo .libs/libharfbuzz$suffix` if test -f "$so"; then echo "Checking that we are not exposing internal symbols" - if nm $so | grep ' [TW] ' | $cplusplusfilt | grep -v ' T _fini\>\| T _init\>\| T hb_'; then + if nm $so | grep ' [TW] ' | grep -v ' T _fini\>\| T _init\>\| T hb_'; then echo "Ouch, internal symbols exposed" stat=1 fi diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh index 6bbf8d8..b6dafbf 100644 --- a/src/hb-font-private.hh +++ b/src/hb-font-private.hh @@ -94,12 +94,12 @@ struct hb_face_t { hb_bool_t immutable; - hb_reference_table_func_t reference_table; + hb_reference_table_func_t reference_table_func; void *user_data; hb_destroy_func_t destroy; unsigned int index; - unsigned int upem; + mutable unsigned int upem; struct hb_shaper_data_t shaper_data; @@ -107,6 +107,31 @@ struct hb_face_t { hb_shape_plan_t *shape_plan; plan_node_t *next; } *shape_plans; + + + inline hb_blob_t *reference_table (hb_tag_t tag) const + { + hb_blob_t *blob; + + if (unlikely (!this || !reference_table_func)) + return hb_blob_get_empty (); + + blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data); + if (unlikely (!blob)) + return hb_blob_get_empty (); + + return blob; + } + + inline unsigned int get_upem (void) const + { + if (unlikely (!upem)) + load_upem (); + return upem; + } + + private: + HB_INTERNAL void load_upem (void) const; }; #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS diff --git a/src/hb-font.cc b/src/hb-font.cc index e5e4af7..922dee3 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -54,7 +54,7 @@ hb_font_get_glyph_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph); + return font->parent->get_glyph (unicode, variation_selector, glyph); *glyph = 0; return false; @@ -67,7 +67,7 @@ hb_font_get_glyph_h_advance_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return font->parent_scale_x_distance (hb_font_get_glyph_h_advance (font->parent, glyph)); + return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); return font->x_scale; } @@ -79,7 +79,7 @@ hb_font_get_glyph_v_advance_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return font->parent_scale_y_distance (hb_font_get_glyph_v_advance (font->parent, glyph)); + return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); return font->y_scale; } @@ -93,7 +93,7 @@ hb_font_get_glyph_h_origin_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent, glyph, x, y); + hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); if (ret) font->parent_scale_position (x, y); return ret; @@ -112,7 +112,7 @@ hb_font_get_glyph_v_origin_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent, glyph, x, y); + hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); if (ret) font->parent_scale_position (x, y); return ret; @@ -130,7 +130,7 @@ hb_font_get_glyph_h_kerning_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return font->parent_scale_x_distance (hb_font_get_glyph_h_kerning (font->parent, left_glyph, right_glyph)); + return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); return 0; } @@ -143,7 +143,7 @@ hb_font_get_glyph_v_kerning_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return font->parent_scale_y_distance (hb_font_get_glyph_v_kerning (font->parent, top_glyph, bottom_glyph)); + return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); return 0; } @@ -156,9 +156,7 @@ hb_font_get_glyph_extents_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_extents (font->parent, - glyph, - extents); + hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); if (ret) { font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); font->parent_scale_distance (&extents->width, &extents->height); @@ -180,7 +178,7 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent, glyph, point_index, x, y); + hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y); if (ret) font->parent_scale_position (x, y); return ret; @@ -198,7 +196,7 @@ hb_font_get_glyph_name_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return hb_font_get_glyph_name (font->parent, glyph, name, size); + return font->parent->get_glyph_name (glyph, name, size); if (size) *name = '\0'; return false; @@ -212,7 +210,7 @@ hb_font_get_glyph_from_name_nil (hb_font_t *font, void *user_data HB_UNUSED) { if (font->parent) - return hb_font_get_glyph_from_name (font->parent, name, len, glyph); + return font->parent->get_glyph_from_name (name, len, glyph); *glyph = 0; return false; @@ -516,7 +514,7 @@ static const hb_face_t _hb_face_nil = { true, /* immutable */ - NULL, /* reference_table */ + NULL, /* reference_table_func */ NULL, /* user_data */ NULL, /* destroy */ @@ -534,19 +532,19 @@ static const hb_face_t _hb_face_nil = { hb_face_t * -hb_face_create_for_tables (hb_reference_table_func_t reference_table, +hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, void *user_data, hb_destroy_func_t destroy) { hb_face_t *face; - if (!reference_table || !(face = hb_object_create<hb_face_t> ())) { + if (!reference_table_func || !(face = hb_object_create<hb_face_t> ())) { if (destroy) destroy (user_data); return hb_face_get_empty (); } - face->reference_table = reference_table; + face->reference_table_func = reference_table_func; face->user_data = user_data; face->destroy = destroy; @@ -697,22 +695,13 @@ hb_blob_t * hb_face_reference_table (hb_face_t *face, hb_tag_t tag) { - hb_blob_t *blob; - - if (unlikely (!face || !face->reference_table)) - return hb_blob_get_empty (); - - blob = face->reference_table (face, tag, face->user_data); - if (unlikely (!blob)) - return hb_blob_get_empty (); - - return blob; + return face->reference_table (tag); } hb_blob_t * hb_face_reference_blob (hb_face_t *face) { - return hb_face_reference_table (face, HB_TAG_NONE); + return face->reference_table (HB_TAG_NONE); } void @@ -744,13 +733,17 @@ hb_face_set_upem (hb_face_t *face, unsigned int hb_face_get_upem (hb_face_t *face) { - if (unlikely (!face->upem)) { - hb_blob_t *head_blob = Sanitizer<head>::sanitize (hb_face_reference_table (face, HB_OT_TAG_head)); - const head *head_table = Sanitizer<head>::lock_instance (head_blob); - face->upem = head_table->get_upem (); - hb_blob_destroy (head_blob); - } - return face->upem; + return face->get_upem (); +} + + +void +hb_face_t::load_upem (void) const +{ + hb_blob_t *head_blob = Sanitizer<head>::sanitize (reference_table (HB_OT_TAG_head)); + const head *head_table = Sanitizer<head>::lock_instance (head_blob); + upem = head_table->get_upem (); + hb_blob_destroy (head_blob); } diff --git a/src/hb-font.h b/src/hb-font.h index 4a043be..d796856 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -52,7 +52,7 @@ typedef hb_blob_t * (*hb_reference_table_func_t) (hb_face_t *face, hb_tag_t tag /* calls destroy() when not needing user_data anymore */ hb_face_t * -hb_face_create_for_tables (hb_reference_table_func_t reference_table, +hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, void *user_data, hb_destroy_func_t destroy); diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index 70103d5..1b657a6 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -73,7 +73,7 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s if (unlikely (!blob)) { - blob = hb_face_reference_table (face_data->face, tag); + blob = face_data->face->reference_table (tag); hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t)); if (unlikely (!p)) { @@ -98,7 +98,7 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s hb_graphite2_shaper_face_data_t * _hb_graphite2_shaper_face_data_create (hb_face_t *face) { - hb_blob_t *silf_blob = hb_face_reference_table (face, HB_GRAPHITE2_TAG_SILF); + hb_blob_t *silf_blob = face->reference_table (HB_GRAPHITE2_TAG_SILF); /* Umm, we just reference the table to check whether it exists. * Maybe add better API for this? */ if (!hb_blob_get_length (silf_blob)) diff --git a/src/hb-old.cc b/src/hb-old.cc index ec25e52..197e620 100644 --- a/src/hb-old.cc +++ b/src/hb-old.cc @@ -188,7 +188,7 @@ static HB_Error table_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length) { hb_face_t *face = (hb_face_t *) font; - hb_blob_t *blob = hb_face_reference_table (face, (hb_tag_t) tag); + hb_blob_t *blob = face->reference_table ((hb_tag_t) tag); unsigned int capacity = *length; *length = hb_blob_get_length (blob); memcpy (buffer, hb_blob_get_data (blob, NULL), MIN (capacity, *length)); diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 91deaa2..e4d84e8 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -49,13 +49,13 @@ _hb_ot_layout_create (hb_face_t *face) if (unlikely (!layout)) return NULL; - layout->gdef_blob = Sanitizer<GDEF>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GDEF)); + layout->gdef_blob = Sanitizer<GDEF>::sanitize (face->reference_table (HB_OT_TAG_GDEF)); layout->gdef = Sanitizer<GDEF>::lock_instance (layout->gdef_blob); - layout->gsub_blob = Sanitizer<GSUB>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GSUB)); + layout->gsub_blob = Sanitizer<GSUB>::sanitize (face->reference_table (HB_OT_TAG_GSUB)); layout->gsub = Sanitizer<GSUB>::lock_instance (layout->gsub_blob); - layout->gpos_blob = Sanitizer<GPOS>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GPOS)); + layout->gpos_blob = Sanitizer<GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS)); layout->gpos = Sanitizer<GPOS>::lock_instance (layout->gpos_blob); layout->gsub_lookup_count = layout->gsub->get_lookup_count (); diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index 54ffdb0..71aed89 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -109,9 +109,8 @@ position_mark (const hb_ot_shape_plan_t *plan, unsigned int combining_class) { hb_glyph_extents_t mark_extents; - if (!hb_font_get_glyph_extents (font, - buffer->info[i].codepoint, - &mark_extents)) + if (!font->get_glyph_extents (buffer->info[i].codepoint, + &mark_extents)) return; hb_position_t y_gap = font->y_scale / 16; @@ -193,9 +192,8 @@ position_around_base (const hb_ot_shape_plan_t *plan, unsigned int end) { hb_glyph_extents_t base_extents; - if (!hb_font_get_glyph_extents (font, - buffer->info[base].codepoint, - &base_extents)) + if (!font->get_glyph_extents (buffer->info[base].codepoint, + &base_extents)) { /* If extents don't work, zero marks and go home. */ zero_mark_advances (buffer, base + 1, end); diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 41ec329..4c055d3 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -578,7 +578,7 @@ hb_ot_shape_glyphs_closure (hb_font_t *font, * if that's what they desire. */ unsigned int count = buffer->len; for (unsigned int i = 0; i < count; i++) - hb_set_add (glyphs, buffer->info[i].codepoint); + glyphs->add (buffer->info[i].codepoint); /* And find transitive closure. */ hb_set_t copy; diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index f7a78e4..038f6af 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -37,7 +37,7 @@ #undef HB_SHAPER_IMPLEMENT -void +static void hb_shape_plan_plan (hb_shape_plan_t *shape_plan, const hb_feature_t *user_features, unsigned int num_user_features, diff --git a/src/hb-shape-plan.h b/src/hb-shape-plan.h index fbce5dd..f1a14a9 100644 --- a/src/hb-shape-plan.h +++ b/src/hb-shape-plan.h @@ -47,7 +47,7 @@ hb_shape_plan_create (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list); -hb_shape_plan_t * +HB_INTERNAL hb_shape_plan_t * hb_shape_plan_create_cached (hb_face_t *face, const hb_segment_properties_t *props, const hb_feature_t *user_features, diff --git a/src/hb-tt-font.cc b/src/hb-tt-font.cc index 0055ae9..b7198ef 100644 --- a/src/hb-tt-font.cc +++ b/src/hb-tt-font.cc @@ -51,7 +51,7 @@ _hb_tt_font_create (hb_font_t *font) /* TODO Remove this object altogether */ hb_tt_font_t *tt = (hb_tt_font_t *) calloc (1, sizeof (hb_tt_font_t)); - tt->hhea_blob = Sanitizer<hhea>::sanitize (hb_face_reference_table (font->face, HB_OT_TAG_hhea)); + tt->hhea_blob = Sanitizer<hhea>::sanitize (font->face->reference_table (HB_OT_TAG_hhea)); tt->hhea = Sanitizer<hhea>::lock_instance (tt->hhea_blob); return tt; @@ -76,168 +76,4 @@ _get_hhea (hb_face_t *face) * hb_tt_font_funcs_t */ -static hb_bool_t -hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) -{ - if (font->parent) - return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph); - - *glyph = 0; - return false; -} - -static hb_position_t -hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) -{ - if (font->parent) - return font->parent_scale_x_distance (hb_font_get_glyph_h_advance (font->parent, glyph)); - - return font->x_scale; -} - -static hb_position_t -hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) -{ - if (font->parent) - return font->parent_scale_y_distance (hb_font_get_glyph_v_advance (font->parent, glyph)); - - return font->y_scale; -} - -static hb_bool_t -hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) -{ - if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent, - glyph, - x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - - *x = *y = 0; - return false; -} - -static hb_bool_t -hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) -{ - if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent, - glyph, - x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - - *x = *y = 0; - return false; -} - -static hb_position_t -hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, - void *user_data HB_UNUSED) -{ - if (font->parent) - return font->parent_scale_x_distance (hb_font_get_glyph_h_kerning (font->parent, left_glyph, right_glyph)); - - return 0; -} - -static hb_position_t -hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t top_glyph, - hb_codepoint_t bottom_glyph, - void *user_data HB_UNUSED) -{ - if (font->parent) - return font->parent_scale_y_distance (hb_font_get_glyph_v_kerning (font->parent, top_glyph, bottom_glyph)); - - return 0; -} - -static hb_bool_t -hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_glyph_extents_t *extents, - void *user_data HB_UNUSED) -{ - if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_extents (font->parent, - glyph, - extents); - if (ret) { - font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); - font->parent_scale_distance (&extents->width, &extents->height); - } - return ret; - } - - memset (extents, 0, sizeof (*extents)); - return false; -} - -static hb_bool_t -hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - unsigned int point_index, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) -{ - if (font->parent) { - hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent, - glyph, point_index, - x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - - *x = *y = 0; - return false; -} - - -static hb_font_funcs_t _hb_font_funcs_nil = { - HB_OBJECT_HEADER_STATIC, - - true, /* immutable */ - - { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - } -}; #endif - commit 560d68af8168d1baff607b9616a3590af70fe9ec Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 17:16:01 2012 -0400 Use a export-file for Windows builds Apparently even that doesn't make check-internal-symbols.sh happy with mingw32. Going to disable that for DLLs again, but hopefully the export-file is doing *something*. diff --git a/configure.ac b/configure.ac index 689b6a4..3ca23ee 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,7 @@ if test "x$GCC" = "xyes"; then CXXFLAGS="$CXXFLAGS -Wcast-align" case "$host" in - *-mingw*) + *-*-mingw*) ;; *) # Hide inline methods @@ -86,6 +86,18 @@ if test "x$GCC" = "xyes"; then esac fi +AC_MSG_CHECKING([for native Win32]) +case "$host" in + *-*-mingw*) + hb_os_win32=yes + ;; + *) + hb_os_win32=no + ;; +esac +AC_MSG_RESULT([$hb_os_win32]) +AM_CONDITIONAL(OS_WIN32, test "$hb_os_win32" = "yes") + dnl ========================================================================== have_ot=true diff --git a/src/Makefile.am b/src/Makefile.am index 93879c4..d8f7502 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -164,16 +164,36 @@ endif DIST_SUBDIRS += hb-old + +# Put the library together + +if OS_WIN32 +export_symbols = -export-symbols harfbuzz.def +harfbuzz_def_dependency = harfbuzz.def +endif + # Use a C linker, not C++; Don't link to libstdc++ libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS) libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) nodist_libharfbuzz_la_SOURCES = $(nodist_HBSOURCES) libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) -libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined +libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined libharfbuzz_la_LIBADD = $(HBLIBS) +libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency) pkginclude_HEADERS = $(HBHEADERS) nodist_pkginclude_HEADERS = hb-version.h +CLEANFILES += harfbuzz.def +harfbuzz.def: $(HBHEADERS) + $(AM_V_GEN) (echo EXPORTS; \ + (cat $^ || echo 'hb_ERROR ()' ) | \ + $(EGREP) '^hb_.* \(' | \ + sed -e 's/ (.*//' | \ + LANG=C sort; \ + echo LIBRARY libharfbuzz-$(HB_VERSION_MAJOR).dll; \ + ) >"$@.tmp" + @ ! grep -q hb_ERROR "$@.tmp" && mv "$@.tmp" "$@" || ($(RM) "$@"; false) + GENERATORS = \ gen-arabic-table.py \ diff --git a/src/hb-buffer.h b/src/hb-buffer.h index d67cfd6..aebf482 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -201,8 +201,8 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer); /* * NOT IMPLEMENTED -void -hb_buffer_normalize_characters (hb_buffer_t *buffer); + void + hb_buffer_normalize_characters (hb_buffer_t *buffer); */ commit f8751cf8e0a16125d63a88da65fdbfa76a19453f Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 17:15:44 2012 -0400 [hb-old] speed-up build diff --git a/src/hb-old/harfbuzz-external.h b/src/hb-old/harfbuzz-external.h index c89a7ad..13ec15f 100644 --- a/src/hb-old/harfbuzz-external.h +++ b/src/hb-old/harfbuzz-external.h @@ -25,7 +25,8 @@ #ifndef HARFBUZZ_EXTERNAL_H #define HARFBUZZ_EXTERNAL_H -#include <hb.h> +#define HB_H_IN +#include <hb-unicode.h> #include "harfbuzz-global.h" HB_BEGIN_HEADER commit 5f4c52867ce67faa15f5d26b59c18c8d068e9261 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 16:53:37 2012 -0400 Minor diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index e14cde8..2ad4ff4 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -169,7 +169,6 @@ hb_ot_layout_feature_get_lookup_indexes (hb_face_t *face, hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face); -/* Supports length 1 or 2 right now. */ hb_bool_t hb_ot_layout_would_substitute_lookup (hb_face_t *face, const hb_codepoint_t *glyphs, commit fe2b8a7777ab1c84980424ede713cb0d6701f987 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 15:27:14 2012 -0400 Minor diff --git a/TODO b/TODO index bf13d07..71e5b4d 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ General fixes: ============= -- mask propagation (when ligation, "or" the masks). +- mask propagation? (when ligation, "or" the masks). - Warn at compile time (and runtime with HB_DEBUG?) if no Unicode / font funcs found / set. @@ -52,7 +52,7 @@ API additions - Add glib GBoxedType stuff and introspection -- Add Uniscribe face / font get API +- Finish Uniscribe / CoreText face / font get API - BCP 47 language handling / API (language_matches?) commit 7e7d245b332306949a19c628bacd920717434769 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 15:23:48 2012 -0400 Make default_language threadsafe diff --git a/src/hb-common.cc b/src/hb-common.cc index baf5977..1301ab2 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -238,17 +238,12 @@ hb_language_to_string (hb_language_t language) hb_language_t hb_language_get_default (void) { - static hb_language_t default_language; + static hb_language_t default_language = HB_LANGUAGE_INVALID; - if (!default_language) { - /* This block is not quite threadsafe, but is not as bad as - * it looks since it's idempotent. As long as pointer ops - * are atomic, we are safe. */ - - /* I hear that setlocale() doesn't honor env vars on Windows, - * but for now we ignore that. */ - - default_language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); + hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language); + if (unlikely (language == HB_LANGUAGE_INVALID)) { + language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); + hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language); } return default_language; commit 06b192c458010c847362d809673209c87ea29949 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 15:23:45 2012 -0400 Minor diff --git a/src/hb-common.h b/src/hb-common.h index 92f77c4..920bd32 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -96,7 +96,8 @@ typedef uint32_t hb_tag_t; #define HB_TAG_NONE HB_TAG(0,0,0,0) /* len=-1 means str is NUL-terminated */ -hb_tag_t hb_tag_from_string (const char *str, int len); +hb_tag_t +hb_tag_from_string (const char *str, int len); /* hb_direction_t */ commit 37191ede7583fdb864db32a8f4d90956657926c7 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 14:59:09 2012 -0400 Minor diff --git a/src/hb-common.h b/src/hb-common.h index 6f2a709..92f77c4 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -43,8 +43,6 @@ # endif /* !__cplusplus */ #endif -HB_BEGIN_DECLS - #if !defined (HB_DONT_DEFINE_STDINT) #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \ @@ -69,6 +67,8 @@ typedef unsigned __int64 uint64_t; #endif +HB_BEGIN_DECLS + typedef int hb_bool_t; diff --git a/src/hb-icu.h b/src/hb-icu.h index d22a8e1..f2f35f0 100644 --- a/src/hb-icu.h +++ b/src/hb-icu.h @@ -33,7 +33,6 @@ #include <unicode/uscript.h> - HB_BEGIN_DECLS commit 6d9a329a8a0f11f4b175e407de59c55924de1ef6 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 14:48:41 2012 -0400 Adjust a couple source checks diff --git a/src/check-internal-symbols.sh b/src/check-internal-symbols.sh index 729b086..bc643da 100755 --- a/src/check-internal-symbols.sh +++ b/src/check-internal-symbols.sh @@ -21,8 +21,8 @@ else fi tested=false -for suffix in so; do - so=.libs/libharfbuzz.$suffix +for suffix in .so -*.dll; do + so=`echo .libs/libharfbuzz$suffix` if test -f "$so"; then echo "Checking that we are not exposing internal symbols" if nm $so | grep ' [TW] ' | $cplusplusfilt | grep -v ' T _fini\>\| T _init\>\| T hb_'; then diff --git a/src/check-static-inits.sh b/src/check-static-inits.sh index eb04a55..1eceb1b 100755 --- a/src/check-static-inits.sh +++ b/src/check-static-inits.sh @@ -14,8 +14,14 @@ else exit 77 fi +OBJS=.libs/*.o +if test "x`echo $OBJS`" = "x$OBJS" 2>/dev/null >/dev/null; then + echo "check-static-inits.sh: object files not found; skipping test" + exit 77 +fi + echo "Checking that no object file has static initializers" -for obj in .libs/*.o; do +for obj in $OBJS; do if objdump -t "$obj" | grep '[.]ctors'; then echo "Ouch, $obj has static initializers" stat=1 @@ -23,7 +29,7 @@ for obj in .libs/*.o; do done echo "Checking that no object file has lazy static C++ constructors/destructors" -for obj in .libs/*.o; do +for obj in $OBJS; do if objdump -t "$obj" | grep '__c'; then echo "Ouch, $obj has lazy static C++ constructors/destructors" stat=1 commit 9c929abdcfef44c0193a2917b20981df37ade21c Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 14:33:37 2012 -0400 Minor renaming diff --git a/src/Makefile.am b/src/Makefile.am index fb7f791..93879c4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,8 +87,8 @@ HBSOURCES += \ hb-ot-shape-complex-private.hh \ hb-ot-shape-normalize-private.hh \ hb-ot-shape-normalize.cc \ - hb-ot-shape-position-fallback-private.hh \ - hb-ot-shape-position-fallback.cc \ + hb-ot-shape-fallback-private.hh \ + hb-ot-shape-fallback.cc \ hb-ot-shape-private.hh \ $(NULL) HBHEADERS += \ diff --git a/src/hb-ot-shape-fallback-private.hh b/src/hb-ot-shape-fallback-private.hh new file mode 100644 index 0000000..be96c4f --- /dev/null +++ b/src/hb-ot-shape-fallback-private.hh @@ -0,0 +1,39 @@ +/* + * Copyright © 2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_SHAPE_FALLBACK_PRIVATE_HH +#define HB_OT_SHAPE_FALLBACK_PRIVATE_HH + +#include "hb-private.hh" + +#include "hb-ot-shape-private.hh" + + +HB_INTERNAL void _hb_ot_shape_fallback_position (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 new file mode 100644 index 0000000..54ffdb0 --- /dev/null +++ b/src/hb-ot-shape-fallback.cc @@ -0,0 +1,276 @@ +/* + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#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) +{ + if (modified_combining_class >= 200) + return modified_combining_class; + + /* This should be kept in sync with modified combining class mapping + * from hb-unicode.cc. */ + switch (modified_combining_class) + { + /* Hebrew */ + case HB_MODIFIED_COMBINING_CLASS_CCC10: /* sheva */ + case HB_MODIFIED_COMBINING_CLASS_CCC11: /* hataf segol */ + case HB_MODIFIED_COMBINING_CLASS_CCC12: /* hataf patah */ + case HB_MODIFIED_COMBINING_CLASS_CCC13: /* hataf qamats */ + case HB_MODIFIED_COMBINING_CLASS_CCC14: /* hiriq */ + case HB_MODIFIED_COMBINING_CLASS_CCC15: /* tsere */ + case HB_MODIFIED_COMBINING_CLASS_CCC16: /* segol */ + case HB_MODIFIED_COMBINING_CLASS_CCC17: /* patah */ + case HB_MODIFIED_COMBINING_CLASS_CCC18: /* qamats */ + case HB_MODIFIED_COMBINING_CLASS_CCC20: /* qubuts */ + case HB_MODIFIED_COMBINING_CLASS_CCC22: /* meteg */ + return HB_UNICODE_COMBINING_CLASS_BELOW; + + case HB_MODIFIED_COMBINING_CLASS_CCC23: /* rafe */ + return HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE; + + case HB_MODIFIED_COMBINING_CLASS_CCC24: /* shin dot */ + return HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT; + + case HB_MODIFIED_COMBINING_CLASS_CCC25: /* sin dot */ + case HB_MODIFIED_COMBINING_CLASS_CCC19: /* holam */ + return HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT; + + case HB_MODIFIED_COMBINING_CLASS_CCC26: /* point varika */ + return HB_UNICODE_COMBINING_CLASS_ABOVE; + + case HB_MODIFIED_COMBINING_CLASS_CCC21: /* dagesh */ + break; + + /* Arabic and Syriac */ + case HB_MODIFIED_COMBINING_CLASS_CCC27: /* fathatan */ + case HB_MODIFIED_COMBINING_CLASS_CCC28: /* dammatan */ + case HB_MODIFIED_COMBINING_CLASS_CCC30: /* fatha */ + case HB_MODIFIED_COMBINING_CLASS_CCC31: /* damma */ + case HB_MODIFIED_COMBINING_CLASS_CCC33: /* shadda */ + case HB_MODIFIED_COMBINING_CLASS_CCC34: /* sukun */ + case HB_MODIFIED_COMBINING_CLASS_CCC35: /* superscript alef */ + case HB_MODIFIED_COMBINING_CLASS_CCC36: /* superscript alaph */ + return HB_UNICODE_COMBINING_CLASS_ABOVE; + + case HB_MODIFIED_COMBINING_CLASS_CCC29: /* kasratan */ + case HB_MODIFIED_COMBINING_CLASS_CCC32: /* kasra */ + return HB_UNICODE_COMBINING_CLASS_BELOW; + + /* TODO Thai, Lao, and Tibetan */ + } + + return modified_combining_class; +} + +static inline void +position_mark (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer, + hb_glyph_extents_t &base_extents, + unsigned int i, + unsigned int combining_class) +{ + hb_glyph_extents_t mark_extents; + if (!hb_font_get_glyph_extents (font, + buffer->info[i].codepoint, + &mark_extents)) + return; + + hb_position_t y_gap = font->y_scale / 16; + + hb_glyph_position_t &pos = buffer->pos[i]; + pos.x_offset = pos.y_offset = 0; + + + /* We dont position LEFT and RIGHT marks. */ + + /* X positioning */ + switch (combining_class) + { + case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: + case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: + /* TODO Do something... For now, fall through. */ + + case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: + case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: + case HB_UNICODE_COMBINING_CLASS_BELOW: + case HB_UNICODE_COMBINING_CLASS_ABOVE: + /* Center align. */ + pos.x_offset += base_extents.x_bearing + (base_extents.width - mark_extents.width) / 2 - mark_extents.x_bearing; + break; + + case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: + case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: + case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: + /* Left align. */ + pos.x_offset += base_extents.x_bearing - mark_extents.x_bearing; + break; + + case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: + case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: + case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: + /* Right align. */ + pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width - mark_extents.x_bearing; + break; + } + + /* Y positioning */ + switch (combining_class) + { + case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: + case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: + case HB_UNICODE_COMBINING_CLASS_BELOW: + case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: + /* Add gap, fall-through. */ + base_extents.height -= y_gap; + + case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: + case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: + pos.y_offset += base_extents.y_bearing + base_extents.height - mark_extents.y_bearing; + base_extents.height += mark_extents.height; + break; + + case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: + case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: + case HB_UNICODE_COMBINING_CLASS_ABOVE: + case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: + /* Add gap, fall-through. */ + base_extents.y_bearing += y_gap; + base_extents.height -= y_gap; + + case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: + case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: + pos.y_offset += base_extents.y_bearing - (mark_extents.y_bearing + mark_extents.height); + base_extents.y_bearing -= mark_extents.height; + base_extents.height += mark_extents.height; + break; + } +} + +static inline void +position_around_base (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer, + unsigned int base, + unsigned int end) +{ + hb_glyph_extents_t base_extents; + if (!hb_font_get_glyph_extents (font, + buffer->info[base].codepoint, + &base_extents)) + { + /* If extents don't work, zero marks and go home. */ + zero_mark_advances (buffer, base + 1, end); + return; + } + base_extents.x_bearing += buffer->pos[base].x_offset; + base_extents.y_bearing += buffer->pos[base].y_offset; + + /* XXX Handle ligature component positioning... */ + HB_UNUSED bool is_ligature = is_a_ligature (buffer->info[base]); + + hb_position_t x_offset = 0, y_offset = 0; + unsigned int last_combining_class = 255; + hb_glyph_extents_t cluster_extents; + for (unsigned int i = base + 1; i < end; i++) + if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) + { + unsigned int this_combining_class = recategorize_combining_class (_hb_glyph_info_get_modified_combining_class (&buffer->info[i])); + if (this_combining_class != last_combining_class) + cluster_extents = base_extents; + + position_mark (plan, font, buffer, base_extents, i, this_combining_class); + + buffer->pos[i].x_advance = 0; + buffer->pos[i].y_advance = 0; + buffer->pos[i].x_offset += x_offset; + buffer->pos[i].y_offset += y_offset; + + /* combine cluster extents. */ + + last_combining_class = this_combining_class; + } else { + x_offset -= buffer->pos[i].x_advance; + y_offset -= buffer->pos[i].y_advance; + } + + +} + +static inline void +position_cluster (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer, + unsigned int start, + unsigned int end) +{ + if (end - start < 2) + return; + + /* Find the base glyph */ + for (unsigned int i = start; i < end; i++) + if (is_a_ligature (buffer->info[i]) || + !(FLAG (_hb_glyph_info_get_general_category (&buffer->info[i])) & + (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))) + { + position_around_base (plan, font, buffer, i, end); + break; + } +} + +void +_hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + unsigned int start = 0; + unsigned int last_cluster = buffer->info[0].cluster; + unsigned int count = buffer->len; + for (unsigned int i = 1; i < count; i++) + if (buffer->info[i].cluster != last_cluster) { + position_cluster (plan, font, buffer, start, i); + start = i; + last_cluster = buffer->info[i].cluster; + } + position_cluster (plan, font, buffer, start, count); +} diff --git a/src/hb-ot-shape-position-fallback-private.hh b/src/hb-ot-shape-position-fallback-private.hh deleted file mode 100644 index f84752e..0000000 --- a/src/hb-ot-shape-position-fallback-private.hh +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright © 2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_OT_POSITION_FALLBACK_PRIVATE_HH -#define HB_OT_POSITION_FALLBACK_PRIVATE_HH - -#include "hb-private.hh" - -#include "hb-ot-shape-private.hh" - - -HB_INTERNAL void _hb_ot_shape_position_fallback (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer); - -#endif /* HB_OT_POSITION_FALLBACK_PRIVATE_HH */ diff --git a/src/hb-ot-shape-position-fallback.cc b/src/hb-ot-shape-position-fallback.cc deleted file mode 100644 index 7966852..0000000 --- a/src/hb-ot-shape-position-fallback.cc +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright © 2011,2012 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#include "hb-ot-shape-position-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) -{ - if (modified_combining_class >= 200) - return modified_combining_class; - - /* This should be kept in sync with modified combining class mapping - * from hb-unicode.cc. */ - switch (modified_combining_class) - { - /* Hebrew */ - case HB_MODIFIED_COMBINING_CLASS_CCC10: /* sheva */ - case HB_MODIFIED_COMBINING_CLASS_CCC11: /* hataf segol */ - case HB_MODIFIED_COMBINING_CLASS_CCC12: /* hataf patah */ - case HB_MODIFIED_COMBINING_CLASS_CCC13: /* hataf qamats */ - case HB_MODIFIED_COMBINING_CLASS_CCC14: /* hiriq */ - case HB_MODIFIED_COMBINING_CLASS_CCC15: /* tsere */ - case HB_MODIFIED_COMBINING_CLASS_CCC16: /* segol */ - case HB_MODIFIED_COMBINING_CLASS_CCC17: /* patah */ - case HB_MODIFIED_COMBINING_CLASS_CCC18: /* qamats */ - case HB_MODIFIED_COMBINING_CLASS_CCC20: /* qubuts */ - case HB_MODIFIED_COMBINING_CLASS_CCC22: /* meteg */ - return HB_UNICODE_COMBINING_CLASS_BELOW; - - case HB_MODIFIED_COMBINING_CLASS_CCC23: /* rafe */ - return HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE; - - case HB_MODIFIED_COMBINING_CLASS_CCC24: /* shin dot */ - return HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT; - - case HB_MODIFIED_COMBINING_CLASS_CCC25: /* sin dot */ - case HB_MODIFIED_COMBINING_CLASS_CCC19: /* holam */ - return HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT; - - case HB_MODIFIED_COMBINING_CLASS_CCC26: /* point varika */ - return HB_UNICODE_COMBINING_CLASS_ABOVE; - - case HB_MODIFIED_COMBINING_CLASS_CCC21: /* dagesh */ - break; - - /* Arabic and Syriac */ - case HB_MODIFIED_COMBINING_CLASS_CCC27: /* fathatan */ - case HB_MODIFIED_COMBINING_CLASS_CCC28: /* dammatan */ - case HB_MODIFIED_COMBINING_CLASS_CCC30: /* fatha */ - case HB_MODIFIED_COMBINING_CLASS_CCC31: /* damma */ - case HB_MODIFIED_COMBINING_CLASS_CCC33: /* shadda */ - case HB_MODIFIED_COMBINING_CLASS_CCC34: /* sukun */ - case HB_MODIFIED_COMBINING_CLASS_CCC35: /* superscript alef */ - case HB_MODIFIED_COMBINING_CLASS_CCC36: /* superscript alaph */ - return HB_UNICODE_COMBINING_CLASS_ABOVE; - - case HB_MODIFIED_COMBINING_CLASS_CCC29: /* kasratan */ - case HB_MODIFIED_COMBINING_CLASS_CCC32: /* kasra */ - return HB_UNICODE_COMBINING_CLASS_BELOW; - - /* TODO Thai, Lao, and Tibetan */ - } - - return modified_combining_class; -} - -static inline void -position_mark (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer, - hb_glyph_extents_t &base_extents, - unsigned int i, - unsigned int combining_class) -{ - hb_glyph_extents_t mark_extents; - if (!hb_font_get_glyph_extents (font, - buffer->info[i].codepoint, - &mark_extents)) - return; - - hb_position_t y_gap = font->y_scale / 16; - - hb_glyph_position_t &pos = buffer->pos[i]; - pos.x_offset = pos.y_offset = 0; - - - /* We dont position LEFT and RIGHT marks. */ - - /* X positioning */ - switch (combining_class) - { - case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: - case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: - /* TODO Do something... For now, fall through. */ - - case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: - case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: - case HB_UNICODE_COMBINING_CLASS_BELOW: - case HB_UNICODE_COMBINING_CLASS_ABOVE: - /* Center align. */ - pos.x_offset += base_extents.x_bearing + (base_extents.width - mark_extents.width) / 2 - mark_extents.x_bearing; - break; - - case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: - case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: - case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: - /* Left align. */ - pos.x_offset += base_extents.x_bearing - mark_extents.x_bearing; - break; - - case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: - case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: - case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: - /* Right align. */ - pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width - mark_extents.x_bearing; - break; - } - - /* Y positioning */ - switch (combining_class) - { - case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: - case HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: - case HB_UNICODE_COMBINING_CLASS_BELOW: - case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: - /* Add gap, fall-through. */ - base_extents.height -= y_gap; - - case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: - case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: - pos.y_offset += base_extents.y_bearing + base_extents.height - mark_extents.y_bearing; - base_extents.height += mark_extents.height; - break; - - case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: - case HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: - case HB_UNICODE_COMBINING_CLASS_ABOVE: - case HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: - /* Add gap, fall-through. */ - base_extents.y_bearing += y_gap; - base_extents.height -= y_gap; - - case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: - case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: - pos.y_offset += base_extents.y_bearing - (mark_extents.y_bearing + mark_extents.height); - base_extents.y_bearing -= mark_extents.height; - base_extents.height += mark_extents.height; - break; - } -} - -static inline void -position_around_base (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer, - unsigned int base, - unsigned int end) -{ - hb_glyph_extents_t base_extents; - if (!hb_font_get_glyph_extents (font, - buffer->info[base].codepoint, - &base_extents)) - { - /* If extents don't work, zero marks and go home. */ - zero_mark_advances (buffer, base + 1, end); - return; - } - base_extents.x_bearing += buffer->pos[base].x_offset; - base_extents.y_bearing += buffer->pos[base].y_offset; - - /* XXX Handle ligature component positioning... */ - HB_UNUSED bool is_ligature = is_a_ligature (buffer->info[base]); - - hb_position_t x_offset = 0, y_offset = 0; - unsigned int last_combining_class = 255; - hb_glyph_extents_t cluster_extents; - for (unsigned int i = base + 1; i < end; i++) - if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) - { - unsigned int this_combining_class = recategorize_combining_class (_hb_glyph_info_get_modified_combining_class (&buffer->info[i])); - if (this_combining_class != last_combining_class) - cluster_extents = base_extents; - - position_mark (plan, font, buffer, base_extents, i, this_combining_class); - - buffer->pos[i].x_advance = 0; - buffer->pos[i].y_advance = 0; - buffer->pos[i].x_offset += x_offset; - buffer->pos[i].y_offset += y_offset; - - /* combine cluster extents. */ - - last_combining_class = this_combining_class; - } else { - x_offset -= buffer->pos[i].x_advance; - y_offset -= buffer->pos[i].y_advance; - } - - -} - -static inline void -position_cluster (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer, - unsigned int start, - unsigned int end) -{ - if (end - start < 2) - return; - - /* Find the base glyph */ - for (unsigned int i = start; i < end; i++) - if (is_a_ligature (buffer->info[i]) || - !(FLAG (_hb_glyph_info_get_general_category (&buffer->info[i])) & - (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | - FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | - FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))) - { - position_around_base (plan, font, buffer, i, end); - break; - } -} - -void -_hb_ot_shape_position_fallback (const hb_ot_shape_plan_t *plan, - hb_font_t *font, - hb_buffer_t *buffer) -{ - unsigned int start = 0; - unsigned int last_cluster = buffer->info[0].cluster; - unsigned int count = buffer->len; - for (unsigned int i = 1; i < count; i++) - if (buffer->info[i].cluster != last_cluster) { - position_cluster (plan, font, buffer, start, i); - start = i; - last_cluster = buffer->info[i].cluster; - } - position_cluster (plan, font, buffer, start, count); -} diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 6ec17c5..41ec329 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -33,8 +33,8 @@ #include "hb-ot-shape-private.hh" #include "hb-ot-shape-complex-private.hh" +#include "hb-ot-shape-fallback-private.hh" #include "hb-ot-shape-normalize-private.hh" -#include "hb-ot-shape-position-fallback-private.hh" #include "hb-ot-layout-private.hh" #include "hb-set-private.hh" @@ -427,7 +427,7 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) static void hb_position_complex_fallback (hb_ot_shape_context_t *c) { - _hb_ot_shape_position_fallback (c->plan, c->font, c->buffer); + _hb_ot_shape_fallback_position (c->plan, c->font, c->buffer); } static void commit 801298b590effd768607bb532dc83c73ba65d16b Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Aug 8 14:26:36 2012 -0400 Fix cast https://bugs.freedesktop.org/show_bug.cgi?id=53233 diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index c96723a..9864ca2 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -64,14 +64,16 @@ hb_segment_properties_equal (const hb_segment_properties_t *a, } -static inline long +#if 0 +static inline unsigned int hb_segment_properties_hash (const hb_segment_properties_t *p) { /* TODO improve */ - return (long) p->direction + - (long) p->script + - (long) p->language; + return (unsigned int) p->direction + + (unsigned int) p->script + + (intptr_t) (p->language); } +#endif diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index ddfb501..f7a78e4 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -190,11 +190,11 @@ hb_shape_plan_execute (hb_shape_plan *shape_plan, */ #if 0 -static long +static unsigned int hb_shape_plan_hash (const hb_shape_plan_t *shape_plan) { return hb_segment_properties_hash (&shape_plan->props) + - shape_plan->default_shaper_list ? 0 : (long) shape_plan->shaper_func; + shape_plan->default_shaper_list ? 0 : (intptr_t) shape_plan->shaper_func; } #endif
_______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz