summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2024-12-21 18:19:38 -0500
committerWilliam Wilgus <wilgus.william@gmail.com>2024-12-21 18:19:38 -0500
commit8091477f8d8f497eba97049545e35c4ab3a90b24 (patch)
treea4ac2613ec2638967c13609823000bc81a807304
parentd6e99178aabd89035dbf2d948a925a3ed51a2970 (diff)
downloadrockbox-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.c45
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: