summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Cellerier <dionoea@videolan.org>2006-06-10 20:39:33 +0000
committerAntoine Cellerier <dionoea@videolan.org>2006-06-10 20:39:33 +0000
commit40a92eaed929670c25961d7280f0d123c01aa48a (patch)
tree5e06380fe81c352d8b5193269b24a230e3777c97
parent74a3f2144cbb2a6912bf7294bce2c732606a35ca (diff)
downloadrockbox-40a92eaed929670c25961d7280f0d123c01aa48a.tar.gz
rockbox-40a92eaed929670c25961d7280f0d123c01aa48a.zip
Scale and use color bitmaps on color lcd targets.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10100 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/sokoban.c57
-rw-r--r--apps/plugins/star.c141
2 files changed, 146 insertions, 52 deletions
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index c3d97adfa4..b450e39b54 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -24,6 +24,10 @@
24 24
25PLUGIN_HEADER 25PLUGIN_HEADER
26 26
27#ifdef HAVE_LCD_COLOR
28extern const fb_data sokoban_tiles[];
29#endif
30
27#define SOKOBAN_TITLE "Sokoban" 31#define SOKOBAN_TITLE "Sokoban"
28#define SOKOBAN_TITLE_FONT 2 32#define SOKOBAN_TITLE_FONT 2
29 33
@@ -33,7 +37,7 @@ PLUGIN_HEADER
33#define COLS 20 37#define COLS 20
34/* Use all but 8k of the plugin buffer for board data */ 38/* Use all but 8k of the plugin buffer for board data */
35#define SOKOBAN_LEVEL_SIZE (ROWS*COLS) 39#define SOKOBAN_LEVEL_SIZE (ROWS*COLS)
36#define MAX_BUFFERED_BOARDS (PLUGIN_BUFFER_SIZE - 0x2000)/SOKOBAN_LEVEL_SIZE 40#define MAX_BUFFERED_BOARDS (PLUGIN_BUFFER_SIZE - 0x3000)/SOKOBAN_LEVEL_SIZE
37#define MAX_UNDOS 5 41#define MAX_UNDOS 5
38 42
39/* variable button definitions */ 43/* variable button definitions */
@@ -423,11 +427,14 @@ static void update_screen(void)
423 int rows = 0, cols = 0; 427 int rows = 0, cols = 0;
424 char s[25]; 428 char s[25];
425 429
426#if LCD_HEIGHT == 128 /* magnify is the number of pixels for each block */ 430/* magnify is the number of pixels for each block */
427 int magnify = 6; /* 6 on h1x0, 9 on h3x0, and 4 on everything else */ 431#if LCD_HEIGHT >= 240 /* ipod 5g */
428#elif LCD_HEIGHT >= 176 432 int magnify = 14;
433#elif LCD_HEIGHT >= 176 /* h3x0, ipod color/photo */
429 int magnify = 9; 434 int magnify = 9;
430#else 435#elif LCD_HEIGHT >= 128 /* h1x0, ipod nano */
436 int magnify = 6;
437#else /* other */
431 int magnify = 4; 438 int magnify = 4;
432#endif 439#endif
433 440
@@ -443,9 +450,8 @@ static void update_screen(void)
443 450
444 case '#': /* this is a wall */ 451 case '#': /* this is a wall */
445#if HAVE_LCD_COLOR 452#if HAVE_LCD_COLOR
446 rb->lcd_set_foreground(WALL_COLOR); 453 rb->lcd_bitmap_part( sokoban_tiles, 0, 1*magnify, magnify,
447 rb->lcd_fillrect(c, b, magnify, magnify); 454 c, b, magnify, magnify );
448 rb->lcd_set_foreground(LCD_BLACK);
449#elif LCD_DEPTH > 1 455#elif LCD_DEPTH > 1
450 rb->lcd_set_foreground(MEDIUM_GRAY); 456 rb->lcd_set_foreground(MEDIUM_GRAY);
451 rb->lcd_fillrect(c, b, magnify, magnify); 457 rb->lcd_fillrect(c, b, magnify, magnify);
@@ -463,9 +469,8 @@ static void update_screen(void)
463 469
464 case '.': /* this is a home location */ 470 case '.': /* this is a home location */
465#ifdef HAVE_LCD_COLOR 471#ifdef HAVE_LCD_COLOR
466 rb->lcd_set_foreground(FREE_TARGET_COLOR); 472 rb->lcd_bitmap_part( sokoban_tiles, 0, 4*magnify, magnify,
467 rb->lcd_fillrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2, 473 c, b, magnify, magnify );
468 magnify/2);
469#else 474#else
470 rb->lcd_drawrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2, 475 rb->lcd_drawrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2,
471 magnify/2); 476 magnify/2);
@@ -474,19 +479,22 @@ static void update_screen(void)
474 479
475 case '$': /* this is a box */ 480 case '$': /* this is a box */
476#ifdef HAVE_LCD_COLOR 481#ifdef HAVE_LCD_COLOR
477 rb->lcd_set_foreground(FREE_BLOCK_COLOR); 482 rb->lcd_bitmap_part( sokoban_tiles, 0, 2*magnify, magnify,
478#endif 483 c, b, magnify, magnify );
484#else
479 rb->lcd_drawrect(c, b, magnify, magnify); /* Free boxes are not filled in */ 485 rb->lcd_drawrect(c, b, magnify, magnify); /* Free boxes are not filled in */
486#endif
480 break; 487 break;
481 488
482 case '@': /* this is you */ 489 case '@': /* this is you */
483 { 490 {
491#ifdef HAVE_LCD_COLOR
492 rb->lcd_bitmap_part( sokoban_tiles, 0, 5*magnify, magnify,
493 c, b, magnify, magnify );
494#else
484 int max = magnify - 1; 495 int max = magnify - 1;
485 int middle = max / 2; 496 int middle = max / 2;
486 int ldelta = (middle + 1) / 2; 497 int ldelta = (middle + 1) / 2;
487#ifdef HAVE_LCD_COLOR
488 rb->lcd_set_foreground(CHAR_COLOR);
489#endif
490 rb->lcd_drawline(c, b+middle, c+max, b+middle); 498 rb->lcd_drawline(c, b+middle, c+max, b+middle);
491 rb->lcd_drawline(c+middle, b, c+middle, b+max-ldelta); 499 rb->lcd_drawline(c+middle, b, c+middle, b+max-ldelta);
492 rb->lcd_drawline(c+max-middle, b, 500 rb->lcd_drawline(c+max-middle, b,
@@ -495,26 +503,27 @@ static void update_screen(void)
495 c+middle-ldelta, b+max); 503 c+middle-ldelta, b+max);
496 rb->lcd_drawline(c+max-middle, b+max-ldelta, 504 rb->lcd_drawline(c+max-middle, b+max-ldelta,
497 c+max-middle+ldelta, b+max); 505 c+max-middle+ldelta, b+max);
506#endif
498 } 507 }
499 break; 508 break;
500 509
501 case '%': /* this is a box on a home spot */ 510 case '%': /* this is a box on a home spot */
502 511
503#ifdef HAVE_LCD_COLOR 512#ifdef HAVE_LCD_COLOR
504 rb->lcd_set_foreground(USED_BLOCK_COLOR); 513 rb->lcd_bitmap_part( sokoban_tiles, 0, 3*magnify, magnify,
505 rb->lcd_fillrect(c, b, magnify, magnify); 514 c, b, magnify, magnify );
506#else 515#else
507 rb->lcd_drawrect(c, b, magnify, magnify); 516 rb->lcd_drawrect(c, b, magnify, magnify);
508#endif
509#ifdef HAVE_LCD_COLOR
510 rb->lcd_set_foreground(USED_TARGET_COLOR);
511 rb->lcd_fillrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2,
512 magnify/2);
513#else
514 rb->lcd_drawrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2, 517 rb->lcd_drawrect(c+(magnify/2)-1, b+(magnify/2)-1, magnify/2,
515 magnify/2); 518 magnify/2);
516#endif 519#endif
517 break; 520 break;
521
522#ifdef HAVE_LCD_COLOR
523 default:
524 rb->lcd_bitmap_part( sokoban_tiles, 0, 0*magnify, magnify,
525 c, b, magnify, magnify );
526#endif
518 } 527 }
519 } 528 }
520 } 529 }
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index c2ce2e7d83..88cc283106 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -37,16 +37,9 @@ PLUGIN_HEADER
37#define STAR_WIDTH 16 37#define STAR_WIDTH 16
38#define STAR_HEIGHT 9 38#define STAR_HEIGHT 9
39 39
40/* left and top margin */
41#define STAR_OFFSET_X 8
42#define STAR_OFFSET_Y 0
43
44/* number of level */ 40/* number of level */
45#define STAR_LEVEL_COUNT 20 41#define STAR_LEVEL_COUNT 20
46 42
47/* size of a tile */
48#define STAR_TILE_SIZE 6
49
50/* values of object in the board */ 43/* values of object in the board */
51#define STAR_VOID '.' 44#define STAR_VOID '.'
52#define STAR_WALL '*' 45#define STAR_WALL '*'
@@ -155,6 +148,38 @@ static int control;
155/* the current board */ 148/* the current board */
156static char board[STAR_HEIGHT][STAR_WIDTH]; 149static char board[STAR_HEIGHT][STAR_WIDTH];
157 150
151#ifdef HAVE_LCD_COLOR
152
153extern const fb_data star_tiles[];
154
155/* size of a tile */
156#if LCD_WIDTH >= 320
157# define STAR_TILE_SIZE 20
158#elif LCD_WIDTH >= 220
159# define STAR_TILE_SIZE 13
160#else
161# define STAR_TILE_SIZE 10
162#endif
163
164/* left and top margin */
165#define STAR_OFFSET_X ( ( LCD_WIDTH - STAR_WIDTH * STAR_TILE_SIZE ) / 2 )
166#define STAR_OFFSET_Y ( ( LCD_HEIGHT - ( STAR_HEIGHT + 1 ) * STAR_TILE_SIZE ) / 2 )
167
168#define wall 0
169#define space 1
170#define block 2
171#define star 3
172#define ball 4
173
174#else
175
176/* left and top margin */
177#define STAR_OFFSET_X 8
178#define STAR_OFFSET_Y 0
179
180/* size of a tile */
181#define STAR_TILE_SIZE 6
182
158/* bitmap of the wall */ 183/* bitmap of the wall */
159static unsigned char wall_bmp[STAR_TILE_SIZE] 184static unsigned char wall_bmp[STAR_TILE_SIZE]
160 = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55}; 185 = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55};
@@ -171,6 +196,8 @@ static unsigned char ball_bmp[STAR_TILE_SIZE]
171static unsigned char block_bmp[STAR_TILE_SIZE] 196static unsigned char block_bmp[STAR_TILE_SIZE]
172 = {0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x00}; 197 = {0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x00};
173 198
199#endif
200
174/* bitmap of the arrow animation */ 201/* bitmap of the arrow animation */
175static unsigned char arrow_bmp[4][7] = 202static unsigned char arrow_bmp[4][7] =
176 { 203 {
@@ -523,13 +550,26 @@ static void star_transition_update(void)
523 */ 550 */
524static void star_display_board_info(void) 551static void star_display_board_info(void)
525{ 552{
526 int label_offset_y = label_offset_y = LCD_HEIGHT - char_height; 553 int label_offset_y = label_offset_y = LCD_HEIGHT - char_height - ( STAR_TILE_SIZE - char_height ) / 2 ;
527 char str_info[32]; 554 char str_info[32];
528 555
529 rb->snprintf(str_info, sizeof(str_info), "L:%02d S:%02d C:", 556 rb->snprintf(str_info, sizeof(str_info), "L:%02d S:%02d C:",
530 current_level, star_count); 557 current_level, star_count);
531 rb->lcd_putsxy(0, label_offset_y, str_info); 558 rb->lcd_putsxy(0, label_offset_y, str_info);
532 559
560#if HAVE_LCD_COLOR
561 if( control == STAR_CONTROL_BALL )
562 rb->lcd_bitmap_part( star_tiles, 0,
563 ball*STAR_TILE_SIZE, STAR_TILE_SIZE,
564 107, label_offset_y - ( STAR_TILE_SIZE - char_height ) / 2 + 1,
565 STAR_TILE_SIZE, STAR_TILE_SIZE);
566 else
567 rb->lcd_bitmap_part( star_tiles, 0,
568 block*STAR_TILE_SIZE, STAR_TILE_SIZE,
569 107, label_offset_y - ( STAR_TILE_SIZE - char_height ) / 2 + 1,
570 STAR_TILE_SIZE, STAR_TILE_SIZE);
571 rb->lcd_update_rect(0, label_offset_y - ( STAR_TILE_SIZE - char_height ) / 2 + 1, LCD_WIDTH, STAR_TILE_SIZE );
572#else
533 if (control == STAR_CONTROL_BALL) 573 if (control == STAR_CONTROL_BALL)
534 rb->lcd_mono_bitmap (ball_bmp, 103, label_offset_y + 1, STAR_TILE_SIZE, 574 rb->lcd_mono_bitmap (ball_bmp, 103, label_offset_y + 1, STAR_TILE_SIZE,
535 STAR_TILE_SIZE); 575 STAR_TILE_SIZE);
@@ -538,6 +578,8 @@ static void star_display_board_info(void)
538 STAR_TILE_SIZE); 578 STAR_TILE_SIZE);
539 579
540 rb->lcd_update_rect(0, label_offset_y, LCD_WIDTH, char_height); 580 rb->lcd_update_rect(0, label_offset_y, LCD_WIDTH, char_height);
581#endif
582
541} 583}
542 584
543 585
@@ -562,41 +604,46 @@ static int star_load_level(int current_level)
562 board[y][x] = *ptr_tab; 604 board[y][x] = *ptr_tab;
563 switch (*ptr_tab) 605 switch (*ptr_tab)
564 { 606 {
607#if HAVE_LCD_COLOR
608# define DRAW_TILE( a ) \
609 rb->lcd_bitmap_part( star_tiles, 0, \
610 a*STAR_TILE_SIZE, STAR_TILE_SIZE, \
611 STAR_OFFSET_X + x * STAR_TILE_SIZE, \
612 STAR_OFFSET_Y + y * STAR_TILE_SIZE, \
613 STAR_TILE_SIZE, STAR_TILE_SIZE);
614#else
615# define DRAW_TILE( a ) \
616 rb->lcd_mono_bitmap ( a # bmp, \
617 STAR_OFFSET_X + x * STAR_TILE_SIZE, \
618 STAR_OFFSET_Y + y * STAR_TILE_SIZE, \
619 STAR_TILE_SIZE, STAR_TILE_SIZE);
620#endif
565 case STAR_VOID: 621 case STAR_VOID:
622#ifdef HAVE_LCD_COLOR
623 DRAW_TILE( space );
624#endif
566 break; 625 break;
567 626
568 case STAR_WALL: 627 case STAR_WALL:
569 rb->lcd_mono_bitmap (wall_bmp, 628 DRAW_TILE( wall );
570 STAR_OFFSET_X + x * STAR_TILE_SIZE,
571 STAR_OFFSET_Y + y * STAR_TILE_SIZE,
572 STAR_TILE_SIZE, STAR_TILE_SIZE);
573 break; 629 break;
574 630
575 case STAR_STAR: 631 case STAR_STAR:
576 rb->lcd_mono_bitmap (star_bmp, 632 DRAW_TILE( star );
577 STAR_OFFSET_X + x * STAR_TILE_SIZE,
578 STAR_OFFSET_Y + y * STAR_TILE_SIZE,
579 STAR_TILE_SIZE, STAR_TILE_SIZE);
580 star_count++; 633 star_count++;
581 break; 634 break;
582 635
583 case STAR_BALL: 636 case STAR_BALL:
584 ball_x = x; 637 ball_x = x;
585 ball_y = y; 638 ball_y = y;
586 rb->lcd_mono_bitmap (ball_bmp, 639 DRAW_TILE( ball );
587 STAR_OFFSET_X + x * STAR_TILE_SIZE,
588 STAR_OFFSET_Y + y * STAR_TILE_SIZE,
589 STAR_TILE_SIZE, STAR_TILE_SIZE);
590 break; 640 break;
591 641
592 642
593 case STAR_BLOCK: 643 case STAR_BLOCK:
594 block_x = x; 644 block_x = x;
595 block_y = y; 645 block_y = y;
596 rb->lcd_mono_bitmap (block_bmp, 646 DRAW_TILE( block );
597 STAR_OFFSET_X + x * STAR_TILE_SIZE,
598 STAR_OFFSET_Y + y * STAR_TILE_SIZE,
599 STAR_TILE_SIZE, STAR_TILE_SIZE);
600 break; 647 break;
601 } 648 }
602 ptr_tab++; 649 ptr_tab++;
@@ -709,18 +756,35 @@ static int star_run_game(void)
709 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR)) 756 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
710 757
711 { 758 {
712 for (i = 0 ; i < 7 ; i++) 759 for (i = 0 ; i <= STAR_TILE_SIZE ; i++)
713 { 760 {
761#if HAVE_LCD_COLOR
762 rb->lcd_bitmap_part(
763 star_tiles, 0, space * STAR_TILE_SIZE, STAR_TILE_SIZE,
764 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE,
765 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE,
766 STAR_TILE_SIZE, STAR_TILE_SIZE);
767 rb->lcd_bitmap_part(
768 star_tiles, 0, ball * STAR_TILE_SIZE, STAR_TILE_SIZE,
769 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * i,
770 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * i,
771 STAR_TILE_SIZE, STAR_TILE_SIZE);
772 rb->lcd_update_rect(
773 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * (i>0?i-1:0),
774 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * (i>0?i-1:0),
775 STAR_TILE_SIZE+(i>0?0:1), STAR_TILE_SIZE+(i>0?0:1));
776#else
714 rb->lcd_mono_bitmap( 777 rb->lcd_mono_bitmap(
715 ball_bmp, 778 ball_bmp,
716 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * i, 779 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * i,
717 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * i, 780 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * i,
718 STAR_TILE_SIZE, STAR_TILE_SIZE); 781 STAR_TILE_SIZE, STAR_TILE_SIZE);
719
720 rb->lcd_update_rect( 782 rb->lcd_update_rect(
721 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * i, 783 STAR_OFFSET_X + ball_x * STAR_TILE_SIZE + move_x * i,
722 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * i, 784 STAR_OFFSET_Y + ball_y * STAR_TILE_SIZE + move_y * i,
723 STAR_TILE_SIZE, STAR_TILE_SIZE); 785 STAR_TILE_SIZE, STAR_TILE_SIZE);
786#endif
787
724 rb->sleep(STAR_SLEEP); 788 rb->sleep(STAR_SLEEP);
725 } 789 }
726 ball_x += move_x; 790 ball_x += move_x;
@@ -741,18 +805,34 @@ static int star_run_game(void)
741 board[block_y][block_x] = STAR_VOID; 805 board[block_y][block_x] = STAR_VOID;
742 while (board[block_y + move_y][block_x + move_x] == STAR_VOID) 806 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
743 { 807 {
744 for (i = 0 ; i < 7 ; i++) 808 for (i = 0 ; i <= STAR_TILE_SIZE ; i++)
745 { 809 {
810#if HAVE_LCD_COLOR
811 rb->lcd_bitmap_part(
812 star_tiles, 0, space * STAR_TILE_SIZE, STAR_TILE_SIZE,
813 STAR_OFFSET_X + block_x * STAR_TILE_SIZE,
814 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE,
815 STAR_TILE_SIZE, STAR_TILE_SIZE);
816 rb->lcd_bitmap_part(
817 star_tiles, 0, block * STAR_TILE_SIZE, STAR_TILE_SIZE,
818 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * i,
819 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * i,
820 STAR_TILE_SIZE, STAR_TILE_SIZE);
821 rb->lcd_update_rect(
822 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * (i>0?i-1:0),
823 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * (i>0?i-1:0),
824 STAR_TILE_SIZE+(i>0?0:1), STAR_TILE_SIZE+(i>0?0:1));
825#else
746 rb->lcd_mono_bitmap( 826 rb->lcd_mono_bitmap(
747 block_bmp, 827 block_bmp,
748 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * i, 828 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * i,
749 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * i, 829 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * i,
750 STAR_TILE_SIZE, STAR_TILE_SIZE); 830 STAR_TILE_SIZE, STAR_TILE_SIZE);
751
752 rb->lcd_update_rect( 831 rb->lcd_update_rect(
753 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * i, 832 STAR_OFFSET_X + block_x * STAR_TILE_SIZE + move_x * i,
754 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * i, 833 STAR_OFFSET_Y + block_y * STAR_TILE_SIZE + move_y * i,
755 STAR_TILE_SIZE, STAR_TILE_SIZE); 834 STAR_TILE_SIZE, STAR_TILE_SIZE);
835#endif
756 836
757 rb->sleep(STAR_SLEEP); 837 rb->sleep(STAR_SLEEP);
758 } 838 }
@@ -912,6 +992,11 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
912 if (char_width == -1) 992 if (char_width == -1)
913 rb->lcd_getstringsize("a", &char_width, &char_height); 993 rb->lcd_getstringsize("a", &char_width, &char_height);
914 994
995#ifdef HAVE_LCD_COLOR
996 rb->lcd_set_background( LCD_BLACK );
997 rb->lcd_set_foreground( LCD_WHITE );
998#endif
999
915 /* display choice menu */ 1000 /* display choice menu */
916 return star_menu(); 1001 return star_menu();
917} 1002}