+Surface::Surfaces Surface::surfaces;
+
+SurfaceData::SurfaceData(SDL_Surface* surf, int use_alpha_)
+ : type(SURFACE), surface(surf), use_alpha(use_alpha_)
+{
+}
+
+SurfaceData::SurfaceData(const std::string& file_, int use_alpha_)
+ : type(LOAD), file(file_), use_alpha(use_alpha_)
+{
+}
+
+SurfaceData::SurfaceData(const std::string& file_, int x_, int y_, int w_, int h_, int use_alpha_)
+ : type(LOAD_PART), file(file_), use_alpha(use_alpha_),
+ x(x_), y(y_), w(w_), h(h_)
+{
+}
+
+SurfaceImpl*
+SurfaceData::create()
+{
+ if (use_gl)
+ return create_SurfaceOpenGL();
+ else
+ return create_SurfaceSDL();
+}
+
+SurfaceSDL*
+SurfaceData::create_SurfaceSDL()
+{
+ switch(type)
+ {
+ case LOAD:
+ return new SurfaceSDL(file, use_alpha);
+ case LOAD_PART:
+ return new SurfaceSDL(file, x, y, w, h, use_alpha);
+ case SURFACE:
+ return 0; //new SurfaceSDL(surface, use_alpha);
+ }
+ assert(0);
+}
+
+SurfaceOpenGL*
+SurfaceData::create_SurfaceOpenGL()
+{
+ switch(type)
+ {
+ case LOAD:
+ return new SurfaceOpenGL(file, use_alpha);
+ case LOAD_PART:
+ return new SurfaceOpenGL(file, x, y, w, h, use_alpha);
+ case SURFACE:
+ return 0; //new SurfaceOpenGL(surface, use_alpha);
+ }
+ assert(0);
+}
+
+