The font is now fixed width.

HUGE performance improvement of the display driver.
This commit is contained in:
JF
2019-12-07 19:15:33 +01:00
parent 6fbb6c8f70
commit 528fc56616
8 changed files with 4356 additions and 4279 deletions

View File

@@ -8,7 +8,11 @@ Gfx::Gfx(Pinetime::Drivers::St7789 &lcd) : lcd{lcd} {
}
void Gfx::ClearScreen() {
lcd.FillRectangle(0, 0, width, height, 0xffff);
lcd.FillRectangle(0, 0, width, height, 0x0000);
}
void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color) {
lcd.FillRectangle(x, y, width, height, color);
}
void Gfx::DrawString(uint8_t x, uint8_t y, uint16_t color, const char *text, const FONT_INFO *p_font, bool wrap) {
@@ -55,17 +59,25 @@ void Gfx::DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint
return;
}
// TODO For now, LCD and SPI driver start a new transfer (cs pin + set address windows + write byte) FOR EACH PIXEL!
// This could be improved by setting CS pin, DC pin and address window ONLY ONCE for the whole character
lcd.BeginDrawBuffer(*x, y, bytes_in_line*8, font->height);
uint16_t bg = 0x0000;
for (uint16_t i = 0; i < font->height; i++) {
for (uint16_t j = 0; j < bytes_in_line; j++) {
for (uint8_t k = 0; k < 8; k++) {
if ((1 << (7 - k)) &
font->data[font->charInfo[char_idx].offset + i * bytes_in_line + j]) {
pixel_draw(*x + j * 8 + k, y + i, color);
lcd.NextDrawBuffer(reinterpret_cast<uint8_t *>(&color), 2);
}
else {
lcd.NextDrawBuffer(reinterpret_cast<uint8_t *>(&bg), 2);
}
}
}
}
lcd.EndDrawBuffer();
*x += font->charInfo[char_idx].widthBits + font->spacePixels;
}

View File

@@ -14,7 +14,7 @@ namespace Pinetime {
void ClearScreen();
void DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO *p_font, bool wrap);
void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color);
void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color);
private:
Drivers::St7789& lcd;