mirror of
https://github.com/alexandrebobkov/ESP-Nodes.git
synced 2024-10-05 20:47:50 -04:00
444 lines
12 KiB
C++
444 lines
12 KiB
C++
// class GxFont_GFX : Font Rendering Graphics Switch and Bridge Class
|
|
//
|
|
// This class allows to connect GxEPD to additional font rendering classes.
|
|
//
|
|
// U8G2_FOR_ADAFRUIT_GFX: Arduino Library that makes all U8G2 fonts available (Oliver Kraus)
|
|
// avaliable from: https://github.com/olikraus/U8g2_for_Adafruit_GFX
|
|
//
|
|
// GxFont_GFX_TFT_eSPI: fonts and font rendering of TFT_eSPI library (Bodmer)
|
|
// available here: https://github.com/ZinggJM/GxFont_GFX_TFT_eSPI
|
|
//
|
|
// Adafruit_ftGFX: a Adafruit_GFX variant with different fonts.
|
|
// need to use modified clone from: https://github.com/ZinggJM/Adafruit_ftGFX
|
|
// (no additional fonts, as all are now part of Adafruit_GFX)
|
|
//
|
|
// Author : J-M Zingg
|
|
//
|
|
// Version : see library.properties
|
|
//
|
|
// License: GNU GENERAL PUBLIC LICENSE V3, see LICENSE
|
|
//
|
|
// Library: https://github.com/ZinggJM/GxEPD
|
|
|
|
#include "GxFont_GFX.h"
|
|
|
|
//#define DIAG_UTF8(x) x
|
|
//#define DIAG(x) x
|
|
|
|
#ifndef DIAG_UTF8
|
|
#define DIAG_UTF8(x)
|
|
#endif
|
|
#ifndef DIAG
|
|
#define DIAG(x)
|
|
#endif
|
|
|
|
enum eFont_GFX
|
|
{
|
|
U8g2_for_Adafruit_GFX_font_gfx, Adafruit_GFX_font_gfx, Adafruit_ftGFX_font_gfx, GxFont_GFX_TFT_eSPI_font_gfx
|
|
};
|
|
|
|
GxFont_GFX::GxFont_GFX(int16_t w, int16_t h) : Adafruit_GFX(w, h)
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
, _U8G2_FONTS_GFX(*this)
|
|
#endif
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
, _GxF_Adafruit_ftGFX(*this, w, h)
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
, _GxF_GxFont_GFX_TFT_eSPI(*this, w, h)
|
|
#endif
|
|
{
|
|
_font_gfx = Adafruit_GFX_font_gfx;
|
|
}
|
|
|
|
void GxFont_GFX::setFont(const GFXfont *f)
|
|
{
|
|
_font_gfx = Adafruit_GFX_font_gfx;
|
|
Adafruit_GFX::setFont(f);
|
|
}
|
|
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
|
|
void GxFont_GFX::setFont(const uint8_t *font)
|
|
{
|
|
_font_gfx = U8g2_for_Adafruit_GFX_font_gfx;
|
|
_U8G2_FONTS_GFX.setFont(font);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
|
|
void GxFont_GFX::GxF_Adafruit_ftGFX::drawPixel(int16_t x, int16_t y, uint16_t color)
|
|
{
|
|
_container.drawPixel(x, y, color);
|
|
}
|
|
|
|
void GxFont_GFX::setFont(uint8_t f)
|
|
{
|
|
_font_gfx = Adafruit_ftGFX_font_gfx;
|
|
_GxF_Adafruit_ftGFX.setFont(f);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
|
|
void GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::drawPixel(uint32_t x, uint32_t y, uint32_t color)
|
|
{
|
|
//Serial.print("GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::drawPixel("); Serial.print(color); Serial.println(")"); yield();
|
|
_container.drawPixel(x, y, color);
|
|
}
|
|
|
|
void GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color)
|
|
{
|
|
//Serial.print("GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::drawFastHLine("); Serial.print(color); Serial.println(")"); yield();
|
|
_container.drawFastHLine(x, y, w, color);
|
|
}
|
|
|
|
void GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)
|
|
{
|
|
//Serial.print("GxFont_GFX::GxF_GxFont_GFX_TFT_eSPI::fillRect("); Serial.print(color); Serial.println(")"); yield();
|
|
_container.fillRect(x, y, w, h, color);
|
|
}
|
|
|
|
#ifdef LOAD_GFXFF
|
|
void GxFont_GFX::setFreeFont(const GFXfont *f)
|
|
{
|
|
_font_gfx = GxFont_GFX_TFT_eSPI_font_gfx;
|
|
_GxF_GxFont_GFX_TFT_eSPI.setFreeFont(f);
|
|
}
|
|
|
|
void GxFont_GFX::setTextFont(uint8_t font)
|
|
{
|
|
_font_gfx = GxFont_GFX_TFT_eSPI_font_gfx;
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextFont(font);
|
|
}
|
|
|
|
#else
|
|
|
|
void GxFont_GFX::setFreeFont(uint8_t font)
|
|
{
|
|
_font_gfx = GxFont_GFX_TFT_eSPI_font_gfx;
|
|
_GxF_GxFont_GFX_TFT_eSPI.setFreeFont(font);
|
|
}
|
|
|
|
void GxFont_GFX::setTextFont(uint8_t font)
|
|
{
|
|
_font_gfx = GxFont_GFX_TFT_eSPI_font_gfx;
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextFont(font);
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if defined(U8g2_for_Adafruit_GFX_h) || defined(_GxFont_GFX_TFT_eSPI_H_)|| defined(_ADAFRUIT_TF_GFX_H_)
|
|
|
|
void GxFont_GFX::setCursor(int16_t x, int16_t y)
|
|
{
|
|
Adafruit_GFX::setCursor(x, y);
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
_U8G2_FONTS_GFX.setCursor(x, y);
|
|
#endif
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
_GxF_Adafruit_ftGFX.setCursor(x, y);
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
_GxF_GxFont_GFX_TFT_eSPI.setCursor(x, y);
|
|
#endif
|
|
}
|
|
|
|
size_t GxFont_GFX::write(uint8_t v)
|
|
{
|
|
DIAG (Serial.write(v); Serial.println();)
|
|
DIAG_UTF8(if (v > 127) Serial.println(v, HEX);)
|
|
switch (_font_gfx)
|
|
{
|
|
case Adafruit_GFX_font_gfx:
|
|
Adafruit_GFX::write(v);
|
|
break;
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
case U8g2_for_Adafruit_GFX_font_gfx:
|
|
_U8G2_FONTS_GFX.write(v);
|
|
break;
|
|
#endif
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
case Adafruit_ftGFX_font_gfx:
|
|
_GxF_Adafruit_ftGFX.write(v);
|
|
break;
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
case GxFont_GFX_TFT_eSPI_font_gfx:
|
|
_GxF_GxFont_GFX_TFT_eSPI.write(v);
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int16_t GxFont_GFX::getCursorX(void) const
|
|
{
|
|
switch (_font_gfx)
|
|
{
|
|
case Adafruit_GFX_font_gfx:
|
|
return Adafruit_GFX::getCursorX();
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
case U8g2_for_Adafruit_GFX_font_gfx:
|
|
return const_cast<U8G2_FONTS_GFX&>(_U8G2_FONTS_GFX).getCursorX();
|
|
#endif
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
case Adafruit_ftGFX_font_gfx:
|
|
return _GxF_Adafruit_ftGFX.getCursorX();
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
case GxFont_GFX_TFT_eSPI_font_gfx:
|
|
return _GxF_GxFont_GFX_TFT_eSPI.getCursorX();
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int16_t GxFont_GFX::getCursorY(void) const
|
|
{
|
|
switch (_font_gfx)
|
|
{
|
|
case Adafruit_GFX_font_gfx:
|
|
return Adafruit_GFX::getCursorY();
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
case U8g2_for_Adafruit_GFX_font_gfx:
|
|
return const_cast<U8G2_FONTS_GFX&>(_U8G2_FONTS_GFX).getCursorY();
|
|
#endif
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
case Adafruit_ftGFX_font_gfx:
|
|
return _GxF_Adafruit_ftGFX.getCursorY();
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
case GxFont_GFX_TFT_eSPI_font_gfx:
|
|
return _GxF_GxFont_GFX_TFT_eSPI.getCursorY();
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(U8g2_for_Adafruit_GFX_h)
|
|
|
|
void GxFont_GFX::home(void)
|
|
{
|
|
_U8G2_FONTS_GFX.home();
|
|
}
|
|
|
|
void GxFont_GFX::setFontMode(uint8_t is_transparent)
|
|
{
|
|
_U8G2_FONTS_GFX.setFontMode(is_transparent);
|
|
}
|
|
|
|
void GxFont_GFX::setFontDirection(uint8_t d)
|
|
{
|
|
_U8G2_FONTS_GFX.setFontDirection(d);
|
|
}
|
|
|
|
void GxFont_GFX::setForegroundColor(uint16_t fg)
|
|
{
|
|
_U8G2_FONTS_GFX.setForegroundColor(fg);
|
|
}
|
|
|
|
void GxFont_GFX::setBackgroundColor(uint16_t bg)
|
|
{
|
|
_U8G2_FONTS_GFX.setBackgroundColor(bg);
|
|
}
|
|
|
|
int8_t GxFont_GFX::getFontAscent(void)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.getFontAscent() : 0);
|
|
}
|
|
|
|
int8_t GxFont_GFX::getFontDescent(void)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.getFontDescent() : 0);
|
|
}
|
|
|
|
int8_t GxFont_GFX::getFontHeight(void)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.u8g2.font_info.max_char_height : 0);
|
|
}
|
|
|
|
int16_t GxFont_GFX::drawGlyph(int16_t x, int16_t y, uint16_t e)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.drawGlyph(x, y, e) : 0);
|
|
}
|
|
|
|
int16_t GxFont_GFX::drawStr(int16_t x, int16_t y, const char *s)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.drawStr(x, y, s) : 0);
|
|
}
|
|
|
|
int16_t GxFont_GFX::drawUTF8(int16_t x, int16_t y, const char *str)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.drawUTF8(x, y, str) : 0);
|
|
}
|
|
|
|
int16_t GxFont_GFX::getUTF8Width(const char *str)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.getUTF8Width(str) : 0);
|
|
}
|
|
|
|
uint16_t GxFont_GFX::utf8_next(uint8_t b)
|
|
{
|
|
return ((_font_gfx == U8g2_for_Adafruit_GFX_font_gfx) ? _U8G2_FONTS_GFX.utf8_next(b) : 0);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(_ADAFRUIT_TF_GFX_H_) || defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
|
|
void GxFont_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)
|
|
{
|
|
switch (_font_gfx)
|
|
{
|
|
case Adafruit_GFX_font_gfx:
|
|
Adafruit_GFX::drawChar(x, y, c, color, bg, size);
|
|
break;
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
case Adafruit_ftGFX_font_gfx:
|
|
_GxF_Adafruit_ftGFX.drawChar(x, y, c, color, bg, size);
|
|
break;
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
case GxFont_GFX_TFT_eSPI_font_gfx:
|
|
_GxF_GxFont_GFX_TFT_eSPI.drawChar(x, y, c, color, bg, size);
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void GxFont_GFX::setTextColor(uint16_t c)
|
|
{
|
|
Adafruit_GFX::setTextColor(c);
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
_GxF_Adafruit_ftGFX.setTextColor(c);
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextColor(c);
|
|
#endif
|
|
}
|
|
|
|
void GxFont_GFX::setTextColor(uint16_t c, uint16_t bg)
|
|
{
|
|
Adafruit_GFX::setTextColor(c, bg);
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
_GxF_Adafruit_ftGFX.setTextColor(c, bg);
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextColor(c, bg);
|
|
#endif
|
|
}
|
|
|
|
void GxFont_GFX::setTextSize(uint8_t s)
|
|
{
|
|
Adafruit_GFX::setTextSize(s);
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
_GxF_Adafruit_ftGFX.setTextSize(s);
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextSize(s);
|
|
#endif
|
|
}
|
|
|
|
void GxFont_GFX::setTextWrap(boolean w)
|
|
{
|
|
Adafruit_GFX::setTextWrap(w);
|
|
#if defined(_ADAFRUIT_TF_GFX_H_)
|
|
_GxF_Adafruit_ftGFX.setTextWrap(w);
|
|
#endif
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
_GxF_GxFont_GFX_TFT_eSPI.setTextWrap(w);
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(_GxFont_GFX_TFT_eSPI_H_)
|
|
void GxFont_GFX::setTextDatum(uint8_t datum)
|
|
{
|
|
if (_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) _GxF_GxFont_GFX_TFT_eSPI.setTextDatum(datum);
|
|
}
|
|
void GxFont_GFX::setTextPadding(uint16_t x_width)
|
|
{
|
|
if (_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) _GxF_GxFont_GFX_TFT_eSPI.setTextPadding(x_width);
|
|
}
|
|
uint8_t GxFont_GFX::getTextDatum()
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.getTextDatum() : 0);
|
|
}
|
|
uint8_t GxFont_GFX::color16to8(uint16_t color565) // Convert 16 bit colour to 8 bits
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.color16to8(color565) : 0);
|
|
}
|
|
uint16_t GxFont_GFX::fontsLoaded(void)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.fontsLoaded() : 0);
|
|
}
|
|
uint16_t GxFont_GFX::color565(uint8_t r, uint8_t g, uint8_t b)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.color565(r, g, b) : 0);
|
|
}
|
|
uint16_t GxFont_GFX::color8to16(uint8_t color332) // Convert 8 bit colour to 16 bits
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.color8to16(color332) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawNumber(long long_num, int poX, int poY, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawNumber(long_num, poX, poY, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawNumber(long long_num, int poX, int poY)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawNumber(long_num, poX, poY) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawFloat(float floatNumber, int decimal, int poX, int poY, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawFloat(floatNumber, decimal, poX, poY, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawFloat(float floatNumber, int decimal, int poX, int poY)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawFloat(floatNumber, decimal, poX, poY) : 0);
|
|
}
|
|
// Handle char arrays
|
|
int16_t GxFont_GFX::drawString(const char *string, int poX, int poY, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawString(string, poX, poY, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawString(const char *string, int poX, int poY)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawString(string, poX, poY) : 0);
|
|
}
|
|
// Handle String type
|
|
int16_t GxFont_GFX::drawString(const String& string, int poX, int poY, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawString(string, poX, poY, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::drawString(const String& string, int poX, int poY)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.drawString(string, poX, poY) : 0);
|
|
}
|
|
int16_t GxFont_GFX::textWidth(const char *string, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.textWidth(string, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::textWidth(const char *string)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.textWidth(string) : 0);
|
|
}
|
|
int16_t GxFont_GFX::textWidth(const String& string, int font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.textWidth(string, font) : 0);
|
|
}
|
|
int16_t GxFont_GFX::textWidth(const String& string)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.textWidth(string) : 0);
|
|
}
|
|
int16_t GxFont_GFX::fontHeight(int16_t font)
|
|
{
|
|
return ((_font_gfx == GxFont_GFX_TFT_eSPI_font_gfx) ? _GxF_GxFont_GFX_TFT_eSPI.fontHeight(font) : 0);
|
|
}
|
|
#endif
|