Make scrolling look way better

This commit is contained in:
2026-01-16 20:09:51 +01:00
parent 6e7a92cba3
commit f975d21195
3 changed files with 37 additions and 48 deletions

View File

@@ -14,7 +14,6 @@ private:
unsigned long holdTick; unsigned long holdTick;
bool isScrolling; bool isScrolling;
std::function<void(TFT_eSprite*, bool)> postDrawCallback; std::function<void(TFT_eSprite*, bool)> postDrawCallback;
int usedW;
int usedH; int usedH;
static const unsigned long SCROLL_INTERVAL = 5; static const unsigned long SCROLL_INTERVAL = 5;
@@ -22,8 +21,8 @@ private:
static const int SCROLL_GAP = 10; static const int SCROLL_GAP = 10;
public: public:
ScrollingTextDisplay(TFT_eSprite* spr, int y, int maxW, int inuseW = -1, int inuseH = -1 ) : ScrollingTextDisplay(TFT_eSprite* spr, int y, int maxW, int inuseH = -1 ) :
sprite(spr), yPos(y), maxWidth(maxW), xPos(0), textWidth(0), lastTick(0), holdTick(0), isScrolling(false), postDrawCallback(nullptr), usedW(inuseW), usedH(inuseH) {} sprite(spr), yPos(y), maxWidth(maxW), xPos(0), textWidth(0), lastTick(0), holdTick(0), isScrolling(false), postDrawCallback(nullptr), usedH(inuseH) {}
void setPostDrawCallback(std::function<void(TFT_eSprite*, bool)> callback) { void setPostDrawCallback(std::function<void(TFT_eSprite*, bool)> callback) {
postDrawCallback = callback; postDrawCallback = callback;
@@ -74,11 +73,11 @@ public:
private: private:
void drawText(const String& text, bool status, uint16_t activeColor, uint16_t activeSmooth, uint16_t dropoutColor, uint16_t dropoutSmooth, uint16_t backgroundColor) { void drawText(const String& text, bool status, uint16_t activeColor, uint16_t activeSmooth, uint16_t dropoutColor, uint16_t dropoutSmooth, uint16_t backgroundColor) {
if(usedW > 0 && usedH > 0) { if(usedH > 0) {
sprite->fillSprite(TFT_TRANSPARENT); sprite->fillSprite(TFT_TRANSPARENT);
sprite->fillRect(0, 0, usedW, usedH, backgroundColor); sprite->fillRect(0, 0, maxWidth, usedH, backgroundColor);
sprite->setViewport(0, 0, usedW, usedH); sprite->setViewport(0, 0, maxWidth, usedH);
if(status) sprite->setTextColor(activeColor, activeSmooth, false); if(status) sprite->setTextColor(activeColor, activeSmooth, false);
else sprite->setTextColor(dropoutColor, dropoutSmooth, false); else sprite->setTextColor(dropoutColor, dropoutSmooth, false);
@@ -97,8 +96,6 @@ private:
if(isScrolling) sprite->drawString(text, xPos + textWidth + SCROLL_GAP, 0); if(isScrolling) sprite->drawString(text, xPos + textWidth + SCROLL_GAP, 0);
} }
sprite->fillRect(0, sprite->fontHeight(), sprite->width(), sprite->height() - sprite->fontHeight(), TFT_TRANSPARENT);
if(postDrawCallback) postDrawCallback(sprite, false); if(postDrawCallback) postDrawCallback(sprite, false);
sprite->pushSprite(35, yPos, TFT_TRANSPARENT); sprite->pushSprite(35, yPos, TFT_TRANSPARENT);
} }

View File

@@ -388,7 +388,7 @@ TFT_eSPI::TFT_eSPI(int16_t w, int16_t h)
textbgcolor = bitmap_bg = 0x0000; textbgcolor = bitmap_bg = 0x0000;
_fillbg = isDigits = textwrapY = false; _fillbg = isDigits = textwrapY = false;
textwrapX = true; textwrapX = false;
textdatum = TL_DATUM; textdatum = TL_DATUM;
_swapBytes = false; _swapBytes = false;
@@ -2256,7 +2256,6 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f
float alpha = 1.0f; float alpha = 1.0f;
ar += 0.5; ar += 0.5;
uint16_t bg = bg_color;
float xpax, ypay, bax = bx - ax, bay = by - ay; float xpax, ypay, bax = bx - ax, bay = by - ay;
begin_nin_write(); begin_nin_write();
@@ -2282,10 +2281,10 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f
} }
//Blend color with background and plot //Blend color with background and plot
if (bg_color == 0x00FFFFFF) { if (bg_color == 0x00FFFFFF) {
bg = readPixel(xp, yp); swin = true; bg_color = readPixel(xp, yp); swin = true;
} }
if (swin) { setWindow(xp, yp, x1, yp); swin = false; } if (swin) { setWindow(xp, yp, x1, yp); swin = false; }
pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg_color));
} }
} }
@@ -2309,10 +2308,10 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f
continue; continue;
} }
if (bg_color == 0x00FFFFFF) { if (bg_color == 0x00FFFFFF) {
bg = readPixel(xp, yp); swin = true; bg_color = readPixel(xp, yp); swin = true;
} }
if (swin) { setWindow(xp, yp, x1, yp); swin = false; } if (swin) { setWindow(xp, yp, x1, yp); swin = false; }
pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg_color));
} }
} }
@@ -2549,7 +2548,7 @@ int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8
uint16_t cheight = 8 * textsize; uint16_t cheight = 8 * textsize;
baseline = gFonts[font].maxAscent; baseline = gFonts[font].maxAscent;
cheight = fontHeight(font); cheight = fontHeight(font);
if (textdatum || padX) { if (textdatum || padX) {
switch(textdatum) { switch(textdatum) {
@@ -2862,14 +2861,9 @@ bool TFT_eSPI::getUnicodeIndex(uint16_t unicode, uint16_t *index, uint16_t font)
return false; return false;
} }
void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) {
{
uint16_t fg = textcolor;
uint16_t bg = textbgcolor;
// Check if cursor has moved // Check if cursor has moved
if (last_cursor_x != cursor_x) if (last_cursor_x != cursor_x) {
{
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;
last_cursor_x = cursor_x; last_cursor_x = cursor_x;
} }
@@ -2877,7 +2871,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font)
if (code < 0x21) if (code < 0x21)
{ {
if (code == 0x20) { if (code == 0x20) {
if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFonts[font].spaceWidth) - bg_cursor_x, gFonts[font].yAdvance, bg); if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFonts[font].spaceWidth) - bg_cursor_x, gFonts[font].yAdvance, textbgcolor);
cursor_x += gFonts[font].spaceWidth; cursor_x += gFonts[font].spaceWidth;
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;
last_cursor_x = cursor_x; last_cursor_x = cursor_x;
@@ -2958,16 +2952,16 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font)
if (pixel) if (pixel)
{ {
if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } if (bl) { drawFastHLine( bxs, y + cy, bl, textbgcolor); bl = 0; }
if (pixel != 0xFF) if (pixel != 0xFF)
{ {
if (fl) { if (fl) {
if (fl==1) drawPixel(fxs, y + cy, fg); if (fl==1) drawPixel(fxs, y + cy, textcolor);
else drawFastHLine( fxs, y + cy, fl, fg); else drawFastHLine( fxs, y + cy, fl, textcolor);
fl = 0; fl = 0;
} }
if (getColor) bg = getColor(x + cx, y + cy); if (getColor) textbgcolor = getColor(x + cx, y + cy);
drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg)); drawPixel(x + cx, y + cy, alphaBlend(pixel, textcolor, textbgcolor));
} }
else else
{ {
@@ -2977,7 +2971,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font)
} }
else else
{ {
if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } if (fl) { drawFastHLine( fxs, y + cy, fl, textcolor); fl = 0; }
if (_fillbg) { if (_fillbg) {
if (x >= bx) { if (x >= bx) {
if (bl==0) bxs = x + cx; if (bl==0) bxs = x + cx;
@@ -2986,8 +2980,8 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font)
} }
} }
} }
if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } if (fl) { drawFastHLine( fxs, y + cy, fl, textcolor); fl = 0; }
if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } if (bl) { drawFastHLine( bxs, y + cy, bl, textcolor); bl = 0; }
} }
// Fill area below glyph // Fill area below glyph
@@ -3005,7 +2999,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font)
else else
{ {
// Point code not in font so draw a rectangle and move on cursor // Point code not in font so draw a rectangle and move on cursor
drawRect(cursor_x, cursor_y + gFonts[font].maxAscent - gFonts[font].ascent, gFonts[font].spaceWidth, gFonts[font].ascent, fg); drawRect(cursor_x, cursor_y + gFonts[font].maxAscent - gFonts[font].ascent, gFonts[font].spaceWidth, gFonts[font].ascent, textcolor);
cursor_x += gFonts[font].spaceWidth + 1; cursor_x += gFonts[font].spaceWidth + 1;
} }
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;
@@ -4474,10 +4468,8 @@ int16_t TFT_eSprite::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t fo
void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font) void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
{ {
uint16_t fg = textcolor;
uint16_t bg = textbgcolor;
bool getBG = false; bool getBG = false;
if (fg == bg) getBG = true; if (textcolor == textbgcolor) getBG = true;
// Check if cursor has moved // Check if cursor has moved
if (last_cursor_x != cursor_x) { if (last_cursor_x != cursor_x) {
@@ -4487,7 +4479,7 @@ void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
if (code < 0x21) { if (code < 0x21) {
if (code == 0x20) { if (code == 0x20) {
if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFonts[font].spaceWidth) - bg_cursor_x, gFonts[font].yAdvance, bg); if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFonts[font].spaceWidth) - bg_cursor_x, gFonts[font].yAdvance, textbgcolor);
cursor_x += gFonts[font].spaceWidth; cursor_x += gFonts[font].spaceWidth;
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;
last_cursor_x = cursor_x; last_cursor_x = cursor_x;
@@ -4511,7 +4503,7 @@ void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
bool newSprite = !_created; bool newSprite = !_created;
if (newSprite) { if (newSprite) {
createSprite(gWidth[font][gNum], gFonts[font].yAdvance); createSprite(gWidth[font][gNum], gFonts[font].yAdvance);
if(fg != bg) fillSprite(bg); if(textcolor != textbgcolor) fillSprite(textbgcolor);
cursor_x = -gdX[font][gNum]; cursor_x = -gdX[font][gNum];
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;
last_cursor_x = cursor_x; last_cursor_x = cursor_x;
@@ -4566,22 +4558,22 @@ void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
pixel = pgm_read_byte(gPtr + gBitmap[font][gNum] + x + gWidth[font][gNum] * y); pixel = pgm_read_byte(gPtr + gBitmap[font][gNum] + x + gWidth[font][gNum] * y);
if (pixel) { if (pixel) {
if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } if (bl) { drawFastHLine( bxs, y + cy, bl, textbgcolor); bl = 0; }
if (pixel != 0xFF) if (pixel != 0xFF)
{ {
if (fl) { if (fl) {
if (fl==1) drawPixel(fxs, y + cy, fg); if (fl==1) drawPixel(fxs, y + cy, textcolor);
else drawFastHLine( fxs, y + cy, fl, fg); else drawFastHLine( fxs, y + cy, fl, textcolor);
fl = 0; fl = 0;
} }
if (getBG) bg = readPixel(x + cx, y + cy); if (getBG) textbgcolor = readPixel(x + cx, y + cy);
drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg)); drawPixel(x + cx, y + cy, alphaBlend(pixel, textcolor, textbgcolor));
} else { } else {
if (fl==0) fxs = x + cx; if (fl==0) fxs = x + cx;
fl++; fl++;
} }
} else { } else {
if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } if (fl) { drawFastHLine( fxs, y + cy, fl, textcolor); fl = 0; }
if (_fillbg) { if (_fillbg) {
if (x >= bx) { if (x >= bx) {
if (bl==0) bxs = x + cx; if (bl==0) bxs = x + cx;
@@ -4590,8 +4582,8 @@ void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
} }
} }
} }
if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } if (fl) { drawFastHLine( fxs, y + cy, fl, textcolor); fl = 0; }
if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } if (bl) { drawFastHLine( bxs, y + cy, bl, textbgcolor); bl = 0; }
} }
// Fill area below glyph // Fill area below glyph
@@ -4609,7 +4601,7 @@ void TFT_eSprite::drawGlyph(uint16_t code, uint16_t font)
} }
} }
else { else {
drawRect(cursor_x, cursor_y + gFonts[font].maxAscent - gFonts[font].ascent, gFonts[font].spaceWidth, gFonts[font].ascent, fg); drawRect(cursor_x, cursor_y + gFonts[font].maxAscent - gFonts[font].ascent, gFonts[font].spaceWidth, gFonts[font].ascent, textcolor);
cursor_x += gFonts[font].spaceWidth + 1; cursor_x += gFonts[font].spaceWidth + 1;
} }
bg_cursor_x = cursor_x; bg_cursor_x = cursor_x;

View File

@@ -351,7 +351,7 @@ WiFiClient RemoteClient;
WiFiUDP Udp; WiFiUDP Udp;
WebServer webserver(80); WebServer webserver(80);
ScrollingTextDisplay rtplusDisplay(&GeneralTextSprite, 147, 180, 165, 19); ScrollingTextDisplay rtplusDisplay(&GeneralTextSprite, 147, 173, 19);
ScrollingTextDisplay eonDisplay(&GeneralTextSprite, 174, 180, 165, 19); ScrollingTextDisplay eonDisplay(&GeneralTextSprite, 174, 173, 19);
ScrollingTextDisplay eccDisplay(&FullLineSprite, 198, 270); ScrollingTextDisplay eccDisplay(&FullLineSprite, 198, 270);
ScrollingTextDisplay rtDisplay(&FullLineSprite, 220, 270); ScrollingTextDisplay rtDisplay(&FullLineSprite, 220, 270);