From c79865f90f62309dc64c8d3f2f503ec2aa4b7ec1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Mar 2014 19:37:55 -0400 Subject: [PATCH] [coretext] Add coretext_aat shaper This is a higher-priority shaper than default shaper ("ot"), but only picks up fonts that have AAT "morx"/"mort" table. Note that for this to work the font face's get_table() implementation should know how to return the full font blob. Based on patch from Konstantin Ritt. --- src/hb-coretext.cc | 94 +++++++++++++++++++++++++++++++++++++++++++ src/hb-coretext.h | 4 ++ src/hb-shaper-list.hh | 4 ++ 3 files changed, 102 insertions(+) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 87dd77975..9031231e8 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -810,3 +810,97 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, return true; } + + +/* + * AAT shaper + */ + +HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, face) +HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, font) + + +/* + * shaper face data + */ + +struct hb_coretext_aat_shaper_face_data_t {}; + +hb_coretext_aat_shaper_face_data_t * +_hb_coretext_aat_shaper_face_data_create (hb_face_t *face) +{ + hb_blob_t *mort_blob = face->reference_table (HB_CORETEXT_TAG_MORT); + /* Umm, we just reference the table to check whether it exists. + * Maybe add better API for this? */ + if (!hb_blob_get_length (mort_blob)) + { + hb_blob_destroy (mort_blob); + mort_blob = face->reference_table (HB_CORETEXT_TAG_MORX); + if (!hb_blob_get_length (mort_blob)) + { + hb_blob_destroy (mort_blob); + return NULL; + } + } + hb_blob_destroy (mort_blob); + + return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL; +} + +void +_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_shaper_face_data_t *data HB_UNUSED) +{ +} + + +/* + * shaper font data + */ + +struct hb_coretext_aat_shaper_font_data_t {}; + +hb_coretext_aat_shaper_font_data_t * +_hb_coretext_aat_shaper_font_data_create (hb_font_t *font) +{ + return hb_coretext_shaper_font_data_ensure (font) ? (hb_coretext_aat_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL; +} + +void +_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_shaper_font_data_t *data HB_UNUSED) +{ +} + + +/* + * shaper shape_plan data + */ + +struct hb_coretext_aat_shaper_shape_plan_data_t {}; + +hb_coretext_aat_shaper_shape_plan_data_t * +_hb_coretext_aat_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, + const hb_feature_t *user_features HB_UNUSED, + unsigned int num_user_features HB_UNUSED) +{ + return (hb_coretext_aat_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; +} + +void +_hb_coretext_aat_shaper_shape_plan_data_destroy (hb_coretext_aat_shaper_shape_plan_data_t *data HB_UNUSED) +{ +} + + +/* + * shaper + */ + +hb_bool_t +_hb_coretext_aat_shape (hb_shape_plan_t *shape_plan, + hb_font_t *font, + hb_buffer_t *buffer, + const hb_feature_t *features, + unsigned int num_features) +{ + return _hb_coretext_shape (shape_plan, font, buffer, features, num_features); +} diff --git a/src/hb-coretext.h b/src/hb-coretext.h index c4954fa1b..bcf1de714 100644 --- a/src/hb-coretext.h +++ b/src/hb-coretext.h @@ -34,6 +34,10 @@ HB_BEGIN_DECLS +#define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t') +#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x') + + CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face); diff --git a/src/hb-shaper-list.hh b/src/hb-shaper-list.hh index 57fb8ec58..6c537d492 100644 --- a/src/hb-shaper-list.hh +++ b/src/hb-shaper-list.hh @@ -34,6 +34,10 @@ /* Only picks up fonts that have a "Silf" table. */ HB_SHAPER_IMPLEMENT (graphite2) #endif +#ifdef HAVE_CORETEXT +/* Only picks up fonts that have a "mort" or "morx" table. */ +HB_SHAPER_IMPLEMENT (coretext_aat) +#endif #ifdef HAVE_OT HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */