diff --git a/data/translations/english.cfg b/data/translations/english.cfg index 003c136d0db..d8c4151c31e 100644 --- a/data/translations/english.cfg +++ b/data/translations/english.cfg @@ -543,6 +543,7 @@ sound_settings="Sound Settings..." sound_volume="SFX Volume:" music_volume="Music Volume:" scroll_speed="Scroll Speed:" +gamma="Gamma correction:" choose_weapon="Choose weapon" options="Options" diff --git a/src/preferences.cpp b/src/preferences.cpp index 9008f2e83a1..10011287d2c 100644 --- a/src/preferences.cpp +++ b/src/preferences.cpp @@ -76,6 +76,7 @@ display_manager::display_manager(display* d) set_grid(grid()); set_turbo(turbo()); set_fullscreen(fullscreen()); + set_gamma(gamma()); } display_manager::~display_manager() @@ -236,6 +237,26 @@ void mute(bool muted) muted_ = muted; } +int gamma() +{ + static const int default_value = 100; + const string_map::const_iterator gamma = prefs.values.find("gamma"); + if(gamma != prefs.values.end() && gamma->second.empty() == false) + return atoi(gamma->second.c_str()); + else + return default_value; +} + +void set_gamma(int gamma) +{ + std::stringstream stream; + stream << gamma; + prefs["gamma"] = stream.str(); + + CVideo& video = disp->video(); + video.setGamma((float)gamma / 100); +} + bool is_muted() { return muted_; @@ -480,7 +501,7 @@ void show_preferences_dialog(display& disp) log_scope("show_preferences_dialog"); const int width = 600; - const int height = 450; + const int height = 500; const int xpos = disp.x()/2 - width/2; const int ypos = disp.y()/2 - height/2; @@ -497,6 +518,7 @@ void show_preferences_dialog(display& disp) const std::string& music_label = string_table["music_volume"]; const std::string& sound_label = string_table["sound_volume"]; const std::string& scroll_label = string_table["scroll_speed"]; + const std::string& gamma_label = string_table["gamma"]; SDL_Rect music_rect = {0,0,0,0}; music_rect = font::draw_text(NULL,clip_rect,14,font::NORMAL_COLOUR, @@ -510,12 +532,18 @@ void show_preferences_dialog(display& disp) scroll_rect = font::draw_text(NULL,clip_rect,14,font::NORMAL_COLOUR, scroll_label,0,0); + SDL_Rect gamma_rect = {0,0,0,0}; + gamma_rect = font::draw_text(NULL,clip_rect,14,font::NORMAL_COLOUR, + gamma_label,0,0); - const int text_right = xpos + maximum(scroll_rect.w,maximum(music_rect.w,sound_rect.w)) + 5; + const int text_right = xpos + maximum(maximum(scroll_rect.w, gamma_rect.w), + maximum(music_rect.w,sound_rect.w)) + 5; const int music_pos = ypos + 20; const int sound_pos = music_pos + 50; const int scroll_pos = sound_pos + 50; + const int gamma_pos = scroll_pos + 50; + const int buttons_pos = gamma_pos + 50; music_rect.x = text_right - music_rect.w; music_rect.y = music_pos; @@ -526,6 +554,9 @@ void show_preferences_dialog(display& disp) scroll_rect.x = text_right - scroll_rect.w; scroll_rect.y = scroll_pos; + gamma_rect.x = text_right - gamma_rect.w; + gamma_rect.y = gamma_pos; + const int slider_left = text_right + 10; const int slider_right = xpos + width - 5; if(slider_left >= slider_right) @@ -549,16 +580,23 @@ void show_preferences_dialog(display& disp) scroll_slider.set_max(100); scroll_slider.set_value(scroll_speed()); - gui::button fullscreen_button(disp,string_table["full_screen"],gui::button::TYPE_CHECK); + slider_rect.y = gamma_pos; + gui::slider gamma_slider(disp,slider_rect); + gamma_slider.set_min(50); + gamma_slider.set_max(200); + gamma_slider.set_value(gamma()); + + gui::button fullscreen_button(disp,string_table["full_screen"], + gui::button::TYPE_CHECK); fullscreen_button.set_check(fullscreen()); - fullscreen_button.set_location(slider_left,sound_pos + 80); + fullscreen_button.set_location(slider_left,buttons_pos ); gui::button turbo_button(disp,string_table["speed_turbo"],gui::button::TYPE_CHECK); turbo_button.set_check(turbo()); - turbo_button.set_location(slider_left,sound_pos + 80 + 50); + turbo_button.set_location(slider_left,buttons_pos + 50); gui::button show_ai_moves_button(disp,string_table["skip_ai_moves"],gui::button::TYPE_CHECK); show_ai_moves_button.set_check(!show_ai_moves()); @@ -567,37 +605,37 @@ void show_preferences_dialog(display& disp) gui::button grid_button(disp,string_table["grid_button"],gui::button::TYPE_CHECK); grid_button.set_check(grid()); - grid_button.set_location(slider_left,sound_pos + 80 + 150); + grid_button.set_location(slider_left,buttons_pos + 100); gui::button floating_labels_button(disp,string_table["floating_labels_button"],gui::button::TYPE_CHECK); floating_labels_button.set_check(show_floating_labels()); - floating_labels_button.set_location(slider_left,sound_pos + 80 + 200); + floating_labels_button.set_location(slider_left,buttons_pos + 150); gui::button resolution_button(disp,string_table["video_mode"]); - resolution_button.set_location(slider_left,sound_pos + 80 + 250); + resolution_button.set_location(slider_left,buttons_pos + 250); gui::button turn_dialog_button(disp,string_table["turn_dialog_button"],gui::button::TYPE_CHECK); turn_dialog_button.set_check(turn_dialog()); - turn_dialog_button.set_location(slider_left+fullscreen_button.width()+100,sound_pos + 80); + turn_dialog_button.set_location(slider_left+fullscreen_button.width()+100,buttons_pos); gui::button turn_bell_button(disp,string_table["turn_bell_button"],gui::button::TYPE_CHECK); turn_bell_button.set_check(turn_bell()); - turn_bell_button.set_location(slider_left+fullscreen_button.width()+100,sound_pos + 80 + 50); + turn_bell_button.set_location(slider_left+fullscreen_button.width()+100,buttons_pos + 50); gui::button side_colours_button(disp,string_table["show_side_colours"],gui::button::TYPE_CHECK); side_colours_button.set_check(show_side_colours()); - side_colours_button.set_location(slider_left + fullscreen_button.width() + 100,sound_pos + 80 + 100); + side_colours_button.set_location(slider_left + fullscreen_button.width() + 100,buttons_pos + 100); gui::button colour_cursors_button(disp,string_table["show_colour_cursors"],gui::button::TYPE_CHECK); colour_cursors_button.set_check(use_colour_cursors()); - colour_cursors_button.set_location(slider_left + fullscreen_button.width() + 100,sound_pos + 80 + 150); + colour_cursors_button.set_location(slider_left + fullscreen_button.width() + 100,buttons_pos + 150); gui::button haloes_button(disp,string_table["show_haloes"],gui::button::TYPE_CHECK); haloes_button.set_check(show_haloes()); - haloes_button.set_location(slider_left + fullscreen_button.width() + 100,sound_pos + 80 + 200); + haloes_button.set_location(slider_left + fullscreen_button.width() + 100,buttons_pos + 200); gui::button hotkeys_button (disp,string_table["hotkeys_button"]); - hotkeys_button.set_location(slider_left + fullscreen_button.width() + 100,sound_pos + 80 + 250); + hotkeys_button.set_location(slider_left + fullscreen_button.width() + 100,buttons_pos + 250); bool redraw_all = true; @@ -638,6 +676,7 @@ void show_preferences_dialog(display& disp) sound_slider.set_dirty(); scroll_slider.set_dirty(); music_slider.set_dirty(); + gamma_slider.set_dirty(); font::draw_text(&disp,clip_rect,14,font::NORMAL_COLOUR,music_label, music_rect.x,music_rect.y); @@ -648,6 +687,9 @@ void show_preferences_dialog(display& disp) font::draw_text(&disp,clip_rect,14,font::NORMAL_COLOUR,scroll_label, scroll_rect.x,scroll_rect.y); + font::draw_text(&disp,clip_rect,14,font::NORMAL_COLOUR,gamma_label, + gamma_rect.x,gamma_rect.y); + update_rect(disp.screen_area()); redraw_all = false; @@ -711,6 +753,7 @@ void show_preferences_dialog(display& disp) set_sound_volume(sound_slider.value()); set_music_volume(music_slider.value()); set_scroll_speed(scroll_slider.value()); + set_gamma(gamma_slider.value()); disp.update_display(); diff --git a/src/preferences.hpp b/src/preferences.hpp index 3516d3062af..dc7180c71eb 100644 --- a/src/preferences.hpp +++ b/src/preferences.hpp @@ -54,6 +54,9 @@ namespace preferences { void mute(bool muted); bool is_muted(); + int gamma(); + void set_gamma(int gamma); + bool grid(); void set_grid(bool ison); diff --git a/src/video.cpp b/src/video.cpp index 753d7d29303..d4ebc97b296 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -253,6 +253,13 @@ int CVideo::setMode( int x, int y, int bits_per_pixel, int flags ) } else return 0; } +int CVideo::setGamma(float gamma) +{ + SDL_SetGamma(gamma, gamma, gamma); + + return 0; +} + int CVideo::getx() const { return frameBuffer->w; diff --git a/src/video.hpp b/src/video.hpp index c93ee684f33..c23f5728caa 100644 --- a/src/video.hpp +++ b/src/video.hpp @@ -39,6 +39,8 @@ class CVideo { int modePossible( int x, int y, int bits_per_pixel, int flags ); int setMode( int x, int y, int bits_per_pixel, int flags ); + int setGamma(float gamma); + //functions to get the dimensions of the current video-mode int getx() const; int gety() const;