diff options
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc')
-rw-r--r-- | Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc | 85 |
1 files changed, 75 insertions, 10 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc index d882fa16681..45268e3e7ab 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc @@ -30,12 +30,48 @@ #include "hb-ot-layout-gsubgpos-private.hh" #include "hb-aat-layout-private.hh" +#include "hb-aat-layout-ankr-table.hh" +#include "hb-aat-layout-kerx-table.hh" #include "hb-aat-layout-morx-table.hh" +#include "hb-aat-layout-trak-table.hh" /* - * mort/morx + * morx/kerx/trak */ +static inline const AAT::ankr& +_get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + { + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::ankr); + } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + const AAT::ankr& ankr = *(layout->ankr.get ()); + if (blob) + *blob = layout->ankr.blob; + return ankr; +} + +static inline const AAT::kerx& +_get_kerx (hb_face_t *face, hb_blob_t **blob = nullptr) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + { + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::kerx); + } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + /* XXX this doesn't call set_num_glyphs on sanitizer. */ + const AAT::kerx& kerx = *(layout->kerx.get ()); + if (blob) + *blob = layout->kerx.blob; + return kerx; +} + static inline const AAT::morx& _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr) { @@ -53,20 +89,36 @@ _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr) return morx; } -static inline void -_hb_aat_layout_create (hb_face_t *face) +static inline const AAT::trak& +_get_trak (hb_face_t *face, hb_blob_t **blob = nullptr) { - OT::Sanitizer<AAT::morx> sanitizer; - sanitizer.set_num_glyphs (face->get_num_glyphs ()); - hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX)); - OT::Sanitizer<AAT::morx>::lock_instance (morx_blob); - - if (0) + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) { - OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ()); + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::trak); } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + const AAT::trak& trak = *(layout->trak.get ()); + if (blob) + *blob = layout->trak.blob; + return trak; } +// static inline void +// _hb_aat_layout_create (hb_face_t *face) +// { +// OT::Sanitizer<AAT::morx> sanitizer; +// sanitizer.set_num_glyphs (face->get_num_glyphs ()); +// hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX)); +// OT::Sanitizer<AAT::morx>::lock_instance (morx_blob); + +// if (0) +// { +// OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ()); +// } +// } + void hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer) { @@ -76,3 +128,16 @@ hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer) AAT::hb_aat_apply_context_t c (font, buffer, blob); morx.apply (&c); } + +void +hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer) +{ + hb_blob_t *blob; + const AAT::ankr& ankr = _get_ankr (font->face, &blob); + const AAT::kerx& kerx = _get_kerx (font->face, &blob); + const AAT::trak& trak = _get_trak (font->face, &blob); + + AAT::hb_aat_apply_context_t c (font, buffer, blob); + kerx.apply (&c, &ankr); + trak.apply (&c); +} |