display/font: optimise font rendering by about 25% (#4956)

This commit is contained in:
Kamil Trzciński 2023-06-19 01:29:43 +02:00 committed by GitHub
parent 77a7d3f24b
commit 54eb52c19a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 17 deletions

View file

@ -8,25 +8,23 @@ namespace display {
static const char *const TAG = "display"; static const char *const TAG = "display";
bool Glyph::get_pixel(int x, int y) const {
const int x_data = x - this->glyph_data_->offset_x;
const int y_data = y - this->glyph_data_->offset_y;
if (x_data < 0 || x_data >= this->glyph_data_->width || y_data < 0 || y_data >= this->glyph_data_->height)
return false;
const uint32_t width_8 = ((this->glyph_data_->width + 7u) / 8u) * 8u;
const uint32_t pos = x_data + y_data * width_8;
return progmem_read_byte(this->glyph_data_->data + (pos / 8u)) & (0x80 >> (pos % 8u));
}
void Glyph::draw(int x_at, int y_start, DisplayBuffer *display, Color color) const { void Glyph::draw(int x_at, int y_start, DisplayBuffer *display, Color color) const {
int scan_x1, scan_y1, scan_width, scan_height; int scan_x1, scan_y1, scan_width, scan_height;
this->scan_area(&scan_x1, &scan_y1, &scan_width, &scan_height); this->scan_area(&scan_x1, &scan_y1, &scan_width, &scan_height);
const int glyph_x_max = scan_x1 + scan_width; const unsigned char *data = this->glyph_data_->data;
const int glyph_y_max = scan_y1 + scan_height; const int max_x = x_at + scan_x1 + scan_width;
for (int glyph_x = scan_x1; glyph_x < glyph_x_max; glyph_x++) { const int max_y = y_start + scan_y1 + scan_height;
for (int glyph_y = scan_y1; glyph_y < glyph_y_max; glyph_y++) {
if (this->get_pixel(glyph_x, glyph_y)) { for (int glyph_y = y_start + scan_y1; glyph_y < max_y; glyph_y++) {
display->draw_pixel_at(glyph_x + x_at, glyph_y + y_start, color); for (int glyph_x = x_at + scan_x1; glyph_x < max_x; data++, glyph_x += 8) {
uint8_t pixel_data = progmem_read_byte(data);
const int pixel_max_x = std::min(max_x, glyph_x + 8);
for (int pixel_x = glyph_x; pixel_x < pixel_max_x && pixel_data; pixel_x++, pixel_data <<= 1) {
if (pixel_data & 0x80) {
display->draw_pixel_at(pixel_x, glyph_y, color);
}
} }
} }
} }

View file

@ -22,8 +22,6 @@ class Glyph {
public: public:
Glyph(const GlyphData *data) : glyph_data_(data) {} Glyph(const GlyphData *data) : glyph_data_(data) {}
bool get_pixel(int x, int y) const;
void draw(int x, int y, DisplayBuffer *display, Color color) const; void draw(int x, int y, DisplayBuffer *display, Color color) const;
const char *get_char() const; const char *get_char() const;