flow/src/tui/fonts.zig

248 lines
12 KiB
Zig
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const Plane = @import("renderer").Plane;
const Style = @import("theme").Style;
pub fn print_string_large(n: *Plane, s: []const u8, style: Style) !void {
for (s) |c|
print_char_large(n, c, style) catch break;
}
pub fn print_char_large(n: *Plane, char: u8, style: Style) !void {
const bitmap = font8x8[char];
for (0..8) |y| {
for (0..8) |x| {
const set = bitmap[y] & @as(usize, 1) << @intCast(x);
if (set != 0) {
try write_cell(n, "", style);
} else {
n.cursor_move_rel(0, 1) catch {};
}
}
n.cursor_move_rel(1, -8) catch {};
}
n.cursor_move_rel(-8, 8) catch {};
}
pub fn print_string_medium(n: *Plane, s: []const u8, style: Style) !void {
for (s) |c|
print_char_medium(n, c, style) catch break;
}
const QUADBLOCKS = [_][:0]const u8{ " ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
pub fn print_char_medium(n: *Plane, char: u8, style: Style) !void {
const bitmap = font8x8[char];
for (0..4) |y| {
for (0..4) |x| {
const yt = 2 * y;
const yb = 2 * y + 1;
const xl = 2 * x;
const xr = 2 * x + 1;
const settl: u4 = if (bitmap[yt] & @as(usize, 1) << @intCast(xl) != 0) 1 else 0;
const settr: u4 = if (bitmap[yt] & @as(usize, 1) << @intCast(xr) != 0) 2 else 0;
const setbl: u4 = if (bitmap[yb] & @as(usize, 1) << @intCast(xl) != 0) 4 else 0;
const setbr: u4 = if (bitmap[yb] & @as(usize, 1) << @intCast(xr) != 0) 8 else 0;
const quadidx: u4 = setbr | setbl | settr | settl;
const c = QUADBLOCKS[quadidx];
if (quadidx != 0) {
try write_cell(n, c, style);
} else {
n.cursor_move_rel(0, 1) catch {};
}
}
n.cursor_move_rel(1, -4) catch {};
}
n.cursor_move_rel(-4, 4) catch {};
}
fn write_cell(n: *Plane, egc: [:0]const u8, style: Style) !void {
var cell = n.cell_init();
_ = n.at_cursor_cell(&cell) catch return;
_ = n.cell_load(&cell, egc) catch {};
cell.set_style_fg(style);
_ = n.putc(&cell) catch {};
}
pub const font8x8: [128][8]u8 = [128][8]u8{
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
[8]u8{ 24, 60, 60, 24, 24, 0, 24, 0 },
[8]u8{ 54, 54, 0, 0, 0, 0, 0, 0 },
[8]u8{ 54, 54, 127, 54, 127, 54, 54, 0 },
[8]u8{ 12, 62, 3, 30, 48, 31, 12, 0 },
[8]u8{ 0, 99, 51, 24, 12, 102, 99, 0 },
[8]u8{ 28, 54, 28, 110, 59, 51, 110, 0 },
[8]u8{ 6, 6, 3, 0, 0, 0, 0, 0 },
[8]u8{ 24, 12, 6, 6, 6, 12, 24, 0 },
[8]u8{ 6, 12, 24, 24, 24, 12, 6, 0 },
[8]u8{ 0, 102, 60, 255, 60, 102, 0, 0 },
[8]u8{ 0, 12, 12, 63, 12, 12, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 12, 12, 6 },
[8]u8{ 0, 0, 0, 63, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 12, 12, 0 },
[8]u8{ 96, 48, 24, 12, 6, 3, 1, 0 },
[8]u8{ 62, 99, 115, 123, 111, 103, 62, 0 },
[8]u8{ 12, 14, 12, 12, 12, 12, 63, 0 },
[8]u8{ 30, 51, 48, 28, 6, 51, 63, 0 },
[8]u8{ 30, 51, 48, 28, 48, 51, 30, 0 },
[8]u8{ 56, 60, 54, 51, 127, 48, 120, 0 },
[8]u8{ 63, 3, 31, 48, 48, 51, 30, 0 },
[8]u8{ 28, 6, 3, 31, 51, 51, 30, 0 },
[8]u8{ 63, 51, 48, 24, 12, 12, 12, 0 },
[8]u8{ 30, 51, 51, 30, 51, 51, 30, 0 },
[8]u8{ 30, 51, 51, 62, 48, 24, 14, 0 },
[8]u8{ 0, 12, 12, 0, 0, 12, 12, 0 },
[8]u8{ 0, 12, 12, 0, 0, 12, 12, 6 },
[8]u8{ 24, 12, 6, 3, 6, 12, 24, 0 },
[8]u8{ 0, 0, 63, 0, 0, 63, 0, 0 },
[8]u8{ 6, 12, 24, 48, 24, 12, 6, 0 },
[8]u8{ 30, 51, 48, 24, 12, 0, 12, 0 },
[8]u8{ 62, 99, 123, 123, 123, 3, 30, 0 },
[8]u8{ 12, 30, 51, 51, 63, 51, 51, 0 },
[8]u8{ 63, 102, 102, 62, 102, 102, 63, 0 },
[8]u8{ 60, 102, 3, 3, 3, 102, 60, 0 },
[8]u8{ 31, 54, 102, 102, 102, 54, 31, 0 },
[8]u8{ 127, 70, 22, 30, 22, 70, 127, 0 },
[8]u8{ 127, 70, 22, 30, 22, 6, 15, 0 },
[8]u8{ 60, 102, 3, 3, 115, 102, 124, 0 },
[8]u8{ 51, 51, 51, 63, 51, 51, 51, 0 },
[8]u8{ 30, 12, 12, 12, 12, 12, 30, 0 },
[8]u8{ 120, 48, 48, 48, 51, 51, 30, 0 },
[8]u8{ 103, 102, 54, 30, 54, 102, 103, 0 },
[8]u8{ 15, 6, 6, 6, 70, 102, 127, 0 },
[8]u8{ 99, 119, 127, 127, 107, 99, 99, 0 },
[8]u8{ 99, 103, 111, 123, 115, 99, 99, 0 },
[8]u8{ 28, 54, 99, 99, 99, 54, 28, 0 },
[8]u8{ 63, 102, 102, 62, 6, 6, 15, 0 },
[8]u8{ 30, 51, 51, 51, 59, 30, 56, 0 },
[8]u8{ 63, 102, 102, 62, 54, 102, 103, 0 },
[8]u8{ 30, 51, 7, 14, 56, 51, 30, 0 },
[8]u8{ 63, 45, 12, 12, 12, 12, 30, 0 },
[8]u8{ 51, 51, 51, 51, 51, 51, 63, 0 },
[8]u8{ 51, 51, 51, 51, 51, 30, 12, 0 },
[8]u8{ 99, 99, 99, 107, 127, 119, 99, 0 },
[8]u8{ 99, 99, 54, 28, 28, 54, 99, 0 },
[8]u8{ 51, 51, 51, 30, 12, 12, 30, 0 },
[8]u8{ 127, 99, 49, 24, 76, 102, 127, 0 },
[8]u8{ 30, 6, 6, 6, 6, 6, 30, 0 },
[8]u8{ 3, 6, 12, 24, 48, 96, 64, 0 },
[8]u8{ 30, 24, 24, 24, 24, 24, 30, 0 },
[8]u8{ 8, 28, 54, 99, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 255 },
[8]u8{ 12, 12, 24, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 30, 48, 62, 51, 110, 0 },
[8]u8{ 7, 6, 6, 62, 102, 102, 59, 0 },
[8]u8{ 0, 0, 30, 51, 3, 51, 30, 0 },
[8]u8{ 56, 48, 48, 62, 51, 51, 110, 0 },
[8]u8{ 0, 0, 30, 51, 63, 3, 30, 0 },
[8]u8{ 28, 54, 6, 15, 6, 6, 15, 0 },
[8]u8{ 0, 0, 110, 51, 51, 62, 48, 31 },
[8]u8{ 7, 6, 54, 110, 102, 102, 103, 0 },
[8]u8{ 12, 0, 14, 12, 12, 12, 30, 0 },
[8]u8{ 48, 0, 48, 48, 48, 51, 51, 30 },
[8]u8{ 7, 6, 102, 54, 30, 54, 103, 0 },
[8]u8{ 14, 12, 12, 12, 12, 12, 30, 0 },
[8]u8{ 0, 0, 51, 127, 127, 107, 99, 0 },
[8]u8{ 0, 0, 31, 51, 51, 51, 51, 0 },
[8]u8{ 0, 0, 30, 51, 51, 51, 30, 0 },
[8]u8{ 0, 0, 59, 102, 102, 62, 6, 15 },
[8]u8{ 0, 0, 110, 51, 51, 62, 48, 120 },
[8]u8{ 0, 0, 59, 110, 102, 6, 15, 0 },
[8]u8{ 0, 0, 62, 3, 30, 48, 31, 0 },
[8]u8{ 8, 12, 62, 12, 12, 44, 24, 0 },
[8]u8{ 0, 0, 51, 51, 51, 51, 110, 0 },
[8]u8{ 0, 0, 51, 51, 51, 30, 12, 0 },
[8]u8{ 0, 0, 99, 107, 127, 127, 54, 0 },
[8]u8{ 0, 0, 99, 54, 28, 54, 99, 0 },
[8]u8{ 0, 0, 51, 51, 51, 62, 48, 31 },
[8]u8{ 0, 0, 63, 25, 12, 38, 63, 0 },
[8]u8{ 56, 12, 12, 7, 12, 12, 56, 0 },
[8]u8{ 24, 24, 24, 0, 24, 24, 24, 0 },
[8]u8{ 7, 12, 12, 56, 12, 12, 7, 0 },
[8]u8{ 110, 59, 0, 0, 0, 0, 0, 0 },
[8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
};
pub const font_test_text: []const u8 =
\\
\\notcurses (3.0.9) glyph rendering test suite:
\\
\\ ▘▝▀▖▌▞▛▗▚▐▜▄▙▟█⎧ 🬀🬁🬂🬃🬄🬅🬆🬇🬈🬊🬋🬌🬍🬎🬏🬐🬑🬒🬓▌🬔🬕🬖🬗🬘🬙🬚🬛🬜🬝⎫♠♥🯰🯱🯲🯳🯴🯵🯶🯷🯸🯹⅗⅘⅙⅚⅛⎧▕▏⎫┌╥─╥─╥┐🭩⎛⎞
\\ ╲╿╱ ◨◧ ◪◩ ◖◗ ⫷⫸ ⎩🬟🬠🬡🬢🬣🬤🬥🬦🬧▐🬨🬩🬪🬫🬬🬭🬮🬯🬰🬱🬲🬳🬴🬵🬶🬷🬸🬹🬺🬻█⎭♦♣¼½¾⅐⅑⅒⅓⅔⅕⅖⅜⅝⅞⅟↉⎪🮇▎⎪├╜╓╫╖╙┤🭫⎜⎟
\\ ╾╳╼ ◲◱ ◶◵ 🮣🮠 🮤🮥◜◝ ◿◺ 🮞🮟 ◢◣ ┌┐─ ┏┓━ ╭╮─ ╔╗═ 🭽🭾▁♟♜♞⩘▵△▹▷▿▽◃◁⭡⭣⭠⭢⭧⭩⭦⭨⎪🮈▍⎪├─╨╫╨─┤┇⎜⎟
\\ ╱╽╲ ◳◰ ◷◴ 🮡🮢 🮦🮧◟◞ ◹◸ 🮝🮜 ◥◤ └┘│ ┗┛┃ ╰╯│ ╚╝║ 🭼🭿🭵♝♛♚⩗▴⏶⯅▲▸⏵⯈▶▾⏷⯆▼◂⏴⯇◀⎪▐▌⎪╞═╤╬╤═╡┋⎜⎟
\\ ⎡⠀⠁⠈⠉⠂⠃⠊⠋⠐⠑⠘⠙⠒⠓⠚⠛⠄⠅⠌⠍⠆⠇⠎⠏⠔⠕⠜⠝⠖⠗⠞⠟⠠⠡⠨⠩⠢⠣⠪⠫⠰⠱⠸⠹⠲⠳⠺⠻⠤⠥⠬⠭⠦⠧⠮⠯⠴⠵⠼⠽⠶⠷⠾⠿⎤⎨🮉▋⎬╞╕╘╬╛╒╡┊⎜⎟
\\ ⎢⡀⡁⡈⡉⡂⡃⡊⡋⡐⡑⡘⡙⡒⡓⡚⡛⡄⡅⡌⡍⡆⡇⡎⡏⡔⡕⡜⡝⡖⡗⡞⡟⡠⡡⡨⡩⡢⡣⡪⡫⡰⡱⡸⡹⡲⡳⡺⡻⡤⡥⡬⡭⡦⡧⡮⡯⡴⡵⡼⡽⡶⡷⡾⡿⎥⎪🮊▊⎪└┴─╨─┴┘╏⎝⎠
\\ ⎢⢀⢁⢈⢉⢂⢃⢊⢋⢐⢑⢘⢙⢒⢓⢚⢛⢄⢅⢌⢍⢆⢇⢎⢏⢔⢕⢜⢝⢖⢗⢞⢟⢠⢡⢨⢩⢢⢣⢪⢫⢰⢱⢸⢹⢲⢳⢺⢻⢤⢥⢬⢭⢦⢧⢮⢯⢴⢵⢼⢽⢶⢷⢾⢿⎥⎪🮋▉⎪╭──╮⟬⟭╔╗≶≷
\\ ⎣⣀⣁⣈⣉⣂⣃⣊⣋⣐⣑⣘⣙⣒⣓⣚⣛⣄⣅⣌⣍⣆⣇⣎⣏⣔⣕⣜⣝⣖⣗⣞⣟⣠⣡⣨⣩⣢⣣⣪⣫⣰⣱⣸⣹⣲⣳⣺⣻⣤⣥⣬⣭⣦⣧⣮⣯⣴⣵⣼⣽⣶⣷⣾⣿⎦⎪██⎪│╭╮│╔═╝║⊆⊇
\\ ▔🭶🭷🭸🭹🭺🭻▁ 🭁🭌 🭂🭍 🭃🭎 🭄🭏 🭅🭐 🭆🭑 🭇🬼 🭈🬽 🭉🬾 🭊🬿 🭋🭀 ₀₁₂₃₄₅₆₇₈₉ ⎛ ▁▂▃▄▅▆▇█🭫⎞⎪🭨🭪⎪╰╯││║╔═╝⊴⊵
\\ ▏🭰🭱🭲🭳🭴🭵▕ 🭒🭝 🭓🭞 🭔🭟 🭕🭠 🭖🭡 🭧🭜 🭢🭗 🭣🭘 🭤🭙 🭥🭚 🭦🭛 ⁰¹²³⁴⁵⁶⁷⁸⁹ ⎝ ▔🮂🮃▀🮄🮅🮆█🭩⎠⎩🭪🭨⎭⧒⧑╰╯╚╝❨❩⟃⟄
\\ 👾🏴🤘🚬🌍🌎🌏🥆💣🗡🔫⚗️⚛️☢️☣️🌿🎱🏧💉💊🕴️📡🤻🦑🇦🇶👩‍🔬🪤🚱✊🏿🔬🧬🏴‍☠️🤽🏼‍♀️
\\
\\
\\Unicode mode 2027 tests:
\\
\\xxxxxxxxxx
\\xxxx🧑🌾xxxx
\\xxxxxxxxxx
\\
\\xxxxxxxxxxxxxxxxxxxxxxxx
\\xx🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾xx
\\xx🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾🧑🌾xx
\\xxxxxxxxxxxxxxxxxxxxxxxx
\\
\\🙂‍↔
\\
\\
\\ recommended fonts for terminals with no nerdfont fallback support (e.g. flow-gui):
\\
\\ "IosevkaTerm Nerd Font" => https://github.com/ryanoasis/nerd-fonts/releases/download/v3.3.0/IosevkaTerm.zip
\\ "Cascadia Code NF" => https://github.com/microsoft/cascadia-code/releases/download/v2407.24/CascadiaCode-2407.24.zip
\\
;
pub const DigitStyle = @import("config").DigitStyle;
pub fn get_digit(n: anytype, style_: DigitStyle) []const u8 {
return switch (style_) {
.ascii => digits_ascii[n],
.digital => digits_digtl[n],
.subscript => digits_subsc[n],
.superscript => digits_super[n],
};
}
const digits_ascii: [10][]const u8 = .{ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
const digits_digtl: [10][]const u8 = .{ "🯰", "🯱", "🯲", "🯳", "🯴", "🯵", "🯶", "🯷", "🯸", "🯹" };
const digits_subsc: [10][]const u8 = .{ "", "", "", "", "", "", "", "", "", "" };
const digits_super: [10][]const u8 = .{ "", "¹", "²", "³", "", "", "", "", "", "" };