From fb0f80f9caf2b16a77f645f4ecb3783f096d3680 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 25 Aug 2023 22:24:45 -0700 Subject: [PATCH 1/5] macos: add necessary functions for variation axes querying --- pkg/macos/foundation/array.zig | 2 +- pkg/macos/text/font_descriptor.zig | 37 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/pkg/macos/foundation/array.zig b/pkg/macos/foundation/array.zig index 35d3a0aba..4524cda6b 100644 --- a/pkg/macos/foundation/array.zig +++ b/pkg/macos/foundation/array.zig @@ -24,7 +24,7 @@ pub const Array = opaque { /// constness so that further API calls work correctly. The Foundation /// API doesn't properly mark things const/non-const. pub fn getValueAtIndex(self: *Array, comptime T: type, idx: usize) *T { - return @ptrCast(CFArrayGetValueAtIndex(self, idx)); + return @ptrCast(@alignCast(CFArrayGetValueAtIndex(self, idx))); } pub extern "c" fn CFArrayCreate( diff --git a/pkg/macos/text/font_descriptor.zig b/pkg/macos/text/font_descriptor.zig index f7f8097a1..2c1da2b6a 100644 --- a/pkg/macos/text/font_descriptor.zig +++ b/pkg/macos/text/font_descriptor.zig @@ -75,6 +75,9 @@ pub const FontAttribute = enum { downloadable, downloaded, + // https://developer.apple.com/documentation/coretext/core_text_constants?language=objc + variation_axes, + pub fn key(self: FontAttribute) *foundation.String { return @as(*foundation.String, @ptrFromInt(@intFromPtr(switch (self) { .url => c.kCTFontURLAttribute, @@ -101,6 +104,7 @@ pub const FontAttribute = enum { .enabled => c.kCTFontEnabledAttribute, .downloadable => c.kCTFontDownloadableAttribute, .downloaded => c.kCTFontDownloadedAttribute, + .variation_axes => c.kCTFontVariationAxesAttribute, }))); } @@ -130,6 +134,7 @@ pub const FontAttribute = enum { .enabled => *foundation.Number, .downloadable => *anyopaque, // CFBoolean .downloaded => *anyopaque, // CFBoolean + .variation_axes => ?*foundation.Array, }; } }; @@ -159,6 +164,38 @@ pub const FontTraitKey = enum { } }; +// https://developer.apple.com/documentation/coretext/ctfont/font_variation_axis_dictionary_keys?language=objc +pub const FontVariationAxisKey = enum { + identifier, + minimum_value, + maximum_value, + default_value, + name, + hidden, + + pub fn key(self: FontVariationAxisKey) *foundation.String { + return @as(*foundation.String, @ptrFromInt(@intFromPtr(switch (self) { + .identifier => c.kCTFontVariationAxisIdentifierKey, + .minimum_value => c.kCTFontVariationAxisMinimumValueKey, + .maximum_value => c.kCTFontVariationAxisMaximumValueKey, + .default_value => c.kCTFontVariationAxisDefaultValueKey, + .name => c.kCTFontVariationAxisNameKey, + .hidden => c.kCTFontVariationAxisHiddenKey, + }))); + } + + pub fn Value(comptime self: FontVariationAxisKey) type { + return switch (self) { + .identifier => foundation.Number, + .minimum_value => foundation.Number, + .maximum_value => foundation.Number, + .default_value => foundation.Number, + .name => foundation.String, + .hidden => foundation.Number, + }; + } +}; + pub const FontSymbolicTraits = packed struct(u32) { italic: bool = false, bold: bool = false, From 9d0729f17cb155f58dea04d4817411dce535e079 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 27 Aug 2023 07:56:17 -0700 Subject: [PATCH 2/5] font/coretext: ability to set variation axes --- pkg/macos/text/font.zig | 8 +++ pkg/macos/text/font_descriptor.zig | 15 +++++ src/font/discovery.zig | 22 +++++- src/font/face.zig | 40 +++++++++++ src/font/face/coretext.zig | 103 ++++++++++++++++++++++++++++- src/font/res/Lilex-VF.ttf | Bin 0 -> 196468 bytes src/font/test.zig | 1 + 7 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 src/font/res/Lilex-VF.ttf diff --git a/pkg/macos/text/font.zig b/pkg/macos/text/font.zig index 40238bfdd..0cef4d8a6 100644 --- a/pkg/macos/text/font.zig +++ b/pkg/macos/text/font.zig @@ -39,6 +39,14 @@ pub const Font = opaque { c.CFRelease(self); } + pub fn retain(self: *Font) void { + _ = c.CFRetain(self); + } + + pub fn copyDescriptor(self: *Font) *text.FontDescriptor { + return @ptrCast(@constCast(c.CTFontCopyFontDescriptor(@ptrCast(self)))); + } + pub fn getGlyphsForCharacters(self: *Font, chars: []const u16, glyphs: []graphics.Glyph) bool { assert(chars.len == glyphs.len); return c.CTFontGetGlyphsForCharacters( diff --git a/pkg/macos/text/font_descriptor.zig b/pkg/macos/text/font_descriptor.zig index 2c1da2b6a..c39e03a42 100644 --- a/pkg/macos/text/font_descriptor.zig +++ b/pkg/macos/text/font_descriptor.zig @@ -31,6 +31,21 @@ pub const FontDescriptor = opaque { ) orelse Allocator.Error.OutOfMemory; } + pub fn createCopyWithVariation( + original: *FontDescriptor, + id: *foundation.Number, + value: f64, + ) Allocator.Error!*FontDescriptor { + return @as( + ?*FontDescriptor, + @ptrCast(@constCast(c.CTFontDescriptorCreateCopyWithVariation( + @ptrCast(original), + @ptrCast(id), + value, + ))), + ) orelse Allocator.Error.OutOfMemory; + } + pub fn release(self: *FontDescriptor) void { c.CFRelease(self); } diff --git a/src/font/discovery.zig b/src/font/discovery.zig index 67bde3b0d..fb3c8322e 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -5,6 +5,7 @@ const fontconfig = @import("fontconfig"); const macos = @import("macos"); const options = @import("main.zig").options; const DeferredFace = @import("main.zig").DeferredFace; +const Variation = @import("main.zig").face.Variation; const log = std.log.scoped(.discovery); @@ -43,6 +44,11 @@ pub const Descriptor = struct { bold: bool = false, italic: bool = false, + /// Variation axes to apply to the font. This also impacts searching + /// for fonts since fonts with the ability to set these variations + /// will be preferred, but not guaranteed. + variations: []const Variation = &.{}, + /// Convert to Fontconfig pattern to use for lookup. The pattern does /// not have defaults filled/substituted (Fontconfig thing) so callers /// must still do this. @@ -149,7 +155,21 @@ pub const Descriptor = struct { ); } - return try macos.text.FontDescriptor.createWithAttributes(@ptrCast(attrs)); + // Build our descriptor from attrs + var desc = try macos.text.FontDescriptor.createWithAttributes(@ptrCast(attrs)); + errdefer desc.release(); + + // Variations are built by copying the descriptor. I don't know a way + // to set it on attrs directly. + for (self.variations) |v| { + const id = try macos.foundation.Number.create(.int, @ptrCast(&v.id)); + defer id.release(); + const next = try desc.createCopyWithVariation(id, v.value); + desc.release(); + desc = next; + } + + return desc; } }; diff --git a/src/font/face.zig b/src/font/face.zig index 458a49f62..765b7dfe2 100644 --- a/src/font/face.zig +++ b/src/font/face.zig @@ -1,3 +1,4 @@ +const std = @import("std"); const builtin = @import("builtin"); const options = @import("main.zig").options; const freetype = @import("face/freetype.zig"); @@ -36,6 +37,31 @@ pub const DesiredSize = struct { } }; +/// A font variation setting. The best documentation for this I know of +/// is actually the CSS font-variation-settings property on MDN: +/// https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings +pub const Variation = struct { + id: Id, + value: f64, + + pub const Id = packed struct(u32) { + d: u8, + c: u8, + b: u8, + a: u8, + + pub fn init(v: *const [4]u8) Id { + return .{ .a = v[0], .b = v[1], .c = v[2], .d = v[3] }; + } + + /// Converts the ID to a string. The return value is only valid + /// for the lifetime of the self pointer. + pub fn str(self: Id) [4]u8 { + return .{ self.a, self.b, self.c, self.d }; + } + }; +}; + /// Metrics associated with the font that are useful for renderers to know. pub const Metrics = struct { /// Recommended cell width and height for a monospace grid using this font. @@ -77,3 +103,17 @@ pub const Foo = if (options.backend == .coretext) coretext.Face else void; test { @import("std").testing.refAllDecls(@This()); } + +test "Variation.Id: wght should be 2003265652" { + const testing = std.testing; + const id = Variation.Id.init("wght"); + try testing.expectEqual(@as(u32, 2003265652), @as(u32, @bitCast(id))); + try testing.expectEqualStrings("wght", &(id.str())); +} + +test "Variation.Id: slnt should be 1936486004" { + const testing = std.testing; + const id: Variation.Id = .{ .a = 's', .b = 'l', .c = 'n', .d = 't' }; + try testing.expectEqual(@as(u32, 1936486004), @as(u32, @bitCast(id))); + try testing.expectEqualStrings("slnt", &(id.str())); +} diff --git a/src/font/face/coretext.zig b/src/font/face/coretext.zig index 99d074453..ac14aaef8 100644 --- a/src/font/face/coretext.zig +++ b/src/font/face/coretext.zig @@ -64,11 +64,33 @@ pub const Face = struct { const ct_font = try base.copyWithAttributes(@floatFromInt(size.pixels()), null, null); errdefer ct_font.release(); + return try initFont(ct_font); + } + + /// Initialize a face with a CTFont. This will take ownership over + /// the CTFont. This does NOT copy or retain the CTFont. + pub fn initFont(ct_font: *macos.text.Font) !Face { var hb_font = try harfbuzz.coretext.createFont(ct_font); errdefer hb_font.destroy(); const traits = ct_font.getSymbolicTraits(); + // Get variation axes + // if (ct_font.copyAttribute(.variation_axes)) |axes| { + // defer axes.release(); + // const len = axes.getCount(); + // for (0..len) |i| { + // const dict = axes.getValueAtIndex(macos.foundation.Dictionary, i); + // const Key = macos.text.FontVariationAxisKey; + // const name_ = dict.getValue(Key.name.Value(), Key.name.key()); + // if (name_) |name_val| { + // var buf: [1024]u8 = undefined; + // const namestr = name_val.cstring(&buf, .utf8) orelse ""; + // log.warn("AXES: {s}", .{namestr}); + // } + // } + // } + var result: Face = .{ .font = ct_font, .hb_font = hb_font, @@ -89,8 +111,8 @@ pub const Face = struct { /// matrix applied to italicize it. pub fn italicize(self: *const Face) !Face { const ct_font = try self.font.copyWithAttributes(0.0, &italic_skew, null); - defer ct_font.release(); - return try initFontCopy(ct_font, .{ .points = 0 }); + errdefer ct_font.release(); + return try initFont(ct_font); } /// Returns the font name. If allocation is required, buf will be used, @@ -115,6 +137,31 @@ pub const Face = struct { self.* = face; } + /// Set the variation axes for this font. This will modify this font + /// in-place. + pub fn setVariations( + self: *Face, + vs: []const font.face.Variation, + ) !void { + // Create a new font descriptor with all the variations set. + var desc = self.font.copyDescriptor(); + defer desc.release(); + for (vs) |v| { + const id = try macos.foundation.Number.create(.int, @ptrCast(&v.id)); + defer id.release(); + const next = try desc.createCopyWithVariation(id, v.value); + desc.release(); + desc = next; + } + + // Initialize a font based on these attributes. + const ct_font = try self.font.copyWithAttributes(0, null, desc); + errdefer ct_font.release(); + const face = try initFont(ct_font); + self.deinit(); + self.* = face; + } + /// Returns the glyph index for the given Unicode code point. If this /// face doesn't support this glyph, null is returned. pub fn glyphIndex(self: Face, cp: u32) ?u32 { @@ -492,3 +539,55 @@ test "in-memory" { _ = try face.renderGlyph(alloc, &atlas, face.glyphIndex(i).?, .{}); } } + +test "variable" { + const testing = std.testing; + const alloc = testing.allocator; + const testFont = @import("../test.zig").fontVariable; + + var atlas = try font.Atlas.init(alloc, 512, .greyscale); + defer atlas.deinit(alloc); + + var lib = try font.Library.init(); + defer lib.deinit(); + + var face = try Face.init(lib, testFont, .{ .points = 12 }); + defer face.deinit(); + + try testing.expectEqual(font.Presentation.text, face.presentation); + + // Generate all visible ASCII + var i: u8 = 32; + while (i < 127) : (i += 1) { + try testing.expect(face.glyphIndex(i) != null); + _ = try face.renderGlyph(alloc, &atlas, face.glyphIndex(i).?, .{}); + } +} + +test "variable set variation" { + const testing = std.testing; + const alloc = testing.allocator; + const testFont = @import("../test.zig").fontVariable; + + var atlas = try font.Atlas.init(alloc, 512, .greyscale); + defer atlas.deinit(alloc); + + var lib = try font.Library.init(); + defer lib.deinit(); + + var face = try Face.init(lib, testFont, .{ .points = 12 }); + defer face.deinit(); + + try testing.expectEqual(font.Presentation.text, face.presentation); + + try face.setVariations(&.{ + .{ .id = font.face.Variation.Id.init("wght"), .value = 400 }, + }); + + // Generate all visible ASCII + var i: u8 = 32; + while (i < 127) : (i += 1) { + try testing.expect(face.glyphIndex(i) != null); + _ = try face.renderGlyph(alloc, &atlas, face.glyphIndex(i).?, .{}); + } +} diff --git a/src/font/res/Lilex-VF.ttf b/src/font/res/Lilex-VF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ad0c1aca5a5baced7711e00c5139d95d9f6bda86 GIT binary patch literal 196468 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 Date: Sun, 27 Aug 2023 10:54:31 -0700 Subject: [PATCH 3/5] font/coretext: log the variation axes in debug mode --- src/font/face/coretext.zig | 63 ++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/src/font/face/coretext.zig b/src/font/face/coretext.zig index ac14aaef8..7b738a322 100644 --- a/src/font/face/coretext.zig +++ b/src/font/face/coretext.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const macos = @import("macos"); @@ -75,22 +76,6 @@ pub const Face = struct { const traits = ct_font.getSymbolicTraits(); - // Get variation axes - // if (ct_font.copyAttribute(.variation_axes)) |axes| { - // defer axes.release(); - // const len = axes.getCount(); - // for (0..len) |i| { - // const dict = axes.getValueAtIndex(macos.foundation.Dictionary, i); - // const Key = macos.text.FontVariationAxisKey; - // const name_ = dict.getValue(Key.name.Value(), Key.name.key()); - // if (name_) |name_val| { - // var buf: [1024]u8 = undefined; - // const namestr = name_val.cstring(&buf, .utf8) orelse ""; - // log.warn("AXES: {s}", .{namestr}); - // } - // } - // } - var result: Face = .{ .font = ct_font, .hb_font = hb_font, @@ -98,6 +83,52 @@ pub const Face = struct { .metrics = try calcMetrics(ct_font), }; result.quirks_disable_default_font_features = quirks.disableDefaultFontFeatures(&result); + + // In debug mode, we output information about available variation axes, + // if they exist. + if (comptime builtin.mode == .Debug) { + if (ct_font.copyAttribute(.variation_axes)) |axes| { + defer axes.release(); + + var buf: [1024]u8 = undefined; + log.debug("variation axes font={s}", .{try result.name(&buf)}); + + const len = axes.getCount(); + for (0..len) |i| { + const dict = axes.getValueAtIndex(macos.foundation.Dictionary, i); + const Key = macos.text.FontVariationAxisKey; + const cf_name = dict.getValue(Key.name.Value(), Key.name.key()).?; + const cf_id = dict.getValue(Key.identifier.Value(), Key.identifier.key()).?; + const cf_min = dict.getValue(Key.minimum_value.Value(), Key.minimum_value.key()).?; + const cf_max = dict.getValue(Key.maximum_value.Value(), Key.maximum_value.key()).?; + const cf_def = dict.getValue(Key.default_value.Value(), Key.default_value.key()).?; + + const namestr = cf_name.cstring(&buf, .utf8) orelse ""; + + var id_raw: c_int = 0; + _ = cf_id.getValue(.int, &id_raw); + const id: font.face.Variation.Id = @bitCast(id_raw); + + var min: f64 = 0; + _ = cf_min.getValue(.double, &min); + + var max: f64 = 0; + _ = cf_max.getValue(.double, &max); + + var def: f64 = 0; + _ = cf_def.getValue(.double, &def); + + log.debug("variation axis: name={s} id={s} min={} max={} def={}", .{ + namestr, + id.str(), + min, + max, + def, + }); + } + } + } + return result; } From 906852976ba101c214cccdbcf16a1ab5ce0a255d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 27 Aug 2023 13:04:12 -0700 Subject: [PATCH 4/5] config: new "font-variation" set of configurations to set variable font --- src/Surface.zig | 4 ++ src/config.zig | 116 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/src/Surface.zig b/src/Surface.zig index 8bacd4886..85aa6c78b 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -229,6 +229,7 @@ pub fn init( var disco_it = try disco.discover(.{ .family = family, .size = font_size.points, + .variations = config.@"font-variation".list.items, }); defer disco_it.deinit(); if (try disco_it.next()) |face| { @@ -241,6 +242,7 @@ pub fn init( .family = family, .size = font_size.points, .bold = true, + .variations = config.@"font-variation-bold".list.items, }); defer disco_it.deinit(); if (try disco_it.next()) |face| { @@ -253,6 +255,7 @@ pub fn init( .family = family, .size = font_size.points, .italic = true, + .variations = config.@"font-variation-italic".list.items, }); defer disco_it.deinit(); if (try disco_it.next()) |face| { @@ -266,6 +269,7 @@ pub fn init( .size = font_size.points, .bold = true, .italic = true, + .variations = config.@"font-variation-bold-italic".list.items, }); defer disco_it.deinit(); if (try disco_it.next()) |face| { diff --git a/src/config.zig b/src/config.zig index d91e96689..6f4544124 100644 --- a/src/config.zig +++ b/src/config.zig @@ -3,6 +3,7 @@ const std = @import("std"); const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; +const fontpkg = @import("font/main.zig"); const inputpkg = @import("input.zig"); const terminal = @import("terminal/main.zig"); const internal_os = @import("os/main.zig"); @@ -43,6 +44,30 @@ pub const Config = struct { else => 12, }, + /// A repeatable configuration to set one or more font variations values + /// for a variable font. A variable font is a single font, usually + /// with a filename ending in "-VF.ttf" or "-VF.otf" that contains + /// one or more configurable axes for things such as weight, slant, + /// etc. Not all fonts support variations; only fonts that explicitly + /// state they are variable fonts will work. + /// + /// The format of this is "id=value" where "id" is the axis identifier. + /// An axis identifier is always a 4 character string, such as "wght". + /// To get the list of supported axes, look at your font documentation + /// or use a font inspection tool. + /// + /// Invalid ids and values are usually ignored. For example, if a font + /// only supports weights from 100 to 700, setting "wght=800" will + /// do nothing (it will not be clamped to 700). You must consult your + /// font's documentation to see what values are supported. + /// + /// Common axes are: "wght" (weight), "slnt" (slant), "ital" (italic), + /// "opsz" (optical size), "wdth" (width), "GRAD" (gradient), etc. + @"font-variation": RepeatableFontVariation = .{}, + @"font-variation-bold": RepeatableFontVariation = .{}, + @"font-variation-italic": RepeatableFontVariation = .{}, + @"font-variation-bold-italic": RepeatableFontVariation = .{}, + /// Draw fonts with a thicker stroke, if supported. This is only supported /// currently on macOS. @"font-thicken": bool = false, @@ -1217,6 +1242,97 @@ pub const RepeatableString = struct { } }; +/// FontVariation is a repeatable configuration value that sets a single +/// font variation value. Font variations are configurations for what +/// are often called "variable fonts." The font files usually end in +/// "-VF.ttf." +/// +/// The value for this is in the format of `id=value` where `id` is the +/// 4-character font variation axis identifier and `value` is the +/// floating point value for that axis. For more details on font variations +/// see the MDN font-variation-settings documentation since this copies that +/// behavior almost exactly: +/// +/// https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings +pub const RepeatableFontVariation = struct { + const Self = @This(); + + // Allocator for the list is the arena for the parent config. + list: std.ArrayListUnmanaged(fontpkg.face.Variation) = .{}, + + pub fn parseCLI(self: *Self, alloc: Allocator, input_: ?[]const u8) !void { + const input = input_ orelse return error.ValueRequired; + const eql_idx = std.mem.indexOf(u8, input, "=") orelse return error.InvalidFormat; + const whitespace = " \t"; + const key = std.mem.trim(u8, input[0..eql_idx], whitespace); + const value = std.mem.trim(u8, input[eql_idx + 1 ..], whitespace); + if (key.len != 4) return error.InvalidFormat; + try self.list.append(alloc, .{ + .id = fontpkg.face.Variation.Id.init(@ptrCast(key.ptr)), + .value = std.fmt.parseFloat(f64, value) catch return error.InvalidFormat, + }); + } + + /// Deep copy of the struct. Required by Config. + pub fn clone(self: *const Self, alloc: Allocator) !Self { + return .{ + .list = try self.list.clone(alloc), + }; + } + + /// Compare if two of our value are requal. Required by Config. + pub fn equal(self: Self, other: Self) bool { + const itemsA = self.list.items; + const itemsB = other.list.items; + if (itemsA.len != itemsB.len) return false; + for (itemsA, itemsB) |a, b| { + if (!std.meta.eql(a, b)) return false; + } else return true; + } + + test "parseCLI" { + const testing = std.testing; + var arena = ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + const alloc = arena.allocator(); + + var list: Self = .{}; + try list.parseCLI(alloc, "wght=200"); + try list.parseCLI(alloc, "slnt=-15"); + + try testing.expectEqual(@as(usize, 2), list.list.items.len); + try testing.expectEqual(fontpkg.face.Variation{ + .id = fontpkg.face.Variation.Id.init("wght"), + .value = 200, + }, list.list.items[0]); + try testing.expectEqual(fontpkg.face.Variation{ + .id = fontpkg.face.Variation.Id.init("slnt"), + .value = -15, + }, list.list.items[1]); + } + + test "parseCLI with whitespace" { + const testing = std.testing; + var arena = ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + const alloc = arena.allocator(); + + var list: Self = .{}; + try list.parseCLI(alloc, "wght =200"); + try list.parseCLI(alloc, "slnt= -15"); + + try testing.expectEqual(@as(usize, 2), list.list.items.len); + try testing.expectEqual(fontpkg.face.Variation{ + .id = fontpkg.face.Variation.Id.init("wght"), + .value = 200, + }, list.list.items[0]); + try testing.expectEqual(fontpkg.face.Variation{ + .id = fontpkg.face.Variation.Id.init("slnt"), + .value = -15, + }, list.list.items[1]); + } +}; + /// Stores a set of keybinds. pub const Keybinds = struct { set: inputpkg.Binding.Set = .{}, From 1ee5b7f91c7e8d715110fe928a74e2ad60b19fce Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 27 Aug 2023 19:58:25 -0700 Subject: [PATCH 5/5] font: freetype supports font variation settings --- pkg/freetype/Library.zig | 5 +++ pkg/freetype/face.zig | 33 +++++++++++++++ pkg/freetype/freetype-zig.h | 1 + src/font/DeferredFace.zig | 8 +++- src/font/discovery.zig | 3 ++ src/font/face/freetype.zig | 80 +++++++++++++++++++++++++++++++++++-- 6 files changed, 125 insertions(+), 5 deletions(-) diff --git a/pkg/freetype/Library.zig b/pkg/freetype/Library.zig index ab3be153a..f5dc606ef 100644 --- a/pkg/freetype/Library.zig +++ b/pkg/freetype/Library.zig @@ -57,6 +57,11 @@ pub fn initMemoryFace(self: Library, data: []const u8, index: i32) Error!Face { return face; } +/// Call when you're done with a loaded MM var. +pub fn doneMMVar(self: Library, mm: *c.FT_MM_Var) void { + _ = c.FT_Done_MM_Var(self.handle, mm); +} + pub const Version = struct { major: i32, minor: i32, diff --git a/pkg/freetype/face.zig b/pkg/freetype/face.zig index fd7514d8f..2bd4a33c7 100644 --- a/pkg/freetype/face.zig +++ b/pkg/freetype/face.zig @@ -24,6 +24,12 @@ pub const Face = struct { return c.FT_HAS_COLOR(self.handle); } + /// A macro that returns true whenever a face object contains some + /// multiple masters. + pub fn hasMultipleMasters(self: Face) bool { + return c.FT_HAS_MULTIPLE_MASTERS(self.handle); + } + /// A macro that returns true whenever a face object contains a scalable /// font face (true for TrueType, Type 1, Type 42, CID, OpenType/CFF, /// and PFR font formats). @@ -95,6 +101,33 @@ pub const Face = struct { const res = c.FT_Get_Sfnt_Name(self.handle, @intCast(i), &name); return if (intToError(res)) |_| name else |err| err; } + + /// Retrieve the font variation descriptor for a font. + pub fn getMMVar(self: Face) Error!*c.FT_MM_Var { + var result: *c.FT_MM_Var = undefined; + const res = c.FT_Get_MM_Var(self.handle, @ptrCast(&result)); + return if (intToError(res)) |_| result else |err| err; + } + + /// Get the design coordinates of the currently selected interpolated font. + pub fn getVarDesignCoordinates(self: Face, coords: []c.FT_Fixed) Error!void { + const res = c.FT_Get_Var_Design_Coordinates( + self.handle, + @intCast(coords.len), + coords.ptr, + ); + return intToError(res); + } + + /// Choose an interpolated font design through design coordinates. + pub fn setVarDesignCoordinates(self: Face, coords: []c.FT_Fixed) Error!void { + const res = c.FT_Set_Var_Design_Coordinates( + self.handle, + @intCast(coords.len), + coords.ptr, + ); + return intToError(res); + } }; /// An enumeration to specify indices of SFNT tables loaded and parsed by diff --git a/pkg/freetype/freetype-zig.h b/pkg/freetype/freetype-zig.h index ddb242be8..e430aef52 100644 --- a/pkg/freetype/freetype-zig.h +++ b/pkg/freetype/freetype-zig.h @@ -1,5 +1,6 @@ #include #include FT_FREETYPE_H #include FT_TRUETYPE_TABLES_H +#include #include #include diff --git a/src/font/DeferredFace.zig b/src/font/DeferredFace.zig index 6d0d6fe31..acf5ba93f 100644 --- a/src/font/DeferredFace.zig +++ b/src/font/DeferredFace.zig @@ -54,6 +54,9 @@ pub const Fontconfig = struct { charset: *const fontconfig.CharSet, langset: *const fontconfig.LangSet, + /// Variations to apply to this font. + variations: []const font.face.Variation, + pub fn deinit(self: *Fontconfig) void { self.pattern.destroy(); self.* = undefined; @@ -154,7 +157,10 @@ fn loadFontconfig( const filename = (try fc.pattern.get(.file, 0)).string; const face_index = (try fc.pattern.get(.index, 0)).integer; - return try Face.initFile(lib, filename, face_index, size); + var face = try Face.initFile(lib, filename, face_index, size); + errdefer face.deinit(); + try face.setVariations(fc.variations); + return face; } fn loadCoreText( diff --git a/src/font/discovery.zig b/src/font/discovery.zig index fb3c8322e..d1dc6a601 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -205,6 +205,7 @@ pub const Fontconfig = struct { .pattern = pat, .set = res.fs, .fonts = res.fs.fonts(), + .variations = desc.variations, .i = 0, }; } @@ -214,6 +215,7 @@ pub const Fontconfig = struct { pattern: *fontconfig.Pattern, set: *fontconfig.FontSet, fonts: []*fontconfig.Pattern, + variations: []const Variation, i: usize, pub fn deinit(self: *DiscoverIterator) void { @@ -241,6 +243,7 @@ pub const Fontconfig = struct { .pattern = font_pattern, .charset = (try font_pattern.get(.charset, 0)).char_set, .langset = (try font_pattern.get(.lang, 0)).lang_set, + .variations = self.variations, }, }; } diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index 7b104eb01..9ae861c7d 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -23,6 +23,9 @@ const quirks = @import("../../quirks.zig"); const log = std.log.scoped(.font_face); pub const Face = struct { + /// Our freetype library + lib: freetype.Library, + /// Our font face. face: freetype.Face, @@ -43,30 +46,55 @@ pub const Face = struct { pub fn initFile(lib: Library, path: [:0]const u8, index: i32, size: font.face.DesiredSize) !Face { const face = try lib.lib.initFace(path, index); errdefer face.deinit(); - return try initFace(face, size); + return try initFace(lib, face, size); } /// Initialize a new font face with the given source in-memory. pub fn init(lib: Library, source: [:0]const u8, size: font.face.DesiredSize) !Face { const face = try lib.lib.initMemoryFace(source, 0); errdefer face.deinit(); - return try initFace(face, size); + return try initFace(lib, face, size); } - fn initFace(face: freetype.Face, size: font.face.DesiredSize) !Face { + fn initFace(lib: Library, face: freetype.Face, size: font.face.DesiredSize) !Face { try face.selectCharmap(.unicode); try setSize_(face, size); - const hb_font = try harfbuzz.freetype.createFont(face.handle); + var hb_font = try harfbuzz.freetype.createFont(face.handle); errdefer hb_font.destroy(); var result: Face = .{ + .lib = lib.lib, .face = face, .hb_font = hb_font, .presentation = if (face.hasColor()) .emoji else .text, .metrics = calcMetrics(face), }; result.quirks_disable_default_font_features = quirks.disableDefaultFontFeatures(&result); + + // In debug mode, we output information about available variation axes, + // if they exist. + if (comptime builtin.mode == .Debug) mm: { + if (!face.hasMultipleMasters()) break :mm; + var buf: [1024]u8 = undefined; + log.debug("variation axes font={s}", .{try result.name(&buf)}); + + const mm = try face.getMMVar(); + defer lib.lib.doneMMVar(mm); + for (0..mm.num_axis) |i| { + const axis = mm.axis[i]; + const id_raw = std.math.cast(c_int, axis.tag) orelse continue; + const id: font.face.Variation.Id = @bitCast(id_raw); + log.debug("variation axis: name={s} id={s} min={} max={} def={}", .{ + std.mem.sliceTo(axis.name, 0), + id.str(), + axis.minimum >> 16, + axis.maximum >> 16, + axis.def >> 16, + }); + } + } + return result; } @@ -132,6 +160,50 @@ pub const Face = struct { try face.selectSize(best_i); } + /// Set the variation axes for this font. This will modify this font + /// in-place. + pub fn setVariations( + self: *Face, + vs: []const font.face.Variation, + ) !void { + // If this font doesn't support variations, we can't do anything. + if (!self.face.hasMultipleMasters() or vs.len == 0) return; + + // Freetype requires that we send ALL coordinates in at once so the + // first thing we have to do is get all the vars and put them into + // an array. + const mm = try self.face.getMMVar(); + defer self.lib.doneMMVar(mm); + + // To avoid allocations, we cap the number of variation axes we can + // support. This is arbitrary but Firefox caps this at 16 so I + // feel like that's probably safe... and we do double cause its + // cheap. + var coords_buf: [32]freetype.c.FT_Fixed = undefined; + var coords = coords_buf[0..@min(coords_buf.len, mm.num_axis)]; + try self.face.getVarDesignCoordinates(coords); + + // Now we go through each axis and see if its set. This is slow + // but there usually aren't many axes and usually not many set + // variations, either. + for (0..mm.num_axis) |i| { + const axis = mm.axis[i]; + const id = std.math.cast(u32, axis.tag) orelse continue; + for (vs) |v| { + if (id == @as(u32, @bitCast(v.id))) { + coords[i] = @intFromFloat(v.value * 65536); + break; + } + } + } + + // Set them! + try self.face.setVarDesignCoordinates(coords); + + // We need to recalculate font metrics which may have changed. + self.metrics = calcMetrics(self.face); + } + /// Returns the glyph index for the given Unicode code point. If this /// face doesn't support this glyph, null is returned. pub fn glyphIndex(self: Face, cp: u32) ?u32 {