Skip to content

Commit

Permalink
optimize ssd1306_fill_rectangle
Browse files Browse the repository at this point in the history
  • Loading branch information
0x0aa committed Apr 24, 2020
1 parent bc97988 commit cc24111
Showing 1 changed file with 52 additions and 6 deletions.
58 changes: 52 additions & 6 deletions extras/ssd1306/ssd1306.c
Original file line number Diff line number Diff line change
Expand Up @@ -692,12 +692,58 @@ int ssd1306_draw_rectangle(const ssd1306_t *dev, uint8_t *fb, int8_t x, int8_t y

int ssd1306_fill_rectangle(const ssd1306_t *dev, uint8_t *fb, int8_t x, int8_t y, uint8_t w, uint8_t h, ssd1306_color_t color)
{
// Can be optimized?
uint8_t i;
int err = 0;
for (i = x; i < x + w; ++i)
if ((err = ssd1306_draw_vline(dev, fb, i, y, h, color)))
return err;
uint16_t index;
uint8_t fill, mask, mod, t;

// boundary check
if ((x >= dev->width) || (x < 0) || (y >= dev->height) || (y < 0))
return -EINVAL;
if (w == 0 || h == 0)
return -EINVAL;
if (x + w > dev->width)
w = dev->width - x;
if (y + h > dev->height)
h = dev->height - y;

do {
mod = y & 7;
fill = 8 - mod;

if (fill > h)
fill = h;

t = w;
index = x + (y / 8) * dev->width;
mask = ((1 << fill) - 1) << mod;
switch (color) {
case OLED_COLOR_WHITE:
while (t--) {
fb[index] |= mask;
++index;
}
break;
case OLED_COLOR_BLACK:
mask = ~mask;
while (t--) {
fb[index] &= mask;
++index;
}
break;
case OLED_COLOR_INVERT:
while (t--) {
fb[index] ^= mask;
++index;
}
break;
default:
break;
}

y += fill;
h -= fill;

} while(h > 0);

return 0;
}

Expand Down

0 comments on commit cc24111

Please sign in to comment.