diff options
author | William Wilgus <wilgus.william@gmail.com> | 2024-12-21 18:19:38 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2024-12-21 18:19:38 -0500 |
commit | 8091477f8d8f497eba97049545e35c4ab3a90b24 (patch) | |
tree | a4ac2613ec2638967c13609823000bc81a807304 | |
parent | d6e99178aabd89035dbf2d948a925a3ed51a2970 (diff) | |
download | rockbox-8091477f8d.tar.gz rockbox-8091477f8d.zip |
Optimize 16 bit lcd_fillrect()
move switch outside loop
adds ~10000 ops/s in test_gfx
Change-Id: I2204d637282aae4bbc0dde31395c6cc0568f3247
-rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index be65efb4e7..6108832cb4 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c @@ -169,32 +169,41 @@ void lcd_fillrect(int x, int y, int width, int height) len = STRIDE_MAIN(width, height); step = STRIDE_MAIN(ROW_INC, COL_INC); - do + switch (fillopt) { - switch (fillopt) + case OPT_SET: { - case OPT_SET: - memset16(dst, bits, len); + do + { + memset16(dst, bits, len); + dst += step; + } while (dst <= dst_end); break; - - case OPT_COPY: - memcpy(dst, PTR_ADD(dst, lcd_backdrop_offset), - len * sizeof(fb_data)); + } + case OPT_COPY: + { + do + { + memcpy(dst, PTR_ADD(dst, lcd_backdrop_offset), + len * sizeof(fb_data)); + dst += step; + } while (dst <= dst_end); break; - - case OPT_NONE: /* DRMODE_COMPLEMENT */ - { - fb_data *start = dst; - fb_data *end = start + len; + } + case OPT_NONE: /* DRMODE_COMPLEMENT */ + { do - *start = ~(*start); - while (++start < end); + { + fb_data *start = dst; + fb_data *end = start + len; + do + *start = ~(*start); + while (++start < end); + dst += step; + } while (dst <= dst_end); break; - } } - dst += step; } - while (dst <= dst_end); } /* About Rockbox' internal monochrome bitmap format: |