summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarl Kurbjun <kkurbjun@gmail.com>2009-07-29 04:14:54 +0000
committerKarl Kurbjun <kkurbjun@gmail.com>2009-07-29 04:14:54 +0000
commitad1660074fd42c893f74d4fe4587ca68b1cc5479 (patch)
tree53c946b77be1b1261d53705b863073c3a2cc37d7
parentd10f9511cfa3587960ac86a2b726d86ab403ee76 (diff)
downloadrockbox-ad1660074fd42c893f74d4fe4587ca68b1cc5479.tar.gz
rockbox-ad1660074fd42c893f74d4fe4587ca68b1cc5479.tar.bz2
rockbox-ad1660074fd42c893f74d4fe4587ca68b1cc5479.zip
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
-rw-r--r--apps/plugins/reversi/reversi-gui.c113
-rw-r--r--apps/plugins/reversi/reversi-gui.h10
2 files changed, 80 insertions, 43 deletions
diff --git a/apps/plugins/reversi/reversi-gui.c b/apps/plugins/reversi/reversi-gui.c
index 0bf32daed0..2ad27caf01 100644
--- a/apps/plugins/reversi/reversi-gui.c
+++ b/apps/plugins/reversi/reversi-gui.c
@@ -51,52 +51,69 @@ further options:
PLUGIN_HEADER
-/* Thickness of the grid lines */
-#define LINE_THCK 1
+/* Where the board begins */
+#define XOFS 4
+#define YOFS 4
-#if (LCD_WIDTH/12) < (LCD_HEIGHT/10)
-#define CELL_WIDTH (LCD_WIDTH/12)
-#define CELL_HEIGHT (LCD_WIDTH/12)
+#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 CELL_WIDTH (LCD_HEIGHT/10)
-#define CELL_HEIGHT (LCD_HEIGHT/10)
+#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))
-/* Where the board begins */
-#define XOFS 4
-#define YOFS 4
+#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 */
-#define BOARD_WIDTH (CELL_WIDTH*BOARD_SIZE + LINE_THCK*(BOARD_SIZE+1))
-#define BOARD_HEIGHT (CELL_HEIGHT*BOARD_SIZE + LINE_THCK*(BOARD_SIZE+1))
+#define BOARD_WIDTH (CELL_WIDTH*BOARD_SIZE)
+#define BOARD_HEIGHT (CELL_HEIGHT*BOARD_SIZE)
/* Thickness of the white cells' lines */
-#if (CELL_WIDTH >= 15) && (CELL_HEIGHT >= 15)
-#define CELL_LINE_THICKNESS 2
+#if (CELL_WIDTH >= 10) && (CELL_HEIGHT >= 10)
+#define CELL_LINE_THICKNESS CELL_WIDTH/5
#else
#define CELL_LINE_THICKNESS 1
#endif
/* Margins within a cell */
-#if (CELL_WIDTH >= 10) && (CELL_HEIGHT >= 10)
#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 */
-#define CELL_X(c) (XOFS + (c)*CELL_WIDTH + ((c)+1)*LINE_THCK)
-#define CELL_Y(r) (YOFS + (r)*CELL_HEIGHT + ((r)+1)*LINE_THCK)
+#define CELL_X(c) (XOFS + (c)*CELL_WIDTH)
+#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_Y(lr) (CELL_Y(BOARD_SIZE+(lr)) + CELL_HEIGHT/2)
+#define LEGEND_Y(lr) (CELL_Y(BOARD_SIZE+lr) + YOFS + 1)
#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))
#endif
@@ -146,15 +163,15 @@ static void reversi_gui_display_cursor(int row, int col) {
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
rb->lcd_drawline(x+CURSOR_MARGIN, y+CURSOR_MARGIN,
- x+CELL_WIDTH-CURSOR_MARGIN-1, y+CELL_HEIGHT-CURSOR_MARGIN-1);
- rb->lcd_drawline(x+CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN-1,
- x+CELL_WIDTH-CURSOR_MARGIN-1, y+CURSOR_MARGIN);
+ x+CELL_WIDTH-CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN);
+ rb->lcd_drawline(x+CURSOR_MARGIN, y+CELL_HEIGHT-CURSOR_MARGIN,
+ x+CELL_WIDTH-CURSOR_MARGIN, y+CURSOR_MARGIN);
/* Draw the shadows */
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+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_update();
@@ -168,11 +185,11 @@ static void reversi_gui_draw_cell(int x, int y, int color) {
if (color == WHITE) {
for (i = 0; i < CELL_LINE_THICKNESS; 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) {
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 {
/* Cell is free -> nothing to do */
}
@@ -189,13 +206,13 @@ static void reversi_gui_display_board(void) {
rb->lcd_set_drawmode(DRMODE_FG);
/* 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 */
for (r=0, x=XOFS, y=YOFS; r<=BOARD_SIZE;
- r++, x+=CELL_WIDTH+LINE_THCK, y+=CELL_HEIGHT+LINE_THCK) {
- rb->lcd_hline(XOFS, XOFS+BOARD_WIDTH-1, y);
- rb->lcd_vline(x, YOFS, YOFS+BOARD_HEIGHT-1);
+ r++, x+=CELL_WIDTH, y+=CELL_HEIGHT) {
+ rb->lcd_hline(XOFS, XOFS+BOARD_WIDTH, y);
+ rb->lcd_vline(x, YOFS, YOFS+BOARD_HEIGHT);
}
/* 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);
rb->snprintf(buf, sizeof(buf), "%d", c);
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);
reversi_gui_draw_cell(x, y, WHITE);
rb->snprintf(buf, sizeof(buf), "%d", r);
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 */
r = (cur_player == BLACK ? 0 : 1);
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 */
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) {
bool exit, draw_screen;
int button;
+#ifdef HAVE_TOUCHSCREEN
+ int button_x, button_y;
+#endif
int lastbutton = BUTTON_NONE;
int row, col;
int w_cnt, b_cnt;
char msg_buf[30];
+
+#ifdef HAVE_TOUCHSCREEN
+ rb->touchscreen_set_mode(TOUCHSCREEN_POINT);
+#endif
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
@@ -540,6 +564,19 @@ enum plugin_status plugin_start(const void *parameter) {
break;
#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
case REVERSI_BUTTON_ALT_MAKE_MOVE:
#endif
diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h
index 9ae6e9f286..8c409e9a75 100644
--- a/apps/plugins/reversi/reversi-gui.h
+++ b/apps/plugins/reversi/reversi-gui.h
@@ -128,7 +128,7 @@
#define REVERSI_BUTTON_MENU (BUTTON_SELECT|BUTTON_REPEAT)
#elif CONFIG_KEYPAD == MROBE500_PAD
-#define REVERSI_QUIT BUTTON_POWER
+#define REVERSI_BUTTON_QUIT BUTTON_POWER
#elif (CONFIG_KEYPAD == MROBE100_PAD)
#define REVERSI_BUTTON_QUIT BUTTON_POWER
@@ -149,7 +149,7 @@
#define REVERSI_BUTTON_MENU BUTTON_RC_MENU
#elif CONFIG_KEYPAD == COWOND2_PAD
-#define REVERSI_QUIT BUTTON_POWER
+#define REVERSI_BUTTON_QUIT BUTTON_POWER
#define REVERSI_BUTTON_MENU BUTTON_MENU
#elif CONFIG_KEYPAD == IAUDIO67_PAD
@@ -180,7 +180,7 @@
#define REVERSI_BUTTON_MENU BUTTON_MENU
#elif CONFIG_KEYPAD == ONDAVX747_PAD
-#define REVERSI_QUIT BUTTON_POWER
+#define REVERSI_BUTTON_QUIT BUTTON_POWER
#define REVERSI_BUTTON_MENU BUTTON_MENU
#else
@@ -188,8 +188,8 @@
#endif
#ifdef HAVE_TOUCHSCREEN
-#ifndef REVERSI_QUIT
-#define REVERSI_QUIT BUTTON_TOPLEFT
+#ifndef REVERSI_BUTTON_QUIT
+#define REVERSI_BUTTON_QUIT BUTTON_TOPLEFT
#endif
#ifndef REVERSI_BUTTON_UP
#define REVERSI_BUTTON_UP BUTTON_TOPMIDDLE