diff options
author | Greg White <gwhite@rockbox.org> | 2007-01-16 13:56:38 +0000 |
---|---|---|
committer | Greg White <gwhite@rockbox.org> | 2007-01-16 13:56:38 +0000 |
commit | 9980b4ed6c171fcc4b37b4c9bd392430151a91fd (patch) | |
tree | db531994b8c52922d022eaa96a037cc595f04e97 /firmware/target/arm/gigabeat/meg-fx | |
parent | cd05dbc7f4f402db6b6f52fcfaf5af622792d08f (diff) | |
download | rockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.tar.gz rockbox-9980b4ed6c171fcc4b37b4c9bd392430151a91fd.zip |
Merge various drawmodes; revert to C for common code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12021 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/gigabeat/meg-fx')
-rw-r--r-- | firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c | 107 |
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 f323dda1e1..5af3a4a22a 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) | |||
155 | 155 | ||
156 | void lcd_device_prepare_backdrop(fb_data* backdrop) | 156 | void lcd_device_prepare_backdrop(fb_data* backdrop) |
157 | { | 157 | { |
158 | invalidate_dcache_range((void *)backdrop, (LCD_HEIGHT * sizeof(fb_data) * LCD_WIDTH)); | 158 | if(backdrop) |
159 | invalidate_dcache_range((void *)backdrop, (LCD_HEIGHT * sizeof(fb_data) * LCD_WIDTH)); | ||
159 | } | 160 | } |
160 | 161 | ||
161 | void lcd_clear_display_dma(void) | 162 | 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, | |||
330 | 331 | ||
331 | dst = LCDADDR(x, y); | 332 | dst = LCDADDR(x, y); |
332 | int drawmode = lcd_get_drawmode(); | 333 | int drawmode = lcd_get_drawmode(); |
333 | if(drawmode == DRMODE_SOLID) { | 334 | fb_data *backdrop = lcd_get_backdrop(); |
334 | do | 335 | bool has_backdrop = backdrop ? true : false; |
335 | { | 336 | backdrop = backdrop + y * LCD_WIDTH + x; |
336 | const unsigned char *src_col = src++; | 337 | lcd_fastpixelfunc_type *fgfunc = lcd_fastpixelfuncs[drawmode];; |
337 | unsigned data = *src_col >> src_y; | 338 | lcd_fastpixelfunc_type *bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];; |
338 | fb_data *dst_col = dst++; | 339 | do { |
339 | int numbits = 8 - src_y; | 340 | const unsigned char *src_col = src++; |
340 | 341 | unsigned data = *src_col >> src_y; | |
341 | dst_end = dst_col + height * LCD_WIDTH; | 342 | fb_data *dst_col = dst++; |
342 | asm volatile( | 343 | int numbits = 8 - src_y; |
343 | "transrowstart: \n" | 344 | fb_data *backdrop_col = backdrop++; |
344 | "tst %0, #1 \n" /* Test data bit 1 */ | 345 | dst_end = dst_col + height * LCD_WIDTH; |
345 | "strneh %6, [%1] \n" /* If it is set, set pixel */ | 346 | do { |
346 | "add %1, %1, #480 \n" /* dst_col += LCD_WIDTH (x2) */ | 347 | switch(drawmode) { |
347 | "sub %7, %7, #1 \n" /* numbits-- */ | 348 | case DRMODE_SOLID: |
348 | "cmp %7, #0 \n" | 349 | if (data & 0x01) |
349 | "movne %0, %0, LSR #1 \n" /* Shift data */ | 350 | *dst_col = fg_pattern; |
350 | "bne transrowstart \n" /* if(numbits != 0) goto transrowstart */ | 351 | else |
351 | "add %5, %5, %4 \n" /* src_col += stride */ | 352 | *dst_col = has_backdrop ? *backdrop_col : bg_pattern; |
352 | "ldrb %0, [%5] \n" /* data = *srccol */ | 353 | break; |
353 | "mov %7, #8 \n" /* numbits = 8; */ | 354 | case DRMODE_FG: |
354 | "cmp %1, %3 \n" /* if(dst_col < dst_end */ | 355 | if (data & 0x01) |
355 | "blt transrowstart \n" /* Keep going */ | 356 | *dst_col = fg_pattern; |
356 | : : "r" (data), "r" (dst_col), "r" (numbits), "r" (dst_end), "r" (stride), "r" (src_col), "r" (fg_pattern), "r" (numbits) ); | 357 | break; |
357 | } | 358 | case DRMODE_INVERSEVID: |
358 | while (src < src_end); | 359 | if(!(data & 0x01)) |
359 | } | 360 | *dst_col = has_backdrop ? *backdrop_col : bg_pattern; |
360 | else { | 361 | else |
361 | lcd_fastpixelfunc_type *fgfunc = lcd_fastpixelfuncs[drawmode];; | 362 | *dst_col = fg_pattern; |
362 | lcd_fastpixelfunc_type *bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];; | 363 | break; |
363 | do | 364 | default: |
364 | { | 365 | if (data & 0x01) |
365 | const unsigned char *src_col = src++; | 366 | fgfunc(dst_col); |
366 | unsigned data = *src_col >> src_y; | 367 | else |
367 | fb_data *dst_col = dst++; | 368 | bgfunc(dst_col); |
368 | int numbits = 8 - src_y; | 369 | break; |
369 | 370 | }; | |
370 | dst_end = dst_col + height * LCD_WIDTH; | 371 | dst_col += LCD_WIDTH; |
371 | do | 372 | backdrop_col += LCD_WIDTH; |
372 | { | 373 | data >>= 1; |
373 | if (data & 0x01) | 374 | if (--numbits == 0) { |
374 | fgfunc(dst_col); | 375 | src_col += stride; |
375 | else | 376 | data = *src_col; |
376 | bgfunc(dst_col); | 377 | numbits = 8; |
377 | |||
378 | dst_col += LCD_WIDTH; | ||
379 | |||
380 | data >>= 1; | ||
381 | if (--numbits == 0) | ||
382 | { | ||
383 | src_col += stride; | ||
384 | data = *src_col; | ||
385 | numbits = 8; | ||
386 | } | ||
387 | } | 378 | } |
388 | while (dst_col < dst_end); | 379 | } while (dst_col < dst_end); |
389 | } | 380 | } while (src < src_end); |
390 | while (src < src_end); | ||
391 | } | ||
392 | } | 381 | } |
393 | 382 | ||
394 | 383 | ||