248 lines
12 KiB
Zig
248 lines
12 KiB
Zig
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 = .{ "⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹" };
|