build: add -Dfont-backend=coretext_harfbuzz to force Harfbuzz w/ CT

This commit is contained in:
Mitchell Hashimoto
2024-04-30 14:03:38 -07:00
parent 6858646843
commit 1072354747
6 changed files with 23 additions and 10 deletions

View File

@ -83,7 +83,7 @@ pub const WebCanvas = struct {
pub fn deinit(self: *DeferredFace) void { pub fn deinit(self: *DeferredFace) void {
switch (options.backend) { switch (options.backend) {
.fontconfig_freetype => if (self.fc) |*fc| fc.deinit(), .fontconfig_freetype => if (self.fc) |*fc| fc.deinit(),
.coretext, .coretext_freetype => if (self.ct) |*ct| ct.deinit(), .coretext, .coretext_freetype, .coretext_harfbuzz => if (self.ct) |*ct| ct.deinit(),
.freetype => {}, .freetype => {},
.web_canvas => if (self.wc) |*wc| wc.deinit(), .web_canvas => if (self.wc) |*wc| wc.deinit(),
} }
@ -98,7 +98,7 @@ pub fn familyName(self: DeferredFace, buf: []u8) ![]const u8 {
.fontconfig_freetype => if (self.fc) |fc| .fontconfig_freetype => if (self.fc) |fc|
return (try fc.pattern.get(.family, 0)).string, return (try fc.pattern.get(.family, 0)).string,
.coretext, .coretext_freetype => if (self.ct) |ct| { .coretext, .coretext_freetype, .coretext_harfbuzz => if (self.ct) |ct| {
const family_name = ct.font.copyAttribute(.family_name); const family_name = ct.font.copyAttribute(.family_name);
return family_name.cstringPtr(.utf8) orelse unsupported: { return family_name.cstringPtr(.utf8) orelse unsupported: {
break :unsupported family_name.cstring(buf, .utf8) orelse break :unsupported family_name.cstring(buf, .utf8) orelse
@ -121,7 +121,7 @@ pub fn name(self: DeferredFace, buf: []u8) ![]const u8 {
.fontconfig_freetype => if (self.fc) |fc| .fontconfig_freetype => if (self.fc) |fc|
return (try fc.pattern.get(.fullname, 0)).string, return (try fc.pattern.get(.fullname, 0)).string,
.coretext, .coretext_freetype => if (self.ct) |ct| { .coretext, .coretext_freetype, .coretext_harfbuzz => if (self.ct) |ct| {
const display_name = ct.font.copyDisplayName(); const display_name = ct.font.copyDisplayName();
return display_name.cstringPtr(.utf8) orelse unsupported: { return display_name.cstringPtr(.utf8) orelse unsupported: {
// "NULL if the internal storage of theString does not allow // "NULL if the internal storage of theString does not allow
@ -147,7 +147,7 @@ pub fn load(
) !Face { ) !Face {
return switch (options.backend) { return switch (options.backend) {
.fontconfig_freetype => try self.loadFontconfig(lib, opts), .fontconfig_freetype => try self.loadFontconfig(lib, opts),
.coretext => try self.loadCoreText(lib, opts), .coretext, .coretext_harfbuzz => try self.loadCoreText(lib, opts),
.coretext_freetype => try self.loadCoreTextFreetype(lib, opts), .coretext_freetype => try self.loadCoreTextFreetype(lib, opts),
.web_canvas => try self.loadWebCanvas(opts), .web_canvas => try self.loadWebCanvas(opts),
@ -262,7 +262,7 @@ pub fn hasCodepoint(self: DeferredFace, cp: u32, p: ?Presentation) bool {
} }
}, },
.coretext, .coretext_freetype => { .coretext, .coretext_freetype, .coretext_harfbuzz => {
// If we are using coretext, we check the loaded CT font. // If we are using coretext, we check the loaded CT font.
if (self.ct) |ct| { if (self.ct) |ct| {
if (p) |desired_p| { if (p) |desired_p| {

View File

@ -14,7 +14,7 @@ const log = std.log.scoped(.discovery);
pub const Discover = switch (options.backend) { pub const Discover = switch (options.backend) {
.freetype => void, // no discovery .freetype => void, // no discovery
.fontconfig_freetype => Fontconfig, .fontconfig_freetype => Fontconfig,
.coretext, .coretext_freetype => CoreText, .coretext, .coretext_freetype, .coretext_harfbuzz => CoreText,
.web_canvas => void, // no discovery .web_canvas => void, // no discovery
}; };

View File

@ -13,7 +13,7 @@ pub const Face = switch (options.backend) {
.coretext_freetype, .coretext_freetype,
=> freetype.Face, => freetype.Face,
.coretext => coretext.Face, .coretext, .coretext_harfbuzz => coretext.Face,
.web_canvas => web_canvas.Face, .web_canvas => web_canvas.Face,
}; };

View File

@ -15,6 +15,7 @@ pub const Library = switch (options.backend) {
// Some backends such as CT and Canvas don't have a "library" // Some backends such as CT and Canvas don't have a "library"
.coretext, .coretext,
.coretext_harfbuzz,
.web_canvas, .web_canvas,
=> NoopLibrary, => NoopLibrary,
}; };

View File

@ -50,12 +50,16 @@ pub const Backend = enum {
/// Fontconfig for font discovery and FreeType for font rendering. /// Fontconfig for font discovery and FreeType for font rendering.
fontconfig_freetype, fontconfig_freetype,
/// CoreText for both font discovery for rendering (macOS). /// CoreText for font discovery, rendering, and shaping (macOS).
coretext, coretext,
/// CoreText for font discovery and FreeType for rendering (macOS). /// CoreText for font discovery, FreeType for rendering, and
/// HarfBuzz for shaping (macOS).
coretext_freetype, coretext_freetype,
/// CoreText for font discovery and rendering, HarfBuzz for shaping
coretext_harfbuzz,
/// Use the browser font system and the Canvas API (wasm). This limits /// Use the browser font system and the Canvas API (wasm). This limits
/// the available fonts to browser fonts (anything Canvas natively /// the available fonts to browser fonts (anything Canvas natively
/// supports). /// supports).
@ -89,7 +93,11 @@ pub const Backend = enum {
.fontconfig_freetype, .fontconfig_freetype,
.coretext_freetype, .coretext_freetype,
=> true, => true,
.coretext, .web_canvas => false,
.coretext,
.coretext_harfbuzz,
.web_canvas,
=> false,
}; };
} }
@ -97,6 +105,7 @@ pub const Backend = enum {
return switch (self) { return switch (self) {
.coretext, .coretext,
.coretext_freetype, .coretext_freetype,
.coretext_harfbuzz,
=> true, => true,
.freetype, .freetype,
@ -113,6 +122,7 @@ pub const Backend = enum {
.freetype, .freetype,
.coretext, .coretext,
.coretext_freetype, .coretext_freetype,
.coretext_harfbuzz,
.web_canvas, .web_canvas,
=> false, => false,
}; };
@ -123,6 +133,7 @@ pub const Backend = enum {
.freetype, .freetype,
.fontconfig_freetype, .fontconfig_freetype,
.coretext_freetype, .coretext_freetype,
.coretext_harfbuzz,
=> true, => true,
.coretext, .coretext,

View File

@ -10,6 +10,7 @@ pub const Shaper = switch (options.backend) {
.freetype, .freetype,
.fontconfig_freetype, .fontconfig_freetype,
.coretext_freetype, .coretext_freetype,
.coretext_harfbuzz,
=> harfbuzz.Shaper, => harfbuzz.Shaper,
// Note that coretext_freetype cannot use the coretext // Note that coretext_freetype cannot use the coretext