Finally!!
[supertux.git] / src / texture.h
index 36567f5..4594612 100644 (file)
 #include <SDL_opengl.h>
 #endif
 
+#include <list>
 #include "screen.h"
 
 class SurfaceImpl;
+class SurfaceSDL;
+class SurfaceOpenGL;
+
+/** This class holds all the data necessary to construct a surface */
+class SurfaceData 
+{
+public:
+  enum ConstructorType { LOAD, LOAD_PART, SURFACE };
+  ConstructorType type;
+  SDL_Surface* surface;
+  std::string file;
+  int use_alpha;
+  int x;
+  int y;
+  int w;
+  int h;
+
+  SurfaceData(SDL_Surface* surf, int use_alpha_);
+  SurfaceData(const std::string& file_, int use_alpha_);
+  SurfaceData(const std::string& file_, int x_, int y_, int w_, int h_, int use_alpha_);
+  ~SurfaceData();
+
+  SurfaceSDL* create_SurfaceSDL();
+  SurfaceOpenGL* create_SurfaceOpenGL();
+  SurfaceImpl* create();
+};
 
 /** Container class that holds a surface, necessary so that we can
     switch Surface implementations (OpenGL, SDL) on the fly */
 class Surface
 {
 public:
+  SurfaceData data;
   SurfaceImpl* impl;
   int w; 
   int h;
+  
+  typedef std::list<Surface*> Surfaces;
+  static Surfaces surfaces;
 public:
+  static void reload_all();
+
   Surface(SDL_Surface* surf, int use_alpha);  
   Surface(const std::string& file, int use_alpha);  
   Surface(const std::string& file, int x, int y, int w, int h, int use_alpha);
   ~Surface();
+  
+  /** Reload the surface, which is necesarry in case of a mode swich */
+  void reload();
 
   void draw(float x, float y, Uint8 alpha = 255, bool update = false);
   void draw_bg(Uint8 alpha = 255, bool update = false);
@@ -52,9 +88,10 @@ public:
   int h;
 
 public:
-  virtual void draw(float x, float y, Uint8 alpha, bool update) = 0;
-  virtual void draw_bg(Uint8 alpha, bool update) = 0;
-  virtual void draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update) = 0;
+  /** Return 0 on success, -2 if surface needs to be reloaded */
+  virtual int draw(float x, float y, Uint8 alpha, bool update) = 0;
+  virtual int draw_bg(Uint8 alpha, bool update) = 0;
+  virtual int draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update) = 0;
 };
 
 class SurfaceSDL : public SurfaceImpl
@@ -67,9 +104,9 @@ public:
   SurfaceSDL(const std::string& file, int x, int y, int w, int h, int use_alpha);
   virtual ~SurfaceSDL();
 
-  void draw(float x, float y, Uint8 alpha, bool update);
-  void draw_bg(Uint8 alpha, bool update);
-  void draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update);
+  int draw(float x, float y, Uint8 alpha, bool update);
+  int draw_bg(Uint8 alpha, bool update);
+  int draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update);
 };
 
 class SurfaceOpenGL : public SurfaceImpl
@@ -83,9 +120,9 @@ public:
   SurfaceOpenGL(const std::string& file, int x, int y, int w, int h, int use_alpha);
   virtual ~SurfaceOpenGL();
 
-  void draw(float x, float y, Uint8 alpha, bool update);
-  void draw_bg(Uint8 alpha, bool update);
-  void draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update);
+  int draw(float x, float y, Uint8 alpha, bool update);
+  int draw_bg(Uint8 alpha, bool update);
+  int draw_part(float sx, float sy, float x, float y, float w, float h,  Uint8 alpha, bool update);
 
 private:
   void create_gl(SDL_Surface * surf, GLuint * tex);
@@ -95,4 +132,4 @@ private:
 
 /* Local Variables: */
 /* mode: c++ */
-/* End */
+/* End: */