- OpenGL menu entry is now disabled if no opengl support is compiled in
- added handling for lost surfaces for modeswitch in win32 (needs testing)
- fixed font-shadow issue
SVN-Revision: 519
options_menu->additem(MN_LABEL,"Options",0,0);
options_menu->additem(MN_HL,"",0,0);
options_menu->additem(MN_LABEL,"Options",0,0);
options_menu->additem(MN_HL,"",0,0);
options_menu->additem(MN_TOGGLE,"OpenGL",use_gl,0);
options_menu->additem(MN_TOGGLE,"OpenGL",use_gl,0);
+#else
+ options_menu->additem(MN_DEACTIVE,"OpenGL (not supported)",use_gl,0);
+#endif
options_menu->additem(MN_TOGGLE,"Fullscreen",use_fullscreen,0);
if(audio_device)
{
options_menu->additem(MN_TOGGLE,"Fullscreen",use_fullscreen,0);
if(audio_device)
{
switch (options_menu->check())
{
case 2:
switch (options_menu->check())
{
case 2:
- if(/*use_gl != */options_menu->item[2].toggled)
- {
+ if(use_gl != options_menu->item[2].toggled)
+ {
use_gl = !use_gl;
st_video_setup();
use_gl = !use_gl;
st_video_setup();
-*/
-options_menu->item[2].toggled = false;
-printf("This feature has been temporarly disabled\n");
-#else
- options_menu->item[2].toggled = false;
- printf("OpenGL hasn't been enabled during compiling time.\n");
-#endif
break;
case 3:
if(use_fullscreen != options_menu->item[3].toggled)
break;
case 3:
if(use_fullscreen != options_menu->item[3].toggled)
chars = new Surface(file, USE_ALPHA);
chars = new Surface(file, USE_ALPHA);
- /* Load shadow font. */
conv = SDL_DisplayFormatAlpha(chars->impl->sdl_surface);
pixels = conv->w * conv->h;
SDL_LockSurface(conv);
conv = SDL_DisplayFormatAlpha(chars->impl->sdl_surface);
pixels = conv->w * conv->h;
SDL_LockSurface(conv);
#include "SDL.h"
#include "SDL_image.h"
#include "texture.h"
#include "SDL.h"
#include "SDL_image.h"
#include "texture.h"
Surface::Surfaces Surface::surfaces;
Surface::Surfaces Surface::surfaces;
-SurfaceData::SurfaceData(SDL_Surface* surf, int use_alpha_)
- : type(SURFACE), surface(surf), use_alpha(use_alpha_)
-{
+SurfaceData::SurfaceData(SDL_Surface* temp, int use_alpha_)
+ : type(SURFACE), use_alpha(use_alpha_)
+{
+ // Copy the given surface and make sure that it is not stored in
+ // video memory
+ surface = SDL_CreateRGBSurface(temp->flags & (~SDL_HWSURFACE),
+ temp->w, temp->h,
+ temp->format->BitsPerPixel,
+ temp->format->Rmask,
+ temp->format->Gmask,
+ temp->format->Bmask,
+ temp->format->Amask);
+ SDL_SetAlpha(temp,0,0);
+ SDL_BlitSurface(temp, NULL, surface, NULL);
}
SurfaceData::SurfaceData(const std::string& file_, int use_alpha_)
}
SurfaceData::SurfaceData(const std::string& file_, int use_alpha_)
+SurfaceData::~SurfaceData()
+{
+
+}
+
SurfaceImpl*
SurfaceData::create()
{
SurfaceImpl*
SurfaceData::create()
{
case LOAD_PART:
return new SurfaceSDL(file, x, y, w, h, use_alpha);
case SURFACE:
case LOAD_PART:
return new SurfaceSDL(file, x, y, w, h, use_alpha);
case SURFACE:
- return 0; //new SurfaceSDL(surface, use_alpha);
+ return new SurfaceSDL(surface, use_alpha);
case LOAD_PART:
return new SurfaceOpenGL(file, x, y, w, h, use_alpha);
case SURFACE:
case LOAD_PART:
return new SurfaceOpenGL(file, x, y, w, h, use_alpha);
case SURFACE:
- return 0; //new SurfaceOpenGL(surface, use_alpha);
+ return new SurfaceOpenGL(surface, use_alpha);
void
Surface::draw(float x, float y, Uint8 alpha, bool update)
{
void
Surface::draw(float x, float y, Uint8 alpha, bool update)
{
- if (impl) impl->draw(x, y, alpha, update);
+ if (impl)
+ {
+ if (impl->draw(x, y, alpha, update) == -2)
+ reload();
+ }
}
void
Surface::draw_bg(Uint8 alpha, bool update)
{
}
void
Surface::draw_bg(Uint8 alpha, bool update)
{
- if (impl) impl->draw_bg(alpha, update);
+ if (impl)
+ {
+ if (impl->draw_bg(alpha, update) == -2)
+ reload();
+ }
}
void
Surface::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
}
void
Surface::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
- if (impl) impl->draw_part(sx, sy, x, y, w, h, alpha, update);
+ if (impl)
+ {
+ if (impl->draw_part(sx, sy, x, y, w, h, alpha, update) == -2)
+ reload();
+ }
SurfaceOpenGL::draw(float x, float y, Uint8 alpha, bool update)
{
float pw = power_of_two(w);
SurfaceOpenGL::draw(float x, float y, Uint8 alpha, bool update)
{
float pw = power_of_two(w);
/* Avoid compiler warnings */
if(update)
{}
/* Avoid compiler warnings */
if(update)
{}
SurfaceOpenGL::draw_bg(Uint8 alpha, bool update)
{
float pw = power_of_two(w);
SurfaceOpenGL::draw_bg(Uint8 alpha, bool update)
{
float pw = power_of_two(w);
/* Avoid compiler warnings */
if(update)
{}
/* Avoid compiler warnings */
if(update)
{}
SurfaceOpenGL::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
float pw = power_of_two(int(this->w));
SurfaceOpenGL::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
float pw = power_of_two(int(this->w));
/* Avoid compiler warnings */
if(update)
{}
/* Avoid compiler warnings */
if(update)
{}
SurfaceSDL::draw(float x, float y, Uint8 alpha, bool update)
{
SDL_Rect dest;
SurfaceSDL::draw(float x, float y, Uint8 alpha, bool update)
{
SDL_Rect dest;
dest.h = h;
if(alpha != 255) /* SDL isn't capable of this kind of alpha :( therefore we'll leave now. */
dest.h = h;
if(alpha != 255) /* SDL isn't capable of this kind of alpha :( therefore we'll leave now. */
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
- SDL_BlitSurface(sdl_surface, NULL, screen, &dest);
+ int ret = SDL_BlitSurface(sdl_surface, NULL, screen, &dest);
if (update == UPDATE)
SDL_UpdateRect(screen, dest.x, dest.y, dest.w, dest.h);
if (update == UPDATE)
SDL_UpdateRect(screen, dest.x, dest.y, dest.w, dest.h);
SurfaceSDL::draw_bg(Uint8 alpha, bool update)
{
SDL_Rect dest;
SurfaceSDL::draw_bg(Uint8 alpha, bool update)
{
SDL_Rect dest;
if(alpha != 255)
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
if(alpha != 255)
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
- SDL_SoftStretch(sdl_surface, NULL, screen, &dest);
+
+ int ret = SDL_SoftStretch(sdl_surface, NULL, screen, &dest);
if (update == UPDATE)
SDL_UpdateRect(screen, dest.x, dest.y, dest.w, dest.h);
if (update == UPDATE)
SDL_UpdateRect(screen, dest.x, dest.y, dest.w, dest.h);
SurfaceSDL::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
SDL_Rect src, dest;
SurfaceSDL::draw_part(float sx, float sy, float x, float y, float w, float h, Uint8 alpha, bool update)
{
SDL_Rect src, dest;
if(alpha != 255)
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
if(alpha != 255)
SDL_SetAlpha(sdl_surface ,SDL_SRCALPHA,alpha);
- SDL_BlitSurface(sdl_surface, &src, screen, &dest);
+ int ret = SDL_BlitSurface(sdl_surface, &src, screen, &dest);
if (update == UPDATE)
update_rect(screen, dest.x, dest.y, dest.w, dest.h);
if (update == UPDATE)
update_rect(screen, dest.x, dest.y, dest.w, dest.h);
}
SurfaceSDL::~SurfaceSDL()
}
SurfaceSDL::~SurfaceSDL()
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(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_);
SurfaceSDL* create_SurfaceSDL();
SurfaceOpenGL* create_SurfaceOpenGL();
SurfaceSDL* create_SurfaceSDL();
SurfaceOpenGL* create_SurfaceOpenGL();
- 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
};
class SurfaceSDL : public SurfaceImpl
SurfaceSDL(const std::string& file, int x, int y, int w, int h, int use_alpha);
virtual ~SurfaceSDL();
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
};
class SurfaceOpenGL : public SurfaceImpl
SurfaceOpenGL(const std::string& file, int x, int y, int w, int h, int use_alpha);
virtual ~SurfaceOpenGL();
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);
private:
void create_gl(SDL_Surface * surf, GLuint * tex);