From f9b4c6570a4725eec5393f86e6468a189ac8c6be Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 11 Oct 2017 12:51:25 +0200 Subject: [PATCH 1/5] [coretext] Move font size to a macro --- src/hb-coretext.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 5c0b65af0..10859e161 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -36,6 +36,7 @@ #define HB_DEBUG_CORETEXT (HB_DEBUG+0) #endif +#define HB_CORETEXT_FONT_SIZE 18.0 static void release_table_data (void *user_data) @@ -229,7 +230,7 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face) * Since we always create CTFont at a fixed size, our CTFont lives in face_data * instead of font_data. Which is good, because when people change scale on * hb_font_t, we won't need to update our CTFont. */ - data->ct_font = create_ct_font (data->cg_font, 18.); + data->ct_font = create_ct_font (data->cg_font, HB_CORETEXT_FONT_SIZE); if (unlikely (!data->ct_font)) { DEBUG_MSG (CORETEXT, face, "CTFont creation failed."); From a8e466c3c12a3499028cb576721e5f85ff4cbf2d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 11 Oct 2017 13:05:59 +0200 Subject: [PATCH 2/5] [coretext] Move CT_Font to font data Towards implementing optical sizing. Untested; won't compile. https://github.com/behdad/harfbuzz/issues/360 --- src/hb-coretext.cc | 85 ++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 10859e161..3f1c67113 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -203,51 +203,26 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) return ct_font; } -struct hb_coretext_shaper_face_data_t { - CGFontRef cg_font; - CTFontRef ct_font; -}; +typedef CGFontRef hb_coretext_shaper_face_data_t; hb_coretext_shaper_face_data_t * _hb_coretext_shaper_face_data_create (hb_face_t *face) { - hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t)); - if (unlikely (!data)) - return NULL; + hb_coretext_shaper_face_data_t *cg_font = create_cg_font (face); - data->cg_font = create_cg_font (face); - if (unlikely (!data->cg_font)) + if (unlikely (!cg_font)) { DEBUG_MSG (CORETEXT, face, "CGFont creation failed.."); - free (data); return NULL; } - /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table, - * which can make the font too tight at large sizes. 36pt should be a good semi-neutral - * size. - * - * Since we always create CTFont at a fixed size, our CTFont lives in face_data - * instead of font_data. Which is good, because when people change scale on - * hb_font_t, we won't need to update our CTFont. */ - data->ct_font = create_ct_font (data->cg_font, HB_CORETEXT_FONT_SIZE); - if (unlikely (!data->ct_font)) - { - DEBUG_MSG (CORETEXT, face, "CTFont creation failed."); - CFRelease (data->cg_font); - free (data); - return NULL; - } - - return data; + return cg_font; } void -_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data) +_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *cg_font) { - CFRelease (data->ct_font); - CFRelease (data->cg_font); - free (data); + CFRelease (cg_font); } /* @@ -257,8 +232,8 @@ CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face) { if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - return face_data->cg_font; + hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); + return cg_font; } @@ -266,17 +241,31 @@ hb_coretext_face_get_cg_font (hb_face_t *face) * shaper font data */ -struct hb_coretext_shaper_font_data_t {}; +typedef CTFontRef hb_coretext_shaper_font_data_t; hb_coretext_shaper_font_data_t * -_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED) +_hb_coretext_shaper_font_data_create (hb_font_t *font) { - return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; + if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL; + hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); + + float ptem = font->ptem < 0 ? HB_CORETEXT_FONT_SIZE : font->ptem; + + hb_coretext_shaper_font_data_t *ct_font = create_ct_font (cg_font, ptem); + + if (unlikely (!ct_font)) + { + DEBUG_MSG (CORETEXT, font, "CGFont creation failed.."); + return NULL; + } + + return ct_font; } void -_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) +_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *ct_font) { + CFRelease (ct_font); } @@ -304,10 +293,9 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_ CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { - hb_face_t *face = font->face; - if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - return face_data->ct_font; + if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; + hb_coretext_shaper_font_data_t *ct_font = HB_SHAPER_DATA_GET (font); + return ct_font; } @@ -539,9 +527,10 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, unsigned int num_features) { hb_face_t *face = font->face; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); + hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); + hb_coretext_shaper_font_data_t *ct_font = HB_SHAPER_DATA_GET (font); - CGFloat ct_font_size = CTFontGetSize (face_data->ct_font); + CGFloat ct_font_size = CTFontGetSize (ct_font); CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; @@ -676,7 +665,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes); CFRelease (attributes); - range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc); + range->font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, font_desc); CFRelease (font_desc); } else @@ -830,7 +819,7 @@ resize_and_retry: CFRelease (lang); } CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), - kCTFontAttributeName, face_data->ct_font); + kCTFontAttributeName, ct_font); if (num_features && range_records.len) { @@ -948,7 +937,7 @@ resize_and_retry: */ CFDictionaryRef attributes = CTRunGetAttributes (run); CTFontRef run_ct_font = static_cast(CFDictionaryGetValue (attributes, kCTFontAttributeName)); - if (!CFEqual (run_ct_font, face_data->ct_font)) + if (!CFEqual (run_ct_font, ct_font)) { /* The run doesn't use our main font instance. We have to figure out * whether font fallback happened, or this is just CoreText giving us @@ -986,13 +975,13 @@ resize_and_retry: CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0); if (run_cg_font) { - matched = CFEqual (run_cg_font, face_data->cg_font); + matched = CFEqual (run_cg_font, cg_font); CFRelease (run_cg_font); } } if (!matched) { - CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey); + CFStringRef font_ps_name = CTFontCopyName (ct_font, kCTFontPostScriptNameKey); CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey); CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0); CFRelease (run_ps_name); From f33413075655e6383cd16bc31f0bf804dcec1c64 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 11 Oct 2017 13:17:46 +0200 Subject: [PATCH 3/5] [coretext] Another try --- src/hb-coretext.cc | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 3f1c67113..26cc07c9e 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -203,12 +203,10 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) return ct_font; } -typedef CGFontRef hb_coretext_shaper_face_data_t; - hb_coretext_shaper_face_data_t * _hb_coretext_shaper_face_data_create (hb_face_t *face) { - hb_coretext_shaper_face_data_t *cg_font = create_cg_font (face); + CGFontRef cg_font = create_cg_font (face); if (unlikely (!cg_font)) { @@ -216,13 +214,13 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face) return NULL; } - return cg_font; + return (hb_coretext_shaper_face_data_t *) cg_font; } void -_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *cg_font) +_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data) { - CFRelease (cg_font); + CFRelease ((CGFontRef) data); } /* @@ -232,8 +230,7 @@ CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face) { if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; - hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); - return cg_font; + return (CGFontRef) HB_SHAPER_DATA_GET (face); } @@ -241,17 +238,15 @@ hb_coretext_face_get_cg_font (hb_face_t *face) * shaper font data */ -typedef CTFontRef hb_coretext_shaper_font_data_t; - hb_coretext_shaper_font_data_t * _hb_coretext_shaper_font_data_create (hb_font_t *font) { if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL; - hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); + CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); float ptem = font->ptem < 0 ? HB_CORETEXT_FONT_SIZE : font->ptem; - hb_coretext_shaper_font_data_t *ct_font = create_ct_font (cg_font, ptem); + CTFontRef ct_font = create_ct_font (cg_font, ptem); if (unlikely (!ct_font)) { @@ -259,13 +254,13 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font) return NULL; } - return ct_font; + return (hb_coretext_shaper_font_data_t *) ct_font; } void -_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *ct_font) +_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) { - CFRelease (ct_font); + CFRelease ((CTFontRef) data); } @@ -294,8 +289,7 @@ CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; - hb_coretext_shaper_font_data_t *ct_font = HB_SHAPER_DATA_GET (font); - return ct_font; + return (CTFontRef)_SHAPER_DATA_GET (font); } @@ -527,8 +521,8 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, unsigned int num_features) { hb_face_t *face = font->face; - hb_coretext_shaper_face_data_t *cg_font = HB_SHAPER_DATA_GET (face); - hb_coretext_shaper_font_data_t *ct_font = HB_SHAPER_DATA_GET (font); + CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); + CTFontRef ct_font = (CTFontRef) HB_SHAPER_DATA_GET (font); CGFloat ct_font_size = CTFontGetSize (ct_font); CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; From db7a73ce0781d1fec0235e419ac448565dcfc8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Wed, 11 Oct 2017 13:24:39 +0200 Subject: [PATCH 4/5] [coretext] Fix build --- src/hb-coretext.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 26cc07c9e..9b680abf6 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -241,7 +241,8 @@ hb_coretext_face_get_cg_font (hb_face_t *face) hb_coretext_shaper_font_data_t * _hb_coretext_shaper_font_data_create (hb_font_t *font) { - if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL; + hb_face_t *face = font->face; + if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); float ptem = font->ptem < 0 ? HB_CORETEXT_FONT_SIZE : font->ptem; @@ -289,7 +290,7 @@ CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; - return (CTFontRef)_SHAPER_DATA_GET (font); + return (CTFontRef)HB_SHAPER_DATA_GET (font); } From a5ebe1d4aec41bc5e289a7969e5e5f7bb57733b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Wed, 11 Oct 2017 13:32:38 +0200 Subject: [PATCH 5/5] [coretext] Recreate CTFont if pt size changed Attempt at fixing #360 --- src/hb-coretext.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 9b680abf6..8219284dc 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -71,8 +71,9 @@ hb_coretext_face_create (CGFontRef cg_font) HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face) -HB_SHAPER_DATA_ENSURE_DEFINE(coretext, font) - +HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font, + abs (CTFontGetSize((CTFontRef) data) - + (font->ptem < 0 ? HB_CORETEXT_FONT_SIZE : font->ptem)) < 1) /* * shaper face data