summaryrefslogtreecommitdiff
path: root/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
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 /firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
parentcd05dbc7f4f402db6b6f52fcfaf5af622792d08f (diff)
downloadrockbox-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/lcd-meg-fx.c')
-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 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
156void lcd_device_prepare_backdrop(fb_data* backdrop) 156void 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
161void lcd_clear_display_dma(void) 162void 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