Add the block elements to box_chars

Also use a single eight_bar function for all blocks
This commit is contained in:
Kovid Goyal 2020-09-03 10:56:06 +05:30
parent a508161265
commit e95c789d4b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 66 additions and 39 deletions

View File

@ -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;

View File

@ -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