summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg White <gwhite@rockbox.org>2007-01-16 13:56:38 +0000
committerGreg White <gwhite@rockbox.org>2007-01-16 13:56:38 +0000
commit9980b4ed6c171fcc4b37b4c9bd392430151a91fd (patch)
treedb531994b8c52922d022eaa96a037cc595f04e97
parentcd05dbc7f4f402db6b6f52fcfaf5af622792d08f (diff)
downloadrockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.zip
rockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.tar.gz
rockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.tar.bz2
rockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.tar.xz
Merge various drawmodes; revert to C for common code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12021 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c107
1 files changed, 48 insertions, 59 deletions
diff --git a/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
index f323dda..5af3a4a 100644
--- a/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
+++ b/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
@@ -155,7 +155,8 @@ void lcd_set_background(unsigned color)
void lcd_device_prepare_backdrop(fb_data* backdrop)
{
- invalidate_dcache_range((void *)backdrop, (LCD_HEIGHT * sizeof(fb_data) * LCD_WIDTH));
+ if(backdrop)
+ invalidate_dcache_range((void *)backdrop, (LCD_HEIGHT * sizeof(fb_data) * LCD_WIDTH));
}
void lcd_clear_display_dma(void)
@@ -330,65 +331,53 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
dst = LCDADDR(x, y);
int drawmode = lcd_get_drawmode();
- if(drawmode == DRMODE_SOLID) {
- do
- {
- const unsigned char *src_col = src++;
- unsigned data = *src_col >> src_y;
- fb_data *dst_col = dst++;
- int numbits = 8 - src_y;
-
- dst_end = dst_col + height * LCD_WIDTH;
- asm volatile(
- "transrowstart: \n"
- "tst %0, #1 \n" /* Test data bit 1 */
- "strneh %6, [%1] \n" /* If it is set, set pixel */
- "add %1, %1, #480 \n" /* dst_col += LCD_WIDTH (x2) */
- "sub %7, %7, #1 \n" /* numbits-- */
- "cmp %7, #0 \n"
- "movne %0, %0, LSR #1 \n" /* Shift data */
- "bne transrowstart \n" /* if(numbits != 0) goto transrowstart */
- "add %5, %5, %4 \n" /* src_col += stride */
- "ldrb %0, [%5] \n" /* data = *srccol */
- "mov %7, #8 \n" /* numbits = 8; */
- "cmp %1, %3 \n" /* if(dst_col < dst_end */
- "blt transrowstart \n" /* Keep going */
- : : "r" (data), "r" (dst_col), "r" (numbits), "r" (dst_end), "r" (stride), "r" (src_col), "r" (fg_pattern), "r" (numbits) );
- }
- while (src < src_end);
- }
- else {
- lcd_fastpixelfunc_type *fgfunc = lcd_fastpixelfuncs[drawmode];;
- lcd_fastpixelfunc_type *bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];;
- do
- {
- const unsigned char *src_col = src++;
- unsigned data = *src_col >> src_y;
- fb_data *dst_col = dst++;
- int numbits = 8 - src_y;
-
- dst_end = dst_col + height * LCD_WIDTH;
- do
- {
- if (data & 0x01)
- fgfunc(dst_col);
- else
- bgfunc(dst_col);
-
- dst_col += LCD_WIDTH;
-
- data >>= 1;
- if (--numbits == 0)
- {
- src_col += stride;
- data = *src_col;
- numbits = 8;
- }
+ fb_data *backdrop = lcd_get_backdrop();
+ bool has_backdrop = backdrop ? true : false;
+ backdrop = backdrop + y * LCD_WIDTH + x;
+ lcd_fastpixelfunc_type *fgfunc = lcd_fastpixelfuncs[drawmode];;
+ lcd_fastpixelfunc_type *bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];;
+ do {
+ const unsigned char *src_col = src++;
+ unsigned data = *src_col >> src_y;
+ fb_data *dst_col = dst++;
+ int numbits = 8 - src_y;
+ fb_data *backdrop_col = backdrop++;
+ dst_end = dst_col + height * LCD_WIDTH;
+ do {
+ switch(drawmode) {
+ case DRMODE_SOLID:
+ if (data & 0x01)
+ *dst_col = fg_pattern;
+ else
+ *dst_col = has_backdrop ? *backdrop_col : bg_pattern;
+ break;
+ case DRMODE_FG:
+ if (data & 0x01)
+ *dst_col = fg_pattern;
+ break;
+ case DRMODE_INVERSEVID:
+ if(!(data & 0x01))
+ *dst_col = has_backdrop ? *backdrop_col : bg_pattern;
+ else
+ *dst_col = fg_pattern;
+ break;
+ default:
+ if (data & 0x01)
+ fgfunc(dst_col);
+ else
+ bgfunc(dst_col);
+ break;
+ };
+ dst_col += LCD_WIDTH;
+ backdrop_col += LCD_WIDTH;
+ data >>= 1;
+ if (--numbits == 0) {
+ src_col += stride;
+ data = *src_col;
+ numbits = 8;
}
- while (dst_col < dst_end);
- }
- while (src < src_end);
- }
+ } while (dst_col < dst_end);
+ } while (src < src_end);
}