Skip to documentation
SLOP

tiny.filigree.font.lookups

Reference tiny.filigree font lookups

Defined in font.

API (41)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callsfontlookups
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsfont.lookupsgposOffsetfont.lookupsgsubOffsetfont.lookupsinvalidfont.lookupsbaseOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsfont.lookupsgposChildOffsetfont.lookupsgsubChildOffsetfont.lookupshasBytesfont.lookupsinvalidfont.lookupschildOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.lookupsfeatureConditionSetMatchesfont.lookupsgposChildOffset32font.lookupsgsubChildOffset32font.lookupsmatchingFeatureSubstitutionOffsetfont.lookupssubstitutedFeatureOffsetfont.lookupshasBytesfont.lookupsinvalidfont.lookupschildOffset32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposfeatureContainsLookupImplprivate sourcelib.filigree.src.font.gsubfeatureContainsLookupImplfont.lookupshasBytesfont.lookupsinvalidfont.lookupsreadU16font.lookupsfeatureTableContainsLookup
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposchainedContextualClassSetMatchImplprivate sourcelib.filigree.src.font.gposchainedContextualMatchFormat1Implprivate sourcelib.filigree.src.font.gposchainedContextualMatchFormat2Implprivate sourcelib.filigree.src.font.gposchainedContextualPairAdjustmentFormat...private sourcelib.filigree.src.font.gposchainedContextualRuleSetMatchImpl+36 morefont.lookupschildOffsetfont.lookupsgposChildOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposinitImplprivate sourcelib.filigree.src.font.gposresolveGposSubtablefont.lookupschildOffset32font.lookupsgposChildOffset32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsfont.lookupsgposLookupFilterfont.lookupshasBytesfont.lookupsgposHasBytes
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposlookupContextualPairAdjustmentAtImplprivate sourcelib.filigree.src.font.gposlookupCursiveAttachmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToBaseAdjustmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToLigatureAdjustmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToMarkAdjustmentImpl+3 morefont.lookupsgposHasBytesfont.lookupsgposReadU16font.lookupsgposLookupFilter
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposinitImpltest sourcelib.filigree.src.font.gpostest: GPOS offsets stay inside table ...font.lookupsbaseOffsetfont.lookupsgposOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfont.lookupsreadI16font.lookupsgposReadI16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsfont.lookupsgposLookupFilterfont.lookupsreadU16font.lookupsgposReadU16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfont.lookupsreadU32font.lookupsgposReadU32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gsubalternateSubstitutionprivate sourcelib.filigree.src.font.gsubchainedContextualSubstitutionClassSet...private sourcelib.filigree.src.font.gsubchainedContextualSubstitutionFormat1I...private sourcelib.filigree.src.font.gsubchainedContextualSubstitutionFormat2I...private sourcelib.filigree.src.font.gsubchainedContextualSubstitutionFormat3I...+19 morefont.lookupschildOffsetfont.lookupsgsubChildOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gsubinitImplprivate sourcelib.filigree.src.font.gsubresolveGsubSubtablefont.lookupschildOffset32font.lookupsgsubChildOffset32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsfont.lookupsgsubLookupFilterfont.lookupshasBytesfont.lookupsgsubHasBytes
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gsubsubstitutionAtLookupImplfont.lookupsgsubHasBytesfont.lookupsgsubReadU16font.lookupsgsubLookupFilter
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gsubinitImpltest sourcelib.filigree.src.font.gsubtest: GSUB offsets stay inside table ...font.lookupsbaseOffsetfont.lookupsgsubOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfont.lookupsreadI16font.lookupsgsubReadI16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsfont.lookupsgsubLookupFilterfont.lookupsreadU16font.lookupsgsubReadU16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfont.lookupsreadU32font.lookupsgsubReadU32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsfont.lookupschildOffsetfont.lookupschildOffset32private sourcelib.filigree.src.font.lookupsfeatureConditionMatchesfont.lookupsfeatureTableContainsLookupfont.lookupsgposHasBytes+4 morefont.lookupshasBytes
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsfont.lookupsbaseOffsetfont.lookupschildOffsetfont.lookupschildOffset32private sourcelib.filigree.src.font.lookupsfeatureConditionMatchesprivate sourcelib.filigree.src.font.lookupsfeatureConditionSetMatches+5 morefont.lookupsinvalid
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.filigree.src.font.gsubsubstitutionAtLookupImplfont.lookupslookupFilterSkipsGlyphs
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.filigree.src.font.facetest: lookup filters use GDEF mark cl...private sourcelib.filigree.src.font.gposlookupCursiveAttachmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToBaseAdjustmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToLigatureAdjustmentImplprivate sourcelib.filigree.src.font.gposlookupMarkToMarkAdjustmentImpl+5 morefont.lookupslookupGlyphIgnored
Static calls · unresolved targets: 1 · external targets: 3.
Called byCallsprivate sourcelib.filigree.src.font.gposfeatureOffsetImplprivate sourcelib.filigree.src.font.gsubfeatureOffsetImplfont.lookupschildOffset32private sourcelib.filigree.src.font.lookupsfeatureConditionSetMatchesfont.lookupshasBytesfont.lookupsinvalidfont.lookupsreadU16font.lookupsreadU32font.lookupsmatchingFeatureSubstitutionOffset
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.lookupsfeatureConditionMatchesfont.lookupsgposReadI16font.lookupsgsubReadI16font.lookupsreadU16font.lookupsreadI16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.lookupsfeatureConditionMatchesprivate sourcelib.filigree.src.font.lookupsfeatureConditionSetMatchesfont.lookupsfeatureTableContainsLookupfont.lookupsgposReadU16font.lookupsgsubReadU16+3 morefont.lookupshasBytesfont.lookupsinvalidfont.lookupsreadU16
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.lookupsfeatureConditionSetMatchesfont.lookupsgposReadU32font.lookupsgsubReadU32font.lookupsmatchingFeatureSubstitutionOffsetfont.lookupssubstitutedFeatureOffsetfont.lookupshasBytesfont.lookupsinvalidfont.lookupsreadU32
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.filigree.src.font.gposgposLangSysOffsetprivate sourcelib.filigree.src.font.gsubgsubLangSysOffsetfont.lookupsscriptTagListContains
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.filigree.src.font.gposfeatureOffsetImplprivate sourcelib.filigree.src.font.gsubfeatureOffsetImplfont.lookupschildOffset32font.lookupsinvalidfont.lookupsreadU16font.lookupsreadU32font.lookupssubstitutedFeatureOffset
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/filigree/src/font/lookups.zig

zig
const std = @import("std");const gdef_table = @import("gdef.zig");const model = @import("model.zig");const FontError = model.FontError;const Gdef = gdef_table.Gdef;const LayoutSelection = model.LayoutSelection;const Tag = model.Tag;const VariationSetting = model.VariationSetting;pub const Kind = enum {    gsub,    gpos,};pub const VariationContext = struct {    ptr: *const anyopaque,    variation_axis_count: *const fn (*const anyopaque) u16,    normalized_coordinate_at: *const fn (*const anyopaque, []const VariationSetting, usize) FontError!i16,    pub fn variationAxisCount(self: VariationContext) u16 {        return self.variation_axis_count(self.ptr);    }    pub fn normalizedCoordinateAt(self: VariationContext, settings: []const VariationSetting, axis_index: usize) FontError!i16 {        return self.normalized_coordinate_at(self.ptr, settings, axis_index);    }};pub const ignore_base_glyphs: u16 = 0x0002;pub const ignore_ligatures: u16 = 0x0004;pub const ignore_marks: u16 = 0x0008;pub const use_mark_filtering_set: u16 = 0x0010;pub const reserved_flags: u16 = 0x00e0;pub const mark_attachment_type: u16 = 0xff00;pub const LookupFilter = struct {    flags: u16,    mark_filtering_set: ?u16 = null,};pub fn matchingFeatureSubstitutionOffset(comptime kind: Kind, bytes: []const u8, feature_variations_offset: ?usize, face: anytype, selection: LayoutSelection) FontError!?usize {    const offset = feature_variations_offset orelse return null;    if (!hasBytes(kind, bytes, offset, 8)) return invalid(kind);    if (try readU16(kind, bytes, offset) != 1 or try readU16(kind, bytes, offset + 2) != 0) return null;    const record_count = try readU32(kind, bytes, offset + 4);    if (@as(u64, record_count) * 8 > @as(u64, bytes.len - offset - 8)) return invalid(kind);    for (0..record_count) |record_index| {        const record_offset = offset + 8 + @as(usize, @intCast(record_index)) * 8;        const condition_set_offset = try readU32(kind, bytes, record_offset);        if (!try featureConditionSetMatches(kind, bytes, offset, condition_set_offset, face, selection)) continue;        const substitution_relative = try readU32(kind, bytes, record_offset + 4);        if (substitution_relative == 0) return null;        const substitution_offset = try childOffset32(kind, bytes, offset, substitution_relative, 6);        if (try readU16(kind, bytes, substitution_offset) == 1 and try readU16(kind, bytes, substitution_offset + 2) == 0) {            return substitution_offset;        }    }    return null;}fn featureConditionSetMatches(comptime kind: Kind, bytes: []const u8, feature_variations_offset: usize, relative_offset: u32, face: anytype, selection: LayoutSelection) FontError!bool {    if (relative_offset == 0) return true;    const offset = try childOffset32(kind, bytes, feature_variations_offset, relative_offset, 2);    const condition_count = try readU16(kind, bytes, offset);    if (@as(u64, condition_count) * 4 > @as(u64, bytes.len - offset - 2)) return invalid(kind);    const condition_offsets = offset + 2;    for (0..condition_count) |condition_index| {        const condition_relative = try readU32(kind, bytes, condition_offsets + condition_index * 4);        const condition_offset = try childOffset32(kind, bytes, offset, condition_relative, 2);        if (!try featureConditionMatches(kind, bytes, condition_offset, face, selection)) return false;    }    return true;}fn featureConditionMatches(comptime kind: Kind, bytes: []const u8, condition_offset: usize, face: anytype, selection: LayoutSelection) FontError!bool {    const format = try readU16(kind, bytes, condition_offset);    if (format != 1) return false;    if (!hasBytes(kind, bytes, condition_offset, 8)) return invalid(kind);    const axis_index = try readU16(kind, bytes, condition_offset + 2);    const min_value = try readI16(kind, bytes, condition_offset + 4);    const max_value = try readI16(kind, bytes, condition_offset + 6);    if (min_value > max_value) return false;    const found_face = face orelse return false;    if (axis_index >= found_face.variationAxisCount()) return false;    const value = found_face.normalizedCoordinateAt(selection.variations, axis_index) catch return false;    return value >= min_value and value <= max_value;}pub fn substitutedFeatureOffset(comptime kind: Kind, bytes: []const u8, substitution_offset: usize, feature_index: u16) FontError!?usize {    if (try readU16(kind, bytes, substitution_offset) != 1 or try readU16(kind, bytes, substitution_offset + 2) != 0) return null;    const substitution_count = try readU16(kind, bytes, substitution_offset + 4);    if (@as(u64, substitution_count) * 6 > @as(u64, bytes.len - substitution_offset - 6)) return invalid(kind);    const records = substitution_offset + 6;    for (0..substitution_count) |record_index| {        const record_offset = records + record_index * 6;        const current_feature_index = try readU16(kind, bytes, record_offset);        if (current_feature_index > feature_index) return null;        if (current_feature_index != feature_index) continue;        const alternate_relative = try readU32(kind, bytes, record_offset + 2);        return try childOffset32(kind, bytes, substitution_offset, alternate_relative, 4);    }    return null;}pub fn featureTableContainsLookup(comptime kind: Kind, bytes: []const u8, feature_offset: usize, lookup_index: u16) FontError!bool {    if (!hasBytes(kind, bytes, feature_offset, 4)) return invalid(kind);    const lookup_index_count = try readU16(kind, bytes, feature_offset + 2);    if (@as(u64, lookup_index_count) * 2 > @as(u64, bytes.len - feature_offset - 4)) return invalid(kind);    for (0..lookup_index_count) |i| {        if (try readU16(kind, bytes, feature_offset + 4 + i * 2) == lookup_index) return true;    }    return false;}pub fn baseOffset(comptime kind: Kind, data: []const u8, relative_offset: u16) FontError!usize {    const relative: usize = relative_offset;    if (relative == 0 or relative >= data.len) return invalid(kind);    if (data.len - relative < 2) return invalid(kind);    return relative;}pub fn childOffset(comptime kind: Kind, data: []const u8, base: usize, relative_offset: u16, min_len: usize) FontError!usize {    const relative: usize = relative_offset;    if (relative == 0 or base > data.len or relative > data.len - base) return invalid(kind);    const child = base + relative;    if (!hasBytes(kind, data, child, min_len)) return invalid(kind);    return child;}pub fn childOffset32(comptime kind: Kind, data: []const u8, base: usize, relative_offset: u32, min_len: usize) FontError!usize {    if (relative_offset == 0 or relative_offset > std.math.maxInt(usize)) return invalid(kind);    const relative: usize = @intCast(relative_offset);    if (base > data.len or relative > data.len - base) return invalid(kind);    const child = base + relative;    if (!hasBytes(kind, data, child, min_len)) return invalid(kind);    return child;}pub fn hasBytes(comptime kind: Kind, data: []const u8, offset_value: usize, len: usize) bool {    _ = kind;    return offset_value <= data.len and len <= data.len - offset_value;}pub fn readU16(comptime kind: Kind, data: []const u8, offset_value: usize) FontError!u16 {    if (!hasBytes(kind, data, offset_value, 2)) return invalid(kind);    return std.mem.readInt(u16, data[offset_value..][0..2], .big);}pub fn readI16(comptime kind: Kind, data: []const u8, offset_value: usize) FontError!i16 {    return @bitCast(try readU16(kind, data, offset_value));}pub fn readU32(comptime kind: Kind, data: []const u8, offset_value: usize) FontError!u32 {    if (!hasBytes(kind, data, offset_value, 4)) return invalid(kind);    return std.mem.readInt(u32, data[offset_value..][0..4], .big);}pub fn invalid(comptime kind: Kind) FontError {    return switch (kind) {        .gsub => error.InvalidGsub,        .gpos => error.InvalidGpos,    };}pub fn lookupFilterSkipsGlyphs(filter: LookupFilter) bool {    return filter.flags != 0 or filter.mark_filtering_set != null;}pub fn gsubLookupFilter(data: []const u8, lookup_offset: usize) FontError!LookupFilter {    const flags = try gsubReadU16(data, lookup_offset + 2);    if ((flags & reserved_flags) != 0) return error.InvalidGsub;    const subtable_count = try gsubReadU16(data, lookup_offset + 4);    const mark_filtering_set_offset = lookup_offset + 6 + @as(usize, subtable_count) * 2;    if ((flags & use_mark_filtering_set) == 0) {        return .{ .flags = flags };    }    if (!gsubHasBytes(data, mark_filtering_set_offset, 2)) return error.InvalidGsub;    return .{        .flags = flags,        .mark_filtering_set = try gsubReadU16(data, mark_filtering_set_offset),    };}pub fn gposLookupFilter(data: []const u8, lookup_offset: usize) FontError!LookupFilter {    const flags = try gposReadU16(data, lookup_offset + 2);    if ((flags & reserved_flags) != 0) return error.InvalidGpos;    const subtable_count = try gposReadU16(data, lookup_offset + 4);    const mark_filtering_set_offset = lookup_offset + 6 + @as(usize, subtable_count) * 2;    if ((flags & use_mark_filtering_set) == 0) {        return .{ .flags = flags };    }    if (!gposHasBytes(data, mark_filtering_set_offset, 2)) return error.InvalidGpos;    return .{        .flags = flags,        .mark_filtering_set = try gposReadU16(data, mark_filtering_set_offset),    };}pub fn lookupGlyphIgnored(data: []const u8, gdef: ?Gdef, filter: LookupFilter, glyph_id: u16) FontError!bool {    const needs_gdef =        (filter.flags & (ignore_base_glyphs | ignore_ligatures | ignore_marks | mark_attachment_type)) != 0 or        filter.mark_filtering_set != null;    const definition = gdef orelse return needs_gdef;    const class = try definition.glyphClass(data, glyph_id);    if (class == .base and (filter.flags & ignore_base_glyphs) != 0) return true;    if (class == .ligature and (filter.flags & ignore_ligatures) != 0) return true;    if (class != .mark) return false;    if ((filter.flags & ignore_marks) != 0) return true;    if (filter.mark_filtering_set) |set_index| {        return !try definition.markGlyphSetContains(data, set_index, glyph_id);    }    const attachment_type = (filter.flags & mark_attachment_type) >> 8;    if (attachment_type == 0) return false;    return try definition.markAttachmentClass(data, glyph_id) != attachment_type;}pub fn scriptTagListContains(script_tags: []const Tag, wanted: Tag) bool {    for (script_tags) |script_tag| {        if (script_tag == wanted) return true;    }    return false;}pub fn gsubOffset(data: []const u8, relative_offset: u16) FontError!usize {    return baseOffset(.gsub, data, relative_offset);}pub fn gsubChildOffset(data: []const u8, base: usize, relative_offset: u16, min_len: usize) FontError!usize {    return childOffset(.gsub, data, base, relative_offset, min_len);}pub fn gsubChildOffset32(data: []const u8, base: usize, relative_offset: u32, min_len: usize) FontError!usize {    return childOffset32(.gsub, data, base, relative_offset, min_len);}pub fn gsubHasBytes(data: []const u8, offset_value: usize, len: usize) bool {    return hasBytes(.gsub, data, offset_value, len);}pub fn gsubReadU16(data: []const u8, offset_value: usize) FontError!u16 {    return readU16(.gsub, data, offset_value);}pub fn gsubReadI16(data: []const u8, offset_value: usize) FontError!i16 {    return readI16(.gsub, data, offset_value);}pub fn gsubReadU32(data: []const u8, offset_value: usize) FontError!u32 {    return readU32(.gsub, data, offset_value);}pub fn gposOffset(data: []const u8, relative_offset: u16) FontError!usize {    return baseOffset(.gpos, data, relative_offset);}pub fn gposChildOffset(data: []const u8, base: usize, relative_offset: u16, min_len: usize) FontError!usize {    return childOffset(.gpos, data, base, relative_offset, min_len);}pub fn gposChildOffset32(data: []const u8, base: usize, relative_offset: u32, min_len: usize) FontError!usize {    return childOffset32(.gpos, data, base, relative_offset, min_len);}pub fn gposHasBytes(data: []const u8, offset_value: usize, len: usize) bool {    return hasBytes(.gpos, data, offset_value, len);}pub fn gposReadU16(data: []const u8, offset_value: usize) FontError!u16 {    return readU16(.gpos, data, offset_value);}pub fn gposReadI16(data: []const u8, offset_value: usize) FontError!i16 {    return readI16(.gpos, data, offset_value);}pub fn gposReadU32(data: []const u8, offset_value: usize) FontError!u32 {    return readU32(.gpos, data, offset_value);}

Source: lib/filigree/src/font/root.zig:11

zig
pub const lookups = @import("lookups.zig");

Complete caller list for font.lookups.gposChildOffset

41 direct callers.

Complete caller list for font.lookups.gposLookupFilter

8 direct callers.

Complete caller list for font.lookups.gsubChildOffset

24 direct callers.

Complete caller list for font.lookups.hasBytes

9 direct callers.

Complete caller list for font.lookups.invalid

10 direct callers.

Complete caller list for font.lookups.lookupGlyphIgnored

10 direct callers.

Complete caller list for font.lookups.readU16

8 direct callers.

Audit

Definitions42
Public names42
Members7
Version26.7.0
Revisiondaab053ee433