From 22ca8193c532b8634c1201829affda5ccb60335e Mon Sep 17 00:00:00 2001 From: Bodmer Date: Fri, 2 Oct 2020 22:00:03 +0100 Subject: [PATCH] Improve RLE font rendering See #766 --- TFT_eSPI.cpp | 28 ++++++++++++++++------------ TFT_eSPI.h | 2 +- library.json | 2 +- library.properties | 2 +- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/TFT_eSPI.cpp b/TFT_eSPI.cpp index ab3f3ca..59d6276 100644 --- a/TFT_eSPI.cpp +++ b/TFT_eSPI.cpp @@ -3570,8 +3570,7 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) inTransaction = true; w *= height; // Now w is total number of pixels in the character - if ((textsize != 1) || (textcolor == textbgcolor)) { - if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize * height, textbgcolor); + if (textcolor == textbgcolor) { int32_t px = 0, py = pY; // To hold character block start and end column and row values int32_t pc = 0; // Pixel count uint8_t np = textsize * textsize; // Number of pixels in a drawn pixel @@ -3618,9 +3617,9 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) } } else { - // Text colour != background && textsize = 1 and character is within screen area + // Text colour != background and textsize = 1 and character is within screen area // so use faster drawing of characters and background using block write - if ((x >= 0) && (x + width <= _width) && (y >= 0) && (y + height <= _height)) + if ((textsize == 1) && (x >= 0) && (x + width <= _width) && (y >= 0) && (y + height <= _height)) { setWindow(x, y, x + width - 1, y + height - 1); @@ -3640,7 +3639,8 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) } else { - int32_t px = x, py = y; // To hold character block start and end column and row values + int32_t px = 0, py = 0; // To hold character pixel coords + int32_t tx = 0, ty = 0; // To hold character TFT pixel coords int32_t pc = 0; // Pixel count int32_t pl = 0; // Pixel line length uint16_t pcol = 0; // Pixel color @@ -3651,21 +3651,25 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) if (line & 0x80) { pcol = textcolor; line &= 0x7F; } else pcol = textbgcolor; line++; - px = x + pc % width; - py = y + pc / width; + px = pc % width; + tx = x + textsize * px; + py = pc / width; + ty = y + textsize * py; pl = 0; pc += line; - while (line--) { // In this case the while(line--) is faster + while (line--) { pl++; - if ((px+pl) >= (x + width)) { - drawFastHLine(px, py, pl, pcol); + if ((px+pl) >= width) { + fillRect(tx, ty, pl * textsize, textsize, pcol); pl = 0; - px = x; + px = 0; + tx = x; py ++; + ty += textsize; } } - if (pl)drawFastHLine(px, py, pl, pcol); + if (pl) fillRect(tx, ty, pl * textsize, textsize, pcol); } } } diff --git a/TFT_eSPI.h b/TFT_eSPI.h index 68c7c60..07ceabe 100644 --- a/TFT_eSPI.h +++ b/TFT_eSPI.h @@ -16,7 +16,7 @@ #ifndef _TFT_eSPIH_ #define _TFT_eSPIH_ -#define TFT_ESPI_VERSION "2.2.22" +#define TFT_ESPI_VERSION "2.2.23" /*************************************************************************************** ** Section 1: Load required header files diff --git a/library.json b/library.json index ebf197a..07bd791 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TFT_eSPI", - "version": "2.2.22", + "version": "2.2.23", "keywords": "Arduino, tft, ePaper, display, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9486, ST7789, RM68140", "description": "A TFT and ePaper SPI graphics library with optimisation for ESP8266, ESP32 and STM32", "repository": diff --git a/library.properties b/library.properties index e20d1d6..caef235 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TFT_eSPI -version=2.2.22 +version=2.2.23 author=Bodmer maintainer=Bodmer sentence=TFT graphics library for Arduino processors with performance optimisation for STM32, ESP8266 and ESP32