I added a small nit in the diff comments.

I also get a lot of compiler warnings about variable names in the graphic libs, 
e.g.

src/graphic/gl/fields_to_draw.h:56:16: warning: declaration of ‘size’ shadows a 
member of 'this' [-Wshadow]
   const size_t size = w_ * h_;


The problem with the fuzzy roads from the other branch still remains.

Everything else LGTM :)

Diff comments:

> === modified file 'src/ai/ai_hints.cc'
> --- src/ai/ai_hints.cc        2015-03-26 06:59:37 +0000
> +++ src/ai/ai_hints.cc        2015-03-29 18:13:50 +0000
> @@ -48,7 +48,8 @@
>               } else {
>                       if (!strcmp(section ? 
> section->get_string("trainingsite_type", "basic") : "basic", "basic")) {
>                               trainingsite_type_ =  TrainingSiteType::kBasic;
> -                     } else if (!strcmp(section ? 
> section->get_string("trainingsite_type", "basic") : "basic", "advanced")) {
> +                     } else if (!strcmp(section ? 
> section->get_string("trainingsite_type", "basic") : "basic",
> +                                        "advanced")) {
>                               trainingsite_type_ =  
> TrainingSiteType::kAdvanced;
>                       } else {
>                               trainingsite_type_ = TrainingSiteType::kNoTS;
> 
> === modified file 'src/economy/portdock.cc'
> --- src/economy/portdock.cc   2015-02-16 20:23:15 +0000
> +++ src/economy/portdock.cc   2015-03-29 18:13:50 +0000
> @@ -218,7 +218,6 @@
>               if (!wh->m_cleanup_in_progress){
>                       if (upcast(Game, game, &egbase)) {
>                               if (game->is_loaded()) { //do not attempt when 
> shutting down
> -                                     Player& player = owner();
>                                       wh->restore_portdock_or_destroy(egbase);
>                               }
>                       }
> 
> === modified file 'src/economy/ware_instance.cc'
> --- src/economy/ware_instance.cc      2014-11-30 18:49:38 +0000
> +++ src/economy/ware_instance.cc      2015-03-29 18:13:50 +0000
> @@ -646,7 +646,7 @@
>               throw wexception("WareInstance: %s", e.what());
>       }
>  
> -     return nullptr; // Should never be reached
> +     throw wexception("Unreachable code was reached. Please report a bug.");
>  }
>  
>  }
> 
> === modified file 'src/editor/CMakeLists.txt'
> --- src/editor/CMakeLists.txt 2015-01-31 16:03:59 +0000
> +++ src/editor/CMakeLists.txt 2015-03-29 18:13:50 +0000
> @@ -102,6 +102,6 @@
>      ui_fsmenu
>      widelands_ball_of_mud
>      wui
> +    wui_field_overlay_manager
>      wui_mapview_pixelfunctions
> -    wui_overlay_manager
>  )
> 
> === modified file 'src/editor/editorinteractive.cc'
> --- src/editor/editorinteractive.cc   2015-02-05 23:39:23 +0000
> +++ src/editor/editorinteractive.cc   2015-03-29 18:13:50 +0000
> @@ -49,9 +49,9 @@
>  #include "ui_basic/messagebox.h"
>  #include "ui_basic/progresswindow.h"
>  #include "wlapplication.h"
> +#include "wui/field_overlay_manager.h"
>  #include "wui/game_tips.h"
>  #include "wui/interactive_base.h"
> -#include "wui/overlay_manager.h"
>  
>  namespace {
>  
> @@ -152,21 +152,20 @@
>               if (Widelands::Coords const sp = map.get_starting_pos(p)) {
>                       const Image* pic = g_gr->images().get(fname);
>                       assert(pic);
> -                     map.overlay_manager().register_overlay
> +                     mutable_field_overlay_manager()->register_overlay
>                               (sp, pic, 8, Point(pic->width() / 2, 
> STARTING_POS_HOTSPOT_Y));
>               }
>       }
>  
>       //  Resources: we do not calculate default resources, therefore we do 
> not
>       //  expect to meet them here.
> -     OverlayManager& overlay_manager = map.overlay_manager();
>       Widelands::Extent const extent = map.extent();
>       iterate_Map_FCoords(map, extent, fc) {
>               if (uint8_t const amount = fc.field->get_resources_amount()) {
>                       const std::string& immname =
>                          
> egbase().world().get_resource(fc.field->get_resources())->get_editor_pic(amount);
>                       if (immname.size())
> -                             overlay_manager.register_overlay(fc, 
> g_gr->images().get(immname), 4);
> +                             
> mutable_field_overlay_manager()->register_overlay(fc, 
> g_gr->images().get(immname), 4);
>               }
>       }
>  }
> @@ -224,7 +223,7 @@
>       } catch (LuaScriptNotExistingError &) {
>               // do nothing.
>       }
> -     egbase().map().overlay_manager().show_buildhelp(true);
> +     show_buildhelp(true);
>  }
>  
>  
> @@ -303,11 +302,6 @@
>               map_clicked(true);
>  }
>  
> -void EditorInteractive::toggle_buildhelp() {
> -     egbase().map().overlay_manager().toggle_buildhelp();
> -}
> -
> -
>  void EditorInteractive::tool_menu_btn() {
>       if (m_toolmenu.window)
>               delete m_toolmenu.window;
> @@ -502,7 +496,7 @@
>               Widelands::Map & map = egbase().map();
>               //  A new tool has been selected. Remove all registered overlay 
> callback
>               //  functions.
> -             map.overlay_manager().remove_overlay_callback_function();
> +             
> mutable_field_overlay_manager()->register_overlay_callback_function(nullptr);
>               map.recalc_whole_map(egbase().world());
>       }
>       tools.current_pointer = &primary;
> 
> === modified file 'src/editor/editorinteractive.h'
> --- src/editor/editorinteractive.h    2014-10-14 06:30:20 +0000
> +++ src/editor/editorinteractive.h    2015-03-29 18:13:50 +0000
> @@ -121,7 +121,6 @@
>       void set_need_save(bool const t) {m_need_save = t;}
>  
>  private:
> -     void toggle_buildhelp();
>       void tool_menu_btn();
>       void toolsize_menu_btn();
>       void toggle_mainmenu();
> 
> === modified file 'src/editor/tools/editor_decrease_resources_tool.cc'
> --- src/editor/tools/editor_decrease_resources_tool.cc        2015-03-01 
> 09:21:20 +0000
> +++ src/editor/tools/editor_decrease_resources_tool.cc        2015-03-29 
> 18:13:50 +0000
> @@ -28,7 +28,7 @@
>  #include "logic/widelands_geometry.h"
>  #include "logic/world/resource_description.h"
>  #include "logic/world/world.h"
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  
>  /**
> @@ -39,7 +39,7 @@
>  EditorDecreaseResourcesTool::handle_click_impl(Widelands::Map& map,
>                                                    const Widelands::World& 
> world,
>                                                    
> Widelands::NodeAndTriangle<> const center,
> -                                                  EditorInteractive& /* 
> parent */,
> +                                                  EditorInteractive& parent,
>                                                    EditorActionArgs& args) {
>       Widelands::MapRegion<Widelands::Area<Widelands::FCoords> > mr
>       (map,
> @@ -63,7 +63,8 @@
>                           world.get_resource(res)->get_editor_pic
>                           (mr.location().field->get_resources_amount());
>                       const Image* pic = g_gr->images().get(str);
> -                     map.overlay_manager().remove_overlay(mr.location(), 
> pic);
> +                     auto* overlay_manager = 
> parent.mutable_field_overlay_manager();
> +                     overlay_manager->remove_overlay(mr.location(), pic);
>                       if (!amount) {
>                               mr.location().field->set_resources(0, 0);
>                               mr.location().field->set_initial_res_amount(0);
> @@ -73,7 +74,7 @@
>                               //  set new overlay
>                               str = 
> world.get_resource(args.cur_res)->get_editor_pic(amount);
>                               pic = g_gr->images().get(str);
> -                             
> map.overlay_manager().register_overlay(mr.location(), pic, 4);
> +                             
> overlay_manager->register_overlay(mr.location(), pic, 4);
>                               map.recalc_for_field_area(
>                                  world, 
> Widelands::Area<Widelands::FCoords>(mr.location(), 0));
>                       }
> 
> === modified file 'src/editor/tools/editor_increase_resources_tool.cc'
> --- src/editor/tools/editor_increase_resources_tool.cc        2015-02-24 
> 13:51:38 +0000
> +++ src/editor/tools/editor_increase_resources_tool.cc        2015-03-29 
> 18:13:50 +0000
> @@ -26,7 +26,7 @@
>  #include "logic/world/resource_description.h"
>  #include "logic/world/terrain_description.h"
>  #include "logic/world/world.h"
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  using Widelands::TCoords;
>  
> @@ -84,13 +84,12 @@
>  there is not already another resource there.
>  ===========
>  */
> -int32_t
> -EditorIncreaseResourcesTool::handle_click_impl(Widelands::Map& map,
> -                                                  const Widelands::World& 
> world,
> -                                                  
> Widelands::NodeAndTriangle<> const center,
> -                                                  EditorInteractive& /* 
> parent */,
> -                                                  EditorActionArgs& args) {
> -     OverlayManager & overlay_manager = map.overlay_manager();
> +int32_t EditorIncreaseResourcesTool::handle_click_impl(Widelands::Map& map,
> +                                                       const 
> Widelands::World& world,
> +                                                       
> Widelands::NodeAndTriangle<> const center,
> +                                                       EditorInteractive& 
> parent,
> +                                                       EditorActionArgs& 
> args) {
> +     FieldOverlayManager& overlay_manager = 
> *parent.mutable_field_overlay_manager();
>       Widelands::MapRegion<Widelands::Area<Widelands::FCoords> > mr
>               (map,
>                       Widelands::Area<Widelands::FCoords>
> 
> === modified file 'src/editor/tools/editor_set_origin_tool.cc'
> --- src/editor/tools/editor_set_origin_tool.cc        2014-09-10 14:08:25 
> +0000
> +++ src/editor/tools/editor_set_origin_tool.cc        2015-03-29 18:13:50 
> +0000
> @@ -22,7 +22,6 @@
>  #include "editor/editorinteractive.h"
>  #include "logic/map.h"
>  #include "wui/mapviewpixelconstants.h"
> -#include "wui/overlay_manager.h"
>  
>  int32_t EditorSetOriginTool::handle_click_impl(Widelands::Map& map,
>                                                    const Widelands::World&,
> 
> === modified file 'src/editor/tools/editor_set_port_space_tool.cc'
> --- src/editor/tools/editor_set_port_space_tool.cc    2014-09-20 09:37:47 
> +0000
> +++ src/editor/tools/editor_set_port_space_tool.cc    2015-03-29 18:13:50 
> +0000
> @@ -25,7 +25,6 @@
>  #include "logic/map.h"
>  #include "logic/mapfringeregion.h"
>  #include "logic/mapregion.h"
> -#include "wui/overlay_manager.h"
>  
>  using namespace Widelands;
>  
> 
> === modified file 'src/editor/tools/editor_set_resources_tool.cc'
> --- src/editor/tools/editor_set_resources_tool.cc     2014-12-01 21:47:22 
> +0000
> +++ src/editor/tools/editor_set_resources_tool.cc     2015-03-29 18:13:50 
> +0000
> @@ -27,7 +27,7 @@
>  #include "logic/mapregion.h"
>  #include "logic/world/resource_description.h"
>  #include "logic/world/world.h"
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  /**
>   * Sets the resources of the current to a fixed value
> @@ -35,9 +35,9 @@
>  int32_t EditorSetResourcesTool::handle_click_impl(Widelands::Map& map,
>                                                       const Widelands::World& 
> world,
>                                                       
> Widelands::NodeAndTriangle<> const center,
> -                                                     EditorInteractive& /* 
> parent */,
> +                                                     EditorInteractive& 
> parent,
>                                                       EditorActionArgs& args) 
> {
> -     OverlayManager & overlay_manager = map.overlay_manager();
> +     FieldOverlayManager& field_overlay_manager = 
> *parent.mutable_field_overlay_manager();
>       Widelands::MapRegion<Widelands::Area<Widelands::FCoords> > mr
>       (map,
>        Widelands::Area<Widelands::FCoords>
> @@ -59,7 +59,7 @@
>                       //  Ok, we're doing something. First remove the current 
> overlays.
>                       const Image* pic = g_gr->images().get
>                               (world.get_resource(res)->get_editor_pic 
> (mr.location().field->get_resources_amount()));
> -                     overlay_manager.remove_overlay(mr.location(), pic);
> +                     field_overlay_manager.remove_overlay(mr.location(), 
> pic);
>  
>                       if (!amount) {
>                               mr.location().field->set_resources(0, 0);
> @@ -70,7 +70,7 @@
>                               //  set new overlay
>                               pic =
>                                   
> g_gr->images().get(world.get_resource(args.cur_res)->get_editor_pic(amount));
> -                             overlay_manager.register_overlay(mr.location(), 
> pic, 4);
> +                             
> field_overlay_manager.register_overlay(mr.location(), pic, 4);
>                               map.recalc_for_field_area(world, 
> Widelands::Area<Widelands::FCoords>(mr.location(), 0));
>                       }
>               }
> @@ -80,11 +80,11 @@
>  
>  int32_t
>  EditorSetResourcesTool::handle_undo_impl(Widelands::Map& map,
> -                                            const Widelands::World& world,
> -                                            
> Widelands::NodeAndTriangle<Widelands::Coords> center,
> -                                            EditorInteractive& /* parent */,
> -                                            EditorActionArgs& args) {
> -     OverlayManager & overlay_manager = map.overlay_manager();
> +                                         const Widelands::World& world,
> +                                         
> Widelands::NodeAndTriangle<Widelands::Coords> center,
> +                                         EditorInteractive& parent,
> +                                         EditorActionArgs& args) {
> +     FieldOverlayManager& overlay_manager = 
> *parent.mutable_field_overlay_manager();
>       Widelands::MapRegion<Widelands::Area<Widelands::FCoords> > mr
>       (map,
>        Widelands::Area<Widelands::FCoords>
> 
> === modified file 'src/editor/tools/editor_set_starting_pos_tool.cc'
> --- src/editor/tools/editor_set_starting_pos_tool.cc  2014-09-20 09:37:47 
> +0000
> +++ src/editor/tools/editor_set_starting_pos_tool.cc  2015-03-29 18:13:50 
> +0000
> @@ -24,7 +24,6 @@
>  #include "graphic/graphic.h"
>  #include "logic/building.h"
>  #include "logic/map.h"
> -#include "wui/overlay_manager.h"
>  
>  // global variable to pass data from callback to class
>  static int32_t m_current_player;
> @@ -63,10 +62,10 @@
>  }
>  
>  int32_t EditorSetStartingPosTool::handle_click_impl(Widelands::Map& map,
> -                                                        const 
> Widelands::World&,
> -                                                        
> Widelands::NodeAndTriangle<> const center,
> -                                                        EditorInteractive&,
> -                                                        EditorActionArgs&) {
> +                                                    const Widelands::World&,
> +                                                    
> Widelands::NodeAndTriangle<> const center,
> +                                                    EditorInteractive& 
> parent,
> +                                                    EditorActionArgs&) {
>       assert(0 <= center.node.x);
>       assert(center.node.x < map.get_width());
>       assert(0 <= center.node.y);
> @@ -89,7 +88,7 @@
>  
>               //  check if field is valid
>               if 
> (editor_tool_set_starting_pos_callback(map.get_fcoords(center.node), map)) {
> -                     OverlayManager & overlay_manager = 
> map.overlay_manager();
> +                     FieldOverlayManager& overlay_manager = 
> *parent.mutable_field_overlay_manager();
>                       //  remove old overlay if any
>                       overlay_manager.remove_overlay(old_sp, pic);
>  
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_load_map.cc'
> --- src/editor/ui_menus/editor_main_menu_load_map.cc  2014-11-30 18:49:38 
> +0000
> +++ src/editor/ui_menus/editor_main_menu_load_map.cc  2015-03-29 18:13:50 
> +0000
> @@ -42,7 +42,6 @@
>  #include "ui_basic/multilinetextarea.h"
>  #include "ui_basic/progresswindow.h"
>  #include "ui_basic/textarea.h"
> -#include "wui/overlay_manager.h"
>  
>  using Widelands::WidelandsMapLoader;
>  
> 
> === modified file 'src/editor/ui_menus/editor_player_menu.cc'
> --- src/editor/ui_menus/editor_player_menu.cc 2014-11-30 18:49:38 +0000
> +++ src/editor/ui_menus/editor_player_menu.cc 2015-03-29 18:13:50 +0000
> @@ -34,7 +34,7 @@
>  #include "ui_basic/editbox.h"
>  #include "ui_basic/messagebox.h"
>  #include "ui_basic/textarea.h"
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  #define UNDEFINED_TRIBE_NAME "<undefined>"
>  
> @@ -219,7 +219,8 @@
>  
>  
>  void EditorPlayerMenu::clicked_remove_last_player() {
> -     Widelands::Map & map = eia().egbase().map();
> +     EditorInteractive& editor_interactive = eia();
> +     Widelands::Map& map = editor_interactive.egbase().map();
>       Widelands::PlayerNumber const old_nr_players = map.get_nrplayers();
>       Widelands::PlayerNumber const nr_players     = old_nr_players - 1;
>       assert(1 <= nr_players);
> @@ -230,8 +231,8 @@
>                       char picsname[] = 
> "pics/editor_player_00_starting_pos.png";
>                       picsname[19] += old_nr_players / 10;
>                       picsname[20] += old_nr_players % 10;
> -                     map.overlay_manager().remove_overlay
> -                             (sp, g_gr->images().get(picsname));
> +                     
> editor_interactive.mutable_field_overlay_manager()->remove_overlay(
> +                        sp, g_gr->images().get(picsname));
>               }
>       }
>       map.set_nrplayers(nr_players);
> @@ -350,7 +351,7 @@
>  
>       //  Register callback function to make sure that only valid locations 
> are
>       //  selected.
> -     map.overlay_manager().register_overlay_callback_function(
> +     
> menu.mutable_field_overlay_manager()->register_overlay_callback_function(
>          boost::bind(&editor_tool_set_starting_pos_callback, _1, 
> boost::ref(map)));
>       map.recalc_whole_map(menu.egbase().world());
>       update();
> @@ -377,13 +378,12 @@
>   * Make infrastructure button clicked
>   */
>  void EditorPlayerMenu::make_infrastructure_clicked(uint8_t n) {
> -     EditorInteractive & parent =
> -             dynamic_cast<EditorInteractive &>(*get_parent());
> +     EditorInteractive & parent = eia();
>     // Check if starting position is valid (was checked before
>     // so must be true)
>       Widelands::EditorGameBase & egbase = parent.egbase();
>       Widelands::Map & map = egbase.map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
> +     FieldOverlayManager & overlay_manager = 
> *eia().mutable_field_overlay_manager();
>       const Widelands::Coords start_pos = map.get_starting_pos(n);
>       assert(start_pos);
>  
> 
> === modified file 
> 'src/editor/ui_menus/editor_tool_change_resources_options_menu.cc'
> --- src/editor/ui_menus/editor_tool_change_resources_options_menu.cc  
> 2014-12-07 20:13:27 +0000
> +++ src/editor/ui_menus/editor_tool_change_resources_options_menu.cc  
> 2015-03-29 18:13:50 +0000
> @@ -32,7 +32,7 @@
>  #include "logic/world/resource_description.h"
>  #include "logic/world/world.h"
>  #include "ui_basic/button.h"
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  const static int BUTTON_WIDTH = 20;
>  const static int BUTTON_HEIGHT = 20;
> @@ -218,10 +218,11 @@
>       m_increase_tool.set_cur_res(n);
>       m_increase_tool.decrease_tool().set_cur_res(n);
>  
> -     Widelands::EditorGameBase& egbase = eia().egbase();
> +     EditorInteractive& editor_interactive = eia();
> +     Widelands::EditorGameBase& egbase = editor_interactive.egbase();
>       Widelands::Map & map = egbase.map();
> -     map.overlay_manager().register_overlay_callback_function(
> -        boost::bind(&editor_change_resource_tool_callback, _1, 
> boost::ref(map), boost::ref(egbase.world()), n));
> +     
> editor_interactive.mutable_field_overlay_manager()->register_overlay_callback_function(boost::bind(
> +        &editor_change_resource_tool_callback, _1, boost::ref(map), 
> boost::ref(egbase.world()), n));
>       map.recalc_whole_map(egbase.world());
>       select_correct_tool();
>  
> 
> === modified file 'src/editor/ui_menus/editor_tool_menu.cc'
> --- src/editor/ui_menus/editor_tool_menu.cc   2014-11-30 18:49:38 +0000
> +++ src/editor/ui_menus/editor_tool_menu.cc   2015-03-29 18:13:50 +0000
> @@ -141,8 +141,8 @@
>       if (current_tool_pointer == &parent.tools.set_port_space) {
>               // Set correct overlay
>               Widelands::Map & map = parent.egbase().map();
> -             map.overlay_manager().register_overlay_callback_function(
> -                             
> boost::bind(&editor_Tool_set_port_space_callback, _1, boost::ref(map)));
> +             
> parent.mutable_field_overlay_manager()->register_overlay_callback_function(
> +                boost::bind(&editor_Tool_set_port_space_callback, _1, 
> boost::ref(map)));
>               map.recalc_whole_map(parent.egbase().world());
>               update();
>       }
> 
> === modified file 'src/game_io/CMakeLists.txt'
> --- src/game_io/CMakeLists.txt        2015-01-31 16:03:59 +0000
> +++ src/game_io/CMakeLists.txt        2015-03-29 18:13:50 +0000
> @@ -39,5 +39,4 @@
>      scripting_lua_table
>      wui
>      wui_mapview_pixelfunctions
> -    wui_overlay_manager
>  )
> 
> === modified file 'src/game_io/game_interactive_player_packet.cc'
> --- src/game_io/game_interactive_player_packet.cc     2014-09-20 09:37:47 
> +0000
> +++ src/game_io/game_interactive_player_packet.cc     2015-03-29 18:13:50 
> +0000
> @@ -27,7 +27,6 @@
>  #include "logic/tribe.h"
>  #include "wui/interactive_player.h"
>  #include "wui/mapview.h"
> -#include "wui/overlay_manager.h"
>  
>  namespace Widelands {
>  
> 
> === modified file 'src/graphic/CMakeLists.txt'
> --- src/graphic/CMakeLists.txt        2015-02-20 20:04:28 +0000
> +++ src/graphic/CMakeLists.txt        2015-03-29 18:13:50 +0000
> @@ -177,8 +177,10 @@
>      graphic_surface
>      graphic_terrain_programs
>      logic
> +    wui
> +    wui_edge_overlay_manager
> +    wui_field_overlay_manager
>      wui_mapview_pixelfunctions
> -    wui_overlay_manager
>  )
>  
>  wl_library(graphic_minimap_renderer
> @@ -247,5 +249,4 @@
>      profile
>      scripting_lua_table
>      sound
> -    wui_overlay_manager
>  )
> 
> === modified file 'src/graphic/game_renderer.cc'
> --- src/graphic/game_renderer.cc      2015-03-29 15:50:39 +0000
> +++ src/graphic/game_renderer.cc      2015-03-29 18:13:50 +0000
> @@ -29,9 +29,11 @@
>  #include "logic/editor_game_base.h"
>  #include "logic/player.h"
>  #include "logic/world/world.h"
> +#include "wui/edge_overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
> +#include "wui/interactive_base.h"
>  #include "wui/mapviewpixelconstants.h"
>  #include "wui/mapviewpixelfunctions.h"
> -#include "wui/overlay_manager.h"
>  
>  // Explanation of how drawing works:
>  // Schematic of triangle neighborhood:
> @@ -98,15 +100,18 @@
>  // but this is not the physically present road, but the one that should be
>  // drawn (i.e. taking into account if there is fog of war involved or road
>  // building overlays enabled).
> -uint8_t field_roads(const FCoords& coords, const Map& map, const Player* 
> const player) {
> +uint8_t field_roads(const FCoords& coords,
> +                    const Map& map,
> +                    const EdgeOverlayManager& edge_overlay_manager,
> +                    const Player* const player) {
>       uint8_t roads;
>       if (player && !player->see_all()) {
>               const Player::Field& pf = 
> player->fields()[Map::get_index(coords, map.get_width())];
> -             roads = pf.roads | 
> map.overlay_manager().get_road_overlay(coords);
> +             roads = pf.roads | edge_overlay_manager.get_overlay(coords);
>       } else {
>               roads = coords.field->get_roads();
>       }
> -     roads |= map.overlay_manager().get_road_overlay(coords);
> +     roads |= edge_overlay_manager.get_overlay(coords);
>       return roads;
>  }
>  
> @@ -163,6 +168,7 @@
>       const int surface_height = surface->height();
>  
>       Map& map = egbase.map();
> +     const EdgeOverlayManager& edge_overlay_manager = 
> egbase.get_ibase()->edge_overlay_manager();
>       const uint32_t gametime = egbase.get_gametime();
>  
>       fields_to_draw_.reset(minfx, maxfx, minfy, maxfy);
> @@ -200,7 +206,7 @@
>                               f.road_textures = nullptr;
>                       }
>  
> -                     f.roads = field_roads(fcoords, map, player);
> +                     f.roads = field_roads(fcoords, map, 
> edge_overlay_manager, player);
>               }
>       }
>  
> @@ -247,6 +253,7 @@
>       static const uint32_t BR = 3;
>       const Map & map = egbase.map();
>  
> +     std::vector<FieldOverlayManager::OverlayInfo> overlay_info;
>       for (int32_t fy = minfy; fy <= maxfy; ++fy) {
>               for (int32_t fx = minfx; fx <= maxfx; ++fx) {
>                       Coords ncoords(fx, fy);
> @@ -380,60 +387,37 @@
>                               }
>                       }
>  
> +                     const FieldOverlayManager& overlay_manager = 
> egbase.get_ibase()->field_overlay_manager();
>                       {
> -                             // Render overlays on the node
> -                             OverlayManager::OverlayInfo 
> overlay_info[MAX_OVERLAYS_PER_NODE];
> -
> -                             const OverlayManager::OverlayInfo * const end =
> -                                     overlay_info
> -                                     +
> -                                     
> map.overlay_manager().get_overlays(coords[F], overlay_info);
> -
> -                             for
> -                                     (const OverlayManager::OverlayInfo * it 
> = overlay_info;
> -                                      it < end;
> -                                      ++it)
> -                                     dst.blit(pos[F] - it->hotspot, it->pic);
> +                             overlay_info.clear();
> +                             overlay_manager.get_overlays(coords[F], 
> &overlay_info);
> +                             for (const auto& overlay : overlay_info) {
> +                                     dst.blit(pos[F] - overlay.hotspot, 
> overlay.pic);
> +                             }
>                       }
>  
>                       {
>                               // Render overlays on the R triangle
> -                             OverlayManager::OverlayInfo 
> overlay_info[MAX_OVERLAYS_PER_TRIANGLE];
> -                             OverlayManager::OverlayInfo const * end =
> -                                     overlay_info
> -                                     +
> -                                     map.overlay_manager().get_overlays
> -                                                             
> (TCoords<>(coords[F], TCoords<>::R), overlay_info);
> -
> -                             Point tripos
> -                                     ((pos[F].x + pos[R].x + pos[BR].x) / 3,
> -                                      (pos[F].y + pos[R].y + pos[BR].y) / 3);
> -
> -                             for
> -                                     (OverlayManager::OverlayInfo const * it 
> = overlay_info;
> -                                      it < end;
> -                                      ++it)
> -                                     dst.blit(tripos - it->hotspot, it->pic);
> +                             overlay_info.clear();
> +                             
> overlay_manager.get_overlays(TCoords<>(coords[F], TCoords<>::R), 
> &overlay_info);
> +
> +                             Point tripos(
> +                                (pos[F].x + pos[R].x + pos[BR].x) / 3, 
> (pos[F].y + pos[R].y + pos[BR].y) / 3);
> +                             for (const auto& overlay : overlay_info) {
> +                                     dst.blit(tripos - overlay.hotspot, 
> overlay.pic);
> +                             }
>                       }
>  
>                       {
>                               // Render overlays on the D triangle
> -                             OverlayManager::OverlayInfo 
> overlay_info[MAX_OVERLAYS_PER_TRIANGLE];
> -                             OverlayManager::OverlayInfo const * end =
> -                                     overlay_info
> -                                     +
> -                                     map.overlay_manager().get_overlays
> -                                                             
> (TCoords<>(coords[F], TCoords<>::D), overlay_info);
> -
> -                             Point tripos
> -                                     ((pos[F].x + pos[BL].x + pos[BR].x) / 3,
> -                                      (pos[F].y + pos[BL].y + pos[BR].y) / 
> 3);
> -
> -                             for
> -                                     (OverlayManager::OverlayInfo const * it 
> = overlay_info;
> -                                      it < end;
> -                                      ++it)
> -                                     dst.blit(tripos - it->hotspot, it->pic);
> +                             overlay_info.clear();
> +                             
> overlay_manager.get_overlays(TCoords<>(coords[F], TCoords<>::D), 
> &overlay_info);
> +
> +                             Point tripos(
> +                                (pos[F].x + pos[BL].x + pos[BR].x) / 3, 
> (pos[F].y + pos[BL].y + pos[BR].y) / 3);
> +                             for (const auto& overlay : overlay_info) {
> +                                     dst.blit(tripos - overlay.hotspot, 
> overlay.pic);
> +                             }
>                       }
>               }
>       }
> 
> === modified file 'src/graphic/game_renderer.h'
> --- src/graphic/game_renderer.h       2015-02-18 08:09:42 +0000
> +++ src/graphic/game_renderer.h       2015-03-29 18:13:50 +0000
> @@ -58,7 +58,9 @@
>  
>       // Renders the map from an omniscient perspective. This is used
>       // for spectators, players that see all, and in the editor.
> -     void rendermap(RenderTarget& dst, const Widelands::EditorGameBase& 
> egbase, const Point& view_offset);
> +     void rendermap(RenderTarget& dst,
> +                    const Widelands::EditorGameBase& egbase,
> +                    const Point& view_offset);
>  
>  private:
>       // Draw the map for the given parameters (see rendermap). 'player'
> 
> === modified file 'src/graphic/gl/road_program.h'
> --- src/graphic/gl/road_program.h     2015-03-01 09:23:10 +0000
> +++ src/graphic/gl/road_program.h     2015-03-29 18:13:50 +0000
> @@ -39,7 +39,10 @@
>  
>       // Draws the roads. The dimensions of the renderbuffer are needed to 
> convert from pixel to GL
>       // space.
> -     void draw(int renderbuffer_width, int renderbuffer_height, const 
> FieldsToDraw& fields_to_draw, float z_value);
> +     void draw(int renderbuffer_width,
> +               int renderbuffer_height,
> +               const FieldsToDraw& fields_to_draw,
> +               float z_value);
>  
>  private:
>       struct PerVertexData {
> 
> === modified file 'src/graphic/render_queue.cc'
> --- src/graphic/render_queue.cc       2015-02-20 20:22:48 +0000
> +++ src/graphic/render_queue.cc       2015-03-29 18:13:50 +0000
> @@ -48,8 +48,7 @@
>  //   - we batch up by program to have maximal batching.
>  //   - and we want to render frontmost objects first, so that we do not 
> render
>  //     any pixel more than once.
> -static_assert(RenderQueue::Program::HIGHEST_PROGRAM_ID <= 8,
> -              "Need to change sorting keys.");  // 4 bits.
> +static_assert(RenderQueue::Program::HIGHEST_PROGRAM_ID <= 8, "Please fix 
> make_key_*.");
>  
>  uint64_t
>  make_key_opaque(const uint64_t program_id, const uint64_t z_value, const 
> uint64_t extra_value) {
> 
> === modified file 'src/graphic/rendertarget.cc'
> --- src/graphic/rendertarget.cc       2015-01-29 05:56:51 +0000
> +++ src/graphic/rendertarget.cc       2015-03-29 18:13:50 +0000
> @@ -26,7 +26,6 @@
>  #include "graphic/surface.h"
>  #include "logic/player.h"
>  #include "logic/tribe.h"
> -#include "wui/overlay_manager.h"
>  
>  using Widelands::BaseImmovable;
>  using Widelands::Coords;
> 
> === modified file 'src/logic/CMakeLists.txt'
> --- src/logic/CMakeLists.txt  2015-02-20 20:04:28 +0000
> +++ src/logic/CMakeLists.txt  2015-03-29 18:13:50 +0000
> @@ -261,5 +261,4 @@
>      widelands_ball_of_mud
>      wui
>      wui_mapview_pixelfunctions
> -    wui_overlay_manager
>  )
> 
> === modified file 'src/logic/field.h'
> --- src/logic/field.h 2015-01-24 11:04:49 +0000
> +++ src/logic/field.h 2015-03-29 18:13:50 +0000
> @@ -115,7 +115,6 @@
>       BaseImmovable * immovable;
>  
>       uint8_t caps                    : 7;
> -     uint8_t buildhelp_overlay_index : 3;
>       uint8_t roads                   : 6;
>  
>       Height height;
> @@ -191,11 +190,6 @@
>                       (owner_info_and_selections & ~Border_Bitmask) | (b << 
> Border_Bit);
>       }
>  
> -     uint8_t get_buildhelp_overlay_index() const {return 
> buildhelp_overlay_index;}
> -     void set_buildhelp_overlay_index(BuildhelpIndex const i) {
> -             buildhelp_overlay_index = i;
> -     }
> -
>       int32_t get_roads() const {return roads;}
>       int32_t get_road(int32_t const dir) const {
>               return (roads >> dir) & RoadType::kMask;
> 
> === modified file 'src/logic/map.cc'
> --- src/logic/map.cc  2015-02-24 13:51:38 +0000
> +++ src/logic/map.cc  2015-03-29 18:13:50 +0000
> @@ -47,7 +47,6 @@
>  #include "map_io/s2map.h"
>  #include "map_io/widelands_map_loader.h"
>  #include "notifications/notifications.h"
> -#include "wui/overlay_manager.h"
>  
>  namespace Widelands {
>  
> @@ -114,7 +113,6 @@
>       assert(area.y < m_height);
>       assert(m_fields.get() <= area.field);
>       assert            (area.field < m_fields.get() + max_index());
> -     assert(m_overlay_manager);
>  
>       { //  First pass.
>               MapRegion<Area<FCoords> > mr(*this, area);
> @@ -129,12 +127,6 @@
>               MapRegion<Area<FCoords> > mr(*this, area);
>               do recalc_nodecaps_pass2(world, mr.location()); while 
> (mr.advance(*this));
>       }
> -
> -     { //  Now only recaluclate the overlays.
> -             OverlayManager & om = overlay_manager();
> -             MapRegion<Area<FCoords> > mr(*this, area);
> -             do om.recalc_field_overlays(mr.location()); while 
> (mr.advance(*this));
> -     }
>  }
>  
>  
> @@ -149,8 +141,6 @@
>  */
>  void Map::recalc_whole_map(const World& world)
>  {
> -     assert(m_overlay_manager);
> -
>       //  Post process the map in the necessary two passes to calculate
>       //  brightness and building caps
>       FCoords f;
> @@ -170,11 +160,6 @@
>                       f = get_fcoords(Coords(x, y));
>                       recalc_nodecaps_pass2(world, f);
>               }
> -
> -     //  Now only recaluclate the overlays.
> -     for (int16_t y = 0; y < m_height; ++y)
> -             for (int16_t x = 0; x < m_width; ++x)
> -                     
> overlay_manager().recalc_field_overlays(get_fcoords(Coords(x, y)));
>  }
>  
>  /*
> @@ -303,7 +288,6 @@
>       m_hint = std::string();
>       m_background = std::string();
>  
> -     m_overlay_manager.reset();
>       objectives_.clear();
>  
>       m_port_spaces.clear();
> @@ -411,8 +395,6 @@
>               new_port_spaces.insert(temp);
>       }
>       m_port_spaces = new_port_spaces;
> -
> -     m_overlay_manager.reset(new OverlayManager());
>  }
>  
>  
> @@ -434,8 +416,6 @@
>       memset(m_fields.get(), 0, sizeof(Field) * w * h);
>  
>       m_pathfieldmgr->set_size(w * h);
> -
> -     m_overlay_manager.reset(new OverlayManager());
>  }
>  
>  /*
> 
> === modified file 'src/logic/map.h'
> --- src/logic/map.h   2014-10-29 06:00:52 +0000
> +++ src/logic/map.h   2015-03-29 18:13:50 +0000
> @@ -40,7 +40,6 @@
>  
>  class FileSystem;
>  class Image;
> -struct OverlayManager;
>  struct S2MapLoader;
>  
>  namespace Widelands {
> @@ -163,11 +162,6 @@
>       Map ();
>       virtual ~Map();
>  
> -     OverlayManager * get_overlay_manager()       {return 
> m_overlay_manager.get();}
> -     OverlayManager * get_overlay_manager() const {return 
> m_overlay_manager.get();}
> -     const OverlayManager & overlay_manager() const {return 
> *m_overlay_manager;}
> -     OverlayManager       & overlay_manager()       {return 
> *m_overlay_manager;}
> -
>       /// Returns the correct initialized loader for the given mapfile
>       std::unique_ptr<MapLoader> get_correct_loader(const std::string& 
> filename);
>  
> @@ -413,8 +407,6 @@
>  
>       std::unique_ptr<Field[]> m_fields;
>  
> -     std::unique_ptr<OverlayManager> m_overlay_manager;
> -
>       std::unique_ptr<PathfieldManager> m_pathfieldmgr;
>       std::vector<std::string> m_scenario_tribes;
>       std::vector<std::string> m_scenario_names;
> 
> === modified file 'src/wui/CMakeLists.txt'
> --- src/wui/CMakeLists.txt    2015-01-31 16:03:59 +0000
> +++ src/wui/CMakeLists.txt    2015-03-29 18:13:50 +0000
> @@ -20,10 +20,10 @@
>      wui
>  )
>  
> -wl_library(wui_overlay_manager
> +wl_library(wui_field_overlay_manager
>    SRCS
> -    overlay_manager.cc
> -    overlay_manager.h
> +    field_overlay_manager.cc
> +    field_overlay_manager.h
>    DEPENDS
>      base_geometry
>      graphic
> @@ -31,6 +31,15 @@
>      logic_widelands_geometry
>  )
>  
> +wl_library(wui_edge_overlay_manager
> +  SRCS
> +    edge_overlay_manager.cc
> +    edge_overlay_manager.h
> +  DEPENDS
> +    base_macros
> +    logic_widelands_geometry
> +)
> +
>  wl_library(wui_mapview_pixelfunctions
>    SRCS
>      mapviewpixelconstants.h
> @@ -169,6 +178,7 @@
>      ui_fsmenu
>      widelands_ball_of_mud
>      wui_chat_ui
> +    wui_edge_overlay_manager
> +    wui_field_overlay_manager
>      wui_mapview_pixelfunctions
> -    wui_overlay_manager
>  )
> 
> === modified file 'src/wui/buildingwindow.cc'
> --- src/wui/buildingwindow.cc 2014-12-06 16:14:53 +0000
> +++ src/wui/buildingwindow.cc 2015-03-29 18:13:50 +0000
> @@ -57,7 +57,7 @@
>                b.descr().descname()),
>       m_registry(registry),
>       m_building       (b),
> -     m_workarea_job_id(0),
> +     m_workarea_overlay_id(0),
>       m_avoid_fastclick(false)
>  {
>       delete m_registry;
> @@ -96,9 +96,9 @@
>  
>  BuildingWindow::~BuildingWindow()
>  {
> -     if (m_workarea_job_id)
> -             igbase().egbase().map().overlay_manager().remove_overlay
> -                     (m_workarea_job_id);
> +     if (m_workarea_overlay_id) {
> +             
> igbase().mutable_field_overlay_manager()->remove_overlay(m_workarea_overlay_id);
> +     }
>       m_registry = nullptr;
>  }
>  
> @@ -467,7 +467,7 @@
>   */
>  void BuildingWindow::show_workarea()
>  {
> -     if (m_workarea_job_id) {
> +     if (m_workarea_overlay_id) {
>               return; // already shown, nothing to be done
>       }
>       WorkareaInfo workarea_info;
> @@ -479,7 +479,7 @@
>       if (workarea_info.empty()) {
>               return;
>       }
> -     m_workarea_job_id = igbase().show_work_area(workarea_info, 
> m_building.get_position());
> +     m_workarea_overlay_id = igbase().show_work_area(workarea_info, 
> m_building.get_position());
>  
>       configure_workarea_button();
>  }
> @@ -489,9 +489,9 @@
>   */
>  void BuildingWindow::hide_workarea()
>  {
> -     if (m_workarea_job_id) {
> -             igbase().hide_work_area(m_workarea_job_id);
> -             m_workarea_job_id = 0;
> +     if (m_workarea_overlay_id) {
> +             igbase().hide_work_area(m_workarea_overlay_id);
> +             m_workarea_overlay_id = 0;
>  
>               configure_workarea_button();
>       }
> @@ -503,7 +503,7 @@
>  void BuildingWindow::configure_workarea_button()
>  {
>       if (m_toggle_workarea) {
> -             if (m_workarea_job_id) {
> +             if (m_workarea_overlay_id) {
>                       m_toggle_workarea->set_tooltip(_("Hide work area"));
>                       m_toggle_workarea->set_perm_pressed(true);
>               } else {
> @@ -515,7 +515,7 @@
>  
>  
>  void BuildingWindow::toggle_workarea() {
> -     if (m_workarea_job_id) {
> +     if (m_workarea_overlay_id) {
>               hide_workarea();
>       } else {
>               show_workarea();
> 
> === modified file 'src/wui/buildingwindow.h'
> --- src/wui/buildingwindow.h  2014-11-30 18:49:38 +0000
> +++ src/wui/buildingwindow.h  2015-03-29 18:13:50 +0000
> @@ -22,9 +22,10 @@
>  
>  #include <cstdlib>
>  
> -#include "wui/interactive_gamebase.h"
>  #include "ui_basic/button.h"
>  #include "ui_basic/window.h"
> +#include "wui/field_overlay_manager.h"
> +#include "wui/interactive_gamebase.h"
>  #include "wui/waresdisplay.h"
>  
>  /**
> @@ -89,7 +90,7 @@
>       Widelands::PlayerNumber m_capscache_player_number;
>       bool m_caps_setup;
>  
> -     OverlayManager::JobId m_workarea_job_id;
> +     FieldOverlayManager::OverlayId m_workarea_overlay_id;
>       bool m_avoid_fastclick;
>  };
>  
> 
> === added file 'src/wui/edge_overlay_manager.cc'
> --- src/wui/edge_overlay_manager.cc   1970-01-01 00:00:00 +0000
> +++ src/wui/edge_overlay_manager.cc   2015-03-29 18:13:50 +0000
> @@ -0,0 +1,65 @@
> +/*
> + * Copyright (C) 2006-2015 by the Widelands Development Team
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> + *
> + */
> +
> +#include "wui/edge_overlay_manager.h"
> +
> +EdgeOverlayManager::EdgeOverlayManager() : m_current_overlay_id(0) {
> +}
> +
> +EdgeOverlayManager::OverlayId EdgeOverlayManager::next_overlay_id() {
> +     ++m_current_overlay_id;
> +     return m_current_overlay_id;
> +}
> +
> +void EdgeOverlayManager::register_overlay
> +     (Widelands::Coords const c, uint8_t const where, OverlayId const 
> overlay_id)
> +{
> +     const RegisteredRoadOverlays overlay = {overlay_id, where};
> +     RegisteredRoadOverlaysMap::iterator it = m_overlays.find(c);
> +     if (it == m_overlays.end())
> +             m_overlays.insert
> +                     (std::pair<const Widelands::Coords,
> +                      RegisteredRoadOverlays>(c, overlay));
> +     else
> +             it->second = overlay;
> +}
> +
> +void EdgeOverlayManager::remove_overlay(const Widelands::Coords c) {
> +     const RegisteredRoadOverlaysMap::iterator it = m_overlays.find(c);
> +     if (it != m_overlays.end())
> +             m_overlays.erase(it);
> +}
> +
> +void EdgeOverlayManager::remove_overlay(OverlayId const overlay_id) {
> +     RegisteredRoadOverlaysMap::iterator it = m_overlays.begin();
> +     const RegisteredRoadOverlaysMap::const_iterator end =
> +             m_overlays.end();
> +     while (it != end)
> +             if (it->second.overlay_id == overlay_id)
> +                     m_overlays.erase(it++); //  Necessary!
> +             else
> +                     ++it;
> +}
> +
> +uint8_t EdgeOverlayManager::get_overlay(const Widelands::Coords c) const {
> +     RegisteredRoadOverlaysMap::const_iterator const it = m_overlays.find(c);
> +     if (it != m_overlays.end())
> +             return it->second.where;
> +     return 0;
> +}
> 
> === added file 'src/wui/edge_overlay_manager.h'
> --- src/wui/edge_overlay_manager.h    1970-01-01 00:00:00 +0000
> +++ src/wui/edge_overlay_manager.h    2015-03-29 18:13:50 +0000
> @@ -0,0 +1,65 @@
> +/*
> + * Copyright (C) 2006-2015 by the Widelands Development Team
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> + *
> + */
> +
> +#ifndef WL_WUI_EDGE_OVERLAY_MANAGER_H
> +#define WL_WUI_EDGE_OVERLAY_MANAGER_H
> +
> +#include <map>
> +
> +#include "base/macros.h"
> +#include "logic/widelands_geometry.h"
> +
> +// Similar to FieldOverlayManager, this class cares for overlays that are 
> drawn
> +// onto the edges of triangles.
> +class EdgeOverlayManager {
> +public:
> +     // A unique id identifying a registered overlay.
> +     using OverlayId = uint32_t;
> +
> +     EdgeOverlayManager();
> +
> +     /// Get a unique, unused job id.
> +     OverlayId next_overlay_id();
> +
> +     //  When a road overlay information is requested the same data as for a
> +     //  field is returned (a uint8_t which needs to be ANDed).
> +     void register_overlay
> +             (Widelands::Coords, uint8_t where, OverlayId overlay_id = 0);
> +     void remove_overlay(Widelands::Coords);
> +     void remove_overlay(OverlayId overlay_id);
> +     uint8_t get_overlay(Widelands::Coords c) const;
> +
> +private:
> +     struct RegisteredRoadOverlays {
> +             OverlayId overlay_id;
> +             uint8_t where;
> +     };
> +
> +     using RegisteredRoadOverlaysMap =
> +        std::map<const Widelands::Coords, RegisteredRoadOverlays, 
> Widelands::Coords::OrderingFunctor>;
> +
> +     OverlayId m_current_overlay_id;
> +     RegisteredRoadOverlaysMap m_overlays;
> +
> +     DISALLOW_COPY_AND_ASSIGN(EdgeOverlayManager);
> +};
> +
> +
> +
> +#endif  // end of include guard: WL_WUI_EDGE_OVERLAY_MANAGER_H
> 
> === renamed file 'src/wui/overlay_manager.cc' => 
> 'src/wui/field_overlay_manager.cc'
> --- src/wui/overlay_manager.cc        2014-09-14 11:31:58 +0000
> +++ src/wui/field_overlay_manager.cc  2015-03-29 18:13:50 +0000
> @@ -17,7 +17,7 @@
>   *
>   */
>  
> -#include "wui/overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  
>  #include <algorithm>
>  
> @@ -26,110 +26,102 @@
>  #include "graphic/graphic.h"
>  #include "logic/field.h"
>  
> -OverlayManager::OverlayManager() :
> -     m_are_graphics_loaded(false), m_showbuildhelp(false), 
> m_current_job_id(0) {
> -}
> -
> -/**
> - * \returns the currently registered overlays and the buildhelp for a node.
> - */
> -uint8_t OverlayManager::get_overlays
> -     (Widelands::FCoords const c, OverlayInfo * const overlays) const
> -{
> -     assert(m_are_graphics_loaded);
> -
> -     uint8_t num_ret = 0;
> -
> +FieldOverlayManager::FieldOverlayManager() : m_current_overlay_id(0) {
> +     OverlayInfo * buildhelp_info = m_buildhelp_infos;
> +     const char * filenames[] = {
> +             "pics/set_flag.png",
> +             "pics/small.png",
> +             "pics/medium.png",
> +             "pics/big.png",
> +             "pics/mine.png",
> +             "pics/port.png"
> +     };
> +     const char * const * filename = filenames;
> +
> +     //  Special case for flag, which has a different formula for hotspot_y.
> +     buildhelp_info->pic = g_gr->images().get(*filename);
> +     buildhelp_info->hotspot = Point(buildhelp_info->pic->width() / 2, 
> buildhelp_info->pic->height() - 1);
> +
> +     const OverlayInfo * const buildhelp_infos_end =
> +             buildhelp_info + Widelands::Field::Buildhelp_None;
> +     for (;;) { // The other buildhelp overlays.
> +             ++buildhelp_info, ++filename;
> +             if (buildhelp_info == buildhelp_infos_end)

Code style: Shouldn't the break condition be defined in the for condition? 
Something like:

for (; buildhelp_info != buildhelp_infos_end; ++buildhelp_info)

> +                     break;
> +             buildhelp_info->pic = g_gr->images().get(*filename);
> +             buildhelp_info->hotspot = Point(buildhelp_info->pic->width() / 
> 2, buildhelp_info->pic->height() / 2);
> +     }
> +
> +}
> +
> +bool FieldOverlayManager::buildhelp() const {
> +     return m_buildhelp;
> +}
> +
> +void FieldOverlayManager::show_buildhelp(const bool value) {
> +     m_buildhelp = value;
> +}
> +
> +void FieldOverlayManager::get_overlays(Widelands::FCoords const c,
> +                                          std::vector<OverlayInfo>* result) 
> const {
>       const RegisteredOverlaysMap & overlay_map = 
> m_overlays[Widelands::TCoords<>::None];
>       RegisteredOverlaysMap::const_iterator it = overlay_map.lower_bound(c);
> -     while (it != overlay_map.end() && it->first == c && it->second.level <= 
> MAX_OVERLAYS_PER_NODE)
> -     {
> -             overlays[num_ret].pic = it->second.pic;
> -             overlays[num_ret].hotspot = it->second.hotspot;
> -             if (++num_ret == MAX_OVERLAYS_PER_NODE)
> -                     goto end;
> +
> +     while (it != overlay_map.end() && it->first == c && it->second.level <= 
> kLevelForBuildHelp) {
> +             result->emplace_back(it->second.pic, it->second.hotspot);
>               ++it;
>       }
> -     if (m_showbuildhelp) {
> -             const uint8_t buildhelp_overlay_index =
> -                     c.field->get_buildhelp_overlay_index();
> +
> +     if (m_buildhelp) {
> +             int buildhelp_overlay_index = get_buildhelp_overlay(c);
>               if (buildhelp_overlay_index < Widelands::Field::Buildhelp_None) 
> {
> -                     overlays[num_ret] = 
> m_buildhelp_infos[buildhelp_overlay_index];
> -                     if (++num_ret == MAX_OVERLAYS_PER_NODE)
> -                             goto end;
> -             }
> +                
> result->emplace_back(m_buildhelp_infos[buildhelp_overlay_index]);
> +        }
>       }
> +
>       while (it != overlay_map.end() && it->first == c) {
> -             overlays[num_ret].pic = it->second.pic;
> -             overlays[num_ret].hotspot = it->second.hotspot;
> -             if (++num_ret == MAX_OVERLAYS_PER_NODE)
> -                     goto end;
> +             result->emplace_back(it->second.pic, it->second.hotspot);
>               ++it;
>       }
> -end:
> -     return num_ret;
>  }
>  
> -/**
> - * \returns the currently registered overlays for a triangle.
> - */
> -uint8_t OverlayManager::get_overlays
> -     (Widelands::TCoords<> const c, OverlayInfo * const overlays) const
> -{
> -     assert(m_are_graphics_loaded);
> +void FieldOverlayManager::get_overlays(Widelands::TCoords<> const c,
> +                                       std::vector<OverlayInfo>* result) 
> const {
>       assert(c.t == Widelands::TCoords<>::D || c.t == 
> Widelands::TCoords<>::R);
>  
> -     uint8_t num_ret = 0;
>  
>       const RegisteredOverlaysMap & overlay_map = m_overlays[c.t];
>       RegisteredOverlaysMap::const_iterator it = overlay_map.lower_bound(c);
> -     while
> -             (it != overlay_map.end()
> -              &&
> -              it->first == c
> -              &&
> -              num_ret < MAX_OVERLAYS_PER_TRIANGLE)
> -     {
> -             overlays[num_ret].pic = it->second.pic;
> -             overlays[num_ret].hotspot = it->second.hotspot;
> -             ++num_ret;
> +     while (it != overlay_map.end() && it->first == c) {
> +             result->emplace_back(it->second.pic, it->second.hotspot);
>               ++it;
>       }
> -     return num_ret;
>  }
>  
> -/**
> - * Recalculates all calculatable overlays for fields
> - */
> -void OverlayManager::recalc_field_overlays(const Widelands::FCoords fc) {
> +int FieldOverlayManager::get_buildhelp_overlay(const Widelands::FCoords& fc) 
> const {
>       Widelands::NodeCaps const caps =
>          m_callback ? static_cast<Widelands::NodeCaps>(m_callback(fc)) : 
> fc.field->nodecaps();
>  
> -     fc.field->set_buildhelp_overlay_index
> -             (caps & Widelands::BUILDCAPS_MINE                               
>        ?
> -              Widelands::Field::Buildhelp_Mine                               
>        :
> -              (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_BIG    ?
> -                     (caps & Widelands::BUILDCAPS_PORT ?
> -                      Widelands::Field::Buildhelp_Port :
> -                      Widelands::Field::Buildhelp_Big)
> -              :
> -              (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_MEDIUM ?
> -              Widelands::Field::Buildhelp_Medium                             
>        :
> -              (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_SMALL  ?
> -              Widelands::Field::Buildhelp_Small                              
>        :
> -              caps & Widelands::BUILDCAPS_FLAG                               
>        ?
> -              Widelands::Field::Buildhelp_Flag : 
> Widelands::Field::Buildhelp_None);
> +     const int value = caps & Widelands::BUILDCAPS_MINE ?
> +                    Widelands::Field::Buildhelp_Mine :
> +                    (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_BIG ?
> +                    (caps & Widelands::BUILDCAPS_PORT ? 
> Widelands::Field::Buildhelp_Port :
> +                                                        
> Widelands::Field::Buildhelp_Big) :
> +                    (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_MEDIUM ?
> +                    Widelands::Field::Buildhelp_Medium :
> +                    (caps & Widelands::BUILDCAPS_SIZEMASK) == 
> Widelands::BUILDCAPS_SMALL ?
> +                    Widelands::Field::Buildhelp_Small :
> +                    caps & Widelands::BUILDCAPS_FLAG ? 
> Widelands::Field::Buildhelp_Flag :
> +                                                       
> Widelands::Field::Buildhelp_None;
> +     return value;
>  }
>  
> -/**
> - * finally, register a new overlay
> - */
> -void OverlayManager::register_overlay
> +void FieldOverlayManager::register_overlay
>       (Widelands::TCoords<> const c,
>        const Image* pic,
>        int32_t              const level,
>        Point                      hotspot,
> -      JobId               const jobid)
> +      OverlayId               const overlay_id)
>  {
>       assert(c.t <= 2);
>       assert(level != 5); //  level == 5 is undefined behavior
> @@ -150,13 +142,13 @@
>                        &&
>                        it->second.level   == level)
>               {
> -                     it->second.jobids.insert(jobid);
> +                     it->second.overlay_ids.insert(overlay_id);
>                       return;
>               }
>  
>       overlay_map.insert
>               (std::pair<Widelands::Coords const, RegisteredOverlays>
> -                     (c, RegisteredOverlays(jobid, pic, hotspot, level)));
> +                     (c, RegisteredOverlays(overlay_id, pic, hotspot, 
> level)));
>  
>       //  Now manually sort, so that they are ordered
>       //    * first by c (done by std::multimap)
> @@ -180,10 +172,7 @@
>       } while (it->first == c);
>  }
>  
> -/**
> - * remove one (or many) overlays from a node or triangle
> - */
> -void OverlayManager::remove_overlay
> +void FieldOverlayManager::remove_overlay
>       (Widelands::TCoords<> const c, const Image* pic)
>  {
>       assert(c.t <= 2);
> @@ -203,109 +192,23 @@
>       }
>  }
>  
> -/**
> - * remove all overlays with this jobid
> - */
> -void OverlayManager::remove_overlay(const JobId jobid) {
> +void FieldOverlayManager::remove_overlay(const OverlayId overlay_id) {
>       const RegisteredOverlaysMap * const overlays_end = m_overlays + 3;
>       for (RegisteredOverlaysMap * j = m_overlays; j != overlays_end; ++j)
>               for (RegisteredOverlaysMap::iterator it = j->begin(); it != 
> j->end();) {
> -                     it->second.jobids.erase(jobid);
> -                     if (it->second.jobids.empty())
> +                     it->second.overlay_ids.erase(overlay_id);
> +                     if (it->second.overlay_ids.empty())
>                               j->erase(it++); //  This is necessary!
>                       else
>                               ++it;
>               }
>  }
>  
> -/**
> - * Register road overlays
> - */
> -void OverlayManager::register_road_overlay
> -     (Widelands::Coords const c, uint8_t const where, JobId const jobid)
> -{
> -     const RegisteredRoadOverlays overlay = {jobid, where};
> -     RegisteredRoadOverlaysMap::iterator it = m_road_overlays.find(c);
> -     if (it == m_road_overlays.end())
> -             m_road_overlays.insert
> -                     (std::pair<const Widelands::Coords,
> -                      RegisteredRoadOverlays>(c, overlay));
> -     else
> -             it->second = overlay;
> -}
> -
> -/**
> - * Remove road overlay
> - */
> -void OverlayManager::remove_road_overlay(const Widelands::Coords c) {
> -     const RegisteredRoadOverlaysMap::iterator it = m_road_overlays.find(c);
> -     if (it != m_road_overlays.end())
> -             m_road_overlays.erase(it);
> -}
> -
> -/**
> - * remove all overlays with this jobid
> - */
> -void OverlayManager::remove_road_overlay(JobId const jobid) {
> -     RegisteredRoadOverlaysMap::iterator it = m_road_overlays.begin();
> -     const RegisteredRoadOverlaysMap::const_iterator end =
> -             m_road_overlays.end();
> -     while (it != end)
> -             if (it->second.jobid == jobid)
> -                     m_road_overlays.erase(it++); //  Necessary!
> -             else
> -                     ++it;
> -}
> -
> -/**
> - * call cleanup and then, when graphic is reloaded
> - * overlay_manager calls this for himself and everything should be fine
> - *
> - * Load all the needed graphics
> - */
> -void OverlayManager::load_graphics() {
> -     if (m_are_graphics_loaded)
> -             return;
> -
> -     OverlayInfo * buildhelp_info = m_buildhelp_infos;
> -     static const char * filenames[] = {
> -             "pics/set_flag.png",
> -             "pics/small.png",
> -             "pics/medium.png",
> -             "pics/big.png",
> -             "pics/mine.png",
> -             "pics/port.png"
> -     };
> -     const char * const * filename = filenames;
> -
> -     //  Special case for flag, which has a different formula for hotspot_y.
> -     buildhelp_info->pic = g_gr->images().get(*filename);
> -     buildhelp_info->hotspot = Point(buildhelp_info->pic->width() / 2, 
> buildhelp_info->pic->height() - 1);
> -
> -     const OverlayInfo * const buildhelp_infos_end =
> -             buildhelp_info + Widelands::Field::Buildhelp_None;
> -     for (;;) { // The other buildhelp overlays.
> -             ++buildhelp_info, ++filename;
> -             if (buildhelp_info == buildhelp_infos_end)
> -                     break;
> -             buildhelp_info->pic = g_gr->images().get(*filename);
> -             buildhelp_info->hotspot = Point(buildhelp_info->pic->width() / 
> 2, buildhelp_info->pic->height() / 2);
> -     }
> -
> -     m_are_graphics_loaded = true;
> -}
> -
> -void OverlayManager::register_overlay_callback_function(CallbackFn function) 
> {
> +void FieldOverlayManager::register_overlay_callback_function(CallbackFn 
> function) {
>       m_callback = function;
>  }
>  
> -void OverlayManager::remove_overlay_callback_function() {
> -     m_callback.clear();
> -}
> -
> -OverlayManager::JobId OverlayManager::get_a_job_id() {
> -     ++m_current_job_id;
> -     if (m_current_job_id == 0)
> -             ++m_current_job_id;
> -     return m_current_job_id;
> +FieldOverlayManager::OverlayId FieldOverlayManager::next_overlay_id() {
> +     ++m_current_overlay_id;
> +     return m_current_overlay_id;
>  }
> 
> === renamed file 'src/wui/overlay_manager.h' => 
> 'src/wui/field_overlay_manager.h'
> --- src/wui/overlay_manager.h 2014-09-14 11:31:58 +0000
> +++ src/wui/field_overlay_manager.h   2015-03-29 18:13:50 +0000
> @@ -17,14 +17,13 @@
>   *
>   */
>  
> -#ifndef WL_WUI_OVERLAY_MANAGER_H
> -#define WL_WUI_OVERLAY_MANAGER_H
> +#ifndef WL_WUI_FIELD_OVERLAY_MANAGER_H
> +#define WL_WUI_FIELD_OVERLAY_MANAGER_H
>  
> +#include <functional>
>  #include <map>
>  #include <set>
> -
> -#include <boost/bind.hpp>
> -#include <boost/function.hpp>
> +#include <vector>
>  
>  #include "logic/field.h"
>  #include "logic/widelands_geometry.h"
> @@ -37,134 +36,105 @@
>   * manages overlays in the following way:
>   *   - When someone registered one (or more) special overlays
>   *     for a field he draws them accordingly
> - *   - If nothing was registered for this field, the Overlay Manager
> - *     automatically returns
> - *        - buildhelp (if activated)
>   *
>   *    about the level variable:
> - *     the level describe when the overlay should be drawn
> - *     buildhelp graphics have a level of 5, lower means the
> - *     buildhelp will cover the old overlays, otherways the new
> - *     overlay will cover the buildhelp.
> + *     the level describe when the overlay should be drawn, lower means drawn
> + *     earlier.
>   *
> - *    about jobid:
> - *     the jobid can be given to the register function, whenever
> + *    about overlay_id:
> + *     the overlay_id can be given to the register function, whenever
>   *     the job is finished or canceled, a simple remove_overlay
> - *     with the jobid can be called and all overlays created in the
> + *     with the overlay_id can be called and all overlays created in the
>   *     job are removed. This is useful for interactive road building.
>   */
> -#define MAX_OVERLAYS_PER_NODE 6
> -#define MAX_OVERLAYS_PER_TRIANGLE 3
> -
> -
> -struct OverlayManager {
> -     using JobId = uint32_t;
> -
> +constexpr int kLevelForBuildHelp = 5;
> +struct FieldOverlayManager {
> +     /// A unique id identifying a registered overlay.
> +     using OverlayId = uint32_t;
> +
> +     /// A overlay as drawn onto the screen.
>       struct OverlayInfo {
> +             OverlayInfo() = default;
> +             OverlayInfo(const Image* init_pic, const Point& init_hotspot)
> +                : pic(init_pic), hotspot(init_hotspot) {
> +             }
> +
>               const Image* pic;
>               Point hotspot;
>       };
>  
> +     /// A function returning Field::nodecaps() for the build overlay. This 
> can be
> +     /// registered to hide or change some of the nodecaps during rendering.
>       using CallbackFn =
> -             boost::function<int32_t(const 
> Widelands::TCoords<Widelands::FCoords>& coordinates)>;
> -
> -     OverlayManager();
> -
> -     //  register callback function (see data below for description)
> +        std::function<int32_t(const Widelands::TCoords<Widelands::FCoords>& 
> coordinates)>;
> +
> +     FieldOverlayManager();
> +
> +     /// Returns true if the buildhelp is currently shown.
> +     bool buildhelp() const;
> +
> +     /// Defines if the buildhelp should be shown.
> +     void show_buildhelp(bool t);
> +
> +     /// Register callback function.
>       void register_overlay_callback_function(CallbackFn function);
> -     void remove_overlay_callback_function();
> -
> -     /// Get a unique, unused job id.
> -     uint32_t get_a_job_id();
> -
> -     void load_graphics();
> +
> +     /// Get a unique, unused id that can be passed to register_overlay.
> +     OverlayId next_overlay_id();
>  
>       /// Register an overlay at a location (node or triangle). hotspot is 
> the point
>       /// of the picture that will be exactly over the location. If hotspot is
>       /// Point::invalid(), the center of the picture will be used as hotspot.
> -     void register_overlay
> -             (Widelands::TCoords<>,
> -              const Image* pic,
> -              int32_t level,
> -              Point   hotspot = Point::invalid(),
> -              JobId jobid = 0);
> +     void register_overlay(const Widelands::TCoords<> coords,
> +                           const Image* pic,
> +                           int32_t level,
> +                           Point hotspot = Point::invalid(),
> +                           OverlayId overlay_id = 0);
>  
> -     // removes all overlays when pic is zero
> +     /// removes all overlays when pic is nullptr.
>       void remove_overlay(Widelands::TCoords<>, const Image* pic);
> -     void remove_overlay(JobId jobid);
> -
> -     uint8_t get_overlays(Widelands::FCoords c, OverlayInfo *) const;
> -     uint8_t get_overlays(Widelands::TCoords<>, OverlayInfo *) const;
> -
> -     boost::function<void(bool)> onBuildHelpToggle;
> -     bool buildhelp() {return m_showbuildhelp;}
> -     void show_buildhelp(bool const t) {
> -             if (m_showbuildhelp != t) {
> -                     m_showbuildhelp = t;
> -                     if (onBuildHelpToggle) 
> onBuildHelpToggle(m_showbuildhelp);
> -             }
> -     }
> -     void toggle_buildhelp() {
> -             m_showbuildhelp = !m_showbuildhelp;
> -             if (onBuildHelpToggle) onBuildHelpToggle(m_showbuildhelp);
> -     }
> -
> -     void recalc_field_overlays(Widelands::FCoords);
> -
> -     //  Road overlays are registered like normal overlays and removed like
> -     //  normal overlays but they use are handled internally completely
> -     //  different. When a road overlay information is requested the same 
> data a
> -     //  s for a field is returned (a uint8_t which needs to be ANDed).
> -     void register_road_overlay
> -             (Widelands::Coords, uint8_t where, JobId jobid = 0);
> -     void remove_road_overlay(Widelands::Coords);
> -     void remove_road_overlay(JobId jobid);
> -     uint8_t get_road_overlay(const Widelands::Coords c) const {
> -             RegisteredRoadOverlaysMap::const_iterator const it =
> -                     m_road_overlays.find(c);
> -             if (it != m_road_overlays.end())
> -                     return it->second.where;
> -             return 0;
> -     }
> +
> +     /// remove all overlays with this overlay_id
> +     void remove_overlay(OverlayId overlay_id);
> +
> +     /// Returns the currently registered overlays and the buildhelp for a 
> node.
> +     void get_overlays(Widelands::FCoords c, std::vector<OverlayInfo>* 
> result) const;
> +
> +     /// Returns the currently registered overlays for a triangle.
> +     void get_overlays(Widelands::TCoords<>, std::vector<OverlayInfo>* 
> result) const;
>  
>  private:
>       struct RegisteredOverlays {
> -             RegisteredOverlays(const JobId init_jobid,
> +             RegisteredOverlays(const OverlayId init_overlay_id,
>                                   const Image* init_pic,
>                                   const Point init_hotspot,
>                                   const int init_level)
>                  : pic(init_pic), hotspot(init_hotspot), level(init_level) {
> -                     jobids.insert(init_jobid);
> +                     overlay_ids.insert(init_overlay_id);
>               }
> -             std::set<JobId> jobids;
> +             std::set<OverlayId> overlay_ids;
>               const Image* pic;
>               Point hotspot;
>               int level;
>       };
>  
> -     struct RegisteredRoadOverlays {
> -             JobId jobid;
> -             uint8_t where;
> -     };
> -
> -     using RegisteredRoadOverlaysMap =
> -             std::map<const Widelands::Coords, RegisteredRoadOverlays, 
> Widelands::Coords::OrderingFunctor>;
> -
> -     RegisteredRoadOverlaysMap m_road_overlays;
> -
> -     using RegisteredOverlaysMap =
> -             std::multimap<const Widelands::Coords, RegisteredOverlays, 
> Widelands::Coords::OrderingFunctor>;
> +     using RegisteredOverlaysMap = std::multimap<const Widelands::Coords,
> +                                                           
> RegisteredOverlays,
> +                                                           
> Widelands::Coords::OrderingFunctor>;
> +
> +     // Returns the index into m_buildhelp_infos for the correct fieldcaps 
> for
> +     // 'fc' according to the current 'm_callback'.
> +     int get_buildhelp_overlay(const Widelands::FCoords& fc) const;
>  
>       //  indexed by TCoords<>::TriangleIndex
>       RegisteredOverlaysMap m_overlays[3];
>  
>       OverlayInfo m_buildhelp_infos[Widelands::Field::Buildhelp_None];
> -     bool m_are_graphics_loaded;
> -     bool m_showbuildhelp;
> +     bool m_buildhelp;
>  
>       // this callback is used to define where overlays are drawn.
>       CallbackFn m_callback;
> -     uint32_t m_current_job_id;
> +     OverlayId m_current_overlay_id;
>  };
>  
> -#endif  // end of include guard: WL_WUI_OVERLAY_MANAGER_H
> +#endif  // end of include guard: WL_WUI_FIELD_OVERLAY_MANAGER_H
> 
> === modified file 'src/wui/fieldaction.cc'
> --- src/wui/fieldaction.cc    2014-12-06 16:14:53 +0000
> +++ src/wui/fieldaction.cc    2015-03-29 18:13:50 +0000
> @@ -40,9 +40,9 @@
>  #include "ui_basic/unique_window.h"
>  #include "wui/actionconfirm.h"
>  #include "wui/attack_box.h"
> +#include "wui/field_overlay_manager.h"
>  #include "wui/game_debug_ui.h"
>  #include "wui/interactive_player.h"
> -#include "wui/overlay_manager.h"
>  #include "wui/waresdisplay.h"
>  #include "wui/watchwindow.h"
>  
> @@ -215,14 +215,14 @@
>  
>       Widelands::Player * m_plr;
>       Widelands::Map    * m_map;
> -     OverlayManager & m_overlay_manager;
> +     FieldOverlayManager & m_field_overlay_manager;
>  
>       Widelands::FCoords  m_node;
>  
>       UI::TabPanel      m_tabpanel;
>       bool m_fastclick; // if true, put the mouse over first button in first 
> tab
>       uint32_t m_best_tab;
> -     OverlayManager::JobId m_workarea_preview_job_id;
> +     FieldOverlayManager::OverlayId m_workarea_preview_overlay_id;
>  
>       /// Variables to use with attack dialog.
>       AttackBox * m_attack_box;
> @@ -275,12 +275,12 @@
>       UI::UniqueWindow(ib, "field_action", registry, 68, 34, _("Action")),
>       m_plr(plr),
>       m_map(&ib->egbase().map()),
> -     m_overlay_manager(*m_map->get_overlay_manager()),
> +     m_field_overlay_manager(*ib->mutable_field_overlay_manager()),
>       m_node(ib->get_sel_pos().node, &(*m_map)[ib->get_sel_pos().node]),
>       m_tabpanel(this, 0, 0, g_gr->images().get("pics/but1.png")),
>       m_fastclick(true),
>       m_best_tab(0),
> -     m_workarea_preview_job_id(0),
> +     m_workarea_preview_overlay_id(0),
>       m_attack_box(nullptr)
>  {
>       ib->set_sel_freeze(true);
> @@ -292,8 +292,8 @@
>  
>  FieldActionWindow::~FieldActionWindow()
>  {
> -     if (m_workarea_preview_job_id)
> -             m_overlay_manager.remove_overlay(m_workarea_preview_job_id);
> +     if (m_workarea_preview_overlay_id)
> +             
> m_field_overlay_manager.remove_overlay(m_workarea_preview_overlay_id);
>       ibase().set_sel_freeze(false);
>       delete m_attack_box;
>  }
> @@ -813,9 +813,9 @@
>  void FieldActionWindow::building_icon_mouse_out
>       (Widelands::BuildingIndex)
>  {
> -     if (m_workarea_preview_job_id) {
> -             m_overlay_manager.remove_overlay(m_workarea_preview_job_id);
> -             m_workarea_preview_job_id = 0;
> +     if (m_workarea_preview_overlay_id) {
> +             
> m_field_overlay_manager.remove_overlay(m_workarea_preview_overlay_id);
> +             m_workarea_preview_overlay_id = 0;
>       }
>  }
>  
> @@ -823,11 +823,11 @@
>  void FieldActionWindow::building_icon_mouse_in
>       (const Widelands::BuildingIndex idx)
>  {
> -     if (ibase().m_show_workarea_preview && !m_workarea_preview_job_id) {
> +     if (ibase().m_show_workarea_preview && !m_workarea_preview_overlay_id) {
>               const WorkareaInfo & workarea_info =
>                       
> m_plr->tribe().get_building_descr(Widelands::BuildingIndex(idx))
>                       ->m_workarea_info;
> -             m_workarea_preview_job_id = 
> ibase().show_work_area(workarea_info, m_node);
> +             m_workarea_preview_overlay_id = 
> ibase().show_work_area(workarea_info, m_node);
>       }
>  }
>  
> 
> === modified file 'src/wui/interactive_base.cc'
> --- src/wui/interactive_base.cc       2015-02-16 19:04:26 +0000
> +++ src/wui/interactive_base.cc       2015-03-29 18:13:50 +0000
> @@ -46,6 +46,8 @@
>  #include "profile/profile.h"
>  #include "scripting/lua_interface.h"
>  #include "wlapplication.h"
> +#include "wui/edge_overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  #include "wui/game_chat_menu.h"
>  #include "wui/game_debug_ui.h"
>  #include "wui/interactive_player.h"
> @@ -53,7 +55,6 @@
>  #include "wui/mapviewpixelconstants.h"
>  #include "wui/mapviewpixelfunctions.h"
>  #include "wui/minimap.h"
> -#include "wui/overlay_manager.h"
>  #include "wui/quicknavigation.h"
>  #include "wui/unique_window_handler.h"
>  
> @@ -85,6 +86,8 @@
>       m_chatOverlay(new ChatOverlay(this, 10, 25, get_w() / 2, get_h() - 25)),
>       m_toolbar(this, 0, 0, UI::Box::Horizontal),
>       m(new InteractiveBaseInternals(new QuickNavigation(the_egbase, get_w(), 
> get_h()))),
> +       m_field_overlay_manager(new FieldOverlayManager()),
> +       m_edge_overlay_manager(new EdgeOverlayManager()),
>       m_egbase(the_egbase),
>  #ifndef NDEBUG //  not in releases
>       m_display_flags(dfDebug),
> @@ -156,13 +159,12 @@
>  void InteractiveBase::set_sel_pos(Widelands::NodeAndTriangle<> const center)
>  {
>       Map & map = egbase().map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
>  
>       // Remove old sel pointer
>       if (m_sel.jobid)
> -             overlay_manager.remove_overlay(m_sel.jobid);
> -     const OverlayManager::JobId jobid =
> -             m_sel.jobid = overlay_manager.get_a_job_id();
> +             m_field_overlay_manager->remove_overlay(m_sel.jobid);
> +     const FieldOverlayManager::OverlayId jobid =
> +             m_sel.jobid = m_field_overlay_manager->next_overlay_id();
>  
>       m_sel.pos = center;
>  
> @@ -174,13 +176,13 @@
>               Widelands::MapTriangleRegion<> mr
>                       (map, Area<TCoords<> >(center.triangle, m_sel.radius));
>               do
> -                     overlay_manager.register_overlay
> +                     m_field_overlay_manager->register_overlay
>                               (mr.location(), m_sel.pic, 7, Point::invalid(), 
> jobid);
>               while (mr.advance(map));
>       } else {
>               Widelands::MapRegion<> mr(map, Area<>(center.node, 
> m_sel.radius));
>               do
> -                     overlay_manager.register_overlay
> +                     m_field_overlay_manager->register_overlay
>                               (mr.location(), m_sel.pic, 7, Point::invalid(), 
> jobid);
>               while (mr.advance(map));
>               if (upcast(InteractiveGameBase const, igbase, this))
> @@ -232,21 +234,25 @@
>       set_sel_picture("pics/fsel.png");
>  }
>  
> +bool InteractiveBase::buildhelp() const {
> +     return m_field_overlay_manager->buildhelp();
> +}
> +
> +void InteractiveBase::show_buildhelp(bool t) {
> +     m_field_overlay_manager->show_buildhelp(t);
> +     on_buildhelp_changed(t);
> +}
>  
>  void InteractiveBase::toggle_buildhelp() {
> -     egbase().map().overlay_manager().toggle_buildhelp();
> -}
> -bool InteractiveBase::buildhelp() {
> -     return egbase().map().overlay_manager().buildhelp();
> -}
> -void InteractiveBase::show_buildhelp(bool t) {
> -     egbase().map().overlay_manager().show_buildhelp(t);
> +     
> m_field_overlay_manager->show_buildhelp(!m_field_overlay_manager->buildhelp());
> +}
> +
> +void InteractiveBase::on_buildhelp_changed(bool /* value */) {
>  }
>  
>  // Show the given workareas at the given coords and returns the overlay job 
> id associated
> -OverlayManager::JobId InteractiveBase::show_work_area
> -     (const WorkareaInfo & workarea_info, Widelands::Coords coords)
> -{
> +FieldOverlayManager::OverlayId InteractiveBase::show_work_area(const 
> WorkareaInfo& workarea_info,
> +                                                               
> Widelands::Coords coords) {
>       const uint8_t workareas_nrs = workarea_info.size();
>       WorkareaInfo::size_type wa_index;
>       switch (workareas_nrs) {
> @@ -258,8 +264,7 @@
>                       throw wexception("Encountered unexpected WorkareaInfo 
> size %i", workareas_nrs);
>       }
>       Widelands::Map & map = m_egbase.map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
> -     OverlayManager::JobId job_id = overlay_manager.get_a_job_id();
> +     FieldOverlayManager::OverlayId overlay_id = 
> m_field_overlay_manager->next_overlay_id();
>  
>       Widelands::HollowArea<> hollow_area(Widelands::Area<>(coords, 0), 0);
>  
> @@ -269,23 +274,21 @@
>               hollow_area.radius = it->first;
>               Widelands::MapHollowRegion<> mr(map, hollow_area);
>               do
> -                     overlay_manager.register_overlay
> +                     m_field_overlay_manager->register_overlay
>                               (mr.location(),
>                                       m_workarea_pics[wa_index],
>                                       0,
>                                       Point::invalid(),
> -                                     job_id);
> +                                     overlay_id);
>               while (mr.advance(map));
>               wa_index++;
>               hollow_area.hole_radius = hollow_area.radius;
>       }
> -     return job_id;
> +     return overlay_id;
>  }
>  
> -void InteractiveBase::hide_work_area(OverlayManager::JobId job_id) {
> -     Widelands::Map & map = m_egbase.map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
> -     overlay_manager.remove_overlay(job_id);
> +void InteractiveBase::hide_work_area(FieldOverlayManager::OverlayId 
> overlay_id) {
> +     m_field_overlay_manager->remove_overlay(overlay_id);
>  }
>  
>  
> @@ -749,11 +752,10 @@
>       //log("Add overlay\n");
>  
>       Map & map = egbase().map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
>  
>       // preview of the road
>       assert(!m_jobid);
> -     m_jobid = overlay_manager.get_a_job_id();
> +     m_jobid = m_field_overlay_manager->next_overlay_id();
>       const CoordPath::StepVector::size_type nr_steps = 
> m_buildroad->get_nsteps();
>       for (CoordPath::StepVector::size_type idx = 0; idx < nr_steps; ++idx) {
>               Widelands::Direction dir = (*m_buildroad)[idx];
> @@ -766,16 +768,16 @@
>  
>               int32_t const shift = 2 * (dir - Widelands::WALK_E);
>  
> -             uint8_t set_to = overlay_manager.get_road_overlay(c);
> +             uint8_t set_to = m_edge_overlay_manager->get_overlay(c);
>               set_to |=  Widelands::RoadType::kNormal << shift;
> -             overlay_manager.register_road_overlay(c, set_to, m_jobid);
> +             m_edge_overlay_manager->register_overlay(c, set_to, m_jobid);
>       }
>  
>       // build hints
>       Widelands::FCoords endpos = map.get_fcoords(m_buildroad->get_end());
>  
>       assert(!m_road_buildhelp_overlay_jobid);
> -     m_road_buildhelp_overlay_jobid = overlay_manager.get_a_job_id();
> +     m_road_buildhelp_overlay_jobid = 
> m_field_overlay_manager->next_overlay_id();
>       for (int32_t dir = 1; dir <= 6; ++dir) {
>               Widelands::FCoords neighb;
>               int32_t caps;
> @@ -828,7 +830,7 @@
>               else
>                       name = "pics/roadb_red.png";
>  
> -             egbase().map().overlay_manager().register_overlay
> +             m_field_overlay_manager->register_overlay
>                       (neighb,
>                        g_gr->images().get(name),
>                        7,
> @@ -849,14 +851,15 @@
>       //log("Remove overlay\n");
>  
>       //  preview of the road
> -     OverlayManager & overlay_manager = egbase().map().overlay_manager();
> -     if (m_jobid)
> -             overlay_manager.remove_road_overlay(m_jobid);
> +     if (m_jobid) {
> +             m_edge_overlay_manager->remove_overlay(m_jobid);
> +     }
>       m_jobid = 0;
>  
>       // build hints
> -     if (m_road_buildhelp_overlay_jobid)
> -             overlay_manager.remove_overlay(m_road_buildhelp_overlay_jobid);
> +     if (m_road_buildhelp_overlay_jobid) {
> +             
> m_field_overlay_manager->remove_overlay(m_road_buildhelp_overlay_jobid);
> +     }
>       m_road_buildhelp_overlay_jobid = 0;
>  }
>  
> 
> === modified file 'src/wui/interactive_base.h'
> --- src/wui/interactive_base.h        2014-11-30 12:23:45 +0000
> +++ src/wui/interactive_base.h        2015-03-29 18:13:50 +0000
> @@ -33,13 +33,15 @@
>  #include "ui_basic/unique_window.h"
>  #include "wui/chatoverlay.h"
>  #include "wui/debugconsole.h"
> +#include "wui/edge_overlay_manager.h"
> +#include "wui/field_overlay_manager.h"
>  #include "wui/mapview.h"
> -#include "wui/overlay_manager.h"
>  
>  namespace Widelands {struct CoordPath;}
>  
> +class EdgeOverlayManager;
> +class UniqueWindowHandler;
>  struct InteractiveBaseInternals;
> -class UniqueWindowHandler;
>  
>  /**
>   * This is used to represent the code that InteractivePlayer and
> @@ -65,8 +67,9 @@
>       virtual void reference_player_tribe(Widelands::PlayerNumber, const void 
> * const) {}
>  
>       bool m_show_workarea_preview;
> -     OverlayManager::JobId show_work_area(const WorkareaInfo & 
> workarea_info, Widelands::Coords coords);
> -     void hide_work_area(OverlayManager::JobId job_id);
> +     FieldOverlayManager::OverlayId show_work_area(const WorkareaInfo& 
> workarea_info,
> +                                                   Widelands::Coords coords);
> +     void hide_work_area(FieldOverlayManager::OverlayId overlay_id);
>  
>       //  point of view for drawing
>       virtual Widelands::Player * get_player() const = 0;
> @@ -79,9 +82,11 @@
>       }
>       bool get_sel_freeze() const {return m_sel.freeze;}
>  
> -     bool buildhelp();
> +     // Returns true if the buildhelp is currently displayed.
> +     bool buildhelp() const;
> +
> +     // Sets if the buildhelp should be displayed. Will also call 
> on_buildhelp_changed().
>       void show_buildhelp(bool t);
> -     void toggle_buildhelp ();
>  
>       /**
>        * sel_triangles determines whether the mouse pointer selects triangles.
> @@ -127,7 +132,22 @@
>               log_message(std::string(message));
>       }
>  
> +     const FieldOverlayManager& field_overlay_manager() const {
> +             return *m_field_overlay_manager;
> +     }
> +     FieldOverlayManager* mutable_field_overlay_manager() {
> +             return m_field_overlay_manager.get();
> +     }
> +
> +     const EdgeOverlayManager& edge_overlay_manager() const {
> +             return *m_edge_overlay_manager;
> +     }
> +
>  protected:
> +     // Will be called whenever the buildhelp is changed with the new 
> 'value'.
> +     virtual void on_buildhelp_changed(bool value);
> +
> +     void toggle_buildhelp();
>       void toggle_minimap();
>       void hide_minimap();
>       UI::UniqueWindow::Registry & minimap_registry();
> @@ -165,7 +185,7 @@
>                                               (Widelands::Coords(0, 0), 
> Widelands::TCoords<>::D)),
>                        const uint32_t Radius                   = 0,
>                        const Image* Pic                     = nullptr,
> -                      const OverlayManager::JobId Jobid = 0)
> +                      const FieldOverlayManager::OverlayId Jobid = 0)
>                       :
>                       freeze(Freeze), triangles(Triangles), pos(Pos), 
> radius(Radius),
>                       pic(Pic), jobid(Jobid)
> @@ -175,11 +195,14 @@
>               Widelands::NodeAndTriangle<>     pos;
>               uint32_t              radius;
>               const Image* pic;
> -             OverlayManager::JobId jobid;
> +             FieldOverlayManager::OverlayId jobid;
>       } m_sel;
>  
>       std::unique_ptr<InteractiveBaseInternals> m;
>  
> +     std::unique_ptr<FieldOverlayManager> m_field_overlay_manager;
> +     std::unique_ptr<EdgeOverlayManager> m_edge_overlay_manager;
> +
>       std::unique_ptr<Notifications::Subscriber<GraphicResolutionChanged>>
>          graphic_resolution_changed_subscriber_;
>       Widelands::EditorGameBase & m_egbase;
> @@ -188,8 +211,8 @@
>       uint32_t          m_frametime;         //  in millseconds
>       uint32_t          m_avg_usframetime;   //  in microseconds!
>  
> -     OverlayManager::JobId m_jobid;
> -     OverlayManager::JobId m_road_buildhelp_overlay_jobid;
> +     EdgeOverlayManager::OverlayId m_jobid;
> +     FieldOverlayManager::OverlayId m_road_buildhelp_overlay_jobid;
>       Widelands::CoordPath  * m_buildroad;         //  path for the new road
>       Widelands::PlayerNumber m_road_build_player;
>  
> 
> === modified file 'src/wui/interactive_gamebase.cc'
> --- src/wui/interactive_gamebase.cc   2015-02-14 22:11:44 +0000
> +++ src/wui/interactive_gamebase.cc   2015-03-29 18:13:50 +0000
> @@ -135,18 +135,13 @@
>   */
>  void InteractiveGameBase::postload() {
>       Widelands::Map & map = egbase().map();
> -     OverlayManager & overlay_manager = map.overlay_manager();
> -     overlay_manager.show_buildhelp(false);
> -     overlay_manager.register_overlay_callback_function
> +     auto* overlay_manager = mutable_field_overlay_manager();
> +     show_buildhelp(false);
> +     m_toggle_buildhelp.set_perm_pressed(buildhelp());
> +
> +     overlay_manager->register_overlay_callback_function
>                       (boost::bind(&InteractiveGameBase::calculate_buildcaps, 
> this, _1));
>  
> -     // Connect buildhelp button to reflect build help state. Needs to be
> -     // done here rather than in the constructor as the map is not present 
> then.
> -     // This code assumes that the InteractivePlayer object lives longer than
> -     // the overlay_manager. Otherwise remove the hook in the deconstructor.
> -     egbase().map().overlay_manager().onBuildHelpToggle =
> -             boost::bind(&UI::Button::set_perm_pressed, &m_toggle_buildhelp, 
> _1);
> -     m_toggle_buildhelp.set_perm_pressed(buildhelp());
>  
>       // Recalc whole map for changed owner stuff
>       map.recalc_whole_map(egbase().world());
> @@ -158,6 +153,9 @@
>       hide_minimap();
>  }
>  
> +void InteractiveGameBase::on_buildhelp_changed(const bool value) {
> +     m_toggle_buildhelp.set_perm_pressed(value);
> +}
>  
>  /**
>   * See if we can reasonably open a ship window at the current selection 
> position.
> 
> === modified file 'src/wui/interactive_gamebase.h'
> --- src/wui/interactive_gamebase.h    2015-03-26 06:47:36 +0000
> +++ src/wui/interactive_gamebase.h    2015-03-29 18:13:50 +0000
> @@ -101,6 +101,9 @@
>       UI::UniqueWindow::Registry m_game_summary;
>  
>       UI::Button m_toggle_buildhelp;
> +
> +private:
> +     void on_buildhelp_changed(const bool value) override;
>  };
>  
>  #endif  // end of include guard: WL_WUI_INTERACTIVE_GAMEBASE_H
> 
> === modified file 'src/wui/interactive_player.cc'
> --- src/wui/interactive_player.cc     2015-02-14 22:11:44 +0000
> +++ src/wui/interactive_player.cc     2015-03-29 18:13:50 +0000
> @@ -54,7 +54,6 @@
>  #include "wui/game_objectives_menu.h"
>  #include "wui/game_options_menu.h"
>  #include "wui/general_statistics_menu.h"
> -#include "wui/overlay_manager.h"
>  #include "wui/stock_menu.h"
>  #include "wui/ware_statistics_menu.h"
>  
> @@ -397,22 +396,11 @@
>               return;
>       }
>  
> -     DebugConsole::write
> -             (str
> -                     (boost::format("Switching from #%1% to #%2%.")
> -                      % static_cast<int>(m_player_number) % n));
> +     DebugConsole::write(
> +        str(boost::format("Switching from #%1% to #%2%.") % 
> static_cast<int>(m_player_number) % n));
>       m_player_number = n;
> -     Map              &       map             = egbase().map();
> -     OverlayManager  &       overlay_manager = map.overlay_manager();
> -     Widelands::Extent  const extent          = map.extent         ();
> -     for (uint16_t y = 0; y < extent.h; ++y)
> -             for (uint16_t x = 0; x < extent.w; ++x)
> -                     overlay_manager.recalc_field_overlays
> -                             (map.get_fcoords(Widelands::Coords(x, y)));
> -     if
> -             (UI::UniqueWindow * const building_statistics_window =
> -                     m_mainm_windows.building_stats.window)
> -             dynamic_cast<BuildingStatisticsMenu&>
> -                     (*building_statistics_window)
> -                     .update();
> +
> +     if (UI::UniqueWindow* const building_statistics_window = 
> m_mainm_windows.building_stats.window) {
> +             
> dynamic_cast<BuildingStatisticsMenu&>(*building_statistics_window).update();
> +     }
>  }
> 
> === modified file 'src/wui/mapview.cc'
> --- src/wui/mapview.cc        2015-02-20 20:04:28 +0000
> +++ src/wui/mapview.cc        2015-03-29 18:13:50 +0000
> @@ -29,7 +29,6 @@
>  #include "wui/interactive_base.h"
>  #include "wui/interactive_player.h"
>  #include "wui/mapviewpixelfunctions.h"
> -#include "wui/overlay_manager.h"
>  
>  MapView::MapView(
>     UI::Panel* parent, int32_t x, int32_t y, uint32_t w, uint32_t h, 
> InteractiveBase& player)
> @@ -86,8 +85,6 @@
>                       return;
>       }
>  
> -     egbase.map().overlay_manager().load_graphics();
> -
>       if (upcast(InteractivePlayer const, interactive_player, &intbase())) {
>               m_renderer->rendermap(dst, egbase, m_viewpoint, 
> interactive_player->player());
>       } else {
> 


-- 
https://code.launchpad.net/~widelands-dev/widelands/split_overlay_manager/+merge/254496
Your team Widelands Developers is requested to review the proposed merge of 
lp:~widelands-dev/widelands/split_overlay_manager into 
lp:~widelands-dev/widelands/render_queue.

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to