X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FVideo.cc;h=62addb406dc804b7a31644ef586b3a43b3dd1dce;hp=8de161aa085daca5f087500869eb4067f329b34d;hb=4f9eb9259092994de9690cf12f11437c35a6791e;hpb=a4debfe4a5f5d339410788971b698ba00cb7f09c diff --git a/src/Moof/Video.cc b/src/Moof/Video.cc index 8de161a..62addb4 100644 --- a/src/Moof/Video.cc +++ b/src/Moof/Video.cc @@ -26,11 +26,9 @@ *******************************************************************************/ -#include - -#include - -#include "Dispatcher.hh" +#include "Dispatch.hh" +#include "Error.hh" +#include "Image.hh" #include "Log.hh" #include "Settings.hh" #include "Video.hh" @@ -41,7 +39,7 @@ namespace Mf { Video::Video() { - init(attribs_); + init(mAttribs); } Video::Video(const Attributes& attribs) @@ -51,23 +49,23 @@ Video::Video(const Attributes& attribs) Video::Video(const std::string& caption, const std::string& icon) { - if (attribs_.caption == "Untitled") + if (mAttribs.caption == "Untitled") { - attribs_.caption = caption; + mAttribs.caption = caption; } - if (attribs_.icon == "") + if (mAttribs.icon == "") { - attribs_.icon = icon; + mAttribs.icon = icon; } - init(attribs_); + init(mAttribs); } void Video::init(const Attributes& attribs) { - context_ = 0; - flags_ = 0; - attribs_ = attribs; + mContext = 0; + mFlags = 0; + mAttribs = attribs; setFull(attribs.fullscreen); setResizable(attribs.resizable); @@ -77,79 +75,80 @@ void Video::init(const Attributes& attribs) setCursorVisible(attribs.cursorVisible); setCursorGrab(attribs.cursorGrab); setVideoMode(attribs.mode); + + video = this; } void Video::recreateContext() { - SDL_FreeSurface(context_); - context_ = 0; - setVideoMode(attribs_.mode); + SDL_FreeSurface(mContext); + mContext = 0; + setVideoMode(mAttribs.mode); } void Video::setOpenGLAttributes() { - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, attribs_.colorBuffer[0]); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, attribs_.colorBuffer[1]); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, attribs_.colorBuffer[2]); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, attribs_.colorBuffer[3]); - SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, attribs_.frameBuffer); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, attribs_.doubleBuffer); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, attribs_.depthBuffer); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, attribs_.stencilBuffer); - SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, attribs_.accumBuffer[0]); - SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, attribs_.accumBuffer[1]); - SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, attribs_.accumBuffer[2]); - SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, attribs_.accumBuffer[3]); - SDL_GL_SetAttribute(SDL_GL_STEREO, attribs_.stereo); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, attribs_.multisampleBuffers); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, attribs_.multisampleSamples); - SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, attribs_.swapControl); - SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, attribs_.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); } Video::~Video() { - SDL_FreeSurface(context_); + SDL_FreeSurface(mContext); + + if (video == this) video = 0; } void Video::setVideoMode(const long mode[3]) { - if (mode != attribs_.mode || !context_) + if (mode != mAttribs.mode || !mContext) { - if (context_) SDL_FreeSurface(context_); + if (mContext) SDL_FreeSurface(mContext); - context_ = SDL_SetVideoMode(mode[0], mode[1], mode[2], - SDL_OPENGL | flags_); + mContext = SDL_SetVideoMode(mode[0], mode[1], mode[2], + SDL_OPENGL | mFlags); - if (context_) + if (mContext) { - attribs_.mode[0] = mode[0]; - attribs_.mode[1] = mode[1]; - attribs_.mode[2] = mode[2]; - -#if defined(_WIN32) || defined (_WIN64) || defined(__WIN32__) - // on win32, creating a new context via SDL_SetVideoMode will wipe - // out the GL state, so we gotta notify everyone to reload their - // state after the change - Mf::dispatcher::dispatch("video.context_recreated"); + mAttribs.mode[0] = mode[0]; + mAttribs.mode[1] = mode[1]; + mAttribs.mode[2] = mode[2]; + +#if !defined(linux) && !defined(__linux) && !defined(__linux__) logInfo("video context recreated"); + core.dispatch("video.newcontext"); #endif } - else throw Exception(Exception::SDL_ERROR); + else Error(Error::SDL_VIDEOMODE).raise(); } } Video::Attributes Video::getAttributes() const { - return attribs_; + return mAttribs; } void Video::resize(int width, int height) { - long mode[] = {width, height, attribs_.mode[2]}; + long mode[] = {width, height, mAttribs.mode[2]}; setVideoMode(mode); } @@ -161,46 +160,47 @@ bool Video::iconify() void Video::setCaption(const std::string& caption) { - attribs_.caption = caption; + mAttribs.caption = caption; SDL_WM_SetCaption(caption.c_str(), 0); } void Video::setIcon() { - if (attribs_.icon != "") + if (mAttribs.icon != "") { - SDL_Surface* icon = IMG_Load(attribs_.icon.c_str()); - if (icon) - { - SDL_WM_SetIcon(icon, 0); - SDL_FreeSurface(icon); - } + Image icon(mAttribs.icon); + icon.setAsIcon(); } } std::string Video::getCaption() const { - return attribs_.caption; + return mAttribs.caption; +} + +const std::string& Video::getIcon() const +{ + return mAttribs.icon; } void Video::setFull(bool full) { - if (full != isFull() || !context_) + if (full != isFull() || !mContext) { - if (context_) + if (mContext) { - flags_ ^= SDL_FULLSCREEN; + mFlags ^= SDL_FULLSCREEN; #if defined(linux) || defined(__linux) || defined(__linux__) - if (SDL_WM_ToggleFullScreen(context_) == 0) + if (SDL_WM_ToggleFullScreen(mContext) == 0) #endif recreateContext(); } else { - if (full) flags_ |= SDL_FULLSCREEN; - else flags_ &= ~SDL_FULLSCREEN; + if (full) mFlags |= SDL_FULLSCREEN; + else mFlags &= ~SDL_FULLSCREEN; } } } @@ -212,7 +212,7 @@ void Video::toggleFull() bool Video::isFull() const { - return flags_ & SDL_FULLSCREEN; + return mFlags & SDL_FULLSCREEN; } @@ -234,17 +234,17 @@ bool Video::isCursorVisible() const void Video::setResizable(bool resizable) { - if (resizable != isResizable() || !context_) + if (resizable != isResizable() || !mContext) { - if (context_) + if (mContext) { - flags_ ^= SDL_RESIZABLE; + mFlags ^= SDL_RESIZABLE; recreateContext(); } else { - if (resizable) flags_ |= SDL_RESIZABLE; - else flags_ &= ~SDL_RESIZABLE; + if (resizable) mFlags |= SDL_RESIZABLE; + else mFlags &= ~SDL_RESIZABLE; } } } @@ -256,7 +256,7 @@ void Video::toggleResizable() bool Video::isResizable() const { - return flags_ & SDL_RESIZABLE; + return mFlags & SDL_RESIZABLE; } @@ -276,12 +276,6 @@ void Video::setCursorGrab(bool cursorGrab) } -void Video::makeActive() -{ - // NOP until the day SDL supports more than only one window. - // Still waiting... -} - void Video::swap() { SDL_GL_SwapBuffers(); @@ -290,18 +284,18 @@ void Video::swap() int Video::getWidth() const { - return context_->w; + return mContext->w; } int Video::getHeight() const { - return context_->h; + return mContext->h; } Video::Attributes::Attributes() { - // Set some sane GL and window defaults (see SDL_video.c:217) + // set some sane GL and window defaults (see SDL_video.c:217) colorBuffer[0] = 3; colorBuffer[1] = 3; colorBuffer[2] = 2; @@ -327,8 +321,6 @@ Video::Attributes::Attributes() cursorVisible = true; cursorGrab = false; - Settings& settings = Settings::getInstance(); - std::vector colors; settings.get("colorbuffers", colors); if (colors.size() > 0) colorBuffer[0] = colors[0]; @@ -360,6 +352,11 @@ Video::Attributes::Attributes() } settings.get("icon", icon); + settings.get("fullscreen", fullscreen); + settings.get("resizable", resizable); + settings.get("showcursor", cursorVisible); + settings.get("grab", cursorGrab); + std::vector dimensions; settings.get("videomode", dimensions); if (dimensions.size() > 1) @@ -367,15 +364,35 @@ Video::Attributes::Attributes() mode[0] = dimensions[0]; mode[1] = dimensions[1]; } - if (dimensions.size() > 2) mode[2] = dimensions[2]; + else if (fullscreen) + { + SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); - settings.get("fullscreen", fullscreen); - settings.get("resizable", resizable); - settings.get("showcursor", cursorVisible); - settings.get("grab", cursorGrab); + if (modes == (SDL_Rect**)0) + { + Mf::logError("no native video mode"); + } + else if (modes == (SDL_Rect**)-1) + { + Mf::logWarning("any resolution allowed; choosing default 800x600"); + mode[0] = 800; + mode[1] = 600; + } + else + { + mode[0] = (*modes)->w; + mode[1] = (*modes)->h; + Mf::logInfo << "choosing native resolution " + << mode[0] << "x" << mode[1] << std::endl; + } + } + if (dimensions.size() > 2) mode[2] = dimensions[2]; } +Video* video = 0; + + } // namespace Mf /** vim: set ts=4 sw=4 tw=80: *************************************************/