<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