Font independent rendering for braille characters, which ensures they are properly aligned at all font sizes.
This commit is contained in:
parent
26974b1f3a
commit
7b816bb96f
@ -14,6 +14,9 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
|
||||
- Options to control mouse pointer shape, :opt:`default_pointer_shape`, and
|
||||
:opt:`pointer_shape_when_dragging` (:pull:`3041`)
|
||||
|
||||
- Font independent rendering for braille characters, which ensures they are properly
|
||||
aligned at all font sizes.
|
||||
|
||||
- Fix a regression in 0.19.0 that caused borders not to be drawn when setting
|
||||
:opt:`window_margin_width` and keeping :opt:`draw_minimal_borders` on
|
||||
(:iss:`3017`)
|
||||
|
||||
@ -596,6 +596,7 @@ START_ALLOW_CASE_RANGE
|
||||
case 0x2500 ... 0x2573:
|
||||
case 0x2574 ... 0x259f:
|
||||
case 0xe0b0 ... 0xe0b4:
|
||||
case 0x2800 ... 0x28ff:
|
||||
case 0xe0b6:
|
||||
case 0xe0b8: //
|
||||
case 0xe0ba: //
|
||||
@ -642,8 +643,10 @@ START_ALLOW_CASE_RANGE
|
||||
return 0xa0 + ch - 0xe0b0; // IDs from 0xa0 to 0xc4
|
||||
case 0x1fb00 ... 0x1fb8b:
|
||||
return 0xc5 + ch - 0x1fb00; // IDs from 0xc5 to 0x150
|
||||
case 0x1fba0 ... 0x1fbae:
|
||||
case 0x1fba0 ... 0x1fbae: // IDs from 0x151 to 0x15f
|
||||
return 0x151 + ch - 0x1fba0;
|
||||
case 0x2800 ... 0x28ff:
|
||||
return 0x160 + ch - 0x2800;
|
||||
default:
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
@ -685,6 +685,32 @@ def eight_block(buf: BufType, width: int, height: int, level: int = 1, which: Tu
|
||||
eight_bar(buf, width, height, level, x, horizontal)
|
||||
|
||||
|
||||
def braille_dot(buf: BufType, width: int, height: int, col: int, row: int) -> None:
|
||||
dot_height = max(1, height // 8)
|
||||
dot_width = max(1, width // 4)
|
||||
top_margin = (height - 7 * dot_height) // 2
|
||||
left_margin = (width - 3 * dot_width) // 2
|
||||
x_start = left_margin + (col * 2 * dot_width)
|
||||
y_start = top_margin + (row * 2 * dot_height)
|
||||
if y_start < height:
|
||||
for y in range(y_start, min(height, y_start + dot_height)):
|
||||
if x_start < width:
|
||||
offset = y * width
|
||||
for x in range(x_start, min(width, x_start + dot_width)):
|
||||
buf[offset + x] = 255
|
||||
|
||||
|
||||
def braille(buf: BufType, width: int, height: int, which: int = 0) -> None:
|
||||
if not which:
|
||||
return
|
||||
for i, x in enumerate(reversed(bin(which)[2:])):
|
||||
if x == '1':
|
||||
q = i + 1
|
||||
col = 0 if q in (1, 2, 3, 7) else 1
|
||||
row = 0 if q in (1, 4) else 1 if q in (2, 5) else 2 if q in (3, 6) else 3
|
||||
braille_dot(buf, width, height, col, row)
|
||||
|
||||
|
||||
box_chars: Dict[str, List[Callable]] = {
|
||||
'─': [hline],
|
||||
'━': [p(hline, level=3)],
|
||||
@ -908,6 +934,9 @@ for chars, func_ in (('╒╕╘╛', dvcorner), ('╓╖╙╜', dhcorner), ('
|
||||
for ch in chars:
|
||||
box_chars[ch] = [p(cast(Callable, func_), which=ch)]
|
||||
|
||||
for i in range(256):
|
||||
box_chars[chr(0x2800 + i)] = [p(braille, which=i)]
|
||||
|
||||
|
||||
c = 0x1fb00
|
||||
for i in range(1, 63):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user