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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

dAPRtcnB~j*Dz#{d?c~*7w#+$Z)jX;nXYi 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

F04Y1;Ha=Yjf5lMO*OWO5i5!304 zL$Ckyl0W|&So!{9uvhsG`^S1e^=7}nmP{Jm?ouqK59rVwYVQ98o)Yxt?Ziq7^gk$O z3_2<>vmf$N_(e}5QEH+(p67LFvqysZ#Jj=$gp!AX0LKs*v4Ju+n~gym#i3Prnu*Nr)|?_n6jg(W?HfHU5ktLrWzfgzw^D}jvWOYf zA|YaQqBbUC72G@Ypr3kSJMKjkHj&b6B^)-9D&0TOdu95PNR<&60^8u)rx=}kIRz14k~Sin&Jwm~|6<(MP^sLWNSg3+vW%NVvL5LIJY*2boNRa6 z5(+q2LbRk(*-}$7ab}~@Xy!~(vy>hBlVR2B1hfG-z02*4WeRm*;2r*SGTji( zHXFwE7|tdxbCttrif0H7AX2mF3WizHoJuvilF4W?7z`$(N$NI+SBKt& z7lQySdkM4K?KTrYDkhW3q6DC?-ar5uX6nkK&*9(*ty4^;QpJu&aE^8x5S<*RN7~ z1S1JdQ!Ne_?KCw-lDi06NS8&I+imwlL=(STRm$SqszOS1likRc^0{<81{tjKlIS4_r5inh4#1`i59a3rK)@mZz^=E1 zCMPEYXJ-+>F_I)93~#q|I;#$XK$T9lO#lVZ2DOlkL?XvWU5yYO#auiRiNsIh3P2%6 zdsptNs$SO;9kSe!0EuV-11PPh^+uzSWeG*@>mH}iL}xN0YP;R6mI)ebS8Ezd=@=6y zHx&-kw@yXoqmqGrOLG5dTuU-mmthzUJ{o`_dPk z45(gD3c3o~<2OJn0z&G4$&=xqy!LCYP7}f>*XprErjSi#vz2JGl@&Wwn4IwUD#4bGhvF`jP^arFjw4=f`xA%1Ha zA&Wzf$YHIG4Y7=md%GBl0!>r!_}*cq%+GX08_%P%uAPb}5{Y=Kty2kJtH#=*4e8_} z2ko|k0u9sYMng`b$$-3GmPkazV}Uqh0!Df-AHbVzUQS_T3VVK^_mPcZ!`|1`36A1 zH(;I7^U`QA)I*Ut(0IEEX*bkvN0I?j%v8kb=ViljpraXv(c$@?OKop=XJ=>ssM*BD z>E|W=0&QUWdAVsC!?a%7U|@V|YU=#?MOY$s-fA5BSO(ZrfZ36($9s7OX_80=bloOOi+;BFV%GJWN&t+_|$_nIwl-UD2bce{9lZ${*xSL%;9o9^( zo{ll&cv1pmA@FqnHKVci#rHY?0&!B;`PEhWWE06 zq|qR>QmNF`D7~&&Y=~4}@oymlw!S_$C$Q`5&lms!sRirR%cWAiesol?kBmS&5T-c8 zQWl356RDvgAoRH+*xA`<41&HsGW23C0~17C$A;CzFdqZ5zga!es3#H(CK3tL<%sjA zd%xj(FY*mhMAp{@aoCEno)!Q>*v?6|Ki(W5;9r`+-0}R~t(=Ck(Oj2q}ul z?5uzU_!SEGqR<^M^cuj^4WbA68mu)3Xt&!H+W+isVDN4{$8gfSLH~%~{}w>NZ$tLe=|^|&L=#noAP5rITF~Q+(Ri+Ow6?bP zsGxCY78e&ol#tR+pPfB>&SoTW9HFTdubw5$dem@!V$?~1?4w7I;w{7+oW1h( zuU~gMSI-)a=NIN(E(-&b<2BHg6-6oRJWx&J3kwUA7Es!`ckkXosmYspKA9Ak^;=te zyM@5kE|BY#voq!`Q;YLV&``2iu!Jd;h)N-G0;%j^nprCVkrBu-UOr z1TxW85bG2q2jgvBSh!EnG}4vez)YUtg$q*xNQ+*l^ZM7neq}ajMp}?7BMS)U=)`#g zsy7p?enn5w2#%9R+qtu|vu~eu7mKALV;)^tSeW2J5we->RnhYk77W9n3r|xNrCCU& z?%#V*tGPw*?(Tc<|7>&npo~$0g@uJNgIYP-+(;hA8>*(Q=p`9bYK2^3cW-NJkOy|E zuOZf7QahCX^=OAr>VnVfW}@#&UGRBrO!Pge3qG%ZiM}Uw!RIxu!G7|YcKErv;4hGE z`txK<#MW;LvyMsUPBNC%_m~9SXt3Q@2}0u=@|k+5CwDk0)c>oM%vJUUamCdj)EXa z^mZr&KW@OhnNSFg#SrmYyHTuDn9?pB9v)_kg><@Duh$!0k~YwCyF+k(zu&?s8$63w2?bC|Fd*Y;`)FMzmQh7R$9(tKN`TtSFX;&}7vvriY0G ZG(pl7wt^X~vDgZN(;^m&`TeWl{{n;y4Uzx= literal 0 HcmV?d00001 diff --git a/src/font/test.zig b/src/font/test.zig index c8f2d90e5..f07cefcd5 100644 --- a/src/font/test.zig +++ b/src/font/test.zig @@ -2,3 +2,4 @@ pub const fontRegular = @embedFile("res/Inconsolata-Regular.ttf"); pub const fontBold = @embedFile("res/Inconsolata-Bold.ttf"); pub const fontEmoji = @embedFile("res/NotoColorEmoji.ttf"); pub const fontEmojiText = @embedFile("res/NotoEmoji-Regular.ttf"); +pub const fontVariable = @embedFile("res/Lilex-VF.ttf"); From 16808f2b350d02c966f354b9477175e72959e8ea Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto 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 {