Add font and preliminary tests

This commit is contained in:
Mario Hüttel 2023-02-27 22:10:33 +01:00
parent 3e01230ea5
commit dc7fb4c1bf
4 changed files with 271 additions and 0 deletions

13
CMakeLists.txt Normal file
View File

@ -0,0 +1,13 @@
project(lcd-screenshot LANGUAGES C)
cmake_minimum_required(VERSION 3.0)
find_package(PkgConfig REQUIRED)
pkg_check_modules(CAIRO REQUIRED cairo)
include_directories(${CAIRO_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}/include")
aux_source_directory("src" SOURCES)
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${CAIRO_LIBRARIES})

View File

@ -0,0 +1,16 @@
#ifndef _HD44780_FONT_H_
#define _HD44780_FONT_H_
#include <stdint.h>
/* HD44780 5x7 pixel font data
* http://eleif.net/HD44780.html
* Array offset from ASCII code is decimal 32 (hex 20), i.e. the first element with index 0 is SPACE (' ')
*/
#define HD44780_FONT_HEIGHT (7)
#define HD44780_FONT_WIDTH (5)
const uint8_t *hd44780_font_get_character_raw(char c);
#endif /* _HD44780_FONT_H_ */

218
src/hd44780-font.c Normal file
View File

@ -0,0 +1,218 @@
#include <lcd-screenshot/hd44780-font.h>
#include <stddef.h>
/* HD44780 5x7 pixel font data
* http://eleif.net/HD44780.html
* Array offset from ASCII code is decimal 32 (hex 20), i.e. the first element with index 0 is SPACE (' ')
*/
#define TABLE_OFFSET (0x20)
const uint8_t hd44780_font[192][7] = {
{ 0, 0, 0, 0, 0, 0, 0, }, // { 0} ' '
{ 4, 4, 4, 4, 0, 0, 4, }, // { 1} '!'
{ 10, 10, 10, 0, 0, 0, 0, }, // { 2} '"'
{ 10, 10, 31, 10, 31, 10, 10, }, // { 3} '#'
{ 4, 15, 20, 14, 5, 30, 4, }, // { 4} '$'
{ 24, 25, 2, 4, 8, 19, 3, }, // { 5} '%'
{ 12, 18, 20, 8, 21, 18, 13, }, // { 6} '&'
{ 12, 4, 8, 0, 0, 0, 0, }, // { 7} '''
{ 2, 4, 8, 8, 8, 4, 2, }, // { 8} '('
{ 8, 4, 2, 2, 2, 4, 8, }, // { 9} ')'
{ 0, 4, 21, 14, 21, 4, 0, }, // {10} '*'
{ 0, 4, 4, 31, 4, 4, 0, }, // {11} '+'
{ 0, 0, 0, 0, 12, 4, 8, }, // {12} ','
{ 0, 0, 0, 31, 0, 0, 0, }, // {13} '-'
{ 0, 0, 0, 0, 0, 12, 12, }, // {14} '.'
{ 0, 1, 2, 4, 8, 16, 0, }, // {15} '/'
{ 14, 17, 19, 21, 25, 17, 14, }, // {16} '0'
{ 4, 12, 4, 4, 4, 4, 14, }, // {17} '1'
{ 14, 17, 1, 2, 4, 8, 31, }, // {18} '2'
{ 31, 2, 4, 2, 1, 17, 14, }, // {19} '3'
{ 2, 6, 10, 18, 31, 2, 2, }, // {20} '4'
{ 31, 16, 30, 1, 1, 17, 14, }, // {21} '5'
{ 6, 8, 16, 30, 17, 17, 14, }, // {22} '6'
{ 31, 17, 1, 2, 4, 4, 4, }, // {23} '7'
{ 14, 17, 17, 14, 17, 17, 14, }, // {24} '8'
{ 14, 17, 17, 15, 1, 2, 12, }, // {25} '9'
{ 0, 12, 12, 0, 12, 12, 0, }, // {26} ':'
{ 0, 12, 12, 0, 12, 4, 8, }, // {27} ';'
{ 2, 4, 8, 16, 8, 4, 2, }, // {28} '<'
{ 0, 0, 31, 0, 31, 0, 0, }, // {29} '='
{ 8, 4, 2, 1, 2, 4, 8, }, // {30} '>'
{ 14, 17, 1, 2, 4, 0, 4, }, // {31} '?'
{ 14, 17, 1, 13, 21, 21, 14, }, // {32} '@'
{ 14, 17, 17, 17, 31, 17, 17, }, // {33} 'A'
{ 30, 17, 17, 30, 17, 17, 30, }, // {34} 'B'
{ 14, 17, 16, 16, 16, 17, 14, }, // {35} 'C'
{ 28, 18, 17, 17, 17, 18, 28, }, // {36} 'D'
{ 31, 16, 16, 30, 16, 16, 31, }, // {37} 'E'
{ 31, 16, 16, 30, 16, 16, 16, }, // {38} 'F'
{ 14, 17, 16, 23, 17, 17, 15, }, // {39} 'G'
{ 17, 17, 17, 31, 17, 17, 17, }, // {40} 'H'
{ 14, 4, 4, 4, 4, 4, 14, }, // {41} 'I'
{ 7, 2, 2, 2, 2, 18, 12, }, // {42} 'J'
{ 17, 18, 20, 24, 20, 18, 17, }, // {43} 'K'
{ 16, 16, 16, 16, 16, 16, 31, }, // {44} 'L'
{ 17, 27, 21, 21, 17, 17, 17, }, // {45} 'M'
{ 17, 17, 25, 21, 19, 17, 17, }, // {46} 'N'
{ 14, 17, 17, 17, 17, 17, 14, }, // {47} 'O'
{ 30, 17, 17, 30, 16, 16, 16, }, // {48} 'P'
{ 14, 17, 17, 17, 21, 18, 13, }, // {49} 'Q'
{ 30, 17, 17, 30, 20, 18, 17, }, // {50} 'R'
{ 15, 16, 16, 14, 1, 1, 30, }, // {51} 'S'
{ 31, 4, 4, 4, 4, 4, 4, }, // {52} 'T'
{ 17, 17, 17, 17, 17, 17, 14, }, // {53} 'U'
{ 17, 17, 17, 17, 17, 10, 4, }, // {54} 'V'
{ 17, 17, 17, 21, 21, 21, 10, }, // {55} 'W'
{ 17, 17, 10, 4, 10, 17, 17, }, // {56} 'X'
{ 17, 17, 17, 10, 4, 4, 4, }, // {57} 'Y'
{ 31, 1, 2, 4, 8, 16, 31, }, // {58} 'Z'
{ 28, 16, 16, 16, 16, 16, 28, }, // {59} '{'
{ 17, 10, 31, 4, 31, 4, 4, }, // {60} '\'
{ 14, 2, 2, 2, 2, 2, 14, }, // {61} '}'
{ 4, 10, 17, 0, 0, 0, 0, }, // {62} '^'
{ 0, 0, 0, 0, 0, 0, 31, }, // {63} '_'
{ 8, 4, 2, 0, 0, 0, 0, }, // {64} '`'
{ 0, 0, 14, 1, 15, 17, 15, }, // {65} 'a'
{ 16, 16, 22, 25, 17, 17, 30, }, // {66} 'b'
{ 0, 0, 14, 16, 16, 17, 14, }, // {67} 'c'
{ 1, 1, 13, 19, 17, 17, 15, }, // {68} 'd'
{ 0, 0, 14, 17, 31, 16, 14, }, // {69} 'e'
{ 6, 9, 8, 28, 8, 8, 8, }, // {70} 'f'
{ 0, 15, 17, 17, 15, 1, 14, }, // {71} 'g'
{ 16, 16, 22, 25, 17, 17, 17, }, // {72} 'h'
{ 4, 0, 12, 4, 4, 4, 14, }, // {73} 'i'
{ 2, 0, 6, 2, 2, 18, 12, }, // {74} 'j'
{ 16, 16, 18, 20, 24, 20, 18, }, // {75} 'k'
{ 12, 4, 4, 4, 4, 4, 14, }, // {76} 'l'
{ 0, 0, 26, 21, 21, 17, 17, }, // {77} 'm'
{ 0, 0, 22, 25, 17, 17, 17, }, // {78} 'n'
{ 0, 0, 14, 17, 17, 17, 14, }, // {79} 'o'
{ 0, 0, 30, 17, 30, 16, 16, }, // {80} 'p'
{ 0, 0, 13, 19, 15, 1, 1, }, // {81} 'q'
{ 0, 0, 22, 25, 16, 16, 16, }, // {82} 'r'
{ 0, 0, 14, 16, 14, 1, 30, }, // {83} 's'
{ 8, 8, 28, 8, 8, 9, 6, }, // {84} 't'
{ 0, 0, 17, 17, 17, 19, 13, }, // {85} 'u'
{ 0, 0, 17, 17, 17, 10, 4, }, // {86} 'v'
{ 0, 0, 17, 21, 21, 21, 10, }, // {87} 'w'
{ 0, 0, 17, 10, 4, 10, 17, }, // {88} 'x'
{ 0, 0, 17, 17, 15, 1, 14, }, // {89} 'y'
{ 0, 0, 31, 2, 4, 8, 31, }, // {90} 'z'
{ 2, 4, 4, 8, 4, 4, 2, }, // {91} '{'
{ 4, 4, 4, 4, 4, 4, 4, }, // {92} '|'
{ 8, 4, 4, 2, 4, 4, 8, }, // {93} '}'
{ 0, 4, 2, 31, 2, 4, 0, }, // {94} '~'
{ 0, 4, 8, 31, 8, 4, 0, }, // {95} ''
{ 0, 0, 0, 0, 0, 0, 0, }, // {96} '€'
{ 4, 4, 4, 4, 0, 0, 4, }, // {97} ''
{ 10, 10, 10, 0, 0, 0, 0, }, // {98} '‚'
{ 10, 10, 31, 10, 31, 10, 10, }, // {99} 'ƒ'
{ 4, 15, 20, 14, 5, 30, 4, }, // {100} '„'
{ 24, 25, 2, 4, 8, 19, 3, }, // {101} '…'
{ 12, 18, 20, 8, 21, 18, 13, }, // {102} '†'
{ 12, 4, 8, 0, 0, 0, 0, }, // {103} '‡'
{ 2, 4, 8, 8, 8, 4, 2, }, // {104} 'ˆ'
{ 8, 4, 2, 2, 2, 4, 8, }, // {105} '‰'
{ 0, 4, 21, 14, 21, 4, 0, }, // {106} 'Š'
{ 0, 4, 4, 31, 4, 4, 0, }, // {107} '‹'
{ 0, 0, 0, 0, 12, 4, 8, }, // {108} 'Œ'
{ 0, 0, 0, 31, 0, 0, 0, }, // {109} ''
{ 0, 0, 0, 0, 0, 12, 12, }, // {110} 'Ž'
{ 0, 1, 2, 4, 8, 16, 0, }, // {111} ''
{ 14, 17, 19, 21, 25, 17, 14, }, // {112} ''
{ 4, 12, 4, 4, 4, 4, 14, }, // {113} '‘'
{ 14, 17, 1, 2, 4, 8, 31, }, // {114} '’'
{ 31, 2, 4, 2, 1, 17, 14, }, // {115} '“'
{ 2, 6, 10, 18, 31, 2, 2, }, // {116} '”'
{ 31, 16, 30, 1, 1, 17, 14, }, // {117} '•'
{ 6, 8, 16, 30, 17, 17, 14, }, // {118} '–'
{ 31, 17, 1, 2, 4, 4, 4, }, // {119} '—'
{ 14, 17, 17, 14, 17, 17, 14, }, // {120} '˜'
{ 14, 17, 17, 15, 1, 2, 12, }, // {121} '™'
{ 0, 12, 12, 0, 12, 12, 0, }, // {122} 'š'
{ 0, 12, 12, 0, 12, 4, 8, }, // {123} '›'
{ 2, 4, 8, 16, 8, 4, 2, }, // {124} 'œ'
{ 0, 0, 31, 0, 31, 0, 0, }, // {125} ''
{ 8, 4, 2, 1, 2, 4, 8, }, // {126} 'ž'
{ 14, 17, 1, 2, 4, 0, 4, }, // {127} 'Ÿ'
{ 14, 17, 1, 13, 21, 21, 14, }, // {128} ' '
{ 14, 17, 17, 17, 31, 17, 17, }, // {129} '¡'
{ 30, 17, 17, 30, 17, 17, 30, }, // {130} '¢'
{ 14, 17, 16, 16, 16, 17, 14, }, // {131} '£'
{ 28, 18, 17, 17, 17, 18, 28, }, // {132} '¤'
{ 31, 16, 16, 30, 16, 16, 31, }, // {133} '¥'
{ 31, 16, 16, 30, 16, 16, 16, }, // {134} '¦'
{ 14, 17, 16, 23, 17, 17, 15, }, // {135} '§'
{ 17, 17, 17, 31, 17, 17, 17, }, // {136} '¨'
{ 14, 4, 4, 4, 4, 4, 14, }, // {137} '©'
{ 7, 2, 2, 2, 2, 18, 12, }, // {138} 'ª'
{ 17, 18, 20, 24, 20, 18, 17, }, // {139} '«'
{ 16, 16, 16, 16, 16, 16, 31, }, // {140} '¬'
{ 17, 27, 21, 21, 17, 17, 17, }, // {141} '­'
{ 17, 17, 25, 21, 19, 17, 17, }, // {142} '®'
{ 14, 17, 17, 17, 17, 17, 14, }, // {143} '¯'
{ 30, 17, 17, 30, 16, 16, 16, }, // {144} '°'
{ 14, 17, 17, 17, 21, 18, 13, }, // {145} '±'
{ 30, 17, 17, 30, 20, 18, 17, }, // {146} '²'
{ 15, 16, 16, 14, 1, 1, 30, }, // {147} '³'
{ 31, 4, 4, 4, 4, 4, 4, }, // {148} '´'
{ 17, 17, 17, 17, 17, 17, 14, }, // {149} 'µ'
{ 17, 17, 17, 17, 17, 10, 4, }, // {150} '¶'
{ 17, 17, 17, 21, 21, 21, 10, }, // {151} '·'
{ 17, 17, 10, 4, 10, 17, 17, }, // {152} '¸'
{ 17, 17, 17, 10, 4, 4, 4, }, // {153} '¹'
{ 31, 1, 2, 4, 8, 16, 31, }, // {154} 'º'
{ 28, 16, 16, 16, 16, 16, 28, }, // {155} '»'
{ 17, 10, 31, 4, 31, 4, 4, }, // {156} '¼'
{ 14, 2, 2, 2, 2, 2, 14, }, // {157} '½'
{ 4, 10, 17, 0, 0, 0, 0, }, // {158} '¾'
{ 0, 0, 0, 0, 0, 0, 31, }, // {159} '¿'
{ 8, 4, 2, 0, 0, 0, 0, }, // {160} 'À'
{ 0, 0, 14, 1, 15, 17, 15, }, // {161} 'Á'
{ 16, 16, 22, 25, 17, 17, 30, }, // {162} 'Â'
{ 0, 0, 14, 16, 16, 17, 14, }, // {163} 'Ã'
{ 1, 1, 13, 19, 17, 17, 15, }, // {164} 'Ä'
{ 0, 0, 14, 17, 31, 16, 14, }, // {165} 'Å'
{ 6, 9, 8, 28, 8, 8, 8, }, // {166} 'Æ'
{ 0, 15, 17, 17, 15, 1, 14, }, // {167} 'Ç'
{ 16, 16, 22, 25, 17, 17, 17, }, // {168} 'È'
{ 4, 0, 12, 4, 4, 4, 14, }, // {169} 'É'
{ 2, 0, 6, 2, 2, 18, 12, }, // {170} 'Ê'
{ 16, 16, 18, 20, 24, 20, 18, }, // {171} 'Ë'
{ 12, 4, 4, 4, 4, 4, 14, }, // {172} 'Ì'
{ 0, 0, 26, 21, 21, 17, 17, }, // {173} 'Í'
{ 0, 0, 22, 25, 17, 17, 17, }, // {174} 'Î'
{ 0, 0, 14, 17, 17, 17, 14, }, // {175} 'Ï'
{ 0, 0, 30, 17, 30, 16, 16, }, // {176} 'Ð'
{ 0, 0, 13, 19, 15, 1, 1, }, // {177} 'Ñ'
{ 0, 0, 22, 25, 16, 16, 16, }, // {178} 'Ò'
{ 0, 0, 14, 16, 14, 1, 30, }, // {179} 'Ó'
{ 8, 8, 28, 8, 8, 9, 6, }, // {180} 'Ô'
{ 0, 0, 17, 17, 17, 19, 13, }, // {181} 'Õ'
{ 0, 0, 17, 17, 17, 10, 4, }, // {182} 'Ö'
{ 0, 0, 17, 21, 21, 21, 10, }, // {183} '×'
{ 0, 0, 17, 10, 4, 10, 17, }, // {184} 'Ø'
{ 0, 0, 17, 17, 15, 1, 14, }, // {185} 'Ù'
{ 0, 0, 31, 2, 4, 8, 31, }, // {186} 'Ú'
{ 2, 4, 4, 8, 4, 4, 2, }, // {187} 'Û'
{ 4, 4, 4, 4, 4, 4, 4, }, // {188} 'Ü'
{ 8, 4, 4, 2, 4, 4, 8, }, // {189} 'Ý'
{ 0, 4, 2, 31, 2, 4, 0, }, // {190} 'Þ'
{ 0, 4, 8, 31, 8, 4, 0, } // {191} 'ß'
};
const uint8_t *hd44780_font_get_character_raw(char c)
{
int idx;
idx = (int)((uint8_t)c);
idx -= TABLE_OFFSET;
if (idx < 0 || idx > 191)
return NULL;
return &hd44780_font[idx][0];
}

24
src/main.c Normal file
View File

@ -0,0 +1,24 @@
#include <stdio.h>
#include <cairo.h>
#include <cairo-pdf.h>
#include <cairo-svg.h>
#include <lcd-screenshot/hd44780-font.h>
int main(int argc, char **argv)
{
cairo_surface_t *surface;
cairo_t *cr;
surface = cairo_svg_surface_create ("out.svg", 120, 120);
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0.25, 0.25, 100, 60);
cairo_fill (cr);
cairo_show_page(cr);
cairo_destroy(cr);
cairo_surface_destroy(surface);
return 0;
}