/*
 * Copyright (C) 2021 Mikhail Burakov. This file is part of Pui.
 *
 * Pui is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Pui is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Pui.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <stdint.h>

#define PIXEL(op) ((uint32_t) !!(op - ' '))

#define LINE(str)                                                 \
  (PIXEL(str[0]) << 7 | PIXEL(str[1]) << 6 | PIXEL(str[2]) << 5 | \
   PIXEL(str[3]) << 4 | PIXEL(str[4]) << 3 | PIXEL(str[5]) << 2 | \
   PIXEL(str[6]) << 1 | PIXEL(str[7]))

#define GLYPH(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, width)  \
  width << 24 | LINE(_0) << 16 | LINE(_1) << 8 | LINE(_2),        \
      LINE(_3) << 24 | LINE(_4) << 16 | LINE(_5) << 8 | LINE(_6), \
      LINE(_7) << 24 | LINE(_8) << 16 | LINE(_9) << 8 | LINE(_a)

extern const uint32_t kCp04[256 * 3];

const uint32_t kCp04[256 * 3] = {
    [0x01 * 3] = GLYPH("#  #    ",  //
                       "        ",  //
                       "####    ",  //
                       "#       ",  //
                       "#       ",  //
                       "###     ",  //
                       "#       ",  //
                       "#       ",  //
                       "####    ",  //
                       "        ",  //
                       "        ", 4),
    [0x10 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "####    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x11 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "###     ",  //
                       "#       ",  //
                       "#       ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "        ",  //
                       "        ", 4),
    [0x12 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "        ",  //
                       "        ", 4),
    [0x13 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "####    ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "        ",  //
                       "        ", 4),
    [0x14 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "  ##    ",  //
                       " #  #   ",  //
                       " #  #   ",  //
                       " #  #   ",  //
                       " #  #   ",  //
                       "######  ",  //
                       "#    #  ",  //
                       "        ",  //
                       "        ", 6),
    [0x15 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "####    ",  //
                       "#       ",  //
                       "#       ",  //
                       "###     ",  //
                       "#       ",  //
                       "#       ",  //
                       "####    ",  //
                       "        ",  //
                       "        ", 4),
    [0x16 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       " ###    ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x17 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "   #    ",  //
                       "  #     ",  //
                       "   #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x18 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#  ##   ",  //
                       "# # #   ",  //
                       "##  #   ",  //
                       "#   #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x19 * 3] = GLYPH(" ###    ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#  ##   ",  //
                       "# # #   ",  //
                       "##  #   ",  //
                       "#   #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x1a * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "# #     ",  //
                       "##      ",  //
                       "# #     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x1b * 3] = GLYPH("        ",  //
                       "        ",  //
                       "  #     ",  //
                       " # #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x1c * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "## ##   ",  //
                       "# # #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x1d * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "####    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x1e * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x1f * 3] = GLYPH("        ",  //
                       "        ",  //
                       "####    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x20 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "        ",  //
                       "        ", 4),
    [0x21 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x22 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#####   ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "        ",  //
                       "        ", 5),
    [0x23 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "   #    ",  //
                       "   #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x24 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ###    ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       " ###    ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "        ",  //
                       "        ", 5),
    [0x25 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x26 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#####   ",  //
                       "    #   ",  //
                       "        ", 5),
    [0x27 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "   #    ",  //
                       "   #    ",  //
                       "   #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x28 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "#####   ",  //
                       "        ",  //
                       "        ", 5),
    [0x29 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "######  ",  //
                       "     #  ",  //
                       "        ", 6),
    [0x2a * 3] = GLYPH("        ",  //
                       "        ",  //
                       "###     ",  //
                       "  #     ",  //
                       "  #     ",  //
                       "  ###   ",  //
                       "  #  #  ",  //
                       "  #  #  ",  //
                       "  ###   ",  //
                       "        ",  //
                       "        ", 6),
    [0x2b * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#    #  ",  //
                       "#    #  ",  //
                       "#    #  ",  //
                       "###  #  ",  //
                       "#  # #  ",  //
                       "#  # #  ",  //
                       "###  #  ",  //
                       "        ",  //
                       "        ", 6),
    [0x2c * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#       ",  //
                       "#       ",  //
                       "#       ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "        ",  //
                       "        ", 4),
    [0x2d * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "   #    ",  //
                       " ###    ",  //
                       "   #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x2e * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  ##   ",  //
                       "# #  #  ",  //
                       "# #  #  ",  //
                       "###  #  ",  //
                       "# #  #  ",  //
                       "# #  #  ",  //
                       "#  ##   ",  //
                       "        ",  //
                       "        ", 6),
    [0x2f * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x30 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "        ",  //
                       "        ", 4),
    [0x31 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#       ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x32 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "##      ",  //
                       "# #     ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "        ",  //
                       "        ", 4),
    [0x33 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "   #    ",  //
                       " ##     ",  //
                       "#       ",  //
                       " ###    ",  //
                       "        ",  //
                       "        ", 4),
    [0x34 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "   #    ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x35 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "####    ",  //
                       "#       ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x36 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       " ###    ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x37 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "  #     ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x38 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "        ",  //
                       "        ", 4),
    [0x39 * 3] = GLYPH("        ",  //
                       "        ",  //
                       " ##     ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "        ",  //
                       "        ", 4),
    [0x3a * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "# #     ",  //
                       "##      ",  //
                       "# #     ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x3b * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "  #     ",  //
                       " # #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x3c * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "## ##   ",  //
                       "# # #   ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "        ",  //
                       "        ", 5),
    [0x3d * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "####    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x3e * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x3f * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x40 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "#       ",  //
                       "#       ", 4),
    [0x41 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#       ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x42 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "###     ",  //
                       " #      ",  //
                       " #      ",  //
                       " #      ",  //
                       " #      ",  //
                       "        ",  //
                       "        ", 3),
    [0x43 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "   #    ",  //
                       " ##     ", 4),
    [0x44 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ###    ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       " ###    ",  //
                       "  #     ",  //
                       "  #     ", 5),
    [0x45 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x46 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "#####   ",  //
                       "    #   ",  //
                       "        ", 5),
    [0x47 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "   #    ",  //
                       "   #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x48 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "#####   ",  //
                       "        ",  //
                       "        ", 5),
    [0x49 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#   #   ",  //
                       "#   #   ",  //
                       "# # #   ",  //
                       "# # #   ",  //
                       "######  ",  //
                       "     #  ",  //
                       "        ", 6),
    [0x4a * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "##      ",  //
                       " #      ",  //
                       " ###    ",  //
                       " #  #   ",  //
                       " ###    ",  //
                       "        ",  //
                       "        ", 5),
    [0x4b * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#    #  ",  //
                       "#    #  ",  //
                       "###  #  ",  //
                       "#  # #  ",  //
                       "###  #  ",  //
                       "        ",  //
                       "        ", 6),
    [0x4c * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#       ",  //
                       "#       ",  //
                       "###     ",  //
                       "#  #    ",  //
                       "###     ",  //
                       "        ",  //
                       "        ", 4),
    [0x4d * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "  ##    ",  //
                       "#  #    ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
    [0x4e * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       "#  ##   ",  //
                       "# #  #  ",  //
                       "###  #  ",  //
                       "# #  #  ",  //
                       "#  ##   ",  //
                       "        ",  //
                       "        ", 6),
    [0x4f * 3] = GLYPH("        ",  //
                       "        ",  //
                       "        ",  //
                       "        ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       " ###    ",  //
                       "#  #    ",  //
                       "#  #    ",  //
                       "        ",  //
                       "        ", 4),
    [0x51 * 3] = GLYPH("        ",  //
                       "        ",  //
                       "#  #    ",  //
                       "        ",  //
                       " ##     ",  //
                       "#  #    ",  //
                       "####    ",  //
                       "#       ",  //
                       " ##     ",  //
                       "        ",  //
                       "        ", 4),
};