diff --git a/build.zig b/build.zig index b1dde5c68..f847854dc 100644 --- a/build.zig +++ b/build.zig @@ -15,7 +15,6 @@ const XCFrameworkStep = @import("src/build/XCFrameworkStep.zig"); const Version = @import("src/build/Version.zig"); const glfw = @import("vendor/mach-glfw/build.zig"); -const fontconfig = @import("pkg/fontconfig/build.zig"); const js = @import("vendor/zig-js/build.zig"); const libxev = @import("vendor/libxev/build.zig"); const libxml2 = @import("vendor/zig-libxml2/libxml2.zig"); @@ -26,6 +25,7 @@ const utf8proc = @import("pkg/utf8proc/build.zig"); const tracylib = @import("pkg/tracy/build.zig"); const system_sdk = @import("vendor/mach-glfw/system_sdk.zig"); +const fontconfig = @import("pkg/fontconfig/build.old.zig"); const freetype = @import("pkg/freetype/build.old.zig"); const harfbuzz = @import("pkg/harfbuzz/build.old.zig"); const libpng = @import("pkg/libpng/build.old.zig"); @@ -785,48 +785,6 @@ fn addDeps( step.linkLibrary(harfbuzz_dep.artifact("harfbuzz")); try static_libs.append(harfbuzz_dep.artifact("harfbuzz").getEmittedBin()); - // const zlib_step = try zlib.link(b, step); - // try static_libs.append(zlib_step.getEmittedBin()); - // - // const libpng_step = try libpng.link(b, step, .{ - // .zlib = .{ - // .step = zlib_step, - // .include = &zlib.include_paths, - // }, - // }); - // try static_libs.append(libpng_step.getEmittedBin()); - // - // // Freetype - // const freetype_step = try freetype.link(b, step, .{ - // .libpng = freetype.Options.Libpng{ - // .enabled = true, - // .step = libpng_step, - // .include = &libpng.include_paths, - // }, - // - // .zlib = .{ - // .enabled = true, - // .step = zlib_step, - // .include = &zlib.include_paths, - // }, - // }); - // try static_libs.append(freetype_step.getEmittedBin()); - // - // // Harfbuzz - // const harfbuzz_step = try harfbuzz.link(b, step, .{ - // .freetype = .{ - // .enabled = true, - // .step = freetype_step, - // .include = &freetype.include_paths, - // }, - // - // .coretext = .{ - // .enabled = font_backend.hasCoretext(), - // }, - // }); - // system_sdk.include(b, harfbuzz_step, .{}); - // try static_libs.append(harfbuzz_step.getEmittedBin()); - // Pixman const pixman_step = try pixman.link(b, step, .{}); try static_libs.append(pixman_step.getEmittedBin()); diff --git a/pkg/fontconfig/build.old.zig b/pkg/fontconfig/build.old.zig new file mode 100644 index 000000000..03b9573c0 --- /dev/null +++ b/pkg/fontconfig/build.old.zig @@ -0,0 +1,240 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const NativeTargetInfo = std.zig.system.NativeTargetInfo; + +/// Directories with our includes. +const root = thisDir() ++ "../../../vendor/fontconfig-2.14.0/"; +const include_path = root; +const include_path_self = thisDir(); + +pub const include_paths = .{ include_path, include_path_self }; + +pub fn module(b: *std.Build) *std.build.Module { + return b.createModule(.{ + .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" }, + }); +} + +fn thisDir() []const u8 { + return std.fs.path.dirname(@src().file) orelse "."; +} + +pub const Options = struct { + freetype: Freetype = .{}, + expat: Expat = .{}, + libxml2: bool = false, + + pub const Freetype = struct { + enabled: bool = false, + step: ?*std.build.LibExeObjStep = null, + include: ?[]const []const u8 = null, + }; + + pub const Expat = struct { + enabled: bool = false, + step: ?*std.build.LibExeObjStep = null, + include: ?[]const []const u8 = null, + }; +}; + +pub fn link( + b: *std.Build, + step: *std.build.LibExeObjStep, + opt: Options, +) !*std.build.LibExeObjStep { + const lib = try buildFontconfig(b, step, opt); + step.linkLibrary(lib); + step.addIncludePath(.{ .path = include_path }); + step.addIncludePath(.{ .path = include_path_self }); + return lib; +} + +pub fn buildFontconfig( + b: *std.Build, + step: *std.build.LibExeObjStep, + opt: Options, +) !*std.build.LibExeObjStep { + const target = step.target; + const lib = b.addStaticLibrary(.{ + .name = "fontconfig", + .target = step.target, + .optimize = step.optimize, + }); + + // Include + lib.addIncludePath(.{ .path = include_path }); + lib.addIncludePath(.{ .path = include_path_self }); + + // Link + lib.linkLibC(); + if (opt.expat.enabled) { + if (opt.expat.step) |expat| + lib.linkLibrary(expat) + else + lib.linkSystemLibrary("expat"); + + if (opt.expat.include) |dirs| + for (dirs) |dir| lib.addIncludePath(.{ .path = dir }); + } + if (opt.freetype.enabled) { + if (opt.freetype.step) |freetype| + lib.linkLibrary(freetype) + else + lib.linkSystemLibrary("freetype2"); + + if (opt.freetype.include) |dirs| + for (dirs) |dir| lib.addIncludePath(.{ .path = dir }); + } + if (!target.isWindows()) { + lib.linkSystemLibrary("pthread"); + } + + // Compile + var flags = std.ArrayList([]const u8).init(b.allocator); + defer flags.deinit(); + + try flags.appendSlice(&.{ + "-DHAVE_DIRENT_H", + "-DHAVE_FCNTL_H", + "-DHAVE_STDLIB_H", + "-DHAVE_STRING_H", + "-DHAVE_UNISTD_H", + "-DHAVE_SYS_PARAM_H", + + "-DHAVE_MKSTEMP", + "-DHAVE__MKTEMP_S", + "-DHAVE_MKDTEMP", + "-DHAVE_GETOPT", + "-DHAVE_GETOPT_LONG", + //"-DHAVE_GETPROGNAME", + //"-DHAVE_GETEXECNAME", + "-DHAVE_RAND", + //"-DHAVE_RANDOM_R", + "-DHAVE_FSTATVFS", + "-DHAVE_FSTATFS", + "-DHAVE_VPRINTF", + + "-DHAVE_FT_GET_BDF_PROPERTY", + "-DHAVE_FT_GET_PS_FONT_INFO", + "-DHAVE_FT_HAS_PS_GLYPH_NAMES", + "-DHAVE_FT_GET_X11_FONT_FORMAT", + "-DHAVE_FT_DONE_MM_VAR", + + "-DHAVE_POSIX_FADVISE", + + //"-DHAVE_STRUCT_STATVFS_F_BASETYPE", + // "-DHAVE_STRUCT_STATVFS_F_FSTYPENAME", + // "-DHAVE_STRUCT_STATFS_F_FLAGS", + // "-DHAVE_STRUCT_STATFS_F_FSTYPENAME", + // "-DHAVE_STRUCT_DIRENT_D_TYPE", + + "-DFLEXIBLE_ARRAY_MEMBER", + + "-DHAVE_STDATOMIC_PRIMITIVES", + + "-DFC_GPERF_SIZE_T=size_t", + + // Default errors that fontconfig can't handle + "-Wno-implicit-function-declaration", + "-Wno-int-conversion", + + // https://gitlab.freedesktop.org/fontconfig/fontconfig/-/merge_requests/231 + "-fno-sanitize=undefined", + "-fno-sanitize-trap=undefined", + }); + const target_info = try NativeTargetInfo.detect(target); + switch (target_info.target.ptrBitWidth()) { + 32 => try flags.appendSlice(&.{ + "-DSIZEOF_VOID_P=4", + "-DALIGNOF_VOID_P=4", + }), + + 64 => try flags.appendSlice(&.{ + "-DSIZEOF_VOID_P=8", + "-DALIGNOF_VOID_P=8", + }), + + else => @panic("unsupported arch"), + } + + if (opt.libxml2) { + try flags.appendSlice(&.{ + "-DENABLE_LIBXML2", + "-DLIBXML_STATIC", + "-DLIBXML_PUSH_ENABLED", + }); + if (target.isWindows()) { + // NOTE: this should be defined on all targets + try flags.appendSlice(&.{ + "-Werror=implicit-function-declaration", + }); + } + } + + if (target.isWindows()) { + try flags.appendSlice(&.{ + "-DFC_CACHEDIR=\"LOCAL_APPDATA_FONTCONFIG_CACHE\"", + "-DFC_TEMPLATEDIR=\"c:/share/fontconfig/conf.avail\"", + "-DCONFIGDIR=\"c:/etc/fonts/conf.d\"", + "-DFC_DEFAULT_FONTS=\"\\tWINDOWSFONTDIR\\n\\tWINDOWSUSERFONTDIR\\n\"", + }); + } else { + try flags.appendSlice(&.{ + "-DHAVE_SYS_STATVFS_H", + "-DHAVE_SYS_VFS_H", + "-DHAVE_SYS_STATFS_H", + "-DHAVE_SYS_MOUNT_H", + "-DHAVE_LINK", + "-DHAVE_MKOSTEMP", + "-DHAVE_RANDOM", + "-DHAVE_LRAND48", + "-DHAVE_RAND_R", + "-DHAVE_READLINK", + "-DHAVE_LSTAT", + "-DHAVE_MMAP", + "-DHAVE_PTHREAD", + + "-DFC_CACHEDIR=\"/var/cache/fontconfig\"", + "-DFC_TEMPLATEDIR=\"/usr/share/fontconfig/conf.avail\"", + "-DFONTCONFIG_PATH=\"/etc/fonts\"", + "-DCONFIGDIR=\"/usr/local/fontconfig/conf.d\"", + "-DFC_DEFAULT_FONTS=\"/usr/share/fonts/usr/local/share/fonts\"", + }); + } + + // C files + lib.addCSourceFiles(srcs, flags.items); + + return lib; +} + +const srcs = &.{ + root ++ "src/fcatomic.c", + root ++ "src/fccache.c", + root ++ "src/fccfg.c", + root ++ "src/fccharset.c", + root ++ "src/fccompat.c", + root ++ "src/fcdbg.c", + root ++ "src/fcdefault.c", + root ++ "src/fcdir.c", + root ++ "src/fcformat.c", + root ++ "src/fcfreetype.c", + root ++ "src/fcfs.c", + root ++ "src/fcptrlist.c", + root ++ "src/fchash.c", + root ++ "src/fcinit.c", + root ++ "src/fclang.c", + root ++ "src/fclist.c", + root ++ "src/fcmatch.c", + root ++ "src/fcmatrix.c", + root ++ "src/fcname.c", + root ++ "src/fcobjs.c", + root ++ "src/fcpat.c", + root ++ "src/fcrange.c", + root ++ "src/fcserialize.c", + root ++ "src/fcstat.c", + root ++ "src/fcstr.c", + root ++ "src/fcweight.c", + root ++ "src/fcxml.c", + root ++ "src/ftglue.c", +}; diff --git a/pkg/fontconfig/build.zig b/pkg/fontconfig/build.zig index 03b9573c0..352b48758 100644 --- a/pkg/fontconfig/build.zig +++ b/pkg/fontconfig/build.zig @@ -1,107 +1,51 @@ const std = @import("std"); -const builtin = @import("builtin"); const NativeTargetInfo = std.zig.system.NativeTargetInfo; -/// Directories with our includes. -const root = thisDir() ++ "../../../vendor/fontconfig-2.14.0/"; -const include_path = root; -const include_path_self = thisDir(); +pub fn build(b: *std.Build) !void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); -pub const include_paths = .{ include_path, include_path_self }; + const libxml2_enabled = b.option(bool, "enable-libxml2", "Build libxml2") orelse true; + const freetype_enabled = b.option(bool, "enable-freetype", "Build freetype") orelse true; -pub fn module(b: *std.Build) *std.build.Module { - return b.createModule(.{ - .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" }, - }); -} + const upstream = b.dependency("fontconfig", .{}); -fn thisDir() []const u8 { - return std.fs.path.dirname(@src().file) orelse "."; -} - -pub const Options = struct { - freetype: Freetype = .{}, - expat: Expat = .{}, - libxml2: bool = false, - - pub const Freetype = struct { - enabled: bool = false, - step: ?*std.build.LibExeObjStep = null, - include: ?[]const []const u8 = null, - }; - - pub const Expat = struct { - enabled: bool = false, - step: ?*std.build.LibExeObjStep = null, - include: ?[]const []const u8 = null, - }; -}; - -pub fn link( - b: *std.Build, - step: *std.build.LibExeObjStep, - opt: Options, -) !*std.build.LibExeObjStep { - const lib = try buildFontconfig(b, step, opt); - step.linkLibrary(lib); - step.addIncludePath(.{ .path = include_path }); - step.addIncludePath(.{ .path = include_path_self }); - return lib; -} - -pub fn buildFontconfig( - b: *std.Build, - step: *std.build.LibExeObjStep, - opt: Options, -) !*std.build.LibExeObjStep { - const target = step.target; const lib = b.addStaticLibrary(.{ .name = "fontconfig", - .target = step.target, - .optimize = step.optimize, + .target = target, + .optimize = optimize, }); - - // Include - lib.addIncludePath(.{ .path = include_path }); - lib.addIncludePath(.{ .path = include_path_self }); - - // Link lib.linkLibC(); - if (opt.expat.enabled) { - if (opt.expat.step) |expat| - lib.linkLibrary(expat) - else - lib.linkSystemLibrary("expat"); - - if (opt.expat.include) |dirs| - for (dirs) |dir| lib.addIncludePath(.{ .path = dir }); - } - if (opt.freetype.enabled) { - if (opt.freetype.step) |freetype| - lib.linkLibrary(freetype) - else - lib.linkSystemLibrary("freetype2"); - - if (opt.freetype.include) |dirs| - for (dirs) |dir| lib.addIncludePath(.{ .path = dir }); - } if (!target.isWindows()) { lib.linkSystemLibrary("pthread"); } + if (freetype_enabled) { + const freetype_dep = b.dependency("freetype", .{ .target = target, .optimize = optimize }); + lib.linkLibrary(freetype_dep.artifact("freetype")); + } + if (libxml2_enabled) { + // const libxml2_dep = b.dependency("libxml2", .{ .target = target, .optimize = optimize }); + // lib.linkLibrary(libxml2_dep.artifact("xml2")); + } + + lib.addIncludePath(upstream.path("")); + lib.addIncludePath(.{ .path = "override/include" }); - // Compile var flags = std.ArrayList([]const u8).init(b.allocator); defer flags.deinit(); - try flags.appendSlice(&.{ "-DHAVE_DIRENT_H", "-DHAVE_FCNTL_H", "-DHAVE_STDLIB_H", "-DHAVE_STRING_H", "-DHAVE_UNISTD_H", + "-DHAVE_SYS_STATVFS_H", "-DHAVE_SYS_PARAM_H", + "-DHAVE_SYS_MOUNT_H", + "-DHAVE_LINK", "-DHAVE_MKSTEMP", + "-DHAVE_MKOSTEMP", "-DHAVE__MKTEMP_S", "-DHAVE_MKDTEMP", "-DHAVE_GETOPT", @@ -109,9 +53,15 @@ pub fn buildFontconfig( //"-DHAVE_GETPROGNAME", //"-DHAVE_GETEXECNAME", "-DHAVE_RAND", + "-DHAVE_RANDOM", + "-DHAVE_LRAND48", //"-DHAVE_RANDOM_R", + "-DHAVE_RAND_R", + "-DHAVE_READLINK", "-DHAVE_FSTATVFS", "-DHAVE_FSTATFS", + "-DHAVE_LSTAT", + "-DHAVE_MMAP", "-DHAVE_VPRINTF", "-DHAVE_FT_GET_BDF_PROPERTY", @@ -156,21 +106,6 @@ pub fn buildFontconfig( else => @panic("unsupported arch"), } - - if (opt.libxml2) { - try flags.appendSlice(&.{ - "-DENABLE_LIBXML2", - "-DLIBXML_STATIC", - "-DLIBXML_PUSH_ENABLED", - }); - if (target.isWindows()) { - // NOTE: this should be defined on all targets - try flags.appendSlice(&.{ - "-Werror=implicit-function-declaration", - }); - } - } - if (target.isWindows()) { try flags.appendSlice(&.{ "-DFC_CACHEDIR=\"LOCAL_APPDATA_FONTCONFIG_CACHE\"", @@ -181,8 +116,6 @@ pub fn buildFontconfig( } else { try flags.appendSlice(&.{ "-DHAVE_SYS_STATVFS_H", - "-DHAVE_SYS_VFS_H", - "-DHAVE_SYS_STATFS_H", "-DHAVE_SYS_MOUNT_H", "-DHAVE_LINK", "-DHAVE_MKOSTEMP", @@ -200,41 +133,77 @@ pub fn buildFontconfig( "-DCONFIGDIR=\"/usr/local/fontconfig/conf.d\"", "-DFC_DEFAULT_FONTS=\"/usr/share/fonts/usr/local/share/fonts\"", }); + if (target.isLinux()) { + try flags.appendSlice(&.{ + "-DHAVE_SYS_STATFS_H", + "-DHAVE_SYS_VFS_H", + }); + } + } + if (libxml2_enabled) { + try flags.appendSlice(&.{ + "-DENABLE_LIBXML2", + "-DLIBXML_STATIC", + "-DLIBXML_PUSH_ENABLED", + }); + if (target.isWindows()) { + // NOTE: this should be defined on all targets + try flags.appendSlice(&.{ + "-Werror=implicit-function-declaration", + }); + } } - // C files - lib.addCSourceFiles(srcs, flags.items); + for (srcs) |src| { + lib.addCSourceFile(.{ + .file = upstream.path(src), + .flags = flags.items, + }); + } - return lib; + lib.installHeadersDirectoryOptions(.{ + .source_dir = upstream.path("fontconfig"), + .install_dir = .header, + .install_subdir = "", + .include_extensions = &.{".h"}, + }); + + b.installArtifact(lib); } -const srcs = &.{ - root ++ "src/fcatomic.c", - root ++ "src/fccache.c", - root ++ "src/fccfg.c", - root ++ "src/fccharset.c", - root ++ "src/fccompat.c", - root ++ "src/fcdbg.c", - root ++ "src/fcdefault.c", - root ++ "src/fcdir.c", - root ++ "src/fcformat.c", - root ++ "src/fcfreetype.c", - root ++ "src/fcfs.c", - root ++ "src/fcptrlist.c", - root ++ "src/fchash.c", - root ++ "src/fcinit.c", - root ++ "src/fclang.c", - root ++ "src/fclist.c", - root ++ "src/fcmatch.c", - root ++ "src/fcmatrix.c", - root ++ "src/fcname.c", - root ++ "src/fcobjs.c", - root ++ "src/fcpat.c", - root ++ "src/fcrange.c", - root ++ "src/fcserialize.c", - root ++ "src/fcstat.c", - root ++ "src/fcstr.c", - root ++ "src/fcweight.c", - root ++ "src/fcxml.c", - root ++ "src/ftglue.c", +const headers = &.{ + "fontconfig/fontconfig.h", + "fontconfig/fcprivate.h", + "fontconfig/fcfreetype.h", +}; + +const srcs: []const []const u8 = &.{ + "src/fcatomic.c", + "src/fccache.c", + "src/fccfg.c", + "src/fccharset.c", + "src/fccompat.c", + "src/fcdbg.c", + "src/fcdefault.c", + "src/fcdir.c", + "src/fcformat.c", + "src/fcfreetype.c", + "src/fcfs.c", + "src/fcptrlist.c", + "src/fchash.c", + "src/fcinit.c", + "src/fclang.c", + "src/fclist.c", + "src/fcmatch.c", + "src/fcmatrix.c", + "src/fcname.c", + "src/fcobjs.c", + "src/fcpat.c", + "src/fcrange.c", + "src/fcserialize.c", + "src/fcstat.c", + "src/fcstr.c", + "src/fcweight.c", + "src/fcxml.c", + "src/ftglue.c", }; diff --git a/pkg/fontconfig/build.zig.zon b/pkg/fontconfig/build.zig.zon new file mode 100644 index 000000000..8a342f66f --- /dev/null +++ b/pkg/fontconfig/build.zig.zon @@ -0,0 +1,12 @@ +.{ + .name = "fontconfig", + .version = "2.14.2", + .dependencies = .{ + .fontconfig = .{ + .url = "https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.14.2.tar.gz", + .hash = "12201149afb3326c56c05bb0a577f54f76ac20deece63aa2f5cd6ff31a4fa4fcb3b7", + }, + + .freetype = .{ .path = "../freetype" }, + }, +} diff --git a/pkg/fontconfig/override/include/fcalias.h b/pkg/fontconfig/override/include/fcalias.h new file mode 100644 index 000000000..e69de29bb diff --git a/pkg/fontconfig/override/include/fcaliastail.h b/pkg/fontconfig/override/include/fcaliastail.h new file mode 100644 index 000000000..e69de29bb diff --git a/pkg/fontconfig/override/include/fcftalias.h b/pkg/fontconfig/override/include/fcftalias.h new file mode 100644 index 000000000..e69de29bb diff --git a/pkg/fontconfig/override/include/fcftaliastail.h b/pkg/fontconfig/override/include/fcftaliastail.h new file mode 100644 index 000000000..e69de29bb diff --git a/pkg/fontconfig/override/include/fcobjshash.h b/pkg/fontconfig/override/include/fcobjshash.h new file mode 100644 index 000000000..f06234ac3 --- /dev/null +++ b/pkg/fontconfig/override/include/fcobjshash.h @@ -0,0 +1,347 @@ +/* ANSI-C code produced by gperf version 3.1 */ +/* Command-line: gperf --pic -m 100 fcobjshash.gperf */ +/* Computed positions: -k'3,5' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "fcobjshash.gperf" + +#line 13 "fcobjshash.gperf" +struct FcObjectTypeInfo { +int name; +int id; +}; +#include +/* maximum key range = 59, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +FcObjectTypeHash (register const char *str, register size_t len) +{ + static const unsigned char asso_values[] = + { + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 4, 10, 32, + 21, 29, 28, 49, 14, 4, 66, 66, 5, 31, + 18, 22, 27, 66, 15, 9, 8, 23, 23, 13, + 23, 16, 4, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66 + }; + register unsigned int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + case 3: + hval += asso_values[(unsigned char)str[2]]; + break; + } + return hval; +} + +struct FcObjectTypeNamePool_t + { + char FcObjectTypeNamePool_str7[sizeof("dpi")]; + char FcObjectTypeNamePool_str8[sizeof("size")]; + char FcObjectTypeNamePool_str9[sizeof("file")]; + char FcObjectTypeNamePool_str13[sizeof("hash")]; + char FcObjectTypeNamePool_str14[sizeof("rgba")]; + char FcObjectTypeNamePool_str15[sizeof("spacing")]; + char FcObjectTypeNamePool_str16[sizeof("scalable")]; + char FcObjectTypeNamePool_str17[sizeof("slant")]; + char FcObjectTypeNamePool_str18[sizeof("matrix")]; + char FcObjectTypeNamePool_str19[sizeof("outline")]; + char FcObjectTypeNamePool_str20[sizeof("charset")]; + char FcObjectTypeNamePool_str21[sizeof("antialias")]; + char FcObjectTypeNamePool_str22[sizeof("lang")]; + char FcObjectTypeNamePool_str23[sizeof("embolden")]; + char FcObjectTypeNamePool_str24[sizeof("weight")]; + char FcObjectTypeNamePool_str25[sizeof("color")]; + char FcObjectTypeNamePool_str26[sizeof("charwidth")]; + char FcObjectTypeNamePool_str27[sizeof("variable")]; + char FcObjectTypeNamePool_str28[sizeof("charheight")]; + char FcObjectTypeNamePool_str29[sizeof("hinting")]; + char FcObjectTypeNamePool_str30[sizeof("autohint")]; + char FcObjectTypeNamePool_str31[sizeof("fullname")]; + char FcObjectTypeNamePool_str32[sizeof("postscriptname")]; + char FcObjectTypeNamePool_str33[sizeof("verticallayout")]; + char FcObjectTypeNamePool_str34[sizeof("lcdfilter")]; + char FcObjectTypeNamePool_str35[sizeof("fullnamelang")]; + char FcObjectTypeNamePool_str36[sizeof("hintstyle")]; + char FcObjectTypeNamePool_str37[sizeof("pixelsize")]; + char FcObjectTypeNamePool_str38[sizeof("scale")]; + char FcObjectTypeNamePool_str39[sizeof("globaladvance")]; + char FcObjectTypeNamePool_str40[sizeof("width")]; + char FcObjectTypeNamePool_str41[sizeof("order")]; + char FcObjectTypeNamePool_str42[sizeof("family")]; + char FcObjectTypeNamePool_str43[sizeof("fonthashint")]; + char FcObjectTypeNamePool_str44[sizeof("namelang")]; + char FcObjectTypeNamePool_str45[sizeof("embeddedbitmap")]; + char FcObjectTypeNamePool_str46[sizeof("familylang")]; + char FcObjectTypeNamePool_str47[sizeof("capability")]; + char FcObjectTypeNamePool_str48[sizeof("rasterizer")]; + char FcObjectTypeNamePool_str49[sizeof("index")]; + char FcObjectTypeNamePool_str50[sizeof("style")]; + char FcObjectTypeNamePool_str51[sizeof("foundry")]; + char FcObjectTypeNamePool_str52[sizeof("fontversion")]; + char FcObjectTypeNamePool_str53[sizeof("minspace")]; + char FcObjectTypeNamePool_str54[sizeof("stylelang")]; + char FcObjectTypeNamePool_str55[sizeof("fontvariations")]; + char FcObjectTypeNamePool_str56[sizeof("fontformat")]; + char FcObjectTypeNamePool_str57[sizeof("decorative")]; + char FcObjectTypeNamePool_str58[sizeof("fontfeatures")]; + char FcObjectTypeNamePool_str59[sizeof("symbol")]; + char FcObjectTypeNamePool_str60[sizeof("prgname")]; + char FcObjectTypeNamePool_str65[sizeof("aspect")]; + }; +static const struct FcObjectTypeNamePool_t FcObjectTypeNamePool_contents = + { + "dpi", + "size", + "file", + "hash", + "rgba", + "spacing", + "scalable", + "slant", + "matrix", + "outline", + "charset", + "antialias", + "lang", + "embolden", + "weight", + "color", + "charwidth", + "variable", + "charheight", + "hinting", + "autohint", + "fullname", + "postscriptname", + "verticallayout", + "lcdfilter", + "fullnamelang", + "hintstyle", + "pixelsize", + "scale", + "globaladvance", + "width", + "order", + "family", + "fonthashint", + "namelang", + "embeddedbitmap", + "familylang", + "capability", + "rasterizer", + "index", + "style", + "foundry", + "fontversion", + "minspace", + "stylelang", + "fontvariations", + "fontformat", + "decorative", + "fontfeatures", + "symbol", + "prgname", + "aspect" + }; +#define FcObjectTypeNamePool ((const char *) &FcObjectTypeNamePool_contents) +const struct FcObjectTypeInfo * +FcObjectTypeLookup (register const char *str, register size_t len) +{ + enum + { + TOTAL_KEYWORDS = 52, + MIN_WORD_LENGTH = 3, + MAX_WORD_LENGTH = 14, + MIN_HASH_VALUE = 7, + MAX_HASH_VALUE = 65 + }; + + static const struct FcObjectTypeInfo wordlist[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 43 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str7,FC_DPI_OBJECT}, +#line 27 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str8,FC_SIZE_OBJECT}, +#line 38 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str9,FC_FILE_OBJECT}, + {-1}, {-1}, {-1}, +#line 62 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str13,FC_HASH_OBJECT}, +#line 44 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str14,FC_RGBA_OBJECT}, +#line 30 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str15,FC_SPACING_OBJECT}, +#line 42 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str16,FC_SCALABLE_OBJECT}, +#line 24 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str17,FC_SLANT_OBJECT}, +#line 49 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str18,FC_MATRIX_OBJECT}, +#line 41 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str19,FC_OUTLINE_OBJECT}, +#line 50 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str20,FC_CHARSET_OBJECT}, +#line 32 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str21,FC_ANTIALIAS_OBJECT}, +#line 51 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str22,FC_LANG_OBJECT}, +#line 55 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str23,FC_EMBOLDEN_OBJECT}, +#line 25 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str24,FC_WEIGHT_OBJECT}, +#line 64 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str25,FC_COLOR_OBJECT}, +#line 47 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str26,FC_CHARWIDTH_OBJECT}, +#line 67 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str27,FC_VARIABLE_OBJECT}, +#line 48 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str28,FC_CHAR_HEIGHT_OBJECT}, +#line 34 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str29,FC_HINTING_OBJECT}, +#line 36 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str30,FC_AUTOHINT_OBJECT}, +#line 22 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str31,FC_FULLNAME_OBJECT}, +#line 63 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str32,FC_POSTSCRIPT_NAME_OBJECT}, +#line 35 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str33,FC_VERTICAL_LAYOUT_OBJECT}, +#line 58 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str34,FC_LCD_FILTER_OBJECT}, +#line 23 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str35,FC_FULLNAMELANG_OBJECT}, +#line 33 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str36,FC_HINT_STYLE_OBJECT}, +#line 29 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str37,FC_PIXEL_SIZE_OBJECT}, +#line 45 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str38,FC_SCALE_OBJECT}, +#line 37 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str39,FC_GLOBAL_ADVANCE_OBJECT}, +#line 26 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str40,FC_WIDTH_OBJECT}, +#line 69 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str41,FC_ORDER_OBJECT}, +#line 18 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str42,FC_FAMILY_OBJECT}, +#line 68 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str43,FC_FONT_HAS_HINT_OBJECT}, +#line 59 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str44,FC_NAMELANG_OBJECT}, +#line 56 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str45,FC_EMBEDDED_BITMAP_OBJECT}, +#line 19 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str46,FC_FAMILYLANG_OBJECT}, +#line 53 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str47,FC_CAPABILITY_OBJECT}, +#line 40 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str48,FC_RASTERIZER_OBJECT}, +#line 39 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str49,FC_INDEX_OBJECT}, +#line 20 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str50,FC_STYLE_OBJECT}, +#line 31 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str51,FC_FOUNDRY_OBJECT}, +#line 52 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str52,FC_FONTVERSION_OBJECT}, +#line 46 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str53,FC_MINSPACE_OBJECT}, +#line 21 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str54,FC_STYLELANG_OBJECT}, +#line 66 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str55,FC_FONT_VARIATIONS_OBJECT}, +#line 54 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str56,FC_FONTFORMAT_OBJECT}, +#line 57 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str57,FC_DECORATIVE_OBJECT}, +#line 60 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str58,FC_FONT_FEATURES_OBJECT}, +#line 65 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str59,FC_SYMBOL_OBJECT}, +#line 61 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str60,FC_PRGNAME_OBJECT}, + {-1}, {-1}, {-1}, {-1}, +#line 28 "fcobjshash.gperf" + {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str65,FC_ASPECT_OBJECT} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register unsigned int key = FcObjectTypeHash (str, len); + + if (key <= MAX_HASH_VALUE) + { + register int o = wordlist[key].name; + if (o >= 0) + { + register const char *s = o + FcObjectTypeNamePool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + } + return 0; +}