committed stpatch20110110.diff by Jonas Kümmerlin
authorChristoph Sommer <mail@christoph-sommer.de>
Mon, 10 Jan 2011 18:51:20 +0000 (18:51 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Mon, 10 Jan 2011 18:51:20 +0000 (18:51 +0000)
* Viewport is restored properly after drawing lightmap (was set to 0,0,SCREEN_WIDTH,SCREEN_HEIGHT before)
* Menu size calculation now minds size of current selected string in STRINGSELECT items -> overlapping bugs disappear
* Magnification is saved in configuration file
* default magnification is auto (maybe talk about that again)
* auto magnification does now downscaling on resolutions smaller than 640x480
* magnification, aspect ratio and fullscreen resolution controls in options menu now display the current value

SVN-Revision: 6660

src/gui/menu.cpp
src/supertux/gameconfig.cpp
src/supertux/menu/options_menu.cpp
src/video/gl/gl_lightmap.cpp
src/video/gl/gl_lightmap.hpp
src/video/gl/gl_renderer.cpp

index b889ce7..6ce60ac 100644 (file)
@@ -624,6 +624,9 @@ Menu::get_width() const
       Resources::big_font->get_text_width(items[i]->input) + 16;
     if(items[i]->kind == MN_TOGGLE)
       w += 32;
+    if (items[i]->kind == MN_STRINGSELECT)
+      w += font->get_text_width(items[i]->list[items[i]->selected]) + 32;
+    
 
     if(w > menu_width)
       menu_width = w;
index add3908..235198c 100644 (file)
@@ -30,7 +30,7 @@ Config::Config() :
   fullscreen_size(800, 600),
   window_size(800, 600),
   aspect_size(0, 0), // auto detect
-  magnification(1.0f),
+  magnification(0.0f),
   use_fullscreen(false),
   video(VideoSystem::AUTO_VIDEO),
   try_vsync(true),
@@ -81,6 +81,8 @@ Config::load()
 
     config_video_lisp->get("aspect_width",  aspect_size.width);
     config_video_lisp->get("aspect_height", aspect_size.height);
+    
+    config_video_lisp->get("magnification", magnification);
   }
 
   const lisp::Lisp* config_audio_lisp = config_lisp->get_lisp("audio");
@@ -124,6 +126,8 @@ Config::save()
 
   writer.write("aspect_width",  aspect_size.width);
   writer.write("aspect_height", aspect_size.height);
+  
+  writer.write("magnification", magnification);
 
   writer.end_list("video");
 
index f01b402..3948b0a 100644 (file)
@@ -81,6 +81,30 @@ OptionsMenu::OptionsMenu() :
   magnification->list.push_back("160%");
   magnification->list.push_back("200%");
   magnification->list.push_back("250%");
+  if (g_config->magnification != 0.0f) //auto
+  {
+    std::ostringstream out;
+    out << (g_config->magnification*100) << "%";
+    std::string magn = out.str();
+    size_t count = 0;
+    for (std::vector<std::string>::iterator i = magnification->list.begin(); i != magnification->list.end(); ++i)
+    {
+      if (*i == magn)
+      {
+       magnification->selected = count;
+       magn.clear();
+       break;
+      }
+      
+      ++count;
+    }
+    if (!magn.empty()) //magnification not in our list but accept anyway
+    {
+      magnification->selected = magnification->list.size();
+      magnification->list.push_back(magn);
+    }
+  }
+  
 
   SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
 
@@ -115,6 +139,26 @@ OptionsMenu::OptionsMenu() :
     // lowest, so reverse them
     std::sort(fullscreen_res->list.begin(), fullscreen_res->list.end(), StringUtil::numeric_less);
   }
+  
+  std::ostringstream out;
+  out << g_config->fullscreen_size.width << "x" << g_config->fullscreen_size.height;
+  std::string fllscrn_sz = out.str();
+  size_t cnt = 0;
+  for (std::vector<std::string>::iterator i = fullscreen_res->list.begin(); i != fullscreen_res->list.end(); ++i) 
+  {
+    if (*i == fllscrn_sz)
+    {
+      fllscrn_sz.clear();
+      fullscreen_res->selected = cnt;
+      break;
+    }
+    ++cnt;
+  }
+  if (!fllscrn_sz.empty())
+  {
+    fullscreen_res->selected = fullscreen_res->list.size();
+    fullscreen_res->list.push_back(fllscrn_sz);
+  }
 
   MenuItem* aspect = add_string_select(MNID_ASPECTRATIO, _("Aspect Ratio"));
   aspect->set_help(_("Adjust the aspect ratio"));
@@ -131,13 +175,16 @@ OptionsMenu::OptionsMenu() :
     std::ostringstream out;
     out << g_config->aspect_size.width << ":" << g_config->aspect_size.height;
     std::string aspect_ratio = out.str();
+    size_t cnt = 0;
     for(std::vector<std::string>::iterator i = aspect->list.begin(); i != aspect->list.end(); ++i)
     {
       if(*i == aspect_ratio)
       {
         aspect_ratio.clear();
+       aspect->selected = cnt;
         break;
       }
+      ++cnt;
     }
 
     if (!aspect_ratio.empty())
index 30df72a..5722d92 100644 (file)
@@ -51,8 +51,8 @@ GLLightmap::GLLightmap() :
 {
   screen = SDL_GetVideoSurface();
 
-  lightmap_width = screen->w / LIGHTMAP_DIV;
-  lightmap_height = screen->h / LIGHTMAP_DIV;
+  lightmap_width = SCREEN_WIDTH / LIGHTMAP_DIV;
+  lightmap_height = SCREEN_HEIGHT / LIGHTMAP_DIV;
   unsigned int width = next_po2(lightmap_width);
   unsigned int height = next_po2(lightmap_height);
 
@@ -70,7 +70,9 @@ GLLightmap::~GLLightmap()
 void
 GLLightmap::start_draw(const Color &ambient_color)
 {
-  glViewport(0, screen->h - lightmap_height, lightmap_width, lightmap_height);
+  
+  glGetFloatv(GL_VIEWPORT, old_viewport); //save viewport
+  glViewport(old_viewport[0], SCREEN_HEIGHT - lightmap_height + old_viewport[1], lightmap_width, lightmap_height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 #ifdef GL_VERSION_ES_CM_1_0
@@ -90,9 +92,9 @@ GLLightmap::end_draw()
 {
   glDisable(GL_BLEND);
   glBindTexture(GL_TEXTURE_2D, lightmap->get_handle());
-  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, screen->h - lightmap_height, lightmap_width, lightmap_height);
-
-  glViewport(0, 0, screen->w, screen->h);
+  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, old_viewport[0], SCREEN_HEIGHT  - lightmap_height + old_viewport[1], lightmap_width, lightmap_height);
+  
+  glViewport(old_viewport[0], old_viewport[1], old_viewport[2], old_viewport[3]);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 #ifdef GL_VERSION_ES_CM_1_0
@@ -267,8 +269,8 @@ GLLightmap::get_light(const DrawingRequest& request) const
   for( int i = 0; i<3; i++)
     pixels[i] = 0.0f; //set to black
 
-  float posX = request.pos.x * lightmap_width / SCREEN_WIDTH;
-  float posY = screen->h - request.pos.y * lightmap_height / SCREEN_HEIGHT;
+  float posX = request.pos.x * lightmap_width / SCREEN_WIDTH + old_viewport[0];
+  float posY = SCREEN_HEIGHT + old_viewport[1] - request.pos.y * lightmap_height / SCREEN_HEIGHT;
   glReadPixels((GLint) posX, (GLint) posY , 1, 1, GL_RGB, GL_FLOAT, pixels);
   *(getlightrequest->color_ptr) = Color( pixels[0], pixels[1], pixels[2]);
 }
index 10ee546..af72e42 100644 (file)
@@ -48,6 +48,7 @@ private:
   int lightmap_height;
   float lightmap_uv_right;
   float lightmap_uv_bottom;
+  GLfloat old_viewport[4]; //holds vieport before redefining in start_draw - returned from glGet
 
 private:
   GLLightmap(const GLLightmap&);
index 2642788..361f30a 100644 (file)
@@ -501,11 +501,12 @@ GLRenderer::apply_config()
   }
 
   Size max_size(1280, 800);
+  Size min_size(640, 480);
 
   if (g_config->magnification == 0.0f) // Magic value that means 'minfill'
   {
     // This scales SCREEN_WIDTH/SCREEN_HEIGHT so that they never excede
-    // max_size.width/max_size.height
+    // max_size.width/max_size.height resp. min_size.width/min_size.height
     if (SCREEN_WIDTH > max_size.width || SCREEN_HEIGHT > max_size.height)
     {
       float scale1  = float(max_size.width)/SCREEN_WIDTH;
@@ -513,7 +514,16 @@ GLRenderer::apply_config()
       float scale   = (scale1 < scale2) ? scale1 : scale2;
       SCREEN_WIDTH  = static_cast<int>(SCREEN_WIDTH  * scale);
       SCREEN_HEIGHT = static_cast<int>(SCREEN_HEIGHT * scale);
+    } 
+    else if (SCREEN_WIDTH < min_size.width || SCREEN_HEIGHT < min_size.height)
+    {
+      float scale1  = float(min_size.width)/SCREEN_WIDTH;
+      float scale2  = float(min_size.height)/SCREEN_HEIGHT;
+      float scale   = (scale1 < scale2) ? scale1 : scale2;
+      SCREEN_WIDTH  = static_cast<int>(SCREEN_WIDTH  * scale);
+      SCREEN_HEIGHT = static_cast<int>(SCREEN_HEIGHT * scale);
     }
+   
 
     glViewport(0, 0, screen_size.width, screen_size.height);
   }