Added conversion from and to Vector to Sizef
[supertux.git] / src / video / video_systems.cpp
index ca86eb1..1e37dd2 100644 (file)
 #include <config.h>
 
 #include "supertux/gameconfig.hpp"
-#include "video/gl/gl_lightmap.hpp"
-#include "video/gl/gl_renderer.hpp"
-#include "video/gl/gl_surface_data.hpp"
-#include "video/gl/gl_texture.hpp"
 #include "video/lightmap.hpp"
 #include "video/renderer.hpp"
 #include "video/sdl/sdl_lightmap.hpp"
 #include "video/texture.hpp"
 #include "video/video_systems.hpp"
 
-Renderer*
+#ifdef HAVE_OPENGL
+#include "video/gl/gl_lightmap.hpp"
+#include "video/gl/gl_renderer.hpp"
+#include "video/gl/gl_surface_data.hpp"
+#include "video/gl/gl_texture.hpp"
+#endif
+
+std::unique_ptr<Renderer>
 VideoSystem::new_renderer()
 {
   switch(g_config->video)
   {
     case AUTO_VIDEO:
 #ifdef HAVE_OPENGL
-      log_info << "new GL renderer\n";
-      return new GLRenderer();
-#else
-      log_warning << "new SDL renderer\n";
-      return new SDLRenderer();
+      try {
+        log_info << "new GL renderer\n";
+        return std::unique_ptr<Renderer>(new GLRenderer());
+      } catch(std::runtime_error& e) {
+        log_warning << "Error creating GL renderer: "  << e.what() << std::endl;
 #endif
+        log_warning << "new SDL renderer\n";
+        return std::unique_ptr<Renderer>(new SDLRenderer());
 #ifdef HAVE_OPENGL
+      }
     case OPENGL:
       log_info << "new GL renderer\n";
-      return new GLRenderer();
+      return std::unique_ptr<Renderer>(new GLRenderer());
 #endif
     case PURE_SDL:
-      log_warning << "new SDL renderer\n";
-      return new SDLRenderer();
+      log_info << "new SDL renderer\n";
+      return std::unique_ptr<Renderer>(new SDLRenderer());
     default:
       assert(0 && "invalid video system in config");
 #ifdef HAVE_OPENGL
       log_info << "new GL renderer\n";
-      return new GLRenderer();
+      return std::unique_ptr<Renderer>(new GLRenderer());
 #else
       log_warning << "new SDL renderer\n";
-      return new SDLRenderer();
+      return std::unique_ptr<Renderer>(new SDLRenderer());
 #endif
   }
 }
 
-Lightmap*
+std::unique_ptr<Lightmap>
 VideoSystem::new_lightmap()
 {
   switch(g_config->video)
   {
     case AUTO_VIDEO:
 #ifdef HAVE_OPENGL
-      return new GLLightmap();
+      return std::unique_ptr<Lightmap>(new GLLightmap());
 #else
-      return new SDLLightmap();
+      return std::unique_ptr<Lightmap>(new SDLLightmap());
 #endif
 #ifdef HAVE_OPENGL
     case OPENGL:
-      return new GLLightmap();
+      return std::unique_ptr<Lightmap>(new GLLightmap());
 #endif
     case PURE_SDL:
-      return new SDLLightmap();
+      return std::unique_ptr<Lightmap>(new SDLLightmap());
     default:
       assert(0 && "invalid video system in config");
 #ifdef HAVE_OPENGL
-      return new GLLightmap();
+      return std::unique_ptr<Lightmap>(new GLLightmap());
 #else
-      return new SDLLightmap();
+      return std::unique_ptr<Lightmap>(new SDLLightmap());
 #endif
   }
 }
 
-Texture*
+TexturePtr
 VideoSystem::new_texture(SDL_Surface *image)
 {
   switch(g_config->video)
   {
     case AUTO_VIDEO:
 #ifdef HAVE_OPENGL
-      return new GLTexture(image);
+      return TexturePtr(new GLTexture(image));
 #else
-      return new SDLTexture(image);
+      return TexturePtr(new SDLTexture(image));
 #endif
 #ifdef HAVE_OPENGL
     case OPENGL:
-      return new GLTexture(image);
+      return TexturePtr(new GLTexture(image));
 #endif
     case PURE_SDL:
-      return new SDLTexture(image);
+      return TexturePtr(new SDLTexture(image));
     default:
       assert(0 && "invalid video system in config");
 #ifdef HAVE_OPENGL
-      return new GLTexture(image);
+      return TexturePtr(new GLTexture(image));
 #else
-      return new SDLTexture(image);
+      return TexturePtr(new SDLTexture(image));
 #endif
   }
 }
@@ -147,6 +153,9 @@ VideoSystem::new_surface_data(const Surface &surface)
 void
 VideoSystem::free_surface_data(SurfaceData* surface_data)
 {
+  if(surface_data == NULL)
+    return;
+
   delete surface_data;
 }