X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fhb-ot-layout.cc;h=a49f339cc085f4cc7fb4b12249bcf37c54015671;hb=18c42850c9327ab4479ff150660a76d4ff6f3e9c;hp=fb6914d612344ac0ed759b81ea7ef6310e0076a0;hpb=1e7c1fcbc33599faefc32d4a28e5d8506d2c56fa;p=framework%2Fuifw%2Fharfbuzz.git diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index fb6914d..a49f339 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1,7 +1,7 @@ /* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * Copyright (C) 2007,2008,2009 Red Hat, Inc. + * Copyright © 1998-2004 David Turner and Werner Lemberg + * Copyright © 2006 Behdad Esfahbod + * Copyright © 2007,2008,2009 Red Hat, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -33,6 +33,8 @@ #include "hb-ot-layout-gdef-private.hh" #include "hb-ot-layout-gsub-private.hh" #include "hb-ot-layout-gpos-private.hh" +#include "hb-ot-head-private.hh" +#include "hb-ot-maxp-private.hh" #include @@ -42,33 +44,33 @@ HB_BEGIN_DECLS hb_ot_layout_t * -_hb_ot_layout_new (hb_face_t *face) +_hb_ot_layout_create (hb_face_t *face) { - /* Remove this object altogether */ + /* TODO Remove this object altogether */ hb_ot_layout_t *layout = (hb_ot_layout_t *) calloc (1, sizeof (hb_ot_layout_t)); - layout->gdef_blob = Sanitizer::sanitize (hb_face_get_table (face, HB_OT_TAG_GDEF)); + layout->gdef_blob = Sanitizer::sanitize (hb_face_reference_table (face, HB_OT_TAG_GDEF)); layout->gdef = Sanitizer::lock_instance (layout->gdef_blob); - layout->gsub_blob = Sanitizer::sanitize (hb_face_get_table (face, HB_OT_TAG_GSUB)); + layout->gsub_blob = Sanitizer::sanitize (hb_face_reference_table (face, HB_OT_TAG_GSUB)); layout->gsub = Sanitizer::lock_instance (layout->gsub_blob); - layout->gpos_blob = Sanitizer::sanitize (hb_face_get_table (face, HB_OT_TAG_GPOS)); + layout->gpos_blob = Sanitizer::sanitize (hb_face_reference_table (face, HB_OT_TAG_GPOS)); layout->gpos = Sanitizer::lock_instance (layout->gpos_blob); + layout->head_blob = Sanitizer::sanitize (hb_face_reference_table (face, HB_OT_TAG_head)); + layout->head = Sanitizer::lock_instance (layout->head_blob); + return layout; } void -_hb_ot_layout_free (hb_ot_layout_t *layout) +_hb_ot_layout_destroy (hb_ot_layout_t *layout) { - hb_blob_unlock (layout->gdef_blob); - hb_blob_unlock (layout->gsub_blob); - hb_blob_unlock (layout->gpos_blob); - hb_blob_destroy (layout->gdef_blob); hb_blob_destroy (layout->gsub_blob); hb_blob_destroy (layout->gpos_blob); + hb_blob_destroy (layout->head_blob); free (layout); } @@ -78,18 +80,21 @@ _get_gdef (hb_face_t *face) { return likely (face->ot_layout && face->ot_layout->gdef) ? *face->ot_layout->gdef : Null(GDEF); } - static inline const GSUB& _get_gsub (hb_face_t *face) { return likely (face->ot_layout && face->ot_layout->gsub) ? *face->ot_layout->gsub : Null(GSUB); } - static inline const GPOS& _get_gpos (hb_face_t *face) { return likely (face->ot_layout && face->ot_layout->gpos) ? *face->ot_layout->gpos : Null(GPOS); } +static inline const head& +_get_head (hb_face_t *face) +{ + return likely (face->ot_layout && face->ot_layout->head) ? *face->ot_layout->head : Null(head); +} /* @@ -106,52 +111,81 @@ unsigned int _hb_ot_layout_get_glyph_property (hb_face_t *face, hb_glyph_info_t *info) { - if (!info->gproperty()) + if (!info->props_cache()) { const GDEF &gdef = _get_gdef (face); - info->gproperty() = gdef.get_glyph_props (info->codepoint); + info->props_cache() = gdef.get_glyph_props (info->codepoint); } - return info->gproperty(); + return info->props_cache(); } -hb_bool_t -_hb_ot_layout_check_glyph_property (hb_face_t *face, - hb_glyph_info_t *ginfo, - unsigned int lookup_props, - unsigned int *property_out) +static hb_bool_t +_hb_ot_layout_match_properties (hb_face_t *face, + hb_codepoint_t codepoint, + unsigned int glyph_props, + unsigned int lookup_props) { - unsigned int property; - - property = _hb_ot_layout_get_glyph_property (face, ginfo); - if (property_out) - *property_out = property; - /* Not covered, if, for example, glyph class is ligature and * lookup_props includes LookupFlags::IgnoreLigatures */ - if (property & lookup_props & LookupFlag::IgnoreFlags) + if (glyph_props & lookup_props & LookupFlag::IgnoreFlags) return false; - if (property & HB_OT_LAYOUT_GLYPH_CLASS_MARK) + if (glyph_props & HB_OT_LAYOUT_GLYPH_CLASS_MARK) { /* If using mark filtering sets, the high short of * lookup_props has the set index. */ if (lookup_props & LookupFlag::UseMarkFilteringSet) - return _get_gdef (face).mark_set_covers (lookup_props >> 16, ginfo->codepoint); + return _get_gdef (face).mark_set_covers (lookup_props >> 16, codepoint); /* The second byte of lookup_props has the meaning * "ignore marks of attachment type different than * the attachment type specified." */ - if (lookup_props & LookupFlag::MarkAttachmentType && property & LookupFlag::MarkAttachmentType) - return (lookup_props & LookupFlag::MarkAttachmentType) == (property & LookupFlag::MarkAttachmentType); + if (lookup_props & LookupFlag::MarkAttachmentType && glyph_props & LookupFlag::MarkAttachmentType) + return (lookup_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType); } return true; } +hb_bool_t +_hb_ot_layout_check_glyph_property (hb_face_t *face, + hb_glyph_info_t *ginfo, + unsigned int lookup_props, + unsigned int *property_out) +{ + unsigned int property; + + property = _hb_ot_layout_get_glyph_property (face, ginfo); + (void) (property_out && (*property_out = property)); + + return _hb_ot_layout_match_properties (face, ginfo->codepoint, property, lookup_props); +} + +hb_bool_t +_hb_ot_layout_skip_mark (hb_face_t *face, + hb_glyph_info_t *ginfo, + unsigned int lookup_props, + unsigned int *property_out) +{ + unsigned int property; + + property = _hb_ot_layout_get_glyph_property (face, ginfo); + (void) (property_out && (*property_out = property)); + + /* If it's a mark, skip it we don't accept it. */ + if (unlikely (property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)) + return !_hb_ot_layout_match_properties (face, ginfo->codepoint, property, lookup_props); + + /* If not a mark, don't skip. */ + return false; +} + + + unsigned int hb_ot_layout_get_attach_points (hb_face_t *face, hb_codepoint_t glyph, @@ -164,17 +198,13 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int hb_ot_layout_get_ligature_carets (hb_font_t *font, - hb_face_t *face, hb_direction_t direction, hb_codepoint_t glyph, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, int *caret_array /* OUT */) { - hb_ot_layout_context_t c; - c.font = font; - c.face = face; - return _get_gdef (face).get_lig_carets (&c, direction, glyph, start_offset, caret_count, caret_array); + return _get_gdef (font->face).get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array); } /* @@ -410,16 +440,26 @@ hb_ot_layout_has_substitution (hb_face_t *face) return &_get_gsub (face) != &Null(GSUB); } +void +hb_ot_layout_substitute_start (hb_buffer_t *buffer) +{ + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + buffer->info[i].var1.u32 = buffer->info[i].var2.u32 = 0; +} + hb_bool_t hb_ot_layout_substitute_lookup (hb_face_t *face, hb_buffer_t *buffer, unsigned int lookup_index, hb_mask_t mask) { - hb_ot_layout_context_t c; - c.font = NULL; - c.face = face; - return _get_gsub (face).substitute_lookup (&c, buffer, lookup_index, mask); + return _get_gsub (face).substitute_lookup (face, buffer, lookup_index, mask); +} + +void +hb_ot_layout_substitute_finish (hb_buffer_t *buffer HB_UNUSED) +{ } @@ -433,17 +473,19 @@ hb_ot_layout_has_positioning (hb_face_t *face) return &_get_gpos (face) != &Null(GPOS); } +void +hb_ot_layout_position_start (hb_buffer_t *buffer) +{ + buffer->clear_positions (); +} + hb_bool_t hb_ot_layout_position_lookup (hb_font_t *font, - hb_face_t *face, hb_buffer_t *buffer, unsigned int lookup_index, hb_mask_t mask) { - hb_ot_layout_context_t c; - c.font = font; - c.face = face; - return _get_gpos (face).position_lookup (&c, buffer, lookup_index, mask); + return _get_gpos (font->face).position_lookup (font, buffer, lookup_index, mask); } void @@ -453,4 +495,15 @@ hb_ot_layout_position_finish (hb_buffer_t *buffer) } +/* + * head + */ + +unsigned int +_hb_ot_layout_get_upem (hb_face_t *face) +{ + return _get_head (face).get_upem (); +} + + HB_END_DECLS