Complete.Org: Mailing Lists: Archives: freeciv-dev: June 2004:
[Freeciv-Dev] Re: (PR#8973) build citydlg canvas sizes on demand
Home

[Freeciv-Dev] Re: (PR#8973) build citydlg canvas sizes on demand

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [Freeciv-Dev] Re: (PR#8973) build citydlg canvas sizes on demand
From: "Jason Short" <jdorje@xxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 14 Jun 2004 18:50:33 -0700
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=8973 >

Jason Short wrote:
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=8973 >
> 
>>[jdorje - Sun Jun 13 07:49:11 2004]:
>>
>>This is a preliminary patch to determine the citydlg size at runtime.
> 
> 
> And here's an updated patch.  This one should be ready.

Hmm, well...

This version avoids the weird semi-recursive call to city_to_canvas_pos 
in generate_citydlg_dimensions.  Instead map_to_gui_vector is accessed 
directly.

jason

Index: client/citydlg_common.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/citydlg_common.c,v
retrieving revision 1.36
diff -u -r1.36 citydlg_common.c
--- client/citydlg_common.c     13 Jun 2004 16:53:34 -0000      1.36
+++ client/citydlg_common.c     15 Jun 2004 01:49:19 -0000
@@ -31,16 +31,14 @@
 #include "options.h"           /* for concise_city_production */
 #include "tilespec.h"          /* for is_isometric */
 
+static int citydlg_width, citydlg_height;
+
 /**************************************************************************
   Return the width of the city dialog canvas.
 **************************************************************************/
 int get_citydlg_canvas_width(void)
 {
-  if (is_isometric) {
-    return (CITY_MAP_SIZE - 1) * NORMAL_TILE_WIDTH;
-  } else {
-    return CITY_MAP_SIZE * NORMAL_TILE_WIDTH;
-  }
+  return citydlg_width;
 }
 
 /**************************************************************************
@@ -48,11 +46,31 @@
 **************************************************************************/
 int get_citydlg_canvas_height(void)
 {
-  if (is_isometric) {
-    return (CITY_MAP_SIZE - 1) * NORMAL_TILE_HEIGHT;
-  } else {
-    return CITY_MAP_SIZE * NORMAL_TILE_HEIGHT;
-  }
+  return citydlg_height;
+}
+
+/**************************************************************************
+  Calculate the citydlg width and height.
+**************************************************************************/
+void generate_citydlg_dimensions(void)
+{
+  int min_x = 0, max_x = 0, min_y = 0, max_y = 0;
+
+  citydlg_width = citydlg_height = 0;
+  city_map_iterate(city_x, city_y) {
+    int canvas_x, canvas_y;
+
+    map_to_gui_vector(&canvas_x, &canvas_y,
+                     city_x - CITY_MAP_RADIUS, city_y - CITY_MAP_RADIUS);
+
+    min_x = MIN(canvas_x, min_x);
+    max_x = MAX(canvas_x, max_x);
+    min_y = MIN(canvas_y, min_y);
+    max_y = MAX(canvas_y, max_y);
+  } city_map_iterate_end;
+
+  citydlg_width = max_x - min_x + NORMAL_TILE_WIDTH;
+  citydlg_height = max_y - min_y + NORMAL_TILE_HEIGHT;
 }
 
 /**************************************************************************
@@ -83,27 +101,33 @@
 bool canvas_to_city_pos(int *city_x, int *city_y, int canvas_x, int canvas_y)
 {
   int orig_canvas_x = canvas_x, orig_canvas_y = canvas_y;
+  const int width = get_citydlg_canvas_width();
+  const int height = get_citydlg_canvas_height();
+
+  canvas_x -= (width - NORMAL_TILE_WIDTH) / 2;
+  canvas_y -= (height - NORMAL_TILE_HEIGHT) / 2;
 
   if (is_isometric) {
     const int W = NORMAL_TILE_WIDTH, H = NORMAL_TILE_HEIGHT;
 
-    /* Shift the tile right so the top corner of tile (-2,2) is at
+    /* Shift the tile left so the top corner of the origin tile is at
        canvas position (0,0). */
-    canvas_y += H / 2;
+    canvas_x -= W / 2;
 
     /* Perform a pi/4 rotation, with scaling.  See canvas_pos_to_map_pos
        for a full explanation. */
     *city_x = DIVIDE(canvas_x * H + canvas_y * W, W * H);
     *city_y = DIVIDE(canvas_y * W - canvas_x * H, W * H);
-
-    /* Add on the offset of the top-left corner to get the final
-     * coordinates (like in canvas_to_map_pos). */
-    *city_x -= CITY_MAP_RADIUS;
-    *city_y += CITY_MAP_RADIUS;
   } else {
-    *city_x = canvas_x / NORMAL_TILE_WIDTH;
-    *city_y = canvas_y / NORMAL_TILE_HEIGHT;
+    *city_x = DIVIDE(canvas_x, NORMAL_TILE_WIDTH);
+    *city_y = DIVIDE(canvas_y, NORMAL_TILE_HEIGHT);
   }
+
+  /* Add on the offset of the top-left corner to get the final
+   * coordinates (like in canvas_to_map_pos). */
+  *city_x += CITY_MAP_RADIUS;
+  *city_y += CITY_MAP_RADIUS;
+
   freelog(LOG_DEBUG, "canvas_to_city_pos(pos=(%d,%d))=(%d,%d)",
          orig_canvas_x, orig_canvas_y, *city_x, *city_y);
 
Index: client/citydlg_common.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/citydlg_common.h,v
retrieving revision 1.20
diff -u -r1.20 citydlg_common.h
--- client/citydlg_common.h     4 Apr 2004 14:49:10 -0000       1.20
+++ client/citydlg_common.h     15 Jun 2004 01:49:19 -0000
@@ -36,6 +36,7 @@
 
 int get_citydlg_canvas_width(void);
 int get_citydlg_canvas_height(void);
+void generate_citydlg_dimensions(void);
 
 bool city_to_canvas_pos(int *canvas_x, int *canvas_y,
                        int city_x, int city_y);
Index: client/packhand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/packhand.c,v
retrieving revision 1.380
diff -u -r1.380 packhand.c
--- client/packhand.c   12 Jun 2004 17:42:27 -0000      1.380
+++ client/packhand.c   15 Jun 2004 01:49:19 -0000
@@ -1318,6 +1318,8 @@
   map_allocate();
   init_client_goto();
 
+  generate_citydlg_dimensions();
+
   set_overview_dimensions(map.xsize, map.ysize);
 }
 
Index: client/tilespec.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.c,v
retrieving revision 1.174
diff -u -r1.174 tilespec.c
--- client/tilespec.c   6 Jun 2004 06:09:46 -0000       1.174
+++ client/tilespec.c   15 Jun 2004 01:49:20 -0000
@@ -419,6 +419,7 @@
        we don't want/need to redraw. */
     return;
   }
+  generate_citydlg_dimensions();
   tileset_changed();
   center_tile_mapcanvas(center_x, center_y);
 }

[Prev in Thread] Current Thread [Next in Thread]
  • [Freeciv-Dev] Re: (PR#8973) build citydlg canvas sizes on demand, Jason Short <=