Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set *_font_fallbacks default to None #16941

Merged
merged 6 commits into from
Aug 29, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
update macOS
  • Loading branch information
JunkuiZhang committed Aug 27, 2024
commit 590c7a2277e38cd8988bfb1e630e7da28a2645c5
107 changes: 75 additions & 32 deletions crates/gpui/src/platform/mac/open_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,50 +35,61 @@ pub fn apply_features_and_fallbacks(
fallbacks: Option<&FontFallbacks>,
) -> anyhow::Result<()> {
unsafe {
let fallback_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
// let fallback_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

if let Some(fallbacks) = fallbacks {
for user_fallback in fallbacks.fallback_list() {
let name = CFString::from(user_fallback.as_str());
let fallback_desc =
CTFontDescriptorCreateWithNameAndSize(name.as_concrete_TypeRef(), 0.0);
CFArrayAppendValue(fallback_array, fallback_desc as _);
CFRelease(fallback_desc as _);
}
}
// if let Some(fallbacks) = fallbacks {
// for user_fallback in fallbacks.fallback_list() {
// let name = CFString::from(user_fallback.as_str());
// let fallback_desc =
// CTFontDescriptorCreateWithNameAndSize(name.as_concrete_TypeRef(), 0.0);
// CFArrayAppendValue(fallback_array, fallback_desc as _);
// CFRelease(fallback_desc as _);
// }
// }

{
let preferred_languages: CFArray<CFString> =
CFArray::wrap_under_create_rule(CFLocaleCopyPreferredLanguages());
// {
// let preferred_languages: CFArray<CFString> =
// CFArray::wrap_under_create_rule(CFLocaleCopyPreferredLanguages());

let default_fallbacks = CTFontCopyDefaultCascadeListForLanguages(
font.native_font().as_concrete_TypeRef(),
preferred_languages.as_concrete_TypeRef(),
);
let default_fallbacks: CFArray<CTFontDescriptor> =
CFArray::wrap_under_create_rule(default_fallbacks);
// let default_fallbacks = CTFontCopyDefaultCascadeListForLanguages(
// font.native_font().as_concrete_TypeRef(),
// preferred_languages.as_concrete_TypeRef(),
// );
// let default_fallbacks: CFArray<CTFontDescriptor> =
// CFArray::wrap_under_create_rule(default_fallbacks);

default_fallbacks
.iter()
.filter(|desc| desc.font_path().is_some())
.map(|desc| {
CFArrayAppendValue(fallback_array, desc.as_concrete_TypeRef() as _);
});
}
// default_fallbacks
// .iter()
// .filter(|desc| desc.font_path().is_some())
// .map(|desc| {
// CFArrayAppendValue(fallback_array, desc.as_concrete_TypeRef() as _);
// });
// }

let feature_array = generate_feature_array(features);
let keys = [kCTFontFeatureSettingsAttribute, kCTFontCascadeListAttribute];
let values = [feature_array, fallback_array];
let mut keys = vec![kCTFontFeatureSettingsAttribute];
let mut values = vec![generate_feature_array(features)];
if let Some(fallbacks) = fallbacks {
if !fallbacks.fallback_list().is_empty() {
keys.push(kCTFontCascadeListAttribute);
values.push(generate_fallback_array());
}
}
// let feature_array = generate_feature_array(features);
// let keys = [kCTFontFeatureSettingsAttribute, kCTFontCascadeListAttribute];
// let values = [feature_array, fallback_array];
let attrs = CFDictionaryCreate(
kCFAllocatorDefault,
keys.as_ptr() as _,
values.as_ptr() as _,
2,
keys.len() as u32,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks,
);
CFRelease(feature_array as *const _ as _);
CFRelease(fallback_array as *const _ as _);
for array in values.iter() {
CFRelease(array as *const _ as _);
}
// CFRelease(feature_array as *const _ as _);
// CFRelease(fallback_array as *const _ as _);
let new_descriptor = CTFontDescriptorCreateWithAttributes(attrs);
CFRelease(attrs as _);
let new_descriptor = CTFontDescriptor::wrap_under_create_rule(new_descriptor);
Expand Down Expand Up @@ -121,6 +132,38 @@ fn generate_feature_array(features: &FontFeatures) -> CFMutableArrayRef {
}
}

fn generate_fallback_array(fallbacks: &FontFallbacks) -> CFMutableArrayRef {
unsafe {
let fallback_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
for user_fallback in fallbacks.fallback_list() {
let name = CFString::from(user_fallback.as_str());
let fallback_desc =
CTFontDescriptorCreateWithNameAndSize(name.as_concrete_TypeRef(), 0.0);
CFArrayAppendValue(fallback_array, fallback_desc as _);
CFRelease(fallback_desc as _);
}
{
let preferred_languages: CFArray<CFString> =
CFArray::wrap_under_create_rule(CFLocaleCopyPreferredLanguages());

let default_fallbacks = CTFontCopyDefaultCascadeListForLanguages(
font.native_font().as_concrete_TypeRef(),
preferred_languages.as_concrete_TypeRef(),
);
let default_fallbacks: CFArray<CTFontDescriptor> =
CFArray::wrap_under_create_rule(default_fallbacks);

default_fallbacks
.iter()
.filter(|desc| desc.font_path().is_some())
.map(|desc| {
CFArrayAppendValue(fallback_array, desc.as_concrete_TypeRef() as _);
});
}
fallback_array
}
}

#[link(name = "CoreText", kind = "framework")]
extern "C" {
static kCTFontOpenTypeFeatureTag: CFStringRef;
Expand Down