提交 15063b12 编写于 作者: B Behdad Esfahbod

[coretext] Move CTFont construction to face_data

上级 ba3d49d9
...@@ -166,6 +166,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) ...@@ -166,6 +166,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
struct hb_coretext_shaper_face_data_t { struct hb_coretext_shaper_face_data_t {
CGFontRef cg_font; CGFontRef cg_font;
CTFontRef ct_font;
}; };
hb_coretext_shaper_face_data_t * hb_coretext_shaper_face_data_t *
...@@ -178,7 +179,23 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face) ...@@ -178,7 +179,23 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
data->cg_font = create_cg_font (face); data->cg_font = create_cg_font (face);
if (unlikely (!data->cg_font)) if (unlikely (!data->cg_font))
{ {
DEBUG_MSG (CORETEXT, face, "Failed creating CGFont."); 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, 36.);
if (unlikely (!data->ct_font))
{
DEBUG_MSG (CORETEXT, face, "CTFont creation failed.");
CFRelease (data->cg_font);
free (data); free (data);
return NULL; return NULL;
} }
...@@ -189,6 +206,7 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face) ...@@ -189,6 +206,7 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
void 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 *data)
{ {
CFRelease (data->ct_font);
CFRelease (data->cg_font); CFRelease (data->cg_font);
free (data); free (data);
} }
...@@ -209,41 +227,17 @@ hb_coretext_face_get_cg_font (hb_face_t *face) ...@@ -209,41 +227,17 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
* shaper font data * shaper font data
*/ */
struct hb_coretext_shaper_font_data_t { struct hb_coretext_shaper_font_data_t {};
CTFontRef ct_font;
};
hb_coretext_shaper_font_data_t * hb_coretext_shaper_font_data_t *
_hb_coretext_shaper_font_data_create (hb_font_t *font) _hb_coretext_shaper_font_data_create (hb_font_t *font)
{ {
if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL; return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
hb_coretext_shaper_font_data_t *data = (hb_coretext_shaper_font_data_t *) calloc (1, sizeof (hb_coretext_shaper_font_data_t));
if (unlikely (!data))
return NULL;
hb_face_t *face = font->face;
hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
/* 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. */
data->ct_font = create_ct_font (face_data->cg_font, 36.);
if (unlikely (!data->ct_font))
{
DEBUG_MSG (CORETEXT, font, "CTFont creation failed");
free (data);
return NULL;
}
return data;
} }
void 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 *data)
{ {
CFRelease (data->ct_font);
free (data);
} }
...@@ -269,9 +263,10 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_ ...@@ -269,9 +263,10 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_
CTFontRef CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font) hb_coretext_font_get_ct_font (hb_font_t *font)
{ {
if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; hb_face_t *face = font->face;
hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font); if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
return font_data->ct_font; hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
return face_data->ct_font;
} }
...@@ -504,9 +499,8 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, ...@@ -504,9 +499,8 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
{ {
hb_face_t *face = font->face; 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 *face_data = HB_SHAPER_DATA_GET (face);
hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
CGFloat ct_font_size = CTFontGetSize (font_data->ct_font); CGFloat ct_font_size = CTFontGetSize (face_data->ct_font);
CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
...@@ -640,7 +634,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, ...@@ -640,7 +634,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes); CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
CFRelease (attributes); CFRelease (attributes);
range->font = CTFontCreateCopyWithAttributes (font_data->ct_font, 0.0, NULL, font_desc); range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc);
CFRelease (font_desc); CFRelease (font_desc);
} }
else else
...@@ -797,7 +791,7 @@ resize_and_retry: ...@@ -797,7 +791,7 @@ resize_and_retry:
CFRelease (lang); CFRelease (lang);
} }
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
kCTFontAttributeName, font_data->ct_font); kCTFontAttributeName, face_data->ct_font);
if (num_features) if (num_features)
{ {
...@@ -890,7 +884,7 @@ resize_and_retry: ...@@ -890,7 +884,7 @@ resize_and_retry:
*/ */
CFDictionaryRef attributes = CTRunGetAttributes (run); CFDictionaryRef attributes = CTRunGetAttributes (run);
CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName)); CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName));
if (!CFEqual (run_ct_font, font_data->ct_font)) if (!CFEqual (run_ct_font, face_data->ct_font))
{ {
/* The run doesn't use our main font instance. We have to figure out /* 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 * whether font fallback happened, or this is just CoreText giving us
...@@ -936,7 +930,7 @@ resize_and_retry: ...@@ -936,7 +930,7 @@ resize_and_retry:
} }
if (!matched) if (!matched)
{ {
CFStringRef font_ps_name = CTFontCopyName (font_data->ct_font, kCTFontPostScriptNameKey); CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey);
CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey); CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0); CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
CFRelease (run_ps_name); CFRelease (run_ps_name);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册