|
| 1 | +# SPDX-FileCopyrightText: 2023 Jeff Epler |
| 2 | +# |
| 3 | +# SPDX-License-Identifier: MIT |
| 4 | +from __future__ import annotations |
| 5 | + |
| 6 | +TYPE_CHECKING = False |
| 7 | +if TYPE_CHECKING: |
| 8 | + from typing import Generator, Sequence |
| 9 | + |
| 10 | + MatrixType = Sequence[Sequence[bool]] |
| 11 | + SixelMapType = dict[tuple[int, int, int, int, int, int], str] |
| 12 | + |
| 13 | +_sixels = { |
| 14 | + (0, 0, 0, 0, 0, 0): " ", # Exception |
| 15 | + (1, 0, 0, 0, 0, 0): "\U0001fb00", |
| 16 | + (0, 1, 0, 0, 0, 0): "\U0001fb01", |
| 17 | + (1, 1, 0, 0, 0, 0): "\U0001fb02", |
| 18 | + (0, 0, 1, 0, 0, 0): "\U0001fb03", |
| 19 | + (1, 0, 1, 0, 0, 0): "\U0001fb04", |
| 20 | + (0, 1, 1, 0, 0, 0): "\U0001fb05", |
| 21 | + (1, 1, 1, 0, 0, 0): "\U0001fb06", |
| 22 | + (0, 0, 0, 1, 0, 0): "\U0001fb07", |
| 23 | + (1, 0, 0, 1, 0, 0): "\U0001fb08", |
| 24 | + (0, 1, 0, 1, 0, 0): "\U0001fb09", |
| 25 | + (1, 1, 0, 1, 0, 0): "\U0001fb0a", |
| 26 | + (0, 0, 1, 1, 0, 0): "\U0001fb0b", |
| 27 | + (1, 0, 1, 1, 0, 0): "\U0001fb0c", |
| 28 | + (0, 1, 1, 1, 0, 0): "\U0001fb0d", |
| 29 | + (1, 1, 1, 1, 0, 0): "\U0001fb0e", |
| 30 | + (0, 0, 0, 0, 1, 0): "\U0001fb0f", |
| 31 | + (1, 0, 0, 0, 1, 0): "\U0001fb10", |
| 32 | + (0, 1, 0, 0, 1, 0): "\U0001fb11", |
| 33 | + (1, 1, 0, 0, 1, 0): "\U0001fb12", |
| 34 | + (0, 0, 1, 0, 1, 0): "\U0001fb13", |
| 35 | + (1, 0, 1, 0, 1, 0): "\u258c", # Exception |
| 36 | + (0, 1, 1, 0, 1, 0): "\U0001fb14", |
| 37 | + (1, 1, 1, 0, 1, 0): "\U0001fb15", |
| 38 | + (0, 0, 0, 1, 1, 0): "\U0001fb16", |
| 39 | + (1, 0, 0, 1, 1, 0): "\U0001fb17", |
| 40 | + (0, 1, 0, 1, 1, 0): "\U0001fb18", |
| 41 | + (1, 1, 0, 1, 1, 0): "\U0001fb19", |
| 42 | + (0, 0, 1, 1, 1, 0): "\U0001fb1a", |
| 43 | + (1, 0, 1, 1, 1, 0): "\U0001fb1b", |
| 44 | + (0, 1, 1, 1, 1, 0): "\U0001fb1c", |
| 45 | + (1, 1, 1, 1, 1, 0): "\U0001fb1d", |
| 46 | + (0, 0, 0, 0, 0, 1): "\U0001fb1e", |
| 47 | + (1, 0, 0, 0, 0, 1): "\U0001fb1f", |
| 48 | + (0, 1, 0, 0, 0, 1): "\U0001fb20", |
| 49 | + (1, 1, 0, 0, 0, 1): "\U0001fb21", |
| 50 | + (0, 0, 1, 0, 0, 1): "\U0001fb22", |
| 51 | + (1, 0, 1, 0, 0, 1): "\U0001fb23", |
| 52 | + (0, 1, 1, 0, 0, 1): "\U0001fb24", |
| 53 | + (1, 1, 1, 0, 0, 1): "\U0001fb25", |
| 54 | + (0, 0, 0, 1, 0, 1): "\U0001fb26", |
| 55 | + (1, 0, 0, 1, 0, 1): "\U0001fb27", |
| 56 | + (0, 1, 0, 1, 0, 1): "\u2590", # Exception |
| 57 | + (1, 1, 0, 1, 0, 1): "\U0001fb28", |
| 58 | + (0, 0, 1, 1, 0, 1): "\U0001fb29", |
| 59 | + (1, 0, 1, 1, 0, 1): "\U0001fb2a", |
| 60 | + (0, 1, 1, 1, 0, 1): "\U0001fb2b", |
| 61 | + (1, 1, 1, 1, 0, 1): "\U0001fb2c", |
| 62 | + (0, 0, 0, 0, 1, 1): "\U0001fb2d", |
| 63 | + (1, 0, 0, 0, 1, 1): "\U0001fb2e", |
| 64 | + (0, 1, 0, 0, 1, 1): "\U0001fb2f", |
| 65 | + (1, 1, 0, 0, 1, 1): "\U0001fb30", |
| 66 | + (0, 0, 1, 0, 1, 1): "\U0001fb31", |
| 67 | + (1, 0, 1, 0, 1, 1): "\U0001fb32", |
| 68 | + (0, 1, 1, 0, 1, 1): "\U0001fb33", |
| 69 | + (1, 1, 1, 0, 1, 1): "\U0001fb34", |
| 70 | + (0, 0, 0, 1, 1, 1): "\U0001fb35", |
| 71 | + (1, 0, 0, 1, 1, 1): "\U0001fb36", |
| 72 | + (0, 1, 0, 1, 1, 1): "\U0001fb37", |
| 73 | + (1, 1, 0, 1, 1, 1): "\U0001fb38", |
| 74 | + (0, 0, 1, 1, 1, 1): "\U0001fb39", |
| 75 | + (1, 0, 1, 1, 1, 1): "\U0001fb3a", |
| 76 | + (0, 1, 1, 1, 1, 1): "\U0001fb3b", |
| 77 | + (1, 1, 1, 1, 1, 1): "\u2588", # Exception |
| 78 | +} |
| 79 | + |
| 80 | + |
| 81 | +def _sixel_gen(m: MatrixType, sixels: SixelMapType = _sixels) -> Generator[str]: |
| 82 | + n_rows = len(m) |
| 83 | + n_cols = len(m[0]) |
| 84 | + |
| 85 | + def get(r: int, c: int) -> bool: |
| 86 | + if r >= n_rows or c >= n_cols: |
| 87 | + return False |
| 88 | + return m[r][c] |
| 89 | + |
| 90 | + for r in range(0, n_rows, 3): |
| 91 | + for c in range(0, n_cols, 2): |
| 92 | + sixel = ( |
| 93 | + get(r, c), |
| 94 | + get(r, c + 1), |
| 95 | + get(r + 1, c), |
| 96 | + get(r + 1, c + 1), |
| 97 | + get(r + 2, c), |
| 98 | + get(r + 2, c + 1), |
| 99 | + ) |
| 100 | + yield sixels[sixel] |
| 101 | + yield "\n" |
| 102 | + |
| 103 | + |
| 104 | +def matrix_to_sixel(m: MatrixType) -> str: |
| 105 | + return "".join(_sixel_gen(m)) |
0 commit comments