summaryrefslogtreecommitdiff
path: root/src/graphics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics.cpp')
-rw-r--r--src/graphics.cpp129
1 files changed, 101 insertions, 28 deletions
diff --git a/src/graphics.cpp b/src/graphics.cpp
index 93448c7c..0ee2371d 100644
--- a/src/graphics.cpp
+++ b/src/graphics.cpp
@@ -29,50 +29,130 @@
extern volatile int framesToDraw;
-Graphics::Graphics(SDL_Surface *screen):
- mScreen(screen)
+Graphics::Graphics():
+ mScreen(0)
{
+}
+
+Graphics::~Graphics()
+{
+ _endDraw();
+}
+
+bool Graphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel)
+{
+ int displayFlags = SDL_ANYFORMAT;
+
+ mFullscreen = fs;
+ mHWAccel = hwaccel;
+
+ if (fs) {
+ displayFlags |= SDL_FULLSCREEN;
+ }
+
+#ifdef USE_OPENGL
if (useOpenGL) {
+ displayFlags |= SDL_OPENGL;
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ } else
+#endif
+ {
+ if (hwaccel) {
+ displayFlags |= SDL_HWSURFACE | SDL_DOUBLEBUF;
+ } else {
+ displayFlags |= SDL_SWSURFACE;
+ }
+ }
+
+ mScreen = SDL_SetVideoMode(w, h, bpp, displayFlags);
+
+ if (!mScreen) {
+ return false;
+ }
+
+ char videoDriverName[64];
+
+ if (SDL_VideoDriverName(videoDriverName, 64)) {
+ logger->log("Using video driver: %s", videoDriverName);
+ }
+ else {
+ logger->log("Using video driver: unkown");
+ }
+
+ const SDL_VideoInfo *vi = SDL_GetVideoInfo();
+
+ logger->log("Possible to create hardware surfaces: %s",
+ ((vi->hw_available) ? "yes" : "no"));
+ logger->log("Window manager available: %s",
+ ((vi->wm_available) ? "yes" : "no"));
+ logger->log("Accelerated hardware to hardware blits: %s",
+ ((vi->blit_hw) ? "yes" : "no"));
+ logger->log("Accelerated hardware to hardware colorkey blits: %s",
+ ((vi->blit_hw_CC) ? "yes" : "no"));
+ logger->log("Accelerated hardware to hardware alpha blits: %s",
+ ((vi->blit_hw_A) ? "yes" : "no"));
+ logger->log("Accelerated software to hardware blits: %s",
+ ((vi->blit_sw) ? "yes" : "no"));
+ logger->log("Accelerated software to hardware colorkey blits: %s",
+ ((vi->blit_sw_CC) ? "yes" : "no"));
+ logger->log("Accelerated software to hardware alpha blits: %s",
+ ((vi->blit_sw_A) ? "yes" : "no"));
+ logger->log("Accelerated color fills: %s",
+ ((vi->blit_fill) ? "yes" : "no"));
+ logger->log("Available video memory: %d", vi->video_mem);
+
#ifdef USE_OPENGL
+ if (useOpenGL) {
// Setup OpenGL
- glViewport(0, 0, 800, 600);
+ glViewport(0, 0, w, h);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
int gotDoubleBuffer;
SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &gotDoubleBuffer);
logger->log("Using OpenGL %s double buffering.",
(gotDoubleBuffer ? "with" : "without"));
- setTargetPlane(800, 600);
+ setTargetPlane(w, h);
+ } else
#endif
- }
- else {
+ {
setTarget(mScreen);
}
- // Initialize for drawing
- if (!useOpenGL) {
- gcn::SDLGraphics::_beginDraw();
+ return true;
+}
+
+bool Graphics::setFullscreen(bool fs)
+{
+ if (mFullscreen == fs) {
+ return true;
}
+
+ return setVideoMode(mScreen->w, mScreen->h,
+ mScreen->format->BitsPerPixel, fs, mHWAccel);
+}
+
+void Graphics::_beginDraw()
+{
#ifdef USE_OPENGL
- else {
+ if (useOpenGL) {
gcn::OpenGLGraphics::_beginDraw();
- }
+ } else
#endif
- //_beginDraw();
+ {
+ gcn::SDLGraphics::_beginDraw();
+ }
}
-Graphics::~Graphics()
+void Graphics::_endDraw()
{
- // Deinitialize for drawing
- if (!useOpenGL) {
- gcn::SDLGraphics::_endDraw();
- }
#ifdef USE_OPENGL
- else {
+ if (useOpenGL) {
gcn::OpenGLGraphics::_endDraw();
- }
+ } else
#endif
- //_endDraw();
+ {
+ gcn::SDLGraphics::_endDraw();
+ }
}
void Graphics::setFont(gcn::ImageFont *font)
@@ -88,9 +168,7 @@ void Graphics::setFont(gcn::ImageFont *font)
}
void Graphics::drawText(const std::string &text,
- int x,
- int y,
- unsigned int alignment)
+ int x, int y, unsigned int alignment)
{
if (!useOpenGL) {
gcn::SDLGraphics::drawText(text, x, y, alignment);
@@ -223,8 +301,3 @@ void Graphics::updateScreen()
SDL_Delay(10);
}
}
-
-void Graphics::setScreen(SDL_Surface *screen)
-{
- mScreen = screen;
-}