mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-09-28 03:21:28 +08:00
Don't crash on unexpected CTFontDescription content
Don't crash in wxNativeFontInfo::InitFromDescriptor() in wxOSX when the provided descriptor doesn't contain kCTFontTraitsAttribute. This can happen e.g. when the descriptor was deserialized from a plist dictionary and the corresponding font is not present on the system. Closes #26411.
This commit is contained in:
committed by
Vadim Zeitlin
parent
dbce2cf0d1
commit
bbdbf45dce
@@ -887,9 +887,10 @@ void wxNativeFontInfo::InitFromFontDescriptor(CTFontDescriptorRef desc)
|
|||||||
|
|
||||||
// determine approximate family
|
// determine approximate family
|
||||||
|
|
||||||
CTFontSymbolicTraits symbolicTraits;
|
CTFontSymbolicTraits symbolicTraits = 0;
|
||||||
wxCFDictionaryRef traits((CFDictionaryRef)CTFontDescriptorCopyAttribute(desc, kCTFontTraitsAttribute));
|
wxCFDictionaryRef traits((CFDictionaryRef)CTFontDescriptorCopyAttribute(desc, kCTFontTraitsAttribute));
|
||||||
traits.GetValue(kCTFontSymbolicTrait).GetValue((int32_t*)&symbolicTraits, 0);
|
if (traits)
|
||||||
|
traits.GetValue(kCTFontSymbolicTrait).GetValue((int32_t*)&symbolicTraits, 0);
|
||||||
|
|
||||||
if (symbolicTraits & kCTFontMonoSpaceTrait)
|
if (symbolicTraits & kCTFontMonoSpaceTrait)
|
||||||
m_family = wxFONTFAMILY_TELETYPE;
|
m_family = wxFONTFAMILY_TELETYPE;
|
||||||
@@ -1026,6 +1027,8 @@ CGFloat wxNativeFontInfo::GetCTWeight(CTFontDescriptorRef descr)
|
|||||||
{
|
{
|
||||||
CGFloat weight;
|
CGFloat weight;
|
||||||
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
||||||
|
if (!fonttraitstype)
|
||||||
|
return CGFloat(0.0);
|
||||||
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
||||||
traits.GetValue(kCTFontWeightTrait).GetValue(&weight, CGFloat(0.0));
|
traits.GetValue(kCTFontWeightTrait).GetValue(&weight, CGFloat(0.0));
|
||||||
return weight;
|
return weight;
|
||||||
@@ -1035,6 +1038,8 @@ CGFloat wxNativeFontInfo::GetCTwidth(CTFontDescriptorRef descr)
|
|||||||
{
|
{
|
||||||
CGFloat weight;
|
CGFloat weight;
|
||||||
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
||||||
|
if (!fonttraitstype)
|
||||||
|
return CGFloat(0.0);
|
||||||
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
||||||
traits.GetValue(kCTFontWidthTrait).GetValue(&weight, CGFloat(0.0));
|
traits.GetValue(kCTFontWidthTrait).GetValue(&weight, CGFloat(0.0));
|
||||||
return weight;
|
return weight;
|
||||||
@@ -1044,6 +1049,8 @@ CGFloat wxNativeFontInfo::GetCTSlant(CTFontDescriptorRef descr)
|
|||||||
{
|
{
|
||||||
CGFloat slant;
|
CGFloat slant;
|
||||||
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
|
||||||
|
if (!fonttraitstype)
|
||||||
|
return CGFloat(0.0);
|
||||||
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
|
||||||
traits.GetValue(kCTFontSlantTrait).GetValue(&slant, CGFloat(0.0));
|
traits.GetValue(kCTFontSlantTrait).GetValue(&slant, CGFloat(0.0));
|
||||||
return slant;
|
return slant;
|
||||||
|
|||||||
Reference in New Issue
Block a user