-void texture_setup(void);
-extern void (*texture_load) (texture_type* ptexture, const std::string& file, int use_alpha);
-extern void (*texture_load_part) (texture_type* ptexture, const std::string& file, int x, int y, int w, int h, int use_alpha);
-extern void (*texture_free) (texture_type* ptexture);
-extern void (*texture_draw) (texture_type* ptexture, float x, float y, bool update = false);
-extern void (*texture_draw_bg) (texture_type* ptexture, bool update = false);
-extern void (*texture_draw_part) (texture_type* ptexture, float sx, float sy, float x, float y, float w, float h, bool update = false);
-void texture_load_sdl(texture_type* ptexture, const std::string&, int use_alpha);
-void texture_load_part_sdl(texture_type* ptexture, const std::string& file, int x, int y, int w, int h, int use_alpha);
-void texture_free_sdl(texture_type* ptexture);
-void texture_draw_sdl(texture_type* ptexture, float x, float y, bool update);
-void texture_draw_bg_sdl(texture_type* ptexture, bool update);
-void texture_draw_part_sdl(texture_type* ptexture,float sx, float sy, float x, float y, float w, float h, bool update);
-void texture_from_sdl_surface(texture_type* ptexture, SDL_Surface * sdl_surf, int use_alpha);
-#ifndef NOOPENGL
-void texture_load_gl(texture_type* ptexture, const std::string& file, int use_alpha);
-void texture_load_part_gl(texture_type* ptexture, const std::string& file, int x, int y, int w, int h, int use_alpha);
-void texture_free_gl(texture_type* ptexture);
-void texture_draw_gl(texture_type* ptexture, float x, float y, bool update);
-void texture_draw_bg_gl(texture_type* ptexture, bool update);
-void texture_draw_part_gl(texture_type* ptexture, float sx, float sy, float x, float y, float w, float h, bool update);
-void texture_create_gl(SDL_Surface * surf, GLuint * tex);
-#endif
+class SurfaceSDL : public SurfaceImpl
+{
+public:
+
+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 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
+{
+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 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);
+};