Skip to content

Commit 3620f2e

Browse files
committed
Render Powerline symbols in swash
1 parent ba4b0e9 commit 3620f2e

2 files changed

Lines changed: 397 additions & 0 deletions

File tree

src/renderer.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,76 @@ mod tests {
492492
assert_rgb_close(cell_pixel(&image, 4, 7, 0.42, 0.75), PALETTE[YELLOW], 0);
493493
}
494494

495+
#[test]
496+
fn swash_renders_powerline_symbols_as_cell_geometry() {
497+
let mut renderer = swash(settings_without_symbol_fallback());
498+
499+
let image = renderer.render(
500+
&lines_for(concat!(
501+
"\x1b[38;5;2m",
502+
"\u{e0b0}\u{e0b1}\u{e0b2}\u{e0b3}",
503+
"\u{e0b4}\u{e0b5}\u{e0b6}\u{e0b7}",
504+
"\u{e0b8}\u{e0b9}\u{e0ba}\u{e0bb}",
505+
"\u{e0bc}\u{e0bd}\u{e0be}\u{e0bf}",
506+
"\x1b[39m",
507+
)),
508+
None,
509+
);
510+
511+
for (col, x, y) in [
512+
(0, 0.25, 0.50), // right full triangle
513+
(1, 0.50, 0.25), // right bracket
514+
(2, 0.75, 0.50), // left full triangle
515+
(3, 0.50, 0.25), // left bracket
516+
(4, 0.50, 0.50), // right thick cap
517+
(5, 0.85, 0.25), // right thin cap
518+
(6, 0.50, 0.50), // left thick cap
519+
(7, 0.12, 0.25), // left thin cap
520+
(8, 0.25, 0.75), // lower-left triangle
521+
(9, 0.50, 0.50), // backslash
522+
(10, 0.75, 0.75), // lower-right triangle
523+
(11, 0.50, 0.50), // forward slash
524+
(12, 0.25, 0.25), // upper-left triangle
525+
(13, 0.50, 0.50), // redundant forward slash
526+
(14, 0.75, 0.25), // upper-right triangle
527+
(15, 0.50, 0.50), // redundant backslash
528+
] {
529+
let actual = cell_pixel(&image, col, 0, x, y);
530+
let ink = rgb_distance(actual, BG);
531+
532+
assert!(
533+
ink > 40,
534+
"expected powerline cell {col} at ({x}, {y}) to have green ink, got {actual:?}",
535+
);
536+
}
537+
538+
for (col, x, y) in [
539+
(0, 0.85, 0.15), // right full triangle
540+
(1, 0.25, 0.50), // right bracket interior
541+
(2, 0.15, 0.15), // left full triangle
542+
(3, 0.75, 0.50), // left bracket interior
543+
(4, 0.90, 0.10), // right thick cap corner
544+
(5, 0.50, 0.50), // right thin cap interior
545+
(6, 0.10, 0.10), // left thick cap corner
546+
(7, 0.50, 0.50), // left thin cap interior
547+
(8, 0.90, 0.10), // lower-left triangle
548+
(9, 0.90, 0.10), // backslash off diagonal
549+
(10, 0.10, 0.10), // lower-right triangle
550+
(11, 0.10, 0.10), // forward slash off diagonal
551+
(12, 0.90, 0.90), // upper-left triangle
552+
(13, 0.90, 0.90), // redundant forward slash off diagonal
553+
(14, 0.10, 0.90), // upper-right triangle
554+
(15, 0.10, 0.90), // redundant backslash off diagonal
555+
] {
556+
let actual = cell_pixel(&image, col, 0, x, y);
557+
558+
assert!(
559+
rgb_distance(actual, BG) <= 4,
560+
"expected powerline cell {col} at ({x}, {y}) to stay background, got {actual:?}",
561+
);
562+
}
563+
}
564+
495565
#[test]
496566
fn swash_heavy_box_corners_join_without_notches() {
497567
let mut settings = settings(false);
@@ -731,6 +801,22 @@ mod tests {
731801
}
732802
}
733803

804+
fn settings_without_symbol_fallback() -> Settings {
805+
let mut font_db = fontdb::Database::new();
806+
font_db.load_font_data(include_bytes!("../fonts/JetBrainsMono-Regular.ttf").to_vec());
807+
808+
Settings {
809+
terminal_size: (COLS, ROWS),
810+
font_db,
811+
font_families: vec![FONT_FAMILY.to_owned()],
812+
text_family: FONT_FAMILY.to_owned(),
813+
font_size: FONT_SIZE,
814+
line_height: LINE_HEIGHT,
815+
theme: theme(),
816+
bold_is_bright: false,
817+
}
818+
}
819+
734820
fn theme() -> Theme {
735821
[BG, FG]
736822
.into_iter()

0 commit comments

Comments
 (0)