From 3291ae6bfac7a0cd39dafe12b006f73cbcb874d1 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sat, 2 Jul 2005 07:21:21 +0000 Subject: A couple of optimisations. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6981 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-h100-remote.c | 34 +++++++++++++++++++++++----------- firmware/drivers/lcd-h100.c | 34 +++++++++++++++++++++++----------- firmware/drivers/lcd-recorder.c | 36 ++++++++++++++++++++++++------------ 3 files changed, 70 insertions(+), 34 deletions(-) (limited to 'firmware/drivers') 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); } } -- cgit v1.2.3