display-test/drawer/font.go

325 lines
10 KiB
Go
Raw Normal View History

2024-09-15 17:21:57 +00:00
package drawer
import (
"log"
"golang.org/x/text/encoding/charmap"
)
const (
CharGap = 1
LineGap = 1
FontCharW = 5
FontCharH = 7
)
// Standard ASCII 5x7 font
var stdFont = []byte{
0x0, 0x0, 0x0, 0x0, 0x0, // Empty Cell
0x3e, 0x5b, 0x4f, 0x5b, 0x3e, // Sad Smiley
0x3e, 0x6b, 0x4f, 0x6b, 0x3e, // Happy Smiley
0x1c, 0x3e, 0x7c, 0x3e, 0x1c, // Heart
0x18, 0x3c, 0x7e, 0x3c, 0x18, // Diamond
0x1c, 0x57, 0x7d, 0x57, 0x1c, // Clubs
0x1c, 0x5e, 0x7f, 0x5e, 0x1c, // Spades
0x18, 0x3c, 0x18, 0x0, 0x0, // Bullet Point
0xff, 0xe7, 0xc3, 0xe7, 0xff, // Rev Bullet Point
0x18, 0x24, 0x18, 0x0, 0x0, // Hollow Bullet Point
0xff, 0xe7, 0xdb, 0xe7, 0xff, // Rev Hollow BP
0x30, 0x48, 0x3a, 0x6, 0xe, // Male
0x26, 0x29, 0x79, 0x29, 0x26, // Female
0x40, 0x7f, 0x5, 0x5, 0x7, // Music Note 1
0x40, 0x7f, 0x5, 0x25, 0x3f, // Music Note 2
0x5a, 0x3c, 0xe7, 0x3c, 0x5a, // Snowflake
0x7f, 0x3e, 0x1c, 0x1c, 0x8, // Right Pointer
0x8, 0x1c, 0x1c, 0x3e, 0x7f, // Left Pointer
0x14, 0x22, 0x7f, 0x22, 0x14, // UpDown Arrows
0x5f, 0x5f, 0x0, 0x5f, 0x5f, // Double Exclamation
0x6, 0x9, 0x7f, 0x1, 0x7f, // Paragraph Mark
0x66, 0x89, 0x95, 0x6a, 0x0, // Section Mark
0x60, 0x60, 0x60, 0x60, 0x60, // Double Underline
0x94, 0xa2, 0xff, 0xa2, 0x94, // UpDown Underlined
0x8, 0x4, 0x7e, 0x4, 0x8, // Up Arrow
0x10, 0x20, 0x7e, 0x20, 0x10, // Down Arrow
0x8, 0x8, 0x2a, 0x1c, 0x8, // Right Arrow
0x8, 0x1c, 0x2a, 0x8, 0x8, // Left Arrow
0x1e, 0x10, 0x10, 0x10, 0x10, // Angled
0xc, 0x1e, 0xc, 0x1e, 0xc, // Squashed #
0x30, 0x38, 0x3e, 0x38, 0x30, // Up Pointer
0x6, 0xe, 0x3e, 0xe, 0x6, // Down Pointer
0x0, 0x0, 0x0, 0x0, 0x0, // Space
0x5f, 0x0, 0x0, 0x0, 0x0, // !
0x3, 0x0, 0x3, 0x0, 0x0, // "
0x14, 0x3e, 0x14, 0x3e, 0x14, // #
0x24, 0x6a, 0x2b, 0x12, 0x0, // $
0x63, 0x13, 0x8, 0x64, 0x63, // %
0x36, 0x49, 0x56, 0x20, 0x50, // &
0x3, 0x0, 0x0, 0x0, 0x0, // '
0x1c, 0x22, 0x41, 0x0, 0x0, // (
0x41, 0x22, 0x1c, 0x0, 0x0, // )
0x28, 0x18, 0xe, 0x18, 0x28, // *
0x8, 0x8, 0x3e, 0x8, 0x8, // +
0xb0, 0x70, 0x0, 0x0, 0x0, // ,
0x8, 0x8, 0x8, 0x8, 0x0, // -
0x60, 0x60, 0x0, 0x0, 0x0, // .
0x60, 0x18, 0x6, 0x1, 0x0, // /
0x3e, 0x41, 0x41, 0x3e, 0x0, // 0
0x42, 0x7f, 0x40, 0x0, 0x0, // 1
0x62, 0x51, 0x49, 0x46, 0x0, // 2
0x22, 0x41, 0x49, 0x36, 0x0, // 3
0x18, 0x14, 0x12, 0x7f, 0x0, // 4
0x27, 0x45, 0x45, 0x39, 0x0, // 5
0x3e, 0x49, 0x49, 0x30, 0x0, // 6
0x61, 0x11, 0x9, 0x7, 0x0, // 7
0x36, 0x49, 0x49, 0x36, 0x0, // 8
0x6, 0x49, 0x49, 0x3e, 0x0, // 9
0x50, 0x0, 0x0, 0x0, 0x0, // :
0x80, 0x50, 0x0, 0x0, 0x0, // ;
0x10, 0x28, 0x44, 0x0, 0x0, // <
0x14, 0x14, 0x14, 0x0, 0x0, // =
0x44, 0x28, 0x10, 0x0, 0x0, // >
0x2, 0x59, 0x9, 0x6, 0x0, // ?
0x3e, 0x49, 0x55, 0x5d, 0xe, // @
0x7e, 0x11, 0x11, 0x7e, 0x0, // A
0x7f, 0x49, 0x49, 0x36, 0x0, // B
0x3e, 0x41, 0x41, 0x22, 0x0, // C
0x7f, 0x41, 0x41, 0x3e, 0x0, // D
0x7f, 0x49, 0x49, 0x41, 0x0, // E
0x7f, 0x9, 0x9, 0x1, 0x0, // F
0x3e, 0x41, 0x49, 0x7a, 0x0, // G
0x7f, 0x8, 0x8, 0x7f, 0x0, // H
0x41, 0x7f, 0x41, 0x0, 0x0, // I
0x30, 0x40, 0x41, 0x3f, 0x0, // J
0x7f, 0x8, 0x14, 0x63, 0x0, // K
0x7f, 0x40, 0x40, 0x40, 0x0, // L
0x7f, 0x2, 0xc, 0x2, 0x7f, // M
0x7f, 0x4, 0x8, 0x10, 0x7f, // N
0x3e, 0x41, 0x41, 0x3e, 0x0, // O
0x7f, 0x9, 0x9, 0x6, 0x0, // P
0x3e, 0x41, 0x41, 0xbe, 0x0, // Q
0x7f, 0x9, 0x9, 0x76, 0x0, // R
0x46, 0x49, 0x49, 0x32, 0x0, // S
0x1, 0x1, 0x7f, 0x1, 0x1, // T
0x3f, 0x40, 0x40, 0x3f, 0x0, // U
0xf, 0x30, 0x40, 0x30, 0xf, // V
0x3f, 0x40, 0x38, 0x40, 0x3f, // W
0x63, 0x14, 0x8, 0x14, 0x63, // X
0x7, 0x8, 0x70, 0x8, 0x7, // Y
0x61, 0x51, 0x49, 0x47, 0x0, // Z
0x7f, 0x41, 0x0, 0x0, 0x0, // [
0x1, 0x6, 0x18, 0x60, 0x0, //
0x41, 0x7f, 0x0, 0x0, 0x0, // ]
0x2, 0x1, 0x2, 0x0, 0x0, // ^
0x40, 0x40, 0x40, 0x40, 0x0, // _
0x1, 0x2, 0x0, 0x0, 0x0, // `
0x20, 0x54, 0x54, 0x78, 0x0, // a
0x7f, 0x44, 0x44, 0x38, 0x0, // b
0x38, 0x44, 0x44, 0x28, 0x0, // c
0x38, 0x44, 0x44, 0x7f, 0x0, // d
0x38, 0x54, 0x54, 0x18, 0x0, // e
0x4, 0x7e, 0x5, 0x0, 0x0, // f
0x98, 0xa4, 0xa4, 0x78, 0x0, // g
0x7f, 0x4, 0x4, 0x78, 0x0, // h
0x44, 0x7d, 0x40, 0x0, 0x0, // i
0x40, 0x80, 0x84, 0x7d, 0x0, // j
0x7f, 0x10, 0x28, 0x44, 0x0, // k
0x41, 0x7f, 0x40, 0x0, 0x0, // l
0x7c, 0x4, 0x7c, 0x4, 0x78, // m
0x7c, 0x4, 0x4, 0x78, 0x0, // n
0x38, 0x44, 0x44, 0x38, 0x0, // o
0xfc, 0x24, 0x24, 0x18, 0x0, // p
0x18, 0x24, 0x24, 0xfc, 0x0, // q
0x7c, 0x8, 0x4, 0x4, 0x0, // r
0x48, 0x54, 0x54, 0x24, 0x0, // s
0x4, 0x3f, 0x44, 0x0, 0x0, // t
0x3c, 0x40, 0x40, 0x7c, 0x0, // u
0x1c, 0x20, 0x40, 0x20, 0x1c, // v
0x3c, 0x40, 0x3c, 0x40, 0x3c, // w
0x44, 0x28, 0x10, 0x28, 0x44, // x
0x9c, 0xa0, 0xa0, 0x7c, 0x0, // y
0x64, 0x54, 0x4c, 0x0, 0x0, // z
0x8, 0x36, 0x41, 0x0, 0x0, // {
0x7f, 0x0, 0x0, 0x0, 0x0, // |
0x41, 0x36, 0x8, 0x0, 0x0, // }
0x8, 0x4, 0x8, 0x4, 0x0, // ~
0x0, 0x0, 0x0, 0x0, 0x0, // Hollow Up Arrow
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x0, 0x0, 0x0, 0x0, 0x0, // Empty
0x7e, 0x11, 0x11, 0x7e, 0x0, // А
0x7f, 0x49, 0x49, 0x31, 0x0, // Б
0x7f, 0x49, 0x49, 0x36, 0x0, // В
0x7f, 0x1, 0x1, 0x1, 0x0, // Г
0xc0, 0x7e, 0x41, 0x7f, 0xc0, // Д
0x7f, 0x49, 0x49, 0x41, 0x0, // Е
0x77, 0x8, 0x7f, 0x8, 0x77, // Ж
0x22, 0x41, 0x49, 0x36, 0x0, // З
0x7f, 0x20, 0x10, 0x7f, 0x0, // И
0x7f, 0x20, 0x11, 0x7d, 0x0, // Й
0x7f, 0x8, 0x14, 0x63, 0x0, // К
0x40, 0x3c, 0x2, 0x7f, 0x0, // Л
0x7f, 0x2, 0xc, 0x2, 0x7f, // М
0x7f, 0x8, 0x8, 0x7f, 0x0, // Н
0x3e, 0x41, 0x41, 0x3e, 0x0, // О
0x7f, 0x1, 0x1, 0x7f, 0x0, // П
0x7f, 0x9, 0x9, 0x6, 0x0, // Р
0x3e, 0x41, 0x41, 0x22, 0x0, // С
0x1, 0x1, 0x7f, 0x1, 0x1, // Т
0x47, 0x48, 0x48, 0x3f, 0x0, // У
0xe, 0x11, 0x7f, 0x11, 0xe, // Ф
0x63, 0x14, 0x8, 0x14, 0x63, // Х
0x7f, 0x40, 0x40, 0x7f, 0xc0, // Ц
0xf, 0x8, 0x8, 0x7f, 0x0, // Ч
0x7f, 0x40, 0x7c, 0x40, 0x7f, // Ш
0x7f, 0x40, 0x7c, 0x40, 0xff, // Щ
0x1, 0x7f, 0x48, 0x48, 0x30, // Ъ
0x7f, 0x48, 0x30, 0x0, 0x7f, // Ы
0x7f, 0x48, 0x48, 0x30, 0x0, // Ь
0x41, 0x49, 0x49, 0x3e, 0x0, // Э
0x7f, 0x8, 0x3e, 0x41, 0x3e, // Ю
0x46, 0x29, 0x19, 0x7f, 0x0, // Я
0x20, 0x54, 0x54, 0x78, 0x0, // а
0x3c, 0x4a, 0x4a, 0x31, 0x0, // б
0x7e, 0x59, 0x56, 0x20, 0x0, // в
0x7c, 0x4, 0x4, 0x4, 0x0, // г
0xc0, 0x78, 0x44, 0x7c, 0xc0, // д
0x38, 0x54, 0x54, 0x18, 0x0, // е
0x6c, 0x10, 0x7c, 0x10, 0x6c, // ж
0x48, 0x84, 0x94, 0x68, 0x0, // з
0x7c, 0x20, 0x10, 0x7c, 0x0, // и
0x7c, 0x21, 0x11, 0x7c, 0x0, // й
0x7c, 0x10, 0x28, 0x44, 0x0, // к
0x40, 0x38, 0x4, 0x7c, 0x0, // л
0x7c, 0x8, 0x10, 0x8, 0x7c, // м
0x7c, 0x10, 0x10, 0x7c, 0x0, // н
0x38, 0x44, 0x44, 0x38, 0x0, // о
0x7c, 0x4, 0x4, 0x7c, 0x0, // п
0xfc, 0x24, 0x24, 0x18, 0x0, // р
0x38, 0x44, 0x44, 0x28, 0x0, // с
0x4, 0x7c, 0x4, 0x0, 0x0, // т
0x9c, 0xa0, 0xa0, 0x7c, 0x0, // у
0x18, 0x24, 0xfc, 0x24, 0x18, // ф
0x44, 0x28, 0x10, 0x28, 0x44, // х
0x7c, 0x40, 0x40, 0x7c, 0xc0, // ц
0x1c, 0x10, 0x10, 0x7c, 0x0, // ч
0x7c, 0x40, 0x70, 0x40, 0x7c, // ш
0x7c, 0x40, 0x70, 0x40, 0xfc, // щ
0x4, 0x7c, 0x48, 0x48, 0x30, // ъ
0x7c, 0x48, 0x30, 0x0, 0x7c, // ы
0x7c, 0x48, 0x48, 0x30, 0x0, // ь
0x44, 0x54, 0x54, 0x38, 0x0, // э
0x7c, 0x10, 0x38, 0x44, 0x38, // ю
0x48, 0x34, 0x14, 0x7c, 0x0, // я
}
func IntMin(a, b int) int {
if a < b {
return a
}
return b
}
func (d *drawer) putChar(x0, y0 int, c byte) {
if int(c) > len(stdFont)/5 {
return
}
if y0 >= d.img.Rect.Dy() || x0 >= d.img.Rect.Dx() {
return
}
maxYi := IntMin(y0+7, d.img.Rect.Dy()) - y0
maxXi := IntMin(x0+5, d.img.Rect.Dx()) - x0
for yi := range maxYi {
lineaddr := (y0+yi)*d.img.Stride + x0
for xi := range maxXi {
d.img.Pix[lineaddr+xi] = ((stdFont[int(c)*5+xi] >> yi) & 1) * 255
}
}
}
func convertStr(str string) []byte {
out, err := charmap.Windows1251.NewEncoder().Bytes([]byte(str))
if err != nil {
log.Println("ENCODE ERROR: ", err.Error())
}
return out
}
func (d *drawer) PutText(x0, y0 int, text string) {
d.Lock()
defer d.Unlock()
asciiStr := convertStr(text)
//asciiStr := []byte(text)
// Create font drawer
x := x0
for _, c := range asciiStr {
d.putChar(x, y0, c)
x += CharGap + FontCharW
}
}