ghostty/pkg/macos/text/font_descriptor.zig
Mitchell Hashimoto 88ae3be9ef pkg/macos: CFURL
2022-10-01 11:13:44 -07:00

158 lines
6.1 KiB
Zig

const std = @import("std");
const Allocator = std.mem.Allocator;
const foundation = @import("../foundation.zig");
pub const FontDescriptor = opaque {
pub fn createWithNameAndSize(name: *foundation.String, size: f64) Allocator.Error!*FontDescriptor {
return CTFontDescriptorCreateWithNameAndSize(name, size) orelse Allocator.Error.OutOfMemory;
}
pub fn release(self: *FontDescriptor) void {
foundation.CFRelease(self);
}
pub fn copyAttribute(self: *FontDescriptor, comptime attr: FontAttribute) attr.Value() {
const T = attr.Value();
return @ptrCast(T, CTFontDescriptorCopyAttribute(self, attr.key()));
}
pub extern "c" fn CTFontDescriptorCreateWithNameAndSize(
name: *foundation.String,
size: f64,
) ?*FontDescriptor;
pub extern "c" fn CTFontDescriptorCopyAttribute(
*FontDescriptor,
*foundation.String,
) ?*anyopaque;
};
pub const FontAttribute = enum {
url,
name,
display_name,
family_name,
style_name,
traits,
variation,
size,
matrix,
cascade_list,
character_set,
languages,
baseline_adjust,
macintosh_encodings,
features,
feature_settings,
fixed_advance,
orientation,
format,
registration_scope,
priority,
enabled,
downloadable,
downloaded,
pub fn key(self: FontAttribute) *foundation.String {
return switch (self) {
.url => kCTFontURLAttribute,
.name => kCTFontNameAttribute,
.display_name => kCTFontDisplayNameAttribute,
.family_name => kCTFontFamilyNameAttribute,
.style_name => kCTFontStyleNameAttribute,
.traits => kCTFontTraitsAttribute,
.variation => kCTFontVariationAttribute,
.size => kCTFontSizeAttribute,
.matrix => kCTFontMatrixAttribute,
.cascade_list => kCTFontCascadeListAttribute,
.character_set => kCTFontCharacterSetAttribute,
.languages => kCTFontLanguagesAttribute,
.baseline_adjust => kCTFontBaselineAdjustAttribute,
.macintosh_encodings => kCTFontMacintoshEncodingsAttribute,
.features => kCTFontFeaturesAttribute,
.feature_settings => kCTFontFeatureSettingsAttribute,
.fixed_advance => kCTFontFixedAdvanceAttribute,
.orientation => kCTFontOrientationAttribute,
.format => kCTFontFormatAttribute,
.registration_scope => kCTFontRegistrationScopeAttribute,
.priority => kCTFontPriorityAttribute,
.enabled => kCTFontEnabledAttribute,
.downloadable => kCTFontDownloadableAttribute,
.downloaded => kCTFontDownloadedAttribute,
};
}
pub fn Value(self: FontAttribute) type {
return switch (self) {
.url => *foundation.URL,
.name => *foundation.String,
.display_name => *foundation.String,
.family_name => *foundation.String,
.style_name => *foundation.String,
.traits => *foundation.Dictionary,
.variation => *foundation.Dictionary,
.size => *anyopaque, // CFNumber
.matrix => *anyopaque, // CFDataRef
.cascade_list => *foundation.Array,
.character_set => *anyopaque, // CFCharacterSetRef
.languages => *foundation.Array,
.baseline_adjust => *anyopaque, // CFNumber
.macintosh_encodings => *anyopaque, // CFNumber
.features => *foundation.Array,
.feature_settings => *foundation.Array,
.fixed_advance => *anyopaque, // CFNumber
.orientation => *anyopaque, // CFNumber
.format => *anyopaque, // CFNumber
.registration_scope => *anyopaque, // CFNumber
.priority => *anyopaque, // CFNumber
.enabled => *anyopaque, // CFNumber
.downloadable => *anyopaque, // CFBoolean
.downloaded => *anyopaque, // CFBoolean
};
}
extern "c" const kCTFontURLAttribute: *foundation.String;
extern "c" const kCTFontNameAttribute: *foundation.String;
extern "c" const kCTFontDisplayNameAttribute: *foundation.String;
extern "c" const kCTFontFamilyNameAttribute: *foundation.String;
extern "c" const kCTFontStyleNameAttribute: *foundation.String;
extern "c" const kCTFontTraitsAttribute: *foundation.String;
extern "c" const kCTFontVariationAttribute: *foundation.String;
extern "c" const kCTFontVariationAxesAttribute: *foundation.String;
extern "c" const kCTFontSizeAttribute: *foundation.String;
extern "c" const kCTFontMatrixAttribute: *foundation.String;
extern "c" const kCTFontCascadeListAttribute: *foundation.String;
extern "c" const kCTFontCharacterSetAttribute: *foundation.String;
extern "c" const kCTFontLanguagesAttribute: *foundation.String;
extern "c" const kCTFontBaselineAdjustAttribute: *foundation.String;
extern "c" const kCTFontMacintoshEncodingsAttribute: *foundation.String;
extern "c" const kCTFontFeaturesAttribute: *foundation.String;
extern "c" const kCTFontFeatureSettingsAttribute: *foundation.String;
extern "c" const kCTFontFixedAdvanceAttribute: *foundation.String;
extern "c" const kCTFontOrientationAttribute: *foundation.String;
extern "c" const kCTFontFormatAttribute: *foundation.String;
extern "c" const kCTFontRegistrationScopeAttribute: *foundation.String;
extern "c" const kCTFontPriorityAttribute: *foundation.String;
extern "c" const kCTFontEnabledAttribute: *foundation.String;
extern "c" const kCTFontDownloadableAttribute: *foundation.String;
extern "c" const kCTFontDownloadedAttribute: *foundation.String;
};
test "descriptor" {
const testing = std.testing;
const name = try foundation.String.createWithBytes("foo", .utf8, false);
defer name.release();
const v = try FontDescriptor.createWithNameAndSize(name, 12);
defer v.release();
const copy_name = v.copyAttribute(.name);
defer copy_name.release();
{
var buf: [128]u8 = undefined;
const cstr = copy_name.cstring(&buf, .utf8).?;
try testing.expectEqualStrings("foo", cstr);
}
}