154 lines
8.0 KiB
C++
154 lines
8.0 KiB
C++
#ifndef DISPLAYMATRIX_PRINT_H
|
|
#define DISPLAYMATRIX_PRINT_H
|
|
|
|
#include "DisplayMatrix_FontLower.h"
|
|
#include "DisplayMatrix_FontNumber.h"
|
|
#include "DisplayMatrix_FontNumberSegments.h"
|
|
#include "DisplayMatrix_FontSpecial.h"
|
|
#include "DisplayMatrix_FontUpper.h"
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::printf(const char *format, ...) {
|
|
va_list args;
|
|
va_start(args, format);
|
|
printf(false, format, args);
|
|
va_end(args);
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::printf(const bool segments, const char *format, ...) {
|
|
va_list args;
|
|
va_start(args, format);
|
|
printf(segments, format, args);
|
|
va_end(args);
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::printf(const bool segments, const char *format, const va_list args) {
|
|
char buffer[64];
|
|
vsnprintf(buffer, sizeof buffer, format, args);
|
|
print(segments, buffer);
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::print(const char *message) {
|
|
print(false, message);
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::print(const bool segments, const char *message) {
|
|
while (*message != '\0') {
|
|
print(segments, &message);
|
|
cursorX += 2; // space between characters
|
|
}
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::print(const bool segments, const char **cPP) {
|
|
const auto a = *(*cPP)++;
|
|
auto b = '\0';
|
|
if (a == 0xC2) {
|
|
b = *(*cPP)++;
|
|
switch (b) { // NOLINT(*-multiway-paths-covered)
|
|
case 0xB0: return print(reinterpret_cast<bool *>(FONT_CHAR_DEGREE), countof(FONT_CHAR_DEGREE[0]), countof(FONT_CHAR_DEGREE));
|
|
default: return print(reinterpret_cast<bool *>(FONT_ERROR_), countof(FONT_ERROR_[0]), countof(FONT_ERROR_));
|
|
}
|
|
}
|
|
if (a == 0xE2) {
|
|
auto c = '\0';
|
|
b = *(*cPP)++;
|
|
switch (b) { // NOLINT(*-multiway-paths-covered)
|
|
case 0x82:
|
|
c = *(*cPP)++;
|
|
switch (c) { // NOLINT(*-multiway-paths-covered)
|
|
case 0xAC: return print(reinterpret_cast<bool *>(FONT_CHAR_EURO), countof(FONT_CHAR_EURO[0]), countof(FONT_CHAR_EURO));
|
|
default: return print(reinterpret_cast<bool *>(FONT_ERROR_), countof(FONT_ERROR_[0]), countof(FONT_ERROR_));
|
|
}
|
|
default: return print(reinterpret_cast<bool *>(FONT_ERROR_), countof(FONT_ERROR_[0]), countof(FONT_ERROR_));
|
|
}
|
|
}
|
|
|
|
if ('a' <= a && a <= 'z') {
|
|
return print(reinterpret_cast<bool *>(FONT_LOWER[a - 'a']), countof(FONT_LOWER[a - 'a'][0]), countof(FONT_LOWER[a - 'a']));
|
|
}
|
|
if ('A' <= a && a <= 'Z') {
|
|
return print(reinterpret_cast<bool *>(FONT_UPPER[a - 'A']), countof(FONT_UPPER[a - 'A'][0]), countof(FONT_UPPER[a - 'A']));
|
|
}
|
|
if ('0' <= a && a <= '9') {
|
|
if (segments){
|
|
return print(reinterpret_cast<bool *>(FONT_NUMBER[a - '0']), countof(FONT_NUMBER[a - '0'][0]), countof(FONT_NUMBER[a - '0']));
|
|
}
|
|
return print(reinterpret_cast<bool *>(FONT_NUMBER_SEGMENTS[a - '0']), countof(FONT_NUMBER_SEGMENTS[a - '0'][0]), countof(FONT_NUMBER_SEGMENTS[a - '0']));
|
|
}
|
|
switch (a) {
|
|
case ' ': return print(reinterpret_cast<bool *>(FONT_CHAR_SPACE), countof(FONT_CHAR_SPACE[0]), countof(FONT_CHAR_SPACE));
|
|
case '-': return print(reinterpret_cast<bool *>(FONT_CHAR_MINUS), countof(FONT_CHAR_MINUS[0]), countof(FONT_CHAR_MINUS));
|
|
case '+': return print(reinterpret_cast<bool *>(FONT_CHAR_PLUS), countof(FONT_CHAR_PLUS[0]), countof(FONT_CHAR_PLUS));
|
|
case '_': return print(reinterpret_cast<bool *>(FONT_CHAR_UNDERLINE), countof(FONT_CHAR_UNDERLINE[0]), countof(FONT_CHAR_UNDERLINE));
|
|
case '%': return print(reinterpret_cast<bool *>(FONT_CHAR_PERCENT), countof(FONT_CHAR_PERCENT[0]), countof(FONT_CHAR_PERCENT));
|
|
case '?': return print(reinterpret_cast<bool *>(FONT_CHAR_QUESTION), countof(FONT_CHAR_QUESTION[0]), countof(FONT_CHAR_QUESTION));
|
|
case '!': return print(reinterpret_cast<bool *>(FONT_CHAR_EXCLAMATION), countof(FONT_CHAR_EXCLAMATION[0]), countof(FONT_CHAR_EXCLAMATION));
|
|
case '.': return print(reinterpret_cast<bool *>(FONT_CHAR_POINT), countof(FONT_CHAR_POINT[0]), countof(FONT_CHAR_POINT));
|
|
case ',': return print(reinterpret_cast<bool *>(FONT_CHAR_COMMA), countof(FONT_CHAR_COMMA[0]), countof(FONT_CHAR_COMMA));
|
|
case ';': return print(reinterpret_cast<bool *>(FONT_CHAR_SEMICOLON), countof(FONT_CHAR_SEMICOLON[0]), countof(FONT_CHAR_SEMICOLON));
|
|
case ':': return print(reinterpret_cast<bool *>(FONT_CHAR_COLON), countof(FONT_CHAR_COLON[0]), countof(FONT_CHAR_COLON));
|
|
case '#': return print(reinterpret_cast<bool *>(FONT_CHAR_SHARP), countof(FONT_CHAR_SHARP[0]), countof(FONT_CHAR_SHARP));
|
|
case '~': return print(reinterpret_cast<bool *>(FONT_CHAR_TILDE), countof(FONT_CHAR_TILDE[0]), countof(FONT_CHAR_TILDE));
|
|
case '*': return print(reinterpret_cast<bool *>(FONT_CHAR_ASTERISK), countof(FONT_CHAR_ASTERISK[0]), countof(FONT_CHAR_ASTERISK));
|
|
case '"': return print(reinterpret_cast<bool *>(FONT_CHAR_QUOTE_DOUBLE), countof(FONT_CHAR_QUOTE_DOUBLE[0]), countof(FONT_CHAR_QUOTE_DOUBLE));
|
|
case '\'': return print(reinterpret_cast<bool *>(FONT_CHAR_QUOTE_SINGLE), countof(FONT_CHAR_QUOTE_SINGLE[0]), countof(FONT_CHAR_QUOTE_SINGLE));
|
|
case '=': return print(reinterpret_cast<bool *>(FONT_CHAR_EQUALS), countof(FONT_CHAR_EQUALS[0]), countof(FONT_CHAR_EQUALS));
|
|
case '(': return print(reinterpret_cast<bool *>(FONT_CHAR_PAR_L), countof(FONT_CHAR_PAR_L[0]), countof(FONT_CHAR_PAR_L));
|
|
case ')': return print(reinterpret_cast<bool *>(FONT_CHAR_PAR_R), countof(FONT_CHAR_PAR_R[0]), countof(FONT_CHAR_PAR_R));
|
|
case '[': return print(reinterpret_cast<bool *>(FONT_CHAR_BRACKET_L), countof(FONT_CHAR_BRACKET_L[0]), countof(FONT_CHAR_BRACKET_L));
|
|
case ']': return print(reinterpret_cast<bool *>(FONT_CHAR_BRACKET_R), countof(FONT_CHAR_BRACKET_R[0]), countof(FONT_CHAR_BRACKET_R));
|
|
case '{': return print(reinterpret_cast<bool *>(FONT_CHAR_CURL_L), countof(FONT_CHAR_CURL_L[0]), countof(FONT_CHAR_CURL_L));
|
|
case '}': return print(reinterpret_cast<bool *>(FONT_CHAR_CURL_R), countof(FONT_CHAR_CURL_R[0]), countof(FONT_CHAR_CURL_R));
|
|
case '/': return print(reinterpret_cast<bool *>(FONT_CHAR_SLASH), countof(FONT_CHAR_SLASH[0]), countof(FONT_CHAR_SLASH));
|
|
case '\\': return print(reinterpret_cast<bool *>(FONT_CHAR_BACKSLASH), countof(FONT_CHAR_BACKSLASH[0]), countof(FONT_CHAR_BACKSLASH));
|
|
case '&': return print(reinterpret_cast<bool *>(FONT_CHAR_AND), countof(FONT_CHAR_AND[0]), countof(FONT_CHAR_AND));
|
|
case '|': return print(reinterpret_cast<bool *>(FONT_CHAR_PIPE), countof(FONT_CHAR_PIPE[0]), countof(FONT_CHAR_PIPE));
|
|
case '$': return print(reinterpret_cast<bool *>(FONT_CHAR_DOLLAR), countof(FONT_CHAR_DOLLAR[0]), countof(FONT_CHAR_DOLLAR));
|
|
case '@': return print(reinterpret_cast<bool *>(FONT_CHAR_AT), countof(FONT_CHAR_AT[0]), countof(FONT_CHAR_AT));
|
|
case '<': return print(reinterpret_cast<bool *>(FONT_CHAR_LT), countof(FONT_CHAR_LT[0]), countof(FONT_CHAR_LT));
|
|
case '>': return print(reinterpret_cast<bool *>(FONT_CHAR_GT), countof(FONT_CHAR_GT[0]), countof(FONT_CHAR_GT));
|
|
default: return print(reinterpret_cast<bool *>(FONT_ERROR_), countof(FONT_ERROR_[0]), countof(FONT_ERROR_));
|
|
}
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::print(bool *s, const size_t w, const size_t h) {
|
|
auto symbolMaxX = 0;
|
|
for (auto symbolY = 0; symbolY < h; symbolY++) {
|
|
for (auto symbolX = 0; symbolX < w; symbolX++) {
|
|
const auto symbolIndex = symbolY * w + symbolX;
|
|
const auto active = *(s + symbolIndex);
|
|
const auto pixelX = cursorX + symbolX;
|
|
const auto pixelY = cursorY + symbolY;
|
|
if (active) {
|
|
setPixel(pixelX, pixelY);
|
|
symbolMaxX = max(symbolX, symbolMaxX);
|
|
} else {
|
|
setPixel(pixelX, pixelY, background);
|
|
}
|
|
}
|
|
}
|
|
cursorX += symbolMaxX;
|
|
}
|
|
|
|
template<int W, int H>
|
|
void DisplayMatrix<W, H>::print(RGBA *s, const size_t w, const size_t h) {
|
|
for (auto symbolY = 0; symbolY < h; symbolY++) {
|
|
for (auto symbolX = 0; symbolX < w; symbolX++) {
|
|
const auto symbolIndex = symbolY * w + symbolX;
|
|
const auto color = *(s + symbolIndex);
|
|
const auto pixelX = cursorX + symbolX;
|
|
const auto pixelY = cursorY + symbolY;
|
|
setPixel(pixelX, pixelY, color);
|
|
}
|
|
}
|
|
cursorX += w;
|
|
}
|
|
|
|
#endif
|