-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*******************************************************************************/
+/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+**] All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
#include "Dispatch.hh"
#include "Error.hh"
init();
}
-Video::Video(const std::string& caption, const std::string& icon)
-{
- mAttribs.caption = caption;
- mAttribs.icon = icon;
-
- init();
-}
-
void Video::init()
{
Error error = Backend::getError();
setCursorGrab(mAttribs.cursorGrab);
setVideoMode(mAttribs.mode);
- video = this;
+ if (!gCurrentVideo) makeCurrent();
}
void Video::recreateContext()
void Video::setOpenGLAttributes()
{
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, mAttribs.colorBuffer[0]);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, mAttribs.colorBuffer[1]);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, mAttribs.colorBuffer[2]);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, mAttribs.colorBuffer[3]);
- SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, mAttribs.frameBuffer);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, mAttribs.doubleBuffer);
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, mAttribs.depthBuffer);
- SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, mAttribs.stencilBuffer);
- SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, mAttribs.accumBuffer[0]);
- SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, mAttribs.accumBuffer[1]);
- SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, mAttribs.accumBuffer[2]);
- SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, mAttribs.accumBuffer[3]);
- SDL_GL_SetAttribute(SDL_GL_STEREO, mAttribs.stereo);
- SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, mAttribs.multisampleBuffers);
- SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, mAttribs.multisampleSamples);
- SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, mAttribs.swapControl);
- SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, mAttribs.hardwareOnly);
+ SDL_GL_SetAttribute(SDL_GL_RED_SIZE,
+ mAttribs.colorBuffer[0]);
+ SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,
+ mAttribs.colorBuffer[1]);
+ SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,
+ mAttribs.colorBuffer[2]);
+ SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,
+ mAttribs.colorBuffer[3]);
+ SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,
+ mAttribs.frameBuffer);
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,
+ mAttribs.doubleBuffer);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,
+ mAttribs.depthBuffer);
+ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,
+ mAttribs.stencilBuffer);
+ SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,
+ mAttribs.accumBuffer[0]);
+ SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,
+ mAttribs.accumBuffer[1]);
+ SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,
+ mAttribs.accumBuffer[2]);
+ SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,
+ mAttribs.accumBuffer[3]);
+ SDL_GL_SetAttribute(SDL_GL_STEREO,
+ mAttribs.stereo);
+ SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,
+ mAttribs.multisampleBuffers);
+ SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,
+ mAttribs.multisampleSamples);
+ SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,
+ mAttribs.swapControl);
+ SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,
+ mAttribs.hardwareOnly);
}
{
SDL_FreeSurface(mContext);
- if (video == this) video = 0;
+ if (gCurrentVideo == this) gCurrentVideo = 0;
}
-void Video::setVideoMode(const long mode[3])
+void Video::setVideoMode(const int mode[3])
{
if (mode != mAttribs.mode || !mContext)
{
#if !defined(linux) && !defined(__linux) && !defined(__linux__)
logInfo("video context recreated");
- core.dispatch("video.newcontext");
+ Dispatch::global().dispatch("video.newcontext");
#endif
}
else Error(Error::SDL_VIDEOMODE).raise();
}
}
-Video::Attributes Video::getAttributes() const
+Video::Attributes Video::attributes() const
{
return mAttribs;
}
void Video::resize(int width, int height)
{
- long mode[] = {width, height, mAttribs.mode[2]};
+ int mode[] = {width, height, mAttribs.mode[2]};
setVideoMode(mode);
}
}
+void Video::makeCurrent() const
+{
+ gCurrentVideo = const_cast<Video*>(this);
+}
+
+
Video::Attributes::Attributes()
{
- // set some sane GL and window defaults (see SDL_video.c:217)
- colorBuffer[0] = 3;
- colorBuffer[1] = 3;
- colorBuffer[2] = 2;
- colorBuffer[3] = 0;
- frameBuffer = 0;
- doubleBuffer = true;
- depthBuffer = 16;
- stencilBuffer = 0;
- accumBuffer[0] = 0;
- accumBuffer[1] = 0;
- accumBuffer[2] = 0;
- accumBuffer[3] = 0;
- stereo = false;
- multisampleBuffers = 0;
- multisampleSamples = 0;
- swapControl = false;
- hardwareOnly = false;
- mode[0] = 640;
- mode[1] = 480;
- mode[2] = 0;
- fullscreen = false;
- resizable = false;
- cursorVisible = true;
- cursorGrab = false;
+ init();
+}
+
+Video::Attributes::Attributes(const Settings& settings)
+{
+ init();
- std::vector<long> colors;
+ std::vector<int> colors;
settings.get("colorbuffers", colors);
if (colors.size() > 0) colorBuffer[0] = colors[0];
if (colors.size() > 1) colorBuffer[1] = colors[1];
settings.get("depthbuffer", depthBuffer);
settings.get("stencilbuffer", stencilBuffer);
- std::vector<long> accum;
+ std::vector<int> accum;
settings.get("accumbuffers", accum);
if (accum.size() > 0) accumBuffer[0] = accum[0];
if (accum.size() > 1) accumBuffer[1] = accum[1];
settings.get("showcursor", cursorVisible);
settings.get("grab", cursorGrab);
- std::vector<long> dimensions;
+ std::vector<int> dimensions;
settings.get("videomode", dimensions);
if (dimensions.size() > 1)
{
}
else if (fullscreen && Backend::isInitialized())
{
- SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
+ SDL_Rect** modes = SDL_ListModes(NULL,
+ SDL_FULLSCREEN | SDL_HWSURFACE);
if (modes == (SDL_Rect**)0)
{
}
else if (modes == (SDL_Rect**)-1)
{
- Mf::logWarning("any resolution allowed; choosing default 800x600");
+ Mf::logWarning("any resolution allowed; "
+ "choosing default 800x600");
mode[0] = 800;
mode[1] = 600;
}
if (dimensions.size() > 2) mode[2] = dimensions[2];
}
+void Video::Attributes::init()
+{
+ // set some sane GL and window defaults (see SDL_video.c:217)
+ colorBuffer[0] = 3;
+ colorBuffer[1] = 3;
+ colorBuffer[2] = 2;
+ colorBuffer[3] = 0;
+ frameBuffer = 0;
+ doubleBuffer = true;
+ depthBuffer = 16;
+ stencilBuffer = 0;
+ accumBuffer[0] = 0;
+ accumBuffer[1] = 0;
+ accumBuffer[2] = 0;
+ accumBuffer[3] = 0;
+ stereo = false;
+ multisampleBuffers = 0;
+ multisampleSamples = 0;
+ swapControl = false;
+ hardwareOnly = false;
+ mode[0] = 640;
+ mode[1] = 480;
+ mode[2] = 0;
+ fullscreen = false;
+ resizable = false;
+ cursorVisible = true;
+ cursorGrab = false;
+}
+
-Video* video = 0;
+Video* Video::gCurrentVideo = 0; // most recently instantiated instance
} // namespace Mf
-/** vim: set ts=4 sw=4 tw=80: *************************************************/
-