added option to draw virtual buttons outlined
[rocksndiamonds.git] / src / libgame / sdl.c
index df5b32425fe870d6c0d9547b19bafdc5b5e1bdcd..8ac2fc3af6e298f3eb3ba20fb8155c4607d64205 100644 (file)
@@ -3012,6 +3012,13 @@ static void DrawTouchInputOverlay_ShowGrid(int alpha)
   SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255);
 }
 
+static void RenderFillRectangle(int x, int y, int width, int height)
+{
+  SDL_Rect rect = { x, y, width, height };
+
+  SDL_RenderFillRect(sdl_renderer, &rect);
+}
+
 static void DrawTouchInputOverlay_ShowGridButtons(int alpha)
 {
   static int alpha_direction = 0;
@@ -3052,44 +3059,81 @@ static void DrawTouchInputOverlay_ShowGridButtons(int alpha)
   {
     for (y = 0; y < grid_ysize; y++)
     {
+      int grid_button = overlay.grid_button[x][y];
+      int alpha_draw = alpha;
+      int outline_border = MV_NONE;
+      int border_size = 2;
+      boolean draw_outlined = setup.touch.draw_outlined;
+
+      if (grid_button == CHAR_GRID_BUTTON_NONE)
+       continue;
+
+      if (grid_button == overlay.grid_button_highlight)
+       alpha_draw = alpha_highlight;
+
+      SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha_draw);
+
       rect.x = (x + 0) * video.screen_width  / grid_xsize;
       rect.y = (y + 0) * video.screen_height / grid_ysize;
       rect.w = (x + 1) * video.screen_width  / grid_xsize - rect.x;
       rect.h = (y + 1) * video.screen_height / grid_ysize - rect.y;
 
-      if (x == 0 ||
-         overlay.grid_button[x - 1][y] != overlay.grid_button[x][y])
+      if (x == 0 || overlay.grid_button[x - 1][y] != grid_button)
       {
-       rect.x += 2;
-       rect.w -= 2;
+       rect.x += border_size;
+       rect.w -= border_size;
+
+       outline_border |= MV_LEFT;
       }
 
-      if (x == grid_xsize - 1 ||
-         overlay.grid_button[x + 1][y] != overlay.grid_button[x][y])
+      if (x == grid_xsize - 1 || overlay.grid_button[x + 1][y] != grid_button)
       {
-       rect.w -= 2;
+       rect.w -= border_size;
+
+       outline_border |= MV_RIGHT;
       }
 
-      if (y == 0 ||
-         overlay.grid_button[x][y - 1] != overlay.grid_button[x][y])
+      if (y == 0 || overlay.grid_button[x][y - 1] != grid_button)
       {
-       rect.y += 2;
-       rect.h -= 2;
+       rect.y += border_size;
+       rect.h -= border_size;
+
+       outline_border |= MV_UP;
       }
 
-      if (y == grid_ysize - 1 ||
-         overlay.grid_button[x][y + 1] != overlay.grid_button[x][y])
+      if (y == grid_ysize - 1 || overlay.grid_button[x][y + 1] != grid_button)
       {
-       rect.h -= 2;
+       rect.h -= border_size;
+
+       outline_border |= MV_DOWN;
       }
 
-      if (overlay.grid_button[x][y] == overlay.grid_button_highlight)
-       SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha_highlight);
-      else
-       SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha);
+      if (draw_outlined)
+      {
+       int rect_x = rect.x +
+         (outline_border & MV_LEFT  ? border_size : 0);
+       int rect_w = rect.w -
+         (outline_border & MV_LEFT  ? border_size : 0) -
+         (outline_border & MV_RIGHT ? border_size : 0);
+
+       if (outline_border & MV_LEFT)
+         RenderFillRectangle(rect.x, rect.y, border_size, rect.h);
+
+       if (outline_border & MV_RIGHT)
+         RenderFillRectangle(rect.x + rect.w - border_size, rect.y,
+                             border_size, rect.h);
 
-      if (overlay.grid_button[x][y] != CHAR_GRID_BUTTON_NONE)
+       if (outline_border & MV_UP)
+         RenderFillRectangle(rect_x, rect.y, rect_w, border_size);
+
+       if (outline_border & MV_DOWN)
+         RenderFillRectangle(rect_x, rect.y + rect.h - border_size,
+                             rect_w, border_size);
+      }
+      else
+      {
        SDL_RenderFillRect(sdl_renderer, &rect);
+      }
     }
   }