From b926ff5e4c523e7e662abc3a00be109baa9cbea1 Mon Sep 17 00:00:00 2001 From: Wedge009 Date: Fri, 4 Oct 2019 10:57:19 +1000 Subject: [PATCH] Validate zoom level upon initialisation as well as in setting. --- src/display.cpp | 51 +++++++++++++++++++++++++++++-------------------- src/display.hpp | 2 ++ 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/display.cpp b/src/display.cpp index 365bf0009d15..5d86bc1c3227 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -233,9 +233,12 @@ display::display(const display_context * dc, std::weak_ptr wb, repo set_idle_anim_rate(preferences::idle_anim_rate()); - if(preferences::tile_size() > 0) + if(preferences::tile_size() > 0) { zoom_ = preferences::tile_size(); - zoom_index_ = std::distance(zoom_levels.begin(), std::find(zoom_levels.begin(), zoom_levels.end(), zoom_)); + validate_zoom_level_and_set_index(zoom_, zoom_index_); + } else { + zoom_index_ = std::distance(zoom_levels.begin(), std::find(zoom_levels.begin(), zoom_levels.end(), zoom_)); + } image::set_zoom(zoom_); @@ -1997,25 +2000,9 @@ bool display::set_zoom(unsigned int amount, const bool validate_value_and_set_in return false; } - // Confirm this is indeed a valid zoom level. - if(validate_value_and_set_index) { - auto iter = std::lower_bound(zoom_levels.begin(), zoom_levels.end(), new_zoom); - - if(iter == zoom_levels.end()) { - // This should never happen, since the value was already clamped earlier - return false; - } else if(iter != zoom_levels.begin()) { - float diff = *iter - *(iter - 1); - float lower = (new_zoom - *(iter - 1)) / diff; - float upper = (*iter - new_zoom) / diff; - if(lower < upper) { - // It's actually closer to the previous element. - iter--; - } - } - - new_zoom = *iter; - zoom_index_ = std::distance(zoom_levels.begin(), iter); + // Confirm this is indeed a valid zoom level (zoom_index_ doesn't get updated if new_zoom is not valid) + if(validate_value_and_set_index && !validate_zoom_level_and_set_index(new_zoom, zoom_index_)) { + return false; } const SDL_Rect& outside_area = map_outside_area(); @@ -2061,6 +2048,28 @@ bool display::set_zoom(unsigned int amount, const bool validate_value_and_set_in return true; } +bool display::validate_zoom_level_and_set_index(unsigned int& new_zoom, int &new_zoom_index) +{ + auto iter = std::lower_bound(zoom_levels.begin(), zoom_levels.end(), new_zoom); + + if(iter == zoom_levels.end()) { + // This should never happen, since the value was already clamped earlier + return false; + } else if(iter != zoom_levels.begin()) { + float diff = *iter - *(iter - 1); + float lower = (new_zoom - *(iter - 1)) / diff; + float upper = (*iter - new_zoom) / diff; + if(lower < upper) { + // It's actually closer to the previous element. + iter--; + } + } + + new_zoom = *iter; + new_zoom_index = std::distance(zoom_levels.begin(), iter); + return true; +} + void display::set_default_zoom() { if (zoom_ != DefaultZoom) { diff --git a/src/display.hpp b/src/display.hpp index 3475312848a4..d8fb97775b0a 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -635,6 +635,7 @@ class display : public video2::draw_layering private: void read(const config& cfg); + bool validate_zoom_level_and_set_index(unsigned int &new_zoom, int &new_zoom_index); public: /** Init the flag list and the team colors used by ~TC */ @@ -646,6 +647,7 @@ class display : public video2::draw_layering { reports_object_ = &reports_object; } + private: void init_flags_for_side_internal(std::size_t side, const std::string& side_color);