summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/lcd-h100-remote.c34
-rw-r--r--firmware/drivers/lcd-h100.c34
-rw-r--r--firmware/drivers/lcd-recorder.c36
3 files changed, 70 insertions, 34 deletions
diff --git a/firmware/drivers/lcd-h100-remote.c b/firmware/drivers/lcd-h100-remote.c
index 8112aecdb1..af6a45c2c0 100644
--- a/firmware/drivers/lcd-h100-remote.c
+++ b/firmware/drivers/lcd-h100-remote.c
@@ -653,7 +653,7 @@ void lcd_remote_drawline(int x1, int y1, int x2, int y2)
void lcd_remote_hline(int x1, int x2, int y)
{
int x;
- unsigned char *dst;
+ unsigned char *dst, *dst_end;
unsigned mask;
lcd_blockfunc_type *bfunc;
@@ -680,8 +680,10 @@ void lcd_remote_hline(int x1, int x2, int y)
dst = &lcd_remote_framebuffer[y>>3][x1];
mask = 1 << (y & 7);
- for (x = x1; x <= x2; x++)
+ dst_end = dst + x2 - x1;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst <= dst_end);
}
/* Draw a vertical line (optimised) */
@@ -745,8 +747,8 @@ void lcd_remote_drawrect(int x, int y, int width, int height)
/* Fill a rectangular area */
void lcd_remote_fillrect(int x, int y, int width, int height)
{
- int ny, i;
- unsigned char *dst;
+ int ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
unsigned bits = 0xFFu;
lcd_blockfunc_type *bfunc;
@@ -791,8 +793,10 @@ void lcd_remote_fillrect(int x, int y, int width, int height)
{
unsigned char *dst_row = dst;
- for (i = width; i > 0; i--)
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, 0xFFu);
+ while (dst_row < dst_end);
}
dst += LCD_REMOTE_WIDTH;
@@ -804,8 +808,10 @@ void lcd_remote_fillrect(int x, int y, int width, int height)
memset(dst, bits, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst < dst_end);
}
}
@@ -827,8 +833,8 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
- int shift, ny, i;
- unsigned char *dst;
+ int shift, ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
lcd_blockfunc_type *bfunc;
@@ -879,8 +885,10 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
const unsigned char *src_row = src;
unsigned char *dst_row = dst;
- for (i = width; i > 0; i--)
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, *src_row++);
+ while (dst_row < dst_end);
}
src += stride;
@@ -893,13 +901,16 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
memcpy(dst, src, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, *src++);
+ while (dst < dst_end);
}
}
else
{
- for (x = 0; x < width; x++)
+ dst_end = dst + width;
+ do
{
const unsigned char *src_col = src++;
unsigned char *dst_col = dst++;
@@ -925,6 +936,7 @@ void lcd_remote_bitmap_part(const unsigned char *src, int src_x, int src_y,
data |= *src_col << shift;
bfunc(dst_col, mask_col & mask_bottom, data);
}
+ while (dst < dst_end);
}
}
diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c
index 3d858e2271..379838d068 100644
--- a/firmware/drivers/lcd-h100.c
+++ b/firmware/drivers/lcd-h100.c
@@ -492,7 +492,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
void lcd_hline(int x1, int x2, int y)
{
int x;
- unsigned char *dst;
+ unsigned char *dst, *dst_end;
unsigned mask;
lcd_blockfunc_type *bfunc;
@@ -518,8 +518,10 @@ void lcd_hline(int x1, int x2, int y)
dst = &lcd_framebuffer[y>>3][x1];
mask = 1 << (y & 7);
- for (x = x1; x <= x2; x++)
+ dst_end = dst + x2 - x1;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst <= dst_end);
}
/* Draw a vertical line (optimised) */
@@ -582,8 +584,8 @@ void lcd_drawrect(int x, int y, int width, int height)
/* Fill a rectangular area */
void lcd_fillrect(int x, int y, int width, int height)
{
- int ny, i;
- unsigned char *dst;
+ int ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
unsigned bits = 0xFFu;
lcd_blockfunc_type *bfunc;
@@ -628,8 +630,10 @@ void lcd_fillrect(int x, int y, int width, int height)
{
unsigned char *dst_row = dst;
- for (i = width; i > 0; i--)
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, 0xFFu);
+ while (dst_row < dst_end);
}
dst += LCD_WIDTH;
@@ -641,8 +645,10 @@ void lcd_fillrect(int x, int y, int width, int height)
memset(dst, bits, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst < dst_end);
}
}
@@ -664,8 +670,8 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
- int shift, ny, i;
- unsigned char *dst;
+ int shift, ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
lcd_blockfunc_type *bfunc;
@@ -716,8 +722,10 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
const unsigned char *src_row = src;
unsigned char *dst_row = dst;
- for (i = width; i > 0; i--)
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, *src_row++);
+ while (dst_row < dst_end);
}
src += stride;
@@ -730,13 +738,16 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
memcpy(dst, src, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, *src++);
+ while (dst < dst_end);
}
}
else
{
- for (x = 0; x < width; x++)
+ dst_end = dst + width;
+ do
{
const unsigned char *src_col = src++;
unsigned char *dst_col = dst++;
@@ -762,6 +773,7 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
data |= *src_col << shift;
bfunc(dst_col, mask_col & mask_bottom, data);
}
+ while (dst < dst_end);
}
}
diff --git a/firmware/drivers/lcd-recorder.c b/firmware/drivers/lcd-recorder.c
index f933e6ca5c..b857708514 100644
--- a/firmware/drivers/lcd-recorder.c
+++ b/firmware/drivers/lcd-recorder.c
@@ -549,7 +549,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
void lcd_hline(int x1, int x2, int y)
{
int x;
- unsigned char *dst;
+ unsigned char *dst, *dst_end;
unsigned mask;
lcd_blockfunc_type *bfunc;
@@ -575,8 +575,10 @@ void lcd_hline(int x1, int x2, int y)
dst = &lcd_framebuffer[y>>3][x1];
mask = 1 << (y & 7);
- for (x = x1; x <= x2; x++)
+ dst_end = dst + x2 - x1;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst <= dst_end);
}
/* Draw a vertical line (optimised) */
@@ -639,8 +641,8 @@ void lcd_drawrect(int x, int y, int width, int height)
/* Fill a rectangular area */
void lcd_fillrect(int x, int y, int width, int height)
{
- int ny, i;
- unsigned char *dst;
+ int ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
unsigned bits = 0xFFu;
lcd_blockfunc_type *bfunc;
@@ -685,8 +687,10 @@ void lcd_fillrect(int x, int y, int width, int height)
{
unsigned char *dst_row = dst;
- for (i = width; i > 0; i--)
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, 0xFFu);
+ while (dst_row < dst_end);
}
dst += LCD_WIDTH;
@@ -698,8 +702,10 @@ void lcd_fillrect(int x, int y, int width, int height)
memset(dst, bits, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, 0xFFu);
+ while (dst < dst_end);
}
}
@@ -721,8 +727,8 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height)
{
- int shift, ny, i;
- unsigned char *dst;
+ int shift, ny;
+ unsigned char *dst, *dst_end;
unsigned mask, mask_bottom;
lcd_blockfunc_type *bfunc;
@@ -772,9 +778,11 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
{
const unsigned char *src_row = src;
unsigned char *dst_row = dst;
-
- for (i = width; i > 0; i--)
+
+ dst_end = dst_row + width;
+ do
bfunc(dst_row++, mask, *src_row++);
+ while (dst_row < dst_end);
}
src += stride;
@@ -787,13 +795,16 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
memcpy(dst, src, width);
else
{
- for (i = width; i > 0; i--)
+ dst_end = dst + width;
+ do
bfunc(dst++, mask, *src++);
+ while (dst < dst_end);
}
}
else
{
- for (x = 0; x < width; x++)
+ dst_end = dst + width;
+ do
{
const unsigned char *src_col = src++;
unsigned char *dst_col = dst++;
@@ -819,6 +830,7 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
data |= *src_col << shift;
bfunc(dst_col, mask_col & mask_bottom, data);
}
+ while (dst < dst_end);
}
}