diff --git a/kitty/fonts.c b/kitty/fonts.c index f4738e41d..a02e8b616 100644 --- a/kitty/fonts.c +++ b/kitty/fonts.c @@ -600,7 +600,7 @@ START_ALLOW_CASE_RANGE case 0xe0ba: //  case 0xe0bc: //  case 0xe0be: //  - case 0x1fb00 ... 0x1fb67: // symbols for legacy computing + case 0x1fb00 ... 0x1fb8b: // symbols for legacy computing return BOX_FONT; default: ans = in_symbol_maps(fg, cpu_cell->ch); @@ -638,7 +638,7 @@ START_ALLOW_CASE_RANGE return ch - 0x2500; // IDs from 0x00 to 0x9f case 0xe0b0 ... 0xe0d4: return 0xa0 + ch - 0xe0b0; // IDs from 0xa0 to 0xc4 - case 0x1fb00 ... 0x1fb67: + case 0x1fb00 ... 0x1fb8b: return 0xc5 + ch - 0x1fb00; default: return 0xffff; diff --git a/kitty/fonts/box_drawing.py b/kitty/fonts/box_drawing.py index 856bbe177..5dd9a41c7 100644 --- a/kitty/fonts/box_drawing.py +++ b/kitty/fonts/box_drawing.py @@ -513,24 +513,6 @@ def inner_corner(buf: BufType, width: int, height: int, which: str = 'tl', level draw_vline(buf, width, y1, y2, width // 2 + (xd * hgap), level) -def vblock(buf: BufType, width: int, height: int, frac: float = 1., gravity: str = 'top') -> None: - num_rows = min(height, round(frac * height)) - start = 0 if gravity == 'top' else height - num_rows - for r in range(start, start + num_rows): - off = r * width - for c in range(off, off + width): - buf[c] = 255 - - -def hblock(buf: BufType, width: int, height: int, frac: float = 1., gravity: str = 'left') -> None: - num_cols = min(width, round(frac * width)) - start = 0 if gravity == 'left' else width - num_cols - for r in range(height): - off = r * width + start - for c in range(off, off + num_cols): - buf[c] = 255 - - def shade(buf: BufType, width: int, height: int, light: bool = False, invert: bool = False) -> None: square_sz = max(1, width // 12) number_of_rows = height // square_sz @@ -634,6 +616,28 @@ def smooth_mosaic( buf[offset + x] = 255 +def eight_bar(buf: BufType, width: int, height: int, level: int = 1, which: int = 0, horizontal: bool = False) -> None: + if horizontal: + x_range = range(0, width) + thickness = height // 8 + y_start = min(which * thickness, height - 2) + y_range = range(y_start, height if which == 7 else min(y_start + thickness, height)) + else: + y_range = range(0, height) + thickness = width // 8 + x_start = min(which * thickness, width - 2) + x_range = range(x_start, width if which == 7 else min(x_start + thickness, width)) + for y in y_range: + offset = y * width + for x in x_range: + buf[offset + x] = 255 + + +def eight_block(buf: BufType, width: int, height: int, level: int = 1, which: Tuple[int, ...] = (0,), horizontal: bool = False) -> None: + for x in which: + eight_bar(buf, width, height, level, x, horizontal) + + box_chars: Dict[str, List[Callable]] = { '─': [hline], '━': [p(hline, level=3)], @@ -701,28 +705,28 @@ box_chars: Dict[str, List[Callable]] = { '╱': [p(cross_line, left=False)], '╲': [cross_line], '╳': [cross_line, p(cross_line, left=False)], - '▀': [p(vblock, frac=1/2)], - '▁': [p(vblock, frac=1/8, gravity='bottom')], - '▂': [p(vblock, frac=1/4, gravity='bottom')], - '▃': [p(vblock, frac=3/8, gravity='bottom')], - '▄': [p(vblock, frac=1/2, gravity='bottom')], - '▅': [p(vblock, frac=5/8, gravity='bottom')], - '▆': [p(vblock, frac=3/4, gravity='bottom')], - '▇': [p(vblock, frac=7/8, gravity='bottom')], - '█': [p(vblock, frac=1, gravity='bottom')], - '▉': [p(hblock, frac=7/8)], - '▊': [p(hblock, frac=3/4)], - '▋': [p(hblock, frac=5/8)], - '▌': [p(hblock, frac=1/2)], - '▍': [p(hblock, frac=3/8)], - '▎': [p(hblock, frac=1/4)], - '▏': [p(hblock, frac=1/8)], - '▐': [p(hblock, frac=1/2, gravity='right')], + '▀': [p(eight_block, horizontal=True, which=(0, 1, 2, 3))], + '▁': [p(eight_bar, which=7, horizontal=True)], + '▂': [p(eight_block, horizontal=True, which=(6, 7))], + '▃': [p(eight_block, horizontal=True, which=(5, 6, 7))], + '▄': [p(eight_block, horizontal=True, which=(4, 5, 6, 7))], + '▅': [p(eight_block, horizontal=True, which=(3, 4, 5, 6, 7))], + '▆': [p(eight_block, horizontal=True, which=(2, 3, 4, 5, 6, 7))], + '▇': [p(eight_block, horizontal=True, which=(1, 2, 3, 4, 5, 6, 7))], + '█': [p(eight_block, horizontal=True, which=(0, 1, 2, 3, 4, 5, 6, 7))], + '▉': [p(eight_block, which=(0, 1, 2, 3, 4, 5, 6))], + '▊': [p(eight_block, which=(0, 1, 2, 3, 4, 5))], + '▋': [p(eight_block, which=(0, 1, 2, 3, 4))], + '▌': [p(eight_block, which=(0, 1, 2, 3))], + '▍': [p(eight_block, which=(0, 1, 2))], + '▎': [p(eight_block, which=(0, 1))], + '▏': [p(eight_bar)], + '▐': [p(eight_block, which=(4, 5, 6, 7))], '░': [p(shade, light=True)], '▒': [shade], '▓': [p(shade, invert=True)], - '▔': [p(vblock, frac=1/8)], - '▕': [p(hblock, frac=1/8, gravity='right')], + '▔': [p(eight_bar, horizontal=True)], + '▕': [p(eight_bar, which=7)], '▖': [p(quad, y=1)], '▗': [p(quad, x=1, y=1)], '▘': [quad], @@ -785,6 +789,25 @@ box_chars: Dict[str, List[Callable]] = { '🭥': [p(smooth_mosaic, lower=False, a=(0, 0), b=(1, 0.75))], '🭦': [p(smooth_mosaic, lower=False, a=(0.5, 0), b=(1, 1))], '🭧': [p(smooth_mosaic, lower=False, a=(0, 0.25), b=(1, 0.75))], + + '🭼': [eight_bar, p(eight_bar, which=7, horizontal=True)], + '🭽': [eight_bar, p(eight_bar, horizontal=True)], + '🭾': [p(eight_bar, which=7), p(eight_bar, horizontal=True)], + '🭿': [p(eight_bar, which=7), p(eight_bar, which=7, horizontal=True)], + '🮀': [p(eight_bar, horizontal=True), p(eight_bar, which=7, horizontal=True)], + '🮁': [ + p(eight_bar, horizontal=True), p(eight_bar, which=2, horizontal=True), + p(eight_bar, which=4, horizontal=True), p(eight_bar, which=7, horizontal=True)], + '🮂': [p(eight_block, horizontal=True, which=(0, 1))], + '🮃': [p(eight_block, horizontal=True, which=(0, 1, 2))], + '🮄': [p(eight_block, horizontal=True, which=(0, 1, 2, 3, 4))], + '🮅': [p(eight_block, horizontal=True, which=(0, 1, 2, 3, 4, 5))], + '🮆': [p(eight_block, horizontal=True, which=(0, 1, 2, 3, 4, 5, 6))], + '🮇': [p(eight_block, which=(6, 7))], + '🮈': [p(eight_block, which=(5, 6, 7))], + '🮉': [p(eight_block, which=(3, 4, 5, 6, 7))], + '🮊': [p(eight_block, which=(2, 3, 4, 5, 6, 7))], + '🮋': [p(eight_block, which=(1, 2, 3, 4, 5, 6, 7))], } t, f = 1, 3 @@ -821,6 +844,10 @@ for i in range(1, 63): box_chars[chr(c)] = [p(sextant, which=i)] c += 1 +for i in range(1, 7): + box_chars[chr(0x1fb6f + i)] = [p(eight_bar, which=i)] + box_chars[chr(0x1fb75 + i)] = [p(eight_bar, which=i, horizontal=True)] + def render_box_char(ch: str, buf: BufType, width: int, height: int, dpi: float = 96.0) -> BufType: global _dpi