diff --git a/src/display.cpp b/src/display.cpp index 9f207660547..277453054d5 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -82,13 +82,12 @@ display::display(unit_map& units, CVideo& video, const gamemap& map, invalidateAll_(true), invalidateUnit_(true), invalidateGameStatus_(true), sideBarBgDrawn_(false), lastTimeOfDay_(-1), currentTeam_(0), updatesLocked_(0), - turbo_(false), grid_(false) + turbo_(false), grid_(false), sidebarScaling_(1.0) { gameStatusRect_.w = 0; unitDescriptionRect_.w = 0; unitProfileRect_.w = 0; - //clear the screen contents SDL_Surface* const disp = screen_.getSurface(); const int length = disp->w*disp->h; @@ -333,8 +332,20 @@ void display::draw(bool update,bool force) { if(!sideBarBgDrawn_) { SDL_Surface* const screen = screen_.getSurface(); - SDL_Surface* const image = getImage("misc/rightside.png",UNSCALED); + SDL_Surface* image = getImage("misc/rightside.png",UNSCALED); if(image != NULL) { + + if(image->h != screen->h) { + SDL_Surface* const new_image + = scale_surface(image,image->w,screen->h); + if(new_image != NULL) { + images_["misc/rightside.png"] = new_image; + SDL_FreeSurface(image); + image = new_image; + sidebarScaling_ = static_cast(image->h)/768.0; + } + } + SDL_Rect dstrect; dstrect.x = mapx(); dstrect.y = 0; @@ -360,7 +371,7 @@ void display::draw(bool update,bool force) for(int y = -1; y <= map_.y(); ++y) draw_tile(x,y); invalidateAll_ = false; - draw_minimap(mapx()+30,35,(this->x()-mapx())-60,120); + draw_minimap(mapx()+30,35,(this->x()-mapx())-60,120*sidebarScaling_); } else { for(std::set::const_iterator it = invalidated_.begin(); it != invalidated_.end(); ++it) { @@ -416,13 +427,13 @@ void display::draw_sidebar() i = units_.find(selectedHex_); if(i != units_.end()) - draw_unit_details(mapx()+2,390,selectedHex_,i->second, - unitDescriptionRect_,unitProfileRect_); + draw_unit_details(mapx()+2,390*sidebarScaling_,selectedHex_, + i->second,unitDescriptionRect_,unitProfileRect_); invalidateUnit_ = false; } if(invalidateGameStatus_) { - draw_game_status(mapx()+2,258); + draw_game_status(mapx()+2,258*sidebarScaling_); invalidateGameStatus_ = false; } } @@ -454,10 +465,10 @@ void display::draw_game_status(int x, int y) if(tod_surface != NULL) { //hardcoded values as to where the time of day image appears - blit_surface(mapx() + 21,196,tod_surface); + blit_surface(mapx() + 21,196*sidebarScaling_,tod_surface); SDL_Rect update_area; update_area.x = mapx() + 21; - update_area.y = 196; + update_area.y = 196*sidebarScaling_; update_area.w = tod_surface->w; update_area.h = tod_surface->h; update_rect(update_area); diff --git a/src/display.hpp b/src/display.hpp index 7f1780000a3..eb8b6c29e25 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -220,6 +220,7 @@ private: int updatesLocked_; bool turbo_, grid_; + double sidebarScaling_; //for debug mode static std::map debugHighlights_; diff --git a/src/sdl_utils.cpp b/src/sdl_utils.cpp index 0424711d3d7..9a1b5ecb999 100644 --- a/src/sdl_utils.cpp +++ b/src/sdl_utils.cpp @@ -10,6 +10,9 @@ See the COPYING file for more details. */ + +#include + #include "sdl_utils.hpp" SDL_Surface* scale_surface(SDL_Surface* surface, int w, int h) @@ -20,8 +23,10 @@ SDL_Surface* scale_surface(SDL_Surface* surface, int w, int h) surface->format->Gmask, surface->format->Bmask, surface->format->Amask); - if(dest == NULL) + if(dest == NULL) { + std::cerr << "Could not create surface to scale onto\n"; return NULL; + } const double xratio = static_cast(surface->w)/ static_cast(w);