<URL: http://bugs.freeciv.org/Ticket/Display.html?id=38392 >

On 3/18/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
>
>  When ever client connects to new server and gets rulesets (city
> styles), tileset_setup_city_tiles() loads city sprites. They are not
> freed when connection to old server is cut.
>  Note that game.control.num_styles was not necessarily same in the old
> server (when memory was allocated for old sprite set) and in new
> server.

 This patch frees old city style sprites before loading new ones (or
more typically: loading same ones again)


 - ML

diff -Nurd -X.diff_ignore freeciv/client/gui-gtk-2.0/gui_main.c freeciv/client/gui-gtk-2.0/gui_main.c
--- freeciv/client/gui-gtk-2.0/gui_main.c	2007-03-11 23:20:28.000000000 +0200
+++ freeciv/client/gui-gtk-2.0/gui_main.c	2007-03-18 21:15:28.000000000 +0200
@@ -1408,6 +1408,7 @@
     gdk_gc_set_foreground(mask_bg_gc, &pixel);
   }
 
+  tileset_init(tileset);
   tileset_load_tiles(tileset);
 
   /* Only call this after tileset_load_tiles is called. */
diff -Nurd -X.diff_ignore freeciv/client/gui-sdl/gui_main.c freeciv/client/gui-sdl/gui_main.c
--- freeciv/client/gui-sdl/gui_main.c	2007-03-13 15:57:48.000000000 +0200
+++ freeciv/client/gui-sdl/gui_main.c	2007-03-18 21:16:05.000000000 +0200
@@ -927,7 +927,8 @@
                        CF_DRAW_PLAYERS_CEASEFIRE_STATUS|
                        CF_DRAW_PLAYERS_PEACE_STATUS|
                        CF_DRAW_PLAYERS_ALLIANCE_STATUS);
-                       
+
+  tileset_init(tileset);
   tileset_load_tiles(tileset);
   tileset_use_prefered_theme(tileset);
       
diff -Nurd -X.diff_ignore freeciv/client/gui-win32/gui_main.c freeciv/client/gui-win32/gui_main.c
--- freeciv/client/gui-win32/gui_main.c	2007-03-05 21:12:09.000000000 +0200
+++ freeciv/client/gui-win32/gui_main.c	2007-03-18 21:16:50.000000000 +0200
@@ -746,6 +746,7 @@
   SetMenu(root_window,create_mainmenu());
   ShowWindow(root_window,SW_SHOWNORMAL);
   UpdateWindow(root_window);
+  tileset_init(tileset);
   tileset_load_tiles(tileset);
   init_fog_bmp();
   load_cursors();
diff -Nurd -X.diff_ignore freeciv/client/gui-xaw/gui_main.c freeciv/client/gui-xaw/gui_main.c
--- freeciv/client/gui-xaw/gui_main.c	2007-03-05 21:12:03.000000000 +0200
+++ freeciv/client/gui-xaw/gui_main.c	2007-03-18 21:16:31.000000000 +0200
@@ -444,6 +444,7 @@
      setup_widgets() has enough colors available:  (on 256-colour systems)
   */
   setup_widgets();
+  tileset_init(tileset);
   tileset_load_tiles(tileset);
   load_intro_gfx();
   load_cursors();
diff -Nurd -X.diff_ignore freeciv/client/tilespec.c freeciv/client/tilespec.c
--- freeciv/client/tilespec.c	2007-03-15 15:48:28.000000000 +0200
+++ freeciv/client/tilespec.c	2007-03-18 21:14:14.000000000 +0200
@@ -121,6 +121,7 @@
       struct sprite *sprite;
     } *thresholds;
   } *styles;
+  int num_styles;
 };
 
 struct named_sprites {
@@ -1896,9 +1897,13 @@
 {
   /* get style and match the best tile based on city size */
   int style = get_city_style(pcity);
-  int num_thresholds = city_sprite->styles[style].num_thresholds;
+  int num_thresholds;
   int t;
 
+  assert(style < city_sprite->num_styles);
+
+  num_thresholds = city_sprite->styles[style].num_thresholds;
+
   if (num_thresholds == 0) {
     return NULL;
   }
@@ -1928,10 +1933,14 @@
   int style, size;
   char buffer[128];
 
-  city_sprite->styles = fc_malloc(game.control.styles_count
+  /* Store number of styles we have allocated memory for.
+   * game.control.styles_count might change if client disconnects from
+   * server and connects new one. */
+  city_sprite->num_styles = game.control.styles_count;
+  city_sprite->styles = fc_malloc(city_sprite->num_styles
 				  * sizeof(*city_sprite->styles));
 
-  for (style = 0; style < game.control.styles_count; style++) {
+  for (style = 0; style < city_sprite->num_styles; style++) {
     int thresholds = 0;
     struct sprite *sprite;
     char *graphic = city_styles[style].graphic;
@@ -1977,7 +1986,7 @@
   if (!city_sprite) {
     return;
   }
-  for (style = 0; style < game.control.styles_count; style++) {
+  for (style = 0; style < city_sprite->num_styles; style++) {
     if (city_sprite->styles[style].thresholds) {
       free(city_sprite->styles[style].thresholds);
     }
@@ -4279,6 +4288,12 @@
 void tileset_setup_city_tiles(struct tileset *t, int style)
 {
   if (style == game.control.styles_count - 1) {
+
+    /* Free old sprites */
+    free_city_sprite(t->sprites.city.tile);
+    free_city_sprite(t->sprites.city.wall);
+    free_city_sprite(t->sprites.city.occupied);
+
     t->sprites.city.tile = load_city_sprite(t, "city");
     t->sprites.city.wall = load_city_sprite(t, "wall");
     t->sprites.city.occupied = load_city_sprite(t, "occupied");
@@ -4777,3 +4792,14 @@
 		       "default");
   gui_clear_theme();
 }
+
+/****************************************************************************
+  Initialize tileset structure
+****************************************************************************/
+void tileset_init(struct tileset *t)
+{
+  /* We currently have no city sprites loaded. */
+  t->sprites.city.tile     = NULL;
+  t->sprites.city.wall     = NULL;
+  t->sprites.city.occupied = NULL;
+}
diff -Nurd -X.diff_ignore freeciv/client/tilespec.h freeciv/client/tilespec.h
--- freeciv/client/tilespec.h	2007-03-07 16:30:27.000000000 +0200
+++ freeciv/client/tilespec.h	2007-03-18 20:59:29.000000000 +0200
@@ -116,6 +116,7 @@
 const char **get_tileset_list(void);
 
 struct tileset *tileset_read_toplevel(const char *tileset_name, bool verbose);
+void tileset_init(struct tileset *t);
 void tileset_free(struct tileset *tileset);
 void tileset_load_tiles(struct tileset *t);
 void tileset_free_tiles(struct tileset *t);
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to