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 } }