FlipIt graphics rework: * Adjusted token sizes to make them fit better on the various LCDs (4 different sizes, a 5th size is planned). Correct aspect ratio for archos bitmap LCD. Graphics work by Marianne Arnold.* Major code cleanup, use bitmap build system for all sizes. Info panel is now always displayed below.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11228 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-10-15 22:31:09 +00:00
parent e0710b2af1
commit 45e3eed60d
18 changed files with 74 additions and 154 deletions

View file

@ -32,4 +32,13 @@ brickmania_powerups.112x64x1.bmp
rockblox_background.112x64x1.bmp rockblox_background.112x64x1.bmp
#endif #endif
/* Flip it */
#ifndef HAVE_LCD_COLOR
#if LCD_WIDTH >= 125 && LCD_HEIGHT >= 110
flipit_cursor.25x25x1.bmp
#elif LCD_WIDTH >= 80 && LCD_HEIGHT >= 62
flipit_cursor.16x13x1.bmp
#endif
#endif
#endif /* HAVE_LCD_BITMAP */ #endif /* HAVE_LCD_BITMAP */

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

View file

@ -127,18 +127,23 @@ sokoban_tiles.6x6x2.bmp
/* Flip it */ /* Flip it */
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
#if LCD_HEIGHT >= 200 #if LCD_WIDTH >= 280 && LCD_HEIGHT >= 234
flipit_tokens.50x50.bmp flipit_cursor.56x56x16.bmp
#elif LCD_HEIGHT >= 160 flipit_tokens.56x112x16.bmp
flipit_tokens.40x40.bmp #elif LCD_WIDTH >= 200 && LCD_HEIGHT >= 170
#else flipit_cursor.40x40x16.bmp
flipit_tokens.30x30.bmp flipit_tokens.40x80x16.bmp
#elif LCD_WIDTH >= 125 && LCD_HEIGHT >= 110
flipit_cursor.25x25x16.bmp
flipit_tokens.25x50x16.bmp
#endif #endif
#elif LCD_DEPTH >= 2 #elif LCD_DEPTH > 1 /* greyscale */
#if LCD_WIDTH >= 150 #if LCD_WIDTH >= 125 && LCD_HEIGHT >= 110
flipit_tokens.30x30x2.bmp flipit_tokens.25x50x2.bmp
#else #endif
flipit_tokens.20x20x2.bmp #else /* monochrome */
#if LCD_WIDTH >= 80 && LCD_HEIGHT >= 62
flipit_tokens.16x26x1.bmp
#endif #endif
#endif #endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -105,169 +105,73 @@ static struct plugin_api* rb;
static int spots[20]; static int spots[20];
static int toggle[20]; static int toggle[20];
static int cursor_pos, moves; static int cursor_pos, moves;
static char s[5];
#if LCD_DEPTH >= 2 #include "flipit_cursor.h"
#include "flipit_tokens.h"
#ifdef HAVE_LCD_COLOR
#if LCD_HEIGHT >= 200
#define tksize 50
#elif LCD_HEIGHT >=160
#define tksize 40
#else
#define tksize 30
#endif
#else
#if LCD_WIDTH >= 150
#define tksize 30
#else
#define tksize 20
#endif
#endif
extern const fb_data flipit_tokens[];
#else
static char *ptr;
#define tksize 16
static unsigned char spot_pic[2][28] = {
{ 0xe0, 0xf8, 0xfc, 0xfe, 0xfe, 0xff, 0xff,
0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xe0,
0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f,
0x3f, 0x3f, 0x1f, 0x1f, 0x0f, 0x07, 0x01 },
{ 0xe0, 0x18, 0x04, 0x02, 0x02, 0x01, 0x01,
0x01, 0x01, 0x02, 0x02, 0x04, 0x18, 0xe0,
0x01, 0x06, 0x08, 0x10, 0x10, 0x20, 0x20,
0x20, 0x20, 0x10, 0x10, 0x08, 0x06, 0x01 }
};
static unsigned char cursor_pic[32] = {
0x55, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xaa,
0x55, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa };
#endif
#define INFO_WIDTH 32
#if LCD_WIDTH - 5*tksize - INFO_WIDTH < 0
# define INFO_UNDER
# undef INFO_WIDTH
# define INFO_WIDTH 60
# define GRID_LEFT ((LCD_WIDTH-5*tksize)/2)
# define GRID_TOP 0
#else
# define GRID_LEFT 0
# define GRID_TOP ((LCD_HEIGHT-4*tksize)/2)
#endif
#define PANEL_HEIGHT 12
#define TK_WIDTH BMPWIDTH_flipit_cursor
#define TK_HEIGHT BMPHEIGHT_flipit_cursor
#define TK_SPACE MAX(0, MIN((LCD_WIDTH - 5*TK_WIDTH)/4, \
(LCD_HEIGHT - PANEL_HEIGHT - 4*TK_HEIGHT)/4))
#define GRID_WIDTH (5*TK_WIDTH + 4*TK_SPACE)
#define GRID_LEFT ((LCD_WIDTH - GRID_WIDTH)/2)
#define GRID_HEIGHT (4*TK_HEIGHT + 4*TK_SPACE) /* includes grid-panel space */
#define GRID_TOP MAX(0, ((LCD_HEIGHT - PANEL_HEIGHT - GRID_HEIGHT)/2))
/* draw a spot at the coordinates (x,y), range of p is 0-19 */ /* draw a spot at the coordinates (x,y), range of p is 0-19 */
static void draw_spot(int p) { static void draw_spot(int p)
#if LCD_DEPTH >= 2 {
rb->lcd_bitmap_part( flipit_tokens, 0, spots[p]*tksize, tksize, rb->lcd_bitmap_part( flipit_tokens, 0, spots[p] * TK_HEIGHT, TK_WIDTH,
(p%5)*tksize+GRID_LEFT, (p/5)*tksize+GRID_TOP, GRID_LEFT + (p%5) * (TK_WIDTH+TK_SPACE),
tksize, tksize ); GRID_TOP + (p/5) * (TK_HEIGHT+TK_SPACE),
#else TK_WIDTH, TK_HEIGHT );
ptr = spot_pic[spots[p]];
rb->lcd_mono_bitmap (ptr, (p%5)*16+1, (p/5)*16+1, 14, 8);
ptr += 14;
rb->lcd_mono_bitmap (ptr, (p%5)*16+1, (p/5)*16+9, 14, 6);
#endif
} }
/* draw the cursor at the current cursor position */ /* draw the cursor at the current cursor position */
static void draw_cursor(void) { static void draw_cursor(void)
{
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
rb->lcd_bitmap_transparent_part( flipit_tokens, 0, 2*tksize, tksize, rb->lcd_bitmap_transparent( flipit_cursor,
(cursor_pos%5)*tksize+GRID_LEFT, GRID_LEFT + (cursor_pos%5) * (TK_WIDTH+TK_SPACE),
(cursor_pos/5)*tksize+GRID_TOP, GRID_TOP + (cursor_pos/5) * (TK_HEIGHT+TK_SPACE),
tksize, tksize ); TK_WIDTH, TK_HEIGHT );
#elif LCD_DEPTH >= 2
/* grayscale doesn't have transparent bitmap ... */
int i,j;
i = ( cursor_pos%5 )*tksize;
j = ( cursor_pos/5 )*tksize;
rb->lcd_set_drawmode( DRMODE_SOLID );
rb->lcd_drawline( i+GRID_LEFT, j+GRID_TOP,
i+tksize-1+GRID_LEFT, j+GRID_TOP );
rb->lcd_drawline( i+GRID_LEFT, j+tksize-1+GRID_TOP,
i+tksize-1+GRID_LEFT, j+tksize-1+GRID_TOP );
rb->lcd_drawline( i+GRID_LEFT, j+GRID_TOP,
i+GRID_LEFT, j+tksize-1+GRID_TOP );
rb->lcd_drawline( i+tksize-1+GRID_LEFT, j+GRID_TOP,
i+tksize-1+GRID_LEFT, j+tksize-1+GRID_TOP );
#else #else
int i,j;
i = (cursor_pos%5)*16;
j = (cursor_pos/5)*16;
rb->lcd_set_drawmode(DRMODE_FG); rb->lcd_set_drawmode(DRMODE_FG);
ptr = cursor_pic; rb->lcd_mono_bitmap( flipit_cursor,
rb->lcd_mono_bitmap (ptr, i, j, 16, 8); GRID_LEFT + (cursor_pos%5) * (TK_WIDTH+TK_SPACE),
ptr += 16; GRID_TOP + (cursor_pos/5) * (TK_HEIGHT+TK_SPACE),
rb->lcd_mono_bitmap (ptr, i, j+8, 16, 8); TK_WIDTH, TK_HEIGHT );
rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_set_drawmode(DRMODE_SOLID);
#endif #endif
} }
/* clear the cursor where it is */ /* clear the cursor where it is */
static void clear_cursor(void) { static inline void clear_cursor(void)
#if LCD_DEPTH >= 2 {
draw_spot( cursor_pos ); draw_spot( cursor_pos );
#else
int i,j;
i = (cursor_pos%5)*16;
j = (cursor_pos/5)*16;
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
rb->lcd_drawline(i, j, i+15, j);
rb->lcd_drawline(i, j+15, i+15, j+15);
rb->lcd_drawline(i, j, i, j+15);
rb->lcd_drawline(i+15, j, i+15, j+15);
rb->lcd_set_drawmode(DRMODE_SOLID);
#endif
} }
/* draw the info panel ... duh */ /* draw the info panel ... duh */
static void draw_info_panel(void) static void draw_info_panel(void)
{ {
#ifdef INFO_UNDER char s[32];
# define HEIGHT ( LCD_HEIGHT - 4*tksize )
# define LEFT ( ( LCD_WIDTH - INFO_WIDTH ) / 2 )
# define TOP ( LCD_HEIGHT - HEIGHT )
#else
# define HEIGHT 64
# define LEFT ( LCD_WIDTH - (LCD_WIDTH- 5*tksize-INFO_WIDTH)/2 - INFO_WIDTH )
# define TOP ( ( LCD_HEIGHT - HEIGHT ) / 2 )
#endif
rb->lcd_set_drawmode( DRMODE_SOLID|DRMODE_INVERSEVID ); rb->lcd_set_drawmode( DRMODE_SOLID|DRMODE_INVERSEVID );
rb->lcd_fillrect( LEFT, TOP, INFO_WIDTH, HEIGHT ); rb->lcd_fillrect( GRID_LEFT, GRID_TOP + 4*(TK_HEIGHT+TK_SPACE),
GRID_WIDTH, PANEL_HEIGHT );
rb->lcd_set_drawmode( DRMODE_SOLID ); rb->lcd_set_drawmode( DRMODE_SOLID );
rb->lcd_drawrect( LEFT, TOP, INFO_WIDTH, HEIGHT ); rb->lcd_drawrect( GRID_LEFT, GRID_TOP + 4*(TK_HEIGHT+TK_SPACE),
#ifdef INFO_UNDER GRID_WIDTH, PANEL_HEIGHT );
rb->lcd_putsxy( LEFT+1, TOP+1, "Flips" );
#else rb->snprintf( s, sizeof(s), "Flips: %d", moves );
rb->lcd_putsxy( LEFT+1, TOP+10, "Flips" ); rb->lcd_putsxy( (LCD_WIDTH - rb->lcd_getstringsize(s, NULL, NULL)) / 2,
#endif GRID_TOP + 4*(TK_HEIGHT+TK_SPACE) + 2, s );
rb->snprintf( s, sizeof(s), "%d", moves );
#ifdef INFO_UNDER
rb->lcd_putsxy( LEFT+32, TOP+1, s );
#else
rb->lcd_putsxy( LEFT+1, TOP+20, s );
#endif
# undef HEIGHT
# undef LEFT
# undef TOP
} }
/* check if the puzzle is finished */ /* check if the puzzle is finished */
static bool flipit_finished(void) { static bool flipit_finished(void)
{
int i; int i;
for (i=0; i<20; i++) for (i=0; i<20; i++)
if (!spots[i]) if (!spots[i])
@ -277,7 +181,8 @@ static bool flipit_finished(void) {
} }
/* draws the toggled spots */ /* draws the toggled spots */
static void flipit_toggle(void) { static void flipit_toggle(void)
{
spots[cursor_pos] = 1-spots[cursor_pos]; spots[cursor_pos] = 1-spots[cursor_pos];
toggle[cursor_pos] = 1-toggle[cursor_pos]; toggle[cursor_pos] = 1-toggle[cursor_pos];
draw_spot(cursor_pos); draw_spot(cursor_pos);
@ -306,7 +211,8 @@ static void flipit_toggle(void) {
} }
/* move the cursor in any direction */ /* move the cursor in any direction */
static void move_cursor(int x, int y) { static void move_cursor(int x, int y)
{
if (!(flipit_finished())) { if (!(flipit_finished())) {
clear_cursor(); clear_cursor();
cursor_pos = ( x + 5 + cursor_pos%5 )%5 cursor_pos = ( x + 5 + cursor_pos%5 )%5
@ -317,7 +223,8 @@ static void move_cursor(int x, int y) {
} }
/* initialize the board */ /* initialize the board */
static void flipit_init(void) { static void flipit_init(void)
{
int i; int i;
rb->lcd_clear_display(); rb->lcd_clear_display();
moves = 0; moves = 0;
@ -340,7 +247,8 @@ static void flipit_init(void) {
} }
/* the main game loop */ /* the main game loop */
static bool flipit_loop(void) { static bool flipit_loop(void)
{
int i; int i;
int button; int button;
int lastbutton = BUTTON_NONE; int lastbutton = BUTTON_NONE;
@ -398,9 +306,7 @@ static bool flipit_loop(void) {
/* toggle the pieces */ /* toggle the pieces */
if (!flipit_finished()) { if (!flipit_finished()) {
flipit_toggle(); flipit_toggle();
#if LCD_DEPTH >= 2
draw_cursor(); draw_cursor();
#endif
rb->lcd_update(); rb->lcd_update();
} }
break; break;