[coretext] Move CTFont construction to face_data
This commit is contained in:
parent
ba3d49d9a5
commit
15063b12f7
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
* 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_
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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:
|
||||||
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:
|
||||||
*/
|
*/
|
||||||
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:
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue