From dc7fb4c1bf68f789e4996ff9cd3d0221d0ca21bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 27 Feb 2023 22:10:33 +0100 Subject: [PATCH] Add font and preliminary tests --- CMakeLists.txt | 13 ++ include/lcd-screenshot/hd44780-font.h | 16 ++ src/hd44780-font.c | 218 ++++++++++++++++++++++++++ src/main.c | 24 +++ 4 files changed, 271 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 include/lcd-screenshot/hd44780-font.h create mode 100644 src/hd44780-font.c create mode 100644 src/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..db63814 --- /dev/null +++ b/CMakeLists.txt @@ -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}) diff --git a/include/lcd-screenshot/hd44780-font.h b/include/lcd-screenshot/hd44780-font.h new file mode 100644 index 0000000..b96114e --- /dev/null +++ b/include/lcd-screenshot/hd44780-font.h @@ -0,0 +1,16 @@ +#ifndef _HD44780_FONT_H_ +#define _HD44780_FONT_H_ + +#include + +/* 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_ */ diff --git a/src/hd44780-font.c b/src/hd44780-font.c new file mode 100644 index 0000000..bb91cfb --- /dev/null +++ b/src/hd44780-font.c @@ -0,0 +1,218 @@ + +#include +#include + +/* 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]; +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..5d9f185 --- /dev/null +++ b/src/main.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include + +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; +}