From 3cb5dae9d86c680aaada3be22b9cbdefad505cc6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 3 Apr 2022 20:08:29 -0700 Subject: [PATCH] fontconfig example --- build.zig | 1 + nix/devshell.nix | 2 ++ src/fonts.zig | 39 +++++++++++++++++++++++++++++++++++++++ src/main.zig | 4 ++++ 4 files changed, 46 insertions(+) create mode 100644 src/fonts.zig diff --git a/build.zig b/build.zig index d1e5fee69..d79e98b3e 100644 --- a/build.zig +++ b/build.zig @@ -21,6 +21,7 @@ pub fn build(b: *std.build.Builder) !void { ftlib.link(exe); exe.linkSystemLibrary("epoxy"); + exe.linkSystemLibrary("fontconfig"); const run_cmd = exe.run(); run_cmd.step.dependOn(b.getInstallStep()); diff --git a/nix/devshell.nix b/nix/devshell.nix index cabde9da8..3dd0a9828 100644 --- a/nix/devshell.nix +++ b/nix/devshell.nix @@ -8,6 +8,7 @@ , vttest , zig +, fontconfig , libepoxy , libGL , libX11 @@ -32,6 +33,7 @@ buildInputs = [ # TODO: non-linux ] ++ lib.optionals stdenv.isLinux [ + fontconfig libepoxy libGL diff --git a/src/fonts.zig b/src/fonts.zig new file mode 100644 index 000000000..bd951d7a8 --- /dev/null +++ b/src/fonts.zig @@ -0,0 +1,39 @@ +const std = @import("std"); +const fc = @cImport({ + @cInclude("fontconfig/fontconfig.h"); +}); + +// Set to true when FontConfig is initialized. +var initialized: bool = false; + +pub fn list() !void { + if (!initialized) { + if (fc.FcInit() != fc.FcTrue) { + return error.InitializionFailed; + } + } + + const pat = fc.FcPatternCreate(); + defer fc.FcPatternDestroy(pat); + + const key = fc.FC_FULLNAME; + const os = fc.FcObjectSetBuild( + key, + @as([*c]const u8, 0), // @as required Zig #1481 + ); + defer fc.FcObjectSetDestroy(os); + + const fs = fc.FcFontList(null, pat, os); + defer fc.FcFontSetDestroy(fs); + + var i: usize = 0; + while (i <= fs.*.nfont) : (i += 1) { + const fpat = fs.*.fonts[i]; + var str: [*c]fc.FcChar8 = undefined; + if (fc.FcPatternGetString(fpat, key, 0, &str) == fc.FcResultMatch) { + std.log.info("FONT: {s}", .{ + @ptrCast([*:0]u8, str), + }); + } + } +} diff --git a/src/main.zig b/src/main.zig index f5f4b6ebf..b5d17e50e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2,8 +2,12 @@ const std = @import("std"); const glfw = @import("glfw"); const gl = @import("opengl.zig"); const stb = @import("stb.zig"); +const fonts = @import("fonts.zig"); pub fn main() !void { + // List our fonts + try fonts.list(); + try glfw.init(.{}); defer glfw.terminate();