Reversi: Attempt to account for screen aspect, add preliminary absolute touchscreen support (Menu button and quit button need to be added to display)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22079 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Karl Kurbjun 2009-07-29 04:14:54 +00:00
parent d10f9511cf
commit ad1660074f
2 changed files with 82 additions and 45 deletions

View file

@ -51,52 +51,69 @@ further options:
PLUGIN_HEADER PLUGIN_HEADER
/* Thickness of the grid lines */
#define LINE_THCK 1
#if (LCD_WIDTH/12) < (LCD_HEIGHT/10)
#define CELL_WIDTH (LCD_WIDTH/12)
#define CELL_HEIGHT (LCD_WIDTH/12)
#else
#define CELL_WIDTH (LCD_HEIGHT/10)
#define CELL_HEIGHT (LCD_HEIGHT/10)
#endif
/* Where the board begins */ /* Where the board begins */
#define XOFS 4 #define XOFS 4
#define YOFS 4 #define YOFS 4
#if LCD_HEIGHT > LCD_WIDTH
#define MARGIN_W (XOFS*2+1)
#define MARGIN_H (YOFS*2+1)
#define MARGIN_C_W 0
#define MARGIN_C_H 2
#else
#define MARGIN_W (XOFS*2 + 16)
#define MARGIN_H (YOFS*2+1)
#define MARGIN_C_W 1
#define MARGIN_C_H 0
#endif
#if ( (LCD_WIDTH - MARGIN_W) / (BOARD_SIZE+MARGIN_C_W)) < \
( (LCD_HEIGHT - MARGIN_H) / (BOARD_SIZE+MARGIN_C_H))
#define CELL_PRE ( ( (LCD_WIDTH * LCD_PIXEL_ASPECT_WIDTH / \
LCD_PIXEL_ASPECT_HEIGHT) - MARGIN_W) / \
(BOARD_SIZE+MARGIN_C_W) )
#define CELL_WIDTH (CELL_PRE*LCD_PIXEL_ASPECT_HEIGHT / LCD_PIXEL_ASPECT_WIDTH)
#define CELL_HEIGHT (CELL_PRE)
#else
#define CELL_PRE ( ( (LCD_HEIGHT * LCD_PIXEL_ASPECT_HEIGHT / \
LCD_PIXEL_ASPECT_WIDTH) - MARGIN_H) / \
(BOARD_SIZE+MARGIN_C_H) )
#define CELL_WIDTH (CELL_PRE)
#define CELL_HEIGHT (CELL_PRE*LCD_PIXEL_ASPECT_WIDTH / LCD_PIXEL_ASPECT_HEIGHT)
#endif
/* Total width and height of the board without enclosing box */ /* Total width and height of the board without enclosing box */
#define BOARD_WIDTH (CELL_WIDTH*BOARD_SIZE + LINE_THCK*(BOARD_SIZE+1)) #define BOARD_WIDTH (CELL_WIDTH*BOARD_SIZE)
#define BOARD_HEIGHT (CELL_HEIGHT*BOARD_SIZE + LINE_THCK*(BOARD_SIZE+1)) #define BOARD_HEIGHT (CELL_HEIGHT*BOARD_SIZE)
/* Thickness of the white cells' lines */ /* Thickness of the white cells' lines */
#if (CELL_WIDTH >= 15) && (CELL_HEIGHT >= 15) #if (CELL_WIDTH >= 10) && (CELL_HEIGHT >= 10)
#define CELL_LINE_THICKNESS 2 #define CELL_LINE_THICKNESS CELL_WIDTH/5
#else #else
#define CELL_LINE_THICKNESS 1 #define CELL_LINE_THICKNESS 1
#endif #endif
/* Margins within a cell */ /* Margins within a cell */
#if (CELL_WIDTH >= 10) && (CELL_HEIGHT >= 10)
#define STONE_MARGIN 2 #define STONE_MARGIN 2
#else
#define STONE_MARGIN 1
#endif
#define CURSOR_MARGIN (STONE_MARGIN + CELL_LINE_THICKNESS) #define CURSOR_MARGIN 1
/* Upper left corner of a cell */ /* Upper left corner of a cell */
#define CELL_X(c) (XOFS + (c)*CELL_WIDTH + ((c)+1)*LINE_THCK) #define CELL_X(c) (XOFS + (c)*CELL_WIDTH)
#define CELL_Y(r) (YOFS + (r)*CELL_HEIGHT + ((r)+1)*LINE_THCK) #define CELL_Y(r) (YOFS + (r)*CELL_HEIGHT)
/* Used for touchscreen to convert an X/Y location to a cell location */
#define CELL_C(x) (((x)-XOFS)/CELL_WIDTH)
#define CELL_R(y) (((y)-YOFS)/CELL_HEIGHT)
#ifdef VERTICAL_LAYOUT #if LCD_HEIGHT > LCD_WIDTH
#define LEGEND_X(lc) (CELL_X(lc)) #define LEGEND_X(lc) (CELL_X(lc))
#define LEGEND_Y(lr) (CELL_Y(BOARD_SIZE+(lr)) + CELL_HEIGHT/2) #define LEGEND_Y(lr) (CELL_Y(BOARD_SIZE+lr) + YOFS + 1)
#else #else
#define LEGEND_X(lc) (CELL_X(BOARD_SIZE+(lc)) + CELL_WIDTH/2) #define LEGEND_X(lc) (CELL_X(BOARD_SIZE+lc) + XOFS + 1)
#define LEGEND_Y(lr) (CELL_Y(lr)) #define LEGEND_Y(lr) (CELL_Y(lr))
#endif #endif
@ -146,15 +163,15 @@ static void reversi_gui_display_cursor(int row, int col) {
rb->lcd_set_drawmode(DRMODE_COMPLEMENT); rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
rb->lcd_drawline(x+CURSOR_MARGIN, y+CURSOR_MARGIN, rb->lcd_drawline(x+CURSOR_MARGIN, y+CURSOR_MARGIN,
x+CELL_WIDTH-CURSOR_MARGIN-1, y+CELL_HEIGHT-CURSOR_MARGIN-1); x+CELL_WIDTH-CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN);
rb->lcd_drawline(x+CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN-1, rb->lcd_drawline(x+CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN,
x+CELL_WIDTH-CURSOR_MARGIN-1, y+CURSOR_MARGIN); x+CELL_WIDTH-CURSOR_MARGIN, y+CURSOR_MARGIN);
/* Draw the shadows */ /* Draw the shadows */
rb->lcd_hline(x, x+CELL_WIDTH-1, YOFS-3); rb->lcd_hline(x, x+CELL_WIDTH-1, YOFS-3);
rb->lcd_hline(x, x+CELL_WIDTH-1, YOFS+BOARD_HEIGHT+2); rb->lcd_hline(x, x+CELL_WIDTH-1, YOFS+BOARD_HEIGHT+3);
rb->lcd_vline(XOFS-3, y, y+CELL_HEIGHT-1); rb->lcd_vline(XOFS-3, y, y+CELL_HEIGHT-1);
rb->lcd_vline(XOFS+BOARD_WIDTH+2, y, y+CELL_HEIGHT-1); rb->lcd_vline(XOFS+BOARD_WIDTH+3, y, y+CELL_HEIGHT-1);
rb->lcd_set_drawmode(old_mode); rb->lcd_set_drawmode(old_mode);
rb->lcd_update(); rb->lcd_update();
@ -168,11 +185,11 @@ static void reversi_gui_draw_cell(int x, int y, int color) {
if (color == WHITE) { if (color == WHITE) {
for (i = 0; i < CELL_LINE_THICKNESS; i++) { for (i = 0; i < CELL_LINE_THICKNESS; i++) {
rb->lcd_drawrect(x+STONE_MARGIN+i, y+STONE_MARGIN+i, rb->lcd_drawrect(x+STONE_MARGIN+i, y+STONE_MARGIN+i,
CELL_WIDTH-2*(STONE_MARGIN+i), CELL_HEIGHT-2*(STONE_MARGIN+i)); CELL_WIDTH+1-2*(STONE_MARGIN+i), CELL_HEIGHT+1-2*(STONE_MARGIN+i));
} }
} else if (color == BLACK) { } else if (color == BLACK) {
rb->lcd_fillrect(x+STONE_MARGIN, y+STONE_MARGIN, rb->lcd_fillrect(x+STONE_MARGIN, y+STONE_MARGIN,
CELL_WIDTH-2*STONE_MARGIN, CELL_HEIGHT-2*STONE_MARGIN); CELL_WIDTH-STONE_MARGIN-1, CELL_HEIGHT-1-STONE_MARGIN);
} else { } else {
/* Cell is free -> nothing to do */ /* Cell is free -> nothing to do */
} }
@ -189,13 +206,13 @@ static void reversi_gui_display_board(void) {
rb->lcd_set_drawmode(DRMODE_FG); rb->lcd_set_drawmode(DRMODE_FG);
/* Thicker board box */ /* Thicker board box */
rb->lcd_drawrect(XOFS-1, YOFS-1, BOARD_WIDTH+2, BOARD_HEIGHT+2); rb->lcd_drawrect(XOFS-1, YOFS-1, BOARD_WIDTH+3, BOARD_HEIGHT+3);
/* Draw the gridlines */ /* Draw the gridlines */
for (r=0, x=XOFS, y=YOFS; r<=BOARD_SIZE; for (r=0, x=XOFS, y=YOFS; r<=BOARD_SIZE;
r++, x+=CELL_WIDTH+LINE_THCK, y+=CELL_HEIGHT+LINE_THCK) { r++, x+=CELL_WIDTH, y+=CELL_HEIGHT) {
rb->lcd_hline(XOFS, XOFS+BOARD_WIDTH-1, y); rb->lcd_hline(XOFS, XOFS+BOARD_WIDTH, y);
rb->lcd_vline(x, YOFS, YOFS+BOARD_HEIGHT-1); rb->lcd_vline(x, YOFS, YOFS+BOARD_HEIGHT);
} }
/* Draw the stones. This is not the most efficient way but more readable */ /* Draw the stones. This is not the most efficient way but more readable */
@ -219,18 +236,18 @@ static void reversi_gui_display_board(void) {
reversi_gui_draw_cell(x, y, BLACK); reversi_gui_draw_cell(x, y, BLACK);
rb->snprintf(buf, sizeof(buf), "%d", c); rb->snprintf(buf, sizeof(buf), "%d", c);
y += (CELL_HEIGHT-x_height) / 2; y += (CELL_HEIGHT-x_height) / 2;
rb->lcd_putsxy(x + CELL_WIDTH + CELL_WIDTH/2, y, buf); rb->lcd_putsxy(x + CELL_WIDTH + 2, y, buf);
y = LEGEND_Y(1); y = LEGEND_Y(1);
reversi_gui_draw_cell(x, y, WHITE); reversi_gui_draw_cell(x, y, WHITE);
rb->snprintf(buf, sizeof(buf), "%d", r); rb->snprintf(buf, sizeof(buf), "%d", r);
y += (CELL_HEIGHT-x_height) / 2; y += (CELL_HEIGHT-x_height) / 2;
rb->lcd_putsxy(x + CELL_WIDTH + CELL_WIDTH/2, y, buf); rb->lcd_putsxy(x + CELL_WIDTH + 2, y, buf);
/* Draw the box around the current player */ /* Draw the box around the current player */
r = (cur_player == BLACK ? 0 : 1); r = (cur_player == BLACK ? 0 : 1);
y = LEGEND_Y(r); y = LEGEND_Y(r);
rb->lcd_drawrect(x-1, y-1, CELL_WIDTH+2, CELL_HEIGHT+2); rb->lcd_drawrect(x, y, CELL_WIDTH+1, CELL_HEIGHT+1);
/* Update the screen */ /* Update the screen */
rb->lcd_update(); rb->lcd_update();
@ -466,10 +483,17 @@ static void reversi_gui_move_cursor(int new_row, int new_col) {
enum plugin_status plugin_start(const void *parameter) { enum plugin_status plugin_start(const void *parameter) {
bool exit, draw_screen; bool exit, draw_screen;
int button; int button;
#ifdef HAVE_TOUCHSCREEN
int button_x, button_y;
#endif
int lastbutton = BUTTON_NONE; int lastbutton = BUTTON_NONE;
int row, col; int row, col;
int w_cnt, b_cnt; int w_cnt, b_cnt;
char msg_buf[30]; char msg_buf[30];
#ifdef HAVE_TOUCHSCREEN
rb->touchscreen_set_mode(TOUCHSCREEN_POINT);
#endif
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL); rb->lcd_set_backdrop(NULL);
@ -540,6 +564,19 @@ enum plugin_status plugin_start(const void *parameter) {
break; break;
#endif #endif
#ifdef HAVE_TOUCHSCREEN
case BUTTON_TOUCHSCREEN:
button_x = rb->button_get_data() >> 16;
button_y = rb->button_get_data() & 0xffff;
if( (CELL_R(button_y)>(BOARD_SIZE-1)) ||
(CELL_C(button_x)>(BOARD_SIZE-1)) )
{
break;
} else {
reversi_gui_move_cursor(CELL_R(button_y), CELL_C(button_x));
}
#endif
#ifdef REVERSI_BUTTON_ALT_MAKE_MOVE #ifdef REVERSI_BUTTON_ALT_MAKE_MOVE
case REVERSI_BUTTON_ALT_MAKE_MOVE: case REVERSI_BUTTON_ALT_MAKE_MOVE:
#endif #endif

View file

@ -128,7 +128,7 @@
#define REVERSI_BUTTON_MENU (BUTTON_SELECT|BUTTON_REPEAT) #define REVERSI_BUTTON_MENU (BUTTON_SELECT|BUTTON_REPEAT)
#elif CONFIG_KEYPAD == MROBE500_PAD #elif CONFIG_KEYPAD == MROBE500_PAD
#define REVERSI_QUIT BUTTON_POWER #define REVERSI_BUTTON_QUIT BUTTON_POWER
#elif (CONFIG_KEYPAD == MROBE100_PAD) #elif (CONFIG_KEYPAD == MROBE100_PAD)
#define REVERSI_BUTTON_QUIT BUTTON_POWER #define REVERSI_BUTTON_QUIT BUTTON_POWER
@ -149,7 +149,7 @@
#define REVERSI_BUTTON_MENU BUTTON_RC_MENU #define REVERSI_BUTTON_MENU BUTTON_RC_MENU
#elif CONFIG_KEYPAD == COWOND2_PAD #elif CONFIG_KEYPAD == COWOND2_PAD
#define REVERSI_QUIT BUTTON_POWER #define REVERSI_BUTTON_QUIT BUTTON_POWER
#define REVERSI_BUTTON_MENU BUTTON_MENU #define REVERSI_BUTTON_MENU BUTTON_MENU
#elif CONFIG_KEYPAD == IAUDIO67_PAD #elif CONFIG_KEYPAD == IAUDIO67_PAD
@ -180,7 +180,7 @@
#define REVERSI_BUTTON_MENU BUTTON_MENU #define REVERSI_BUTTON_MENU BUTTON_MENU
#elif CONFIG_KEYPAD == ONDAVX747_PAD #elif CONFIG_KEYPAD == ONDAVX747_PAD
#define REVERSI_QUIT BUTTON_POWER #define REVERSI_BUTTON_QUIT BUTTON_POWER
#define REVERSI_BUTTON_MENU BUTTON_MENU #define REVERSI_BUTTON_MENU BUTTON_MENU
#else #else
@ -188,8 +188,8 @@
#endif #endif
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
#ifndef REVERSI_QUIT #ifndef REVERSI_BUTTON_QUIT
#define REVERSI_QUIT BUTTON_TOPLEFT #define REVERSI_BUTTON_QUIT BUTTON_TOPLEFT
#endif #endif
#ifndef REVERSI_BUTTON_UP #ifndef REVERSI_BUTTON_UP
#define REVERSI_BUTTON_UP BUTTON_TOPMIDDLE #define REVERSI_BUTTON_UP BUTTON_TOPMIDDLE