- SDL_Surface* sdl_surface;
- unsigned gl_texture;
- int w;
- int h;
- }
-texture_type;
-
-void texture_setup(int opengl);
-void texture_load(texture_type* ptexture, char * file, int use_alpha);
-void texture_from_sdl_surface(texture_type* ptexture, SDL_Surface * sdl_surf, int use_alpha);
-void texture_free(texture_type* ptexture);
-void texture_draw(texture_type* ptexture, float x, float y, int update);
-void texture_draw_bg(texture_type* ptexture, int update);
-void texture_draw_part(texture_type* ptexture, float x, float y, float w, float h, int update);
+ draw(pos.x, pos.y, alpha, upside_down, update);
+ }
+};
+
+/** Surface implementation, all implementation have to inherit from
+ this class */
+class SurfaceImpl
+{
+protected:
+ SDL_Surface* sdl_surface;
+
+public:
+ int w;
+ int h;
+
+public:
+ SurfaceImpl();
+ virtual ~SurfaceImpl();
+
+ /** Return 0 on success, -2 if surface needs to be reloaded */
+ virtual int draw(float x, float y, Uint8 alpha, bool upside_down, 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;
+ virtual int draw_stretched(float x, float y, int w, int h, Uint8 alpha, bool update) = 0;
+ int resize(int w_, int h_);
+
+ SDL_Surface* get_sdl_surface() const; // @evil@ try to avoid this function
+};
+
+class SurfaceSDL : public SurfaceImpl
+{
+public:
+ SurfaceSDL(SDL_Surface* surf, int use_alpha);
+ SurfaceSDL(const std::string& file, int use_alpha);
+ SurfaceSDL(const std::string& file, int x, int y, int w, int h, int use_alpha);
+ virtual ~SurfaceSDL();
+
+ int draw(float x, float y, Uint8 alpha, bool upside_down, 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);
+ int draw_stretched(float x, float y, int w, int h, Uint8 alpha, bool update);
+};
+
+#ifndef NOOPENGL
+class SurfaceOpenGL : public SurfaceImpl
+{
+public:
+ unsigned gl_texture;
+
+public:
+ SurfaceOpenGL(SDL_Surface* surf, int use_alpha);
+ SurfaceOpenGL(const std::string& file, int use_alpha);
+ SurfaceOpenGL(const std::string& file, int x, int y, int w, int h, int use_alpha);
+ virtual ~SurfaceOpenGL();
+
+ int draw(float x, float y, Uint8 alpha, bool upside_down, 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);
+ int draw_stretched(float x, float y, int w, int h, Uint8 alpha, bool update);
+
+private:
+ void create_gl(SDL_Surface * surf, GLuint * tex);
+};
+#endif