Repository: zengming00/node-gd-bmp
Branch: master
Commit: 12e57cf23250
Files: 14
Total size: 81.8 KB
Directory structure:
gitextract_s_bnrcdu/
├── .eslintrc.js
├── .gitignore
├── .vscode/
│ └── launch.json
├── LICENSE
├── README.md
├── output/
│ └── .gitkeep
├── package.json
├── res/
│ └── gb16.uc2
├── src/
│ ├── BMP24.ts
│ ├── demo/
│ │ ├── filter.ts
│ │ ├── gb16Font.ts
│ │ └── test.ts
│ └── font.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintrc.js
================================================
module.exports = {
env: {
es2021: true,
node: true,
},
extends: [
'standard'
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 12,
sourceType: 'module',
},
plugins: [
'@typescript-eslint'
],
rules: {
'padded-blocks': 'off',
'one-var': 'off',
'no-multiple-empty-lines': 'off',
'space-before-function-paren': ['error', {
'anonymous': 'always',
'named': 'never',
'asyncArrow': 'never',
}],
'indent': ['error', 4, {
'SwitchCase': 1,
}],
'semi': ['error', 'always'],
'quote-props': ['error', 'consistent'],
'comma-dangle': ['error', {
'arrays': 'never',
'objects': 'always-multiline',
'imports': 'never',
'exports': 'never',
'functions': 'never',
}],
},
};
================================================
FILE: .gitignore
================================================
/output/*.bmp
/dist/
/node_modules/
================================================
FILE: .vscode/launch.json
================================================
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/src/demo/font.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
},
]
}
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<a href="https://996.icu"><img src="https://img.shields.io/badge/link-996.icu-red.svg" alt="996.icu" /></a>
# node-gd-bmp
light and high speed and 100% js implement graphical library, it can running in any platform,
BUT only support bmp 24bit format, internal contains 3 fonts
# demo
请看 src/demo,里面有关于如何做验证码、如何做图像处理的案例
# API
**获得对象的两种方式:**
* 构造函数,创建指定宽高的图片对象(初始化为一张全黑的图片)
```javascript
import { BMP24 } from 'gd-bmp';
const BMP24 = require('gd-bmp').BMP24;
const img = new BMP24(w, h);
```
* 从文件加载bmp (注意!必需确保文件是24位bmp)
```javascript
const img = await BMP24.loadFromFile(file);
```
**获取BMP文件数据**
```js
obj.getFileData()
```
**Data Url**
```js
const img = makeImg();
const dataUrl = img.getDataUrl();
res.setHeader('Content-Type', 'text/html');
res.end(`<img src="${dataUrl}"/>`);
```
**API**
```js
// 画点, RGB颜色值(例如红色0xff0000)
obj.drawPoint(x, y, rgb)
// 画点, rgb:{ blue:number, green:number, red:number }, 注意颜色值要保证在0-255之间(包含0和255)
obj.drawPointRGB(x, y, rgb)
// 获取像素点颜色, 返回 rgb: { blue:number, green:number, red:number } ,如果xy坐标超出图片范围将抛出错误
obj.getPointRGB(x, y)
// 画线
obj.drawLine(x1, y1, x2, y2, rgb)
// 画矩形
obj.drawRect(x, y, w, h, rgb)
// 实心矩形
obj.fillRect(x, y, w, h, rgb)
// 画圆
obj.drawCircle(x, y, r, rgb)
//画字符&字符串,font参数为字库,color为RGB颜色值(例如红色0xff0000)
obj.drawChar(ch, x, y, font, color)
obj.drawString(str, x, y, font, color)
```
# 关于字体和颜色
已经内置了三种规格的字体(仅包含大小写英文字母和数字),可以通过:BMP24.font8x16、BMP24.font12x24和BMP24.font16x32得到
另外你也可以参考demo自己生成和定义字体
demo内包含一个支持中文的字库文件,支持65535个字符,需要占用2M内存
颜色采用数值的方式,按RGB排列,例如:红色0xff0000,绿色0x00ff00,蓝色0x0000ff
# 只支持24位bmp
推荐用windows自带的画图工具转码bmp
# License
MIT
================================================
FILE: output/.gitkeep
================================================
================================================
FILE: package.json
================================================
{
"name": "gd-bmp",
"version": "2.0.1",
"description": "light and high speed and 100% js implement graphical library, it can running in any platform",
"main": "dist/BMP24.js",
"typings": "dist/BMP24.d.ts",
"files": [
"dist/*"
],
"scripts": {
"compile": "rm -rf dist && tsc",
"lint": "eslint --fix ./src/**/*.ts",
"test": "npm run compile && node ./dist/demo/filter",
"test2": "npm run compile && node ./dist/demo/test",
"prepublish": "npm run lint && npm run compile"
},
"keywords": [
"gd",
"bmp"
],
"author": "zengming",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/zengming00/node-gd-bmp.git"
},
"bugs": {
"url": "https://github.com/zengming00/node-gd-bmp/issues"
},
"homepage": "https://github.com/zengming00/node-gd-bmp#readme",
"dependencies": {
"@types/node": "^14.14.3"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.5.0",
"@typescript-eslint/parser": "^4.5.0",
"eslint": "^7.12.0",
"eslint-config-standard": "^15.0.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.2",
"typescript": "^4.0.3"
}
}
================================================
FILE: src/BMP24.ts
================================================
// 初始版本确定于:20161103 18:31
import * as fs from 'fs';
import { IFont, font12x24, font16x32, font8x16 } from './font';
export { IFont };
console.log("The '996' working schedule is inhumane.");
console.log('为了您的身体健康,为了国内的软件行业健康发展,请拒绝接受违法的996工作制');
export interface IRGB {
red: number;
green: number;
blue: number;
}
function makeHeader(buf: Buffer, fileLen: number, dataLen: number, w: number, h: number) {
const header = buf;
header.write('BM');
header.writeInt32LE(fileLen, 2); // BMP文件大小
header.writeInt8(122, 6); // 特殊标识
header.writeInt32LE(54, 10);
header.writeInt32LE(40, 14);
header.writeInt32LE(w, 18); // w
header.writeInt32LE(h, 22); // h
header.writeInt16LE(1, 26);
header.writeInt16LE(24, 28);
header.writeInt32LE(dataLen, 34); // 数据大小
}
export class BMP24 {
public static font8x16 = font8x16;
public static font12x24 = font12x24;
public static font16x32 = font16x32;
public w: number;
public h: number;
public fileLen: number;
protected _lineByteNum: number;
protected _data: Buffer;
constructor(w: number, h: number) {
/*
BMP数据的每一行必需能被4整除
例如宽度=10则一行的实际字节数=32=Math.ceil(10*3/4)*4,补了2字节的0
例如宽度=11则一行的实际字节数=36=Math.ceil(11*3/4)*4,补了3字节的0
算法: Math.ceil(宽度*每个像素占用的字节/4)*4
*/
const lineByteNum = Math.ceil(w * 3 / 4) * 4; // 每行数据的实际字节数
const dataLen = lineByteNum * h;
this.w = w;
this.h = h;
this.fileLen = dataLen + 54;
this._lineByteNum = lineByteNum;
this._data = Buffer.alloc(this.fileLen);
// BMP文件头初始化
makeHeader(this._data, this.fileLen, dataLen, w, h);
}
// 获取BMP整个文件数据
public getFileData() {
return this._data;
}
public getDataUrl() {
return `data:image/bmp;base64,${this._data.toString('base64')}`;
}
// 获取BMP图像数据
public getData() {
return this._data.slice(54);
}
// 画点
public drawPoint(x: number, y: number, rgb: number) {
this.drawPointRGB(x, y, {
red: (rgb >> 16) & 0xFF,
green: (rgb >> 8) & 0xFF,
blue: rgb & 0xFF,
});
}
// 画点
public drawPointRGB(x: number, y: number, rgb: IRGB) {
if (x >= this.w || y >= this.h || x < 0 || y < 0) {
return;
}
// 数据第一行为图像的最底一行,颜色数据在十六进制编辑器中的排列是蓝绿红
const line = this.h - y - 1; // 因为data的第一行是图片的最后一行,所以要反过来
const pos = 54 + (x * 3) + (this._lineByteNum * line);
this._data.writeUInt8(rgb.blue, pos); // 蓝
this._data.writeUInt8(rgb.green, pos + 1); // 绿
this._data.writeUInt8(rgb.red, pos + 2); // 红
}
/**
* 获取像素点颜色, 返回 { blue:number, green:number, red:number }
*/
public getPointRGB(x: number, y: number): IRGB {
if (x >= this.w || y >= this.h || x < 0 || y < 0) {
throw new Error('out of range');
}
// 数据第一行为图像的最底一行,颜色数据在十六进制编辑器中的排列是蓝绿红
const line = this.h - y - 1; // 因为data的第一行是图片的最后一行,所以要反过来
const pos = 54 + (x * 3) + (this._lineByteNum * line);
return {
blue: this._data.readUInt8(pos),
green: this._data.readUInt8(pos + 1),
red: this._data.readUInt8(pos + 2),
};
}
// 画水平线
public drawLineH(x1: number, x2: number, y: number, rgb: number) {
if (x1 > x2) {
const tmp = x2;
x2 = x1;
x1 = tmp;
}
for (; x1 <= x2; x1++) {
this.drawPoint(x1, y, rgb);
}
}
// 画垂直线
public drawLineV(y1: number, y2: number, x: number, rgb: number) {
if (y1 > y2) {
const tmp = y2;
y2 = y1;
y1 = tmp;
}
for (; y1 <= y2; y1++) {
this.drawPoint(x, y1, rgb);
}
}
public drawLine(x1: number, y1: number, x2: number, y2: number, rgb: number) {
let x = x1;
let y = y1;
let dx = x2 > x1 ? (x2 - x1) : (x1 - x2);
let dy = y2 > y1 ? (y2 - y1) : (y1 - y2);
let interchange = false;
const s1 = x2 > x1 ? 1 : -1;
const s2 = y2 > y1 ? 1 : -1;
if (dy > dx) {
const temp = dx;
dx = dy;
dy = temp;
interchange = true;
}
let p = (dy << 1) - dx;
for (let i = 0; i <= dx; i++) {
this.drawPoint(x, y, rgb);
if (p >= 0) {
if (interchange) {
x += s1;
} else {
y += s2;
}
p -= (dx << 1);
}
if (interchange) {
y += s2;
} else {
x += s1;
}
p += (dy << 1);
}
}
// 画空心矩形
public drawRect(x: number, y: number, w: number, h: number, rgb: number) {
const x2 = x + w - 1;
const y2 = y + h - 1;
this.drawLineH(x, x2, y, rgb);
this.drawLineH(x, x2, y2, rgb);
this.drawLineV(y, y2, x, rgb);
this.drawLineV(y, y2, x2, rgb);
}
// 画实心矩形
public fillRect(x: number, y: number, w: number, h: number, rgb: number) {
let x2 = x + w - 1;
let y2 = y + h - 1;
if (x > x2) {
const tmp = x2;
x2 = x;
x = tmp;
}
if (y > y2) {
const tmp = y2;
y2 = y;
y = tmp;
}
for (; y <= y2; y++) {
for (let xx = x; xx <= x2; xx++) {
this.drawPoint(xx, y, rgb);
}
}
}
// 画圆,xy为中心点位置
public drawCircle(x: number, y: number, r: number, rgb: number) {
let a = 0;
let b = r;
// c = 1.25 - r;
let c = 3 - 2 * r;
while (a < b) {
this.drawPoint(x + a, y + b, rgb);
this.drawPoint(x - a, y + b, rgb);
this.drawPoint(x + a, y - b, rgb);
this.drawPoint(x - a, y - b, rgb);
this.drawPoint(x + b, y + a, rgb);
this.drawPoint(x - b, y + a, rgb);
this.drawPoint(x + b, y - a, rgb);
this.drawPoint(x - b, y - a, rgb);
if (c < 0) {
c = c + 4 * a + 6;
} else {
c = c + 4 * (a - b) + 10;
b -= 1;
}
a += 1;
}
if (a === b) {
this.drawPoint(x + a, y + b, rgb);
this.drawPoint(x - a, y + b, rgb);
this.drawPoint(x + a, y - b, rgb);
this.drawPoint(x - a, y + b, rgb);
this.drawPoint(x + b, y + a, rgb);
this.drawPoint(x - b, y + a, rgb);
this.drawPoint(x + b, y - a, rgb);
this.drawPoint(x - b, y - a, rgb);
}
}
public drawChar(ch: string, x: number, y: number, font: IFont, color: number) {
const index = font.fonts.indexOf(ch);
if (index < 0) {
return;
}
const fontData = font.data[index];
let y0 = y;
let x0 = x;
for (const data of fontData) {
x0 = x;
for (let b = data; b > 0; b <<= 1) {
if (b & 0x80) {
this.drawPoint(x0, y0, color);
}
x0++;
}
y0++;
if ((y0 - y) >= font.h) {
y0 = y;
x += 8;
}
}
}
public drawString(str: string, x: number, y: number, font: IFont, color: number) {
for (const c of str) {
this.drawChar(c, x, y, font, color);
x += font.w;
}
}
// 从文件加载bmp, 注意!必需确保文件是24位bmp
public static async loadFromFile(filename: string) {
return new Promise<BMP24>(function (resolve, reject) {
fs.readFile(filename, (err, data) => {
if (err) {
return reject(err);
}
// 简单的判断是否是支持的格式
if (data.readInt32LE(10) !== 54) {
return reject(new Error('unsupported format: headlen !== 54'));
} if (data.readInt32LE(14) !== 40) {
return reject(new Error('unsupported format: bitmapInfoHead.length !== 40'));
} if (data.readInt32LE(28) !== 24) {
return reject(new Error('unsupported format: only support 24bit bmp'));
}
const img = new BMP24(0, 0);
img.w = data.readInt32LE(18);
img.h = data.readInt32LE(22);
img.fileLen = data.length;
img._lineByteNum = Math.ceil(img.w * 3 / 4) * 4;
img._data = data;
resolve(img);
});
});
}
}
// /////////////////////////// Copyright zengming 2010-2020 /////////////////////////////////////
================================================
FILE: src/demo/filter.ts
================================================
import * as fs from 'fs';
import * as path from 'path';
import { BMP24 } from '../BMP24'; // gd-bmp
/**
* 高斯模糊
* @param {Array} pixes pix array
* @param {Number} width 图片的宽度
* @param {Number} height 图片的高度
* @param {Number} radius 取样区域半径, 正数, 可选, 默认为 3.0
* @param {Number} sigma 标准方差, 可选, 默认取值为 radius / 3
* @return {Array}
*/
function gaussBlur(img: BMP24, radius: number, sigma?: number) {
const width = img.w;
const height = img.h;
const gaussMatrix = [];
let gaussSum = 0;
let x, y;
let r, g, b, a;
let i, j, k, len;
const mradius = Math.floor(radius || 3);
const msigma = sigma || radius / 3;
a = 1 / (Math.sqrt(2 * Math.PI) * msigma);
b = -1 / (2 * msigma * msigma);
// 生成高斯矩阵
for (i = 0, x = -mradius; x <= mradius; x++, i++) {
g = a * Math.exp(b * x * x);
gaussMatrix[i] = g;
gaussSum += g;
}
// 归一化, 保证高斯矩阵的值在[0,1]之间
for (i = 0, len = gaussMatrix.length; i < len; i++) {
gaussMatrix[i] /= gaussSum;
}
// x 方向一维高斯运算
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
r = g = b = a = 0;
gaussSum = 0;
for (j = -mradius; j <= mradius; j++) {
k = x + j;
if (k >= 0 && k < width) { // 确保 k 没超出 x 的范围
// r,g,b,a 四个一组
// i = (y * width + k) * 4;
const c = img.getPointRGB(k, y);
r += c.red * gaussMatrix[j + mradius];
g += c.green * gaussMatrix[j + mradius];
b += c.blue * gaussMatrix[j + mradius];
// a += pixes[i + 3] * gaussMatrix[j];
gaussSum += gaussMatrix[j + mradius];
}
}
// i = (y * width + x) * 4;
// 除以 gaussSum 是为了消除处于边缘的像素, 高斯运算不足的问题
// console.log(gaussSum)
img.drawPointRGB(x, y, {
red: r / gaussSum,
green: g / gaussSum,
blue: b / gaussSum,
});
// pixes[i + 3] = a ;
}
}
// y 方向一维高斯运算
for (x = 0; x < width; x++) {
for (y = 0; y < height; y++) {
r = g = b = a = 0;
gaussSum = 0;
for (j = -mradius; j <= mradius; j++) {
k = y + j;
if (k >= 0 && k < height) { // 确保 k 没超出 y 的范围
// i = (k * width + x) * 4;
const c = img.getPointRGB(x, k);
r += c.red * gaussMatrix[j + mradius];
g += c.green * gaussMatrix[j + mradius];
b += c.blue * gaussMatrix[j + mradius];
// a += pixes[i + 3] * gaussMatrix[j];
gaussSum += gaussMatrix[j + mradius];
}
}
// i = (y * width + x) * 4;
img.drawPointRGB(x, y, {
red: r / gaussSum,
green: g / gaussSum,
blue: b / gaussSum,
});
// pixes[i] = r ;
// pixes[i + 1] = g ;
// pixes[i + 2] = b ;
// pixes[i + 3] = a ;
}
}
}
// 锐化
function sharp(img: BMP24, arg: number) {
const lamta = arg || 0.6;
const width = img.w;
const height = img.h;
// 根据像素点的左上角、上边和左边像素进行运算
// col 0 1 2 3 4
// row
// 0: a:0 b:1 2 3 4
// 1: e:5 c:6 7 8 9
function calculateColor(a: number, b: number, e: number, c: number) {
const delta = c - (b + e + a) / 3;
let r = c + delta * lamta;
// 颜色值边界检查
r = r > 255 ? 255 : r < 0 ? 0 : r;
return r;
}
for (let y = 1; y < height; y++) {
for (let x = 1; x < width; x++) {
const a = img.getPointRGB(x - 1, y - 1);
const b = img.getPointRGB(x, y - 1);
const e = img.getPointRGB(x - 1, y);
const c = img.getPointRGB(x, y);
const color = {
red: calculateColor(a.red, b.red, e.red, c.red),
green: calculateColor(a.green, b.green, e.green, c.green),
blue: calculateColor(a.blue, b.blue, e.blue, c.blue),
};
img.drawPointRGB(x, y, color);
}
}
}
const srcFile = path.resolve(__dirname, '../../res/lena.bmp');
const sharpFile = path.resolve(__dirname, '../../output/sharp.bmp');
const gaussBlurFile = path.resolve(__dirname, '../../output/gaussBlur.bmp');
async function test() {
const img = await BMP24.loadFromFile(srcFile);
console.log('w=%d, h=%d', img.w, img.h);
console.time('time');
sharp(img, 1);
fs.writeFileSync(sharpFile, img.getFileData());
gaussBlur(img, 30);
fs.writeFileSync(gaussBlurFile, img.getFileData());
console.log('done.');
console.timeEnd('time');
}
test().catch(function (err) {
console.log(err);
});
================================================
FILE: src/demo/gb16Font.ts
================================================
import * as fs from 'fs';
import * as http from 'http';
import * as querystring from 'querystring';
import * as path from 'path';
import { BMP24 } from '../BMP24';
const CHAR_H = 16;
const EN_CHAR_W = 8;
const CN_CHAR_W = 16;
// 字库,支持中文,总共65536个字符
const fontPath = path.join(__dirname, '../../res/gb16.uc2');
const fontBuffer = fs.readFileSync(fontPath);
function getCharWidthHeight(char: number | string) {
const o = { width: CN_CHAR_W, height: CHAR_H };
if (typeof char === 'string') {
char = char.charCodeAt(0);
}
if (char < 128) {
o.width = EN_CHAR_W;
}
return o;
}
function drawChar(img: BMP24, char: number | string, x: number, y: number, color: number) {
if (typeof char === 'string') {
char = char.charCodeAt(0);
}
const offset = char * 32; // 一行两字节,高度16,所以2*16=32字节
const charData = fontBuffer.slice(offset, offset + 32);
for (let iy = 0; iy < CHAR_H; iy++) {
let data = charData.readUInt16BE(iy * 2);
for (let ix = 0; data > 0; ix++) {
if (data & (1 << 16)) {
img.drawPoint(ix + x, iy + y, color);
}
data <<= 1;
}
}
}
function drawString(img: BMP24, str: string, x: number, y: number, color: number) {
for (const c of str) {
drawChar(img, c, x, y, color);
x += getCharWidthHeight(c).width;
}
}
http.createServer((req, res) => {
switch (req.url) {
case '/favicon.ico':
res.end();
break;
default: {
if (req.url) {
let str = req.url;
str = str.substring(str.indexOf('?') + 1);
const o = querystring.parse(str);
if (typeof o.str === 'string') {
const img = new BMP24(100, 40);
drawString(img, o.str, 0, 0, 0xff0000);
res.setHeader('Content-Type', 'image/bmp');
res.end(img.getFileData());
} else if ((typeof o.start === 'string') && (typeof o.len === 'string')) {
console.time('printCharCode');
const img = new BMP24(800, 800);
img.fillRect(0, 0, img.w, img.h, 0xffffff);
const start = parseInt(o.start, 10);
const stop = start + parseInt(o.len, 10);
let x = 0, y = 0;
for (let i = start; i < stop; i++) {
if (x >= (img.w - getCharWidthHeight(i).width)) {
y += CHAR_H;
x = 0;
}
drawChar(img, i, x, y, 0xff0000);
x += getCharWidthHeight(i).width;
}
console.timeEnd('printCharCode');
res.setHeader('Content-Type', 'image/bmp');
res.end(img.getFileData());
}
}
res.end();
}
}
}).listen(3000);
console.log('localhost:3000');
console.log('http://localhost:3000/?str=中国');
console.log('http://localhost:3000/?start=0&len=2000');
================================================
FILE: src/demo/test.ts
================================================
import * as http from 'http';
import { BMP24 } from '../BMP24'; // gd-bmp
import * as font from '../font';
/*
用PCtoLCD2002取字模
行列式扫描,正向取模(高位在前)
*/
const cnfonts: font.IFont = { // 自定义字模
w: 16,
h: 16,
fonts: '中国',
data: [
[0x01, 0x01, 0x01, 0x01, 0x3F, 0x21, 0x21, 0x21, 0x21, 0x21, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00], /* "中",0 */
[0x00, 0x7F, 0x40, 0x40, 0x5F, 0x41, 0x41, 0x4F, 0x41, 0x41, 0x41, 0x5F, 0x40, 0x40, 0x7F, 0x40, 0x00, 0xFC, 0x04, 0x04, 0xF4, 0x04, 0x04, 0xE4, 0x04, 0x44, 0x24, 0xF4, 0x04, 0x04, 0xFC, 0x04] /* "国",1 */
],
};
// 测试字库
function makeImg2() {
const img = new BMP24(300, 140);
img.drawString('helloworld', 20, 10, BMP24.font8x16, 0xff0000);
img.drawString('helloworld', 20, 25, BMP24.font12x24, 0x00ff00);
img.drawString('helloworld', 20, 50, BMP24.font16x32, 0x0000ff);
img.drawString('中国', 20, 85, cnfonts, 0xffffff);
return img;
}
function rand(min: number, max: number) {
return ~~(Math.random() * (max - min) + min);
}
// 制造验证码图片
function makeCapcha() {
const img = new BMP24(100, 40);
img.drawRect(0, 0, img.w, img.h, rand(0, 0xffffff));
img.fillRect(1, 1, img.w - 2, img.h - 2, 0xffffff);
img.drawCircle(rand(0, 100), rand(0, 40), rand(10, 40), rand(0, 0xffffff));
img.fillRect(rand(0, 100), rand(0, 40), rand(10, 35), rand(10, 35), rand(0, 0xffffff));
img.drawLine(rand(0, 100), rand(0, 40), rand(0, 100), rand(0, 40), rand(0, 0xffffff));
// 画曲线
const w = img.w / 2;
const h = img.h;
const color = rand(0, 0xffffff);
const y1 = rand(-5, 5);
const w2 = rand(10, 15);
const h3 = rand(4, 6);
const bl = rand(1, 5);
for (let i = -w; i < w; i += 0.1) {
const yy = Math.floor(h / h3 * Math.sin(i / w2) + h / 2 + y1);
const xx = Math.floor(i + w);
for (let j = 0; j < bl; j++) {
img.drawPoint(xx, yy + j, color);
}
}
const p = 'ABCDEFGHKMNPQRSTUVWXYZ3456789';
let str = '';
for (let a = 0; a < 5; a++) {
str += p.charAt(Math.random() * p.length | 0);
}
const fonts = [BMP24.font8x16, BMP24.font12x24, BMP24.font16x32];
// eslint-disable-next-line one-var
let x = 15, y = 8;
for (const ch of str) {
const f = fonts[Math.random() * fonts.length | 0];
y = 8 + rand(-10, 10);
img.drawChar(ch, x, y, f, rand(0, 0xffffff));
x += f.w + rand(2, 8);
}
return img;
}
// 测试生成验证码的效率
const start = Date.now();
let n = 0;
while ((Date.now() - start) < 1000) {
makeCapcha();
// makeImg2();
n++;
}
console.log(`1秒钟生成:${n}`);
http.createServer((req, res) => {
switch (req.url) {
case '/favicon.ico':
res.end();
break;
case '/img2': {
console.time('makeImg2');
const img = makeImg2();
console.timeEnd('makeImg2');
res.setHeader('Content-Type', 'image/bmp');
res.end(img.getFileData());
break;
}
case '/data': {
const img = makeImg2();
const dataUrl = img.getDataUrl();
res.setHeader('Content-Type', 'text/html');
res.end(`<img src="${dataUrl}"/>`);
break;
}
case '/':
default: {
console.time('makeCapcha');
const img = makeCapcha();
console.timeEnd('makeCapcha');
res.setHeader('Content-Type', 'image/bmp');
res.end(img.getFileData());
}
}
}).listen(3000);
console.log('localhost:3000');
================================================
FILE: src/font.ts
================================================
/*
用PCtoLCD2002取字模
行列式扫描,正向取模(高位在前)
*/
const fonts = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
const font8x16Data = [
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x1E, 0x22, 0x42, 0x42, 0x3F, 0x00, 0x00], /* "a",0 */
[0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00], /* "b",1 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00], /* "c",2 */
[0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x02, 0x1E, 0x22, 0x42, 0x42, 0x42, 0x26, 0x1B, 0x00, 0x00], /* "d",3 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00], /* "e",4 */
[0x00, 0x00, 0x00, 0x0F, 0x11, 0x10, 0x10, 0x7E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "f",5 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C], /* "g",6 */
[0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "h",7 */
[0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "i",8 */
[0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78], /* "j",9 */
[0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x68, 0x48, 0x44, 0xEE, 0x00, 0x00], /* "k",10 */
[0x00, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "l",11 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00], /* "m",12 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "n",13 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "o",14 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x44, 0x78, 0x40, 0xE0], /* "p",15 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x22, 0x42, 0x42, 0x42, 0x22, 0x1E, 0x02, 0x07], /* "q",16 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00], /* "r",17 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00], /* "s",18 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00], /* "t",19 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00], /* "u",20 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x28, 0x10, 0x10, 0x00, 0x00], /* "v",21 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x92, 0x92, 0xAA, 0xAA, 0x44, 0x44, 0x00, 0x00], /* "w",22 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x24, 0x18, 0x18, 0x18, 0x24, 0x76, 0x00, 0x00], /* "x",23 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x28, 0x18, 0x10, 0x10, 0xE0], /* "y",24 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00], /* "z",25 */
[0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "A",26 */
[0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00], /* "B",27 */
[0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00], /* "C",28 */
[0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00], /* "D",29 */
[0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00], /* "E",30 */
[0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00], /* "F",31 */
[0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00], /* "G",32 */
[0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "H",33 */
[0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "I",34 */
[0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0], /* "J",35 */
[0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00], /* "K",36 */
[0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00], /* "L",37 */
[0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00], /* "M",38 */
[0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00], /* "N",39 */
[0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00], /* "O",40 */
[0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00], /* "P",41 */
[0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0xCA, 0x4C, 0x38, 0x06, 0x00], /* "Q",42 */
[0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00], /* "R",43 */
[0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00], /* "S",44 */
[0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00], /* "T",45 */
[0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "U",46 */
[0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00], /* "V",47 */
[0x00, 0x00, 0x00, 0xD6, 0x92, 0x92, 0x92, 0x92, 0xAA, 0xAA, 0x6C, 0x44, 0x44, 0x44, 0x00, 0x00], /* "W",48 */
[0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00], /* "X",49 */
[0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00], /* "Y",50 */
[0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00], /* "Z",51 */
[0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00], /* "0",52 */
[0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "1",53 */
[0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x04, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00], /* "2",54 */
[0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00], /* "3",55 */
[0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x44, 0x7E, 0x04, 0x04, 0x1E, 0x00, 0x00], /* "4",56 */
[0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00], /* "5",57 */
[0x00, 0x00, 0x00, 0x1C, 0x24, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00], /* "6",58 */
[0x00, 0x00, 0x00, 0x7E, 0x44, 0x44, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00], /* "7",59 */
[0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "8",60 */
[0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x24, 0x38, 0x00, 0x00] /* "9",61 */
];
const font12x24Data = [
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x30, 0x30, 0x07, 0x1C, 0x30, 0x60, 0x60, 0x60, 0x71, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xD0, 0xF0, 0x00, 0x00, 0x00], /* "a",0 */
[0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x33, 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "b",1 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x31, 0x61, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00], /* "c",2 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x31, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x80, 0x00, 0x00, 0x00], /* "d",3 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x10, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x18, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00], /* "e",4 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x7F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x60,
0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], /* "f",5 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x30, 0x19, 0x1F, 0x30, 0x3E, 0x1F, 0x60, 0x60, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x70, 0x90, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x60, 0xE0, 0x80], /* "g",6 */
[0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x37, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "h",7 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "i",8 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x33, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00,
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00], /* "j",9 */
[0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x33, 0x31, 0x33, 0x32, 0x36, 0x3E, 0x3B, 0x33, 0x31, 0x31, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00], /* "k",10 */
[0x00, 0x00, 0x00, 0x00, 0x02, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "l",11 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x77, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x00, 0x00, 0x00], /* "m",12 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "n",13 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "o",14 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x37, 0x30, 0x30, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "p",15 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x31, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x31, 0x1E, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0], /* "q",16 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0x1A, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "r",17 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x1C, 0x0F, 0x01, 0x20, 0x20, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x60, 0x20, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "s",18 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x0C, 0x0C, 0x7F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00], /* "t",19 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x71, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x80, 0x00, 0x00, 0x00], /* "u",20 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x38, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF0, 0x60, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "v",21 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x63, 0x63, 0x67, 0x37, 0x35, 0x39, 0x39, 0x39, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xB0, 0x20, 0x20, 0x20, 0x20, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00], /* "w",22 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x19, 0x0D, 0x0E, 0x06, 0x07, 0x0B, 0x19, 0x11, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "x",23 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x38, 0x18, 0x18, 0x0D, 0x0D, 0x0D, 0x06, 0x06, 0x02, 0x04, 0x04, 0x28, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "y",24 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x21, 0x23, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0xC0, 0x00, 0x00, 0x00], /* "z",25 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x0E, 0x0B, 0x0B, 0x13, 0x11, 0x11, 0x11, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "A",26 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x61, 0x60, 0x60, 0x60, 0x60, 0x61, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xC0, 0xC0, 0xC0, 0x80, 0x00, 0xC0, 0x40, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "B",27 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x20,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00], /* "C",28 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "D",29 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x7F, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "E",30 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x7F, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x20,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "F",31 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x30, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x40,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "G",32 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60,
0x60, 0x60, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "H",33 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "I",34 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x61, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00], /* "J",35 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x60, 0x61, 0x62, 0x62, 0x64, 0x6C, 0x7C, 0x76, 0x67, 0x63, 0x63, 0x61, 0x60, 0x60, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0x00, 0x00, 0x00], /* "K",36 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "L",37 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x70, 0x70, 0x70, 0x59, 0x59, 0x59, 0x59, 0x5A, 0x4E, 0x4E, 0x4E, 0x4E, 0x44, 0x44, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xE0, 0xE0,
0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "M",38 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x70, 0x70, 0x58, 0x58, 0x4C, 0x46, 0x46, 0x43, 0x43, 0x41, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA0, 0xE0, 0xE0, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00], /* "N",39 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "O",40 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60,
0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "P",41 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x6E, 0x32, 0x31, 0x11, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x80, 0xE0, 0xC0, 0x00], /* "Q",42 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x66, 0x63, 0x63, 0x61, 0x61, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60,
0x60, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0x70, 0x00, 0x00, 0x00], /* "R",43 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x30, 0x60, 0x60, 0x60, 0x70, 0x3C, 0x0F, 0x03, 0x00, 0x00, 0x40, 0x40, 0x60, 0x70, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x20,
0x20, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "S",44 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x46, 0x86, 0x86, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x10,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "T",45 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00], /* "U",46 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x70, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x0D, 0x0D, 0x0D, 0x0F, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x40,
0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "V",47 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x66, 0x66, 0x66, 0x66, 0x67, 0x37, 0x37, 0x3B, 0x3B, 0x3B, 0x3B, 0x39, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20,
0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "W",48 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x30, 0x18, 0x18, 0x19, 0x0D, 0x0E, 0x06, 0x06, 0x07, 0x0B, 0x0B, 0x19, 0x11, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x80,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "X",49 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x70, 0x30, 0x30, 0x18, 0x18, 0x0D, 0x0D, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x40,
0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], /* "Y",50 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x20, 0x41, 0x01, 0x03, 0x03, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0xC0,
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "Z",51 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "0",52 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "1",53 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x40, 0x60, 0x60, 0x00, 0x01, 0x01, 0x03, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0x00, 0x00, 0x00], /* "2",54 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x23, 0x61, 0x61, 0x61, 0x01, 0x03, 0x0E, 0x01, 0x00, 0x00, 0x60, 0x60, 0x60, 0x21, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "3",55 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x05, 0x09, 0x09, 0x11, 0x21, 0x21, 0x41, 0x7F, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00], /* "4",56 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x31, 0x20, 0x00, 0x00, 0x60, 0x60, 0x41, 0x21, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00], /* "5",57 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x20, 0x60, 0x67, 0x68, 0x70, 0x60, 0x60, 0x60, 0x20, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0,
0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "6",58 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x30, 0x20, 0x20, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x40,
0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "7",59 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x30, 0x60, 0x60, 0x60, 0x70, 0x3C, 0x0F, 0x33, 0x20, 0x60, 0x60, 0x60, 0x60, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60,
0x60, 0x60, 0x40, 0xC0, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "8",60 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0x40, 0x60, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00] /* "9",61 */
];
const font16x32Data = [
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x00, 0x01, 0x0E, 0x38, 0x30, 0x60, 0x60, 0x60, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0xF2, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00], /* "a",0 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1B, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x1E, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "b",1 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "c",2 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0x5E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00], /* "d",3 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x04, 0x08, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "e",4 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC3, 0x03, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "f",5 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x08, 0x0C, 0x0F, 0x18, 0x18, 0x0F, 0x0F, 0x10, 0x30, 0x30, 0x30, 0x1C, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xE0, 0x00, 0x00, 0xF0, 0xFC, 0x0E, 0x06, 0x06, 0x06, 0x1C, 0xF0], /* "g",6 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "h",7 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "i",8 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x08, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0], /* "j",9 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x30, 0x60, 0xC0, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x38, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "k",10 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "l",11 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x77, 0x39, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCC, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00], /* "m",12 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "n",13 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x08, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "o",14 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x79, 0x1A, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x1E, 0x19, 0x18, 0x18, 0x18, 0x18, 0x7E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "p",15 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x3C, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x3C, 0xCC, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F], /* "q",16 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7E, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "r",17 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x18, 0x18, 0x0E, 0x07, 0x01, 0x00, 0x20, 0x20, 0x30, 0x38, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0C, 0x0C, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "s",18 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x07, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x88, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "t",19 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x2F, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "u",20 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x1C, 0x0C, 0x0C, 0x0E, 0x06, 0x06, 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "v",21 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x71, 0x30, 0x31, 0x31, 0x19, 0x19, 0x1A, 0x1A, 0x0E, 0x0E, 0x0E, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xC6, 0xC4, 0xC4, 0xC4, 0xC8, 0xC8, 0x68, 0x68, 0x70, 0x70, 0x70, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00], /* "w",22 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0E, 0x0E, 0x07, 0x03, 0x03, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x18, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x10, 0x20, 0x20, 0x40, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "x",23 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x32, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x18, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00], /* "y",24 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x20, 0x20, 0x00, 0x01, 0x01, 0x03, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x30, 0x70, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x04, 0x04, 0x0C, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "z",25 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x02, 0x06, 0x04, 0x04, 0x04, 0x0C, 0x08, 0x08, 0x08, 0x1F, 0x10, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "A",26 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0x18, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "B",27 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "C",28 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x08, 0x18, 0x70, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "D",29 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x06, 0x02, 0x00, 0x10, 0x10, 0x30, 0xF0, 0x30, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00], /* "E",30 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0E, 0x02, 0x03, 0x01, 0x00, 0x08, 0x08, 0x18, 0xF8, 0x18, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "F",31 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x08, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "G",32 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "H",33 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "I",34 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x71, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00], /* "J",35 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x1B, 0x1D, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x18, 0x10, 0x20, 0x60, 0x40, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x30, 0x38, 0x18, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "K",36 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00], /* "L",37 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x38, 0x38, 0x38, 0x38, 0x2C, 0x2C, 0x2C, 0x2C, 0x2E, 0x26, 0x26, 0x26, 0x26, 0x23, 0x23, 0x23, 0x23, 0x23, 0x21, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x3C, 0x2C, 0x2C, 0x2C, 0x6C, 0x4C, 0x4C, 0x4C, 0x4C, 0x8C, 0x8C, 0x8C, 0x8C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "M",38 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x38, 0x3C, 0x2C, 0x2C, 0x2E, 0x26, 0x27, 0x23, 0x23, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0x88, 0xC8, 0xC8, 0xE8, 0x68, 0x78, 0x38, 0x38, 0x38, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], /* "N",39 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "O",40 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "P",41 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x27, 0x34, 0x38, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0x18, 0x08, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x86, 0xCC, 0x4C, 0x68, 0x70, 0xE0, 0x32, 0x3E, 0x1C, 0x00, 0x00], /* "Q",42 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x70, 0x30, 0x30, 0x38, 0x18, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "R",43 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x18, 0x1E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x10, 0x18, 0x1C, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x78, 0x1C, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "S",44 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x31, 0x21, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x84, 0x86, 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "T",45 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "U",46 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x30, 0x20, 0x20, 0x20, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00], /* "V",47 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x61, 0x61, 0x61, 0x31, 0x30, 0x31, 0x31, 0x31, 0x31, 0x32, 0x1A, 0x1A, 0x1A, 0x1C, 0x1C, 0x1C, 0x0C, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x86, 0x84, 0x84, 0x84, 0x84, 0xC4, 0xC8, 0xC8, 0xC8, 0xC8, 0x48, 0x68, 0x70, 0x70, 0x70, 0x70, 0x30, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00], /* "W",48 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x1C, 0x0C, 0x0C, 0x0E, 0x06, 0x07, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "X",49 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x38, 0x18, 0x18, 0x0C, 0x0C, 0x0E, 0x06, 0x06, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x10, 0x10, 0x30, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "Y",50 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x18, 0x18, 0x30, 0x70, 0x60, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "Z",51 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x0C, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "0",52 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "1",53 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0x10, 0x20, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x04, 0x04, 0x04, 0x0C, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "2",54 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x70, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "3",55 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0x70, 0xF0, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xFE, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xFE, 0x00, 0x00, 0x00, 0x00], /* "4",56 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x10, 0x10, 0x13, 0x14, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x20, 0x20, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "5",57 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x08, 0x18, 0x18, 0x10, 0x30, 0x31, 0x36, 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x08, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "6",58 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x38, 0x30, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "7",59 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x38, 0x1C, 0x0E, 0x07, 0x0D, 0x18, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "8",60 */
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x20, 0x10, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x3C, 0x6C, 0x8C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00] /* "9",61 */
];
export interface IFont {
w: number;
h: number;
fonts: string;
data: number[][];
}
export const font8x16: IFont = {
w: 8,
h: 16,
fonts,
data: font8x16Data,
};
export const font12x24: IFont = {
w: 12,
h: 24,
fonts,
data: font12x24Data,
};
export const font16x32: IFont = {
w: 16,
h: 32,
fonts,
data: font16x32Data,
};
================================================
FILE: tsconfig.json
================================================
{
"compilerOptions": {
/* Basic Options */
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'. */
// "lib": [], /* Specify library files to be included in the compilation: */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
"declaration": true, /* Generates corresponding '.d.ts' file. */
"sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./dist/", /* Redirect output structure to the directory. */
"rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
"strictNullChecks": true, /* Enable strict null checks. */
"noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
"alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
"noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
"noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
/* Source Map Options */
// "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
}
}
gitextract_s_bnrcdu/ ├── .eslintrc.js ├── .gitignore ├── .vscode/ │ └── launch.json ├── LICENSE ├── README.md ├── output/ │ └── .gitkeep ├── package.json ├── res/ │ └── gb16.uc2 ├── src/ │ ├── BMP24.ts │ ├── demo/ │ │ ├── filter.ts │ │ ├── gb16Font.ts │ │ └── test.ts │ └── font.ts └── tsconfig.json
SYMBOL INDEX (32 symbols across 5 files)
FILE: src/BMP24.ts
type IRGB (line 9) | interface IRGB {
function makeHeader (line 15) | function makeHeader(buf: Buffer, fileLen: number, dataLen: number, w: nu...
class BMP24 (line 29) | class BMP24 {
method constructor (line 40) | constructor(w: number, h: number) {
method getFileData (line 60) | public getFileData() {
method getDataUrl (line 64) | public getDataUrl() {
method getData (line 69) | public getData() {
method drawPoint (line 74) | public drawPoint(x: number, y: number, rgb: number) {
method drawPointRGB (line 83) | public drawPointRGB(x: number, y: number, rgb: IRGB) {
method getPointRGB (line 99) | public getPointRGB(x: number, y: number): IRGB {
method drawLineH (line 114) | public drawLineH(x1: number, x2: number, y: number, rgb: number) {
method drawLineV (line 126) | public drawLineV(y1: number, y2: number, x: number, rgb: number) {
method drawLine (line 137) | public drawLine(x1: number, y1: number, x2: number, y2: number, rgb: n...
method drawRect (line 175) | public drawRect(x: number, y: number, w: number, h: number, rgb: numbe...
method fillRect (line 185) | public fillRect(x: number, y: number, w: number, h: number, rgb: numbe...
method drawCircle (line 206) | public drawCircle(x: number, y: number, r: number, rgb: number) {
method drawChar (line 240) | public drawChar(ch: string, x: number, y: number, font: IFont, color: ...
method drawString (line 264) | public drawString(str: string, x: number, y: number, font: IFont, colo...
method loadFromFile (line 272) | public static async loadFromFile(filename: string) {
FILE: src/demo/filter.ts
function gaussBlur (line 14) | function gaussBlur(img: BMP24, radius: number, sigma?: number) {
function sharp (line 99) | function sharp(img: BMP24, arg: number) {
function test (line 138) | async function test() {
FILE: src/demo/gb16Font.ts
constant CHAR_H (line 7) | const CHAR_H = 16;
constant EN_CHAR_W (line 8) | const EN_CHAR_W = 8;
constant CN_CHAR_W (line 9) | const CN_CHAR_W = 16;
function getCharWidthHeight (line 15) | function getCharWidthHeight(char: number | string) {
function drawChar (line 26) | function drawChar(img: BMP24, char: number | string, x: number, y: numbe...
function drawString (line 43) | function drawString(img: BMP24, str: string, x: number, y: number, color...
FILE: src/demo/test.ts
function makeImg2 (line 20) | function makeImg2() {
function rand (line 29) | function rand(min: number, max: number) {
function makeCapcha (line 34) | function makeCapcha() {
FILE: src/font.ts
type IFont (line 325) | interface IFont {
Condensed preview — 14 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (88K chars).
[
{
"path": ".eslintrc.js",
"chars": 960,
"preview": "module.exports = {\n env: {\n es2021: true,\n node: true,\n },\n extends: [\n 'standard'\n ],\n"
},
{
"path": ".gitignore",
"chars": 35,
"preview": "/output/*.bmp\n/dist/\n/node_modules/"
},
{
"path": ".vscode/launch.json",
"chars": 515,
"preview": "{\n // 使用 IntelliSense 了解相关属性。 \n // 悬停以查看现有属性的描述。\n // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=83038"
},
{
"path": "LICENSE",
"chars": 1057,
"preview": "MIT License\n\nCopyright (c) 2017 \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this s"
},
{
"path": "README.md",
"chars": 1614,
"preview": "<a href=\"https://996.icu\"><img src=\"https://img.shields.io/badge/link-996.icu-red.svg\" alt=\"996.icu\" /></a>\n\n\n# node-gd-"
},
{
"path": "output/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "package.json",
"chars": 1401,
"preview": "{\n \"name\": \"gd-bmp\",\n \"version\": \"2.0.1\",\n \"description\": \"light and high speed and 100% js implement graphical"
},
{
"path": "src/BMP24.ts",
"chars": 8890,
"preview": "// 初始版本确定于:20161103 18:31\nimport * as fs from 'fs';\nimport { IFont, font12x24, font16x32, font8x16 } from './font';\nexpo"
},
{
"path": "src/demo/filter.ts",
"chars": 4911,
"preview": "import * as fs from 'fs';\nimport * as path from 'path';\nimport { BMP24 } from '../BMP24'; // gd-bmp\n\n/**\n * 高斯模糊\n * @par"
},
{
"path": "src/demo/gb16Font.ts",
"chars": 3152,
"preview": "import * as fs from 'fs';\nimport * as http from 'http';\nimport * as querystring from 'querystring';\nimport * as path fro"
},
{
"path": "src/demo/test.ts",
"chars": 3660,
"preview": "import * as http from 'http';\nimport { BMP24 } from '../BMP24'; // gd-bmp\nimport * as font from '../font';\n\n/*\n 用PCtoLCD"
},
{
"path": "src/font.ts",
"chars": 52694,
"preview": "/*\n用PCtoLCD2002取字模\n行列式扫描,正向取模(高位在前)\n*/\nconst fonts = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\nc"
},
{
"path": "tsconfig.json",
"chars": 4906,
"preview": "{\n \"compilerOptions\": {\n /* Basic Options */ \n \"target\": \"es5\", /*"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the zengming00/node-gd-bmp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 14 files (81.8 KB), approximately 52.0k tokens, and a symbol index with 32 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.