2 /*******************************************************************************
4 Copyright (c) 2009, Charles McGarvey
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
10 * Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *******************************************************************************/
31 #include <SDL/SDL_image.h>
33 #include "Dispatcher.hh"
34 #include "Serializable.hh"
35 #include "Settings.hh"
47 Video::Video(const Attributes
& attribs
)
52 Video::Video(const std::string
& caption
, const std::string
& icon
)
54 if (attribs_
.caption
== "Untitled")
56 attribs_
.caption
= caption
;
58 if (attribs_
.icon
== "")
66 void Video::init(const Attributes
& attribs
)
72 setFull(attribs
.fullscreen
);
73 setResizable(attribs
.resizable
);
74 setOpenGLAttributes();
75 setCaption(attribs
.caption
);
77 setCursorVisible(attribs
.cursorVisible
);
78 setCursorGrab(attribs
.cursorGrab
);
79 setVideoMode(attribs
.mode
);
82 void Video::recreateContext()
84 SDL_FreeSurface(context_
);
86 setVideoMode(attribs_
.mode
);
87 Mf::Dispatcher::getInstance().dispatch("video.context_recreated");
90 void Video::setOpenGLAttributes()
92 SDL_GL_SetAttribute(SDL_GL_RED_SIZE
, attribs_
.colorBuffer
[0]);
93 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE
, attribs_
.colorBuffer
[1]);
94 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE
, attribs_
.colorBuffer
[2]);
95 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE
, attribs_
.colorBuffer
[3]);
96 SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE
, attribs_
.frameBuffer
);
97 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER
, attribs_
.doubleBuffer
);
98 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE
, attribs_
.depthBuffer
);
99 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE
, attribs_
.stencilBuffer
);
100 SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE
, attribs_
.accumBuffer
[0]);
101 SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE
, attribs_
.accumBuffer
[1]);
102 SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE
, attribs_
.accumBuffer
[2]);
103 SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE
, attribs_
.accumBuffer
[3]);
104 SDL_GL_SetAttribute(SDL_GL_STEREO
, attribs_
.stereo
);
105 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS
, attribs_
.multisampleBuffers
);
106 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES
, attribs_
.multisampleSamples
);
107 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL
, attribs_
.swapControl
);
108 SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL
, attribs_
.hardwareonly
);
114 SDL_FreeSurface(context_
);
118 void Video::setVideoMode(const long mode
[3])
120 if (mode
!= attribs_
.mode
|| !context_
)
122 if (context_
) SDL_FreeSurface(context_
);
124 context_
= SDL_SetVideoMode(mode
[0], mode
[1], mode
[2],
125 SDL_OPENGL
| flags_
);
129 attribs_
.mode
[0] = mode
[0];
130 attribs_
.mode
[1] = mode
[1];
131 attribs_
.mode
[2] = mode
[2];
133 else throw Exception(SDL_GetError());
137 Video::Attributes
Video::getAttributes() const
143 void Video::resize(int width
, int height
)
145 long mode
[] = {width
, height
, attribs_
.mode
[2]};
149 bool Video::iconify()
151 return SDL_WM_IconifyWindow();
155 void Video::setCaption(const std::string
& caption
)
157 attribs_
.caption
= caption
;
158 SDL_WM_SetCaption(caption
.c_str(), 0);
161 void Video::setIcon()
163 if (attribs_
.icon
!= "")
165 SDL_Surface
* icon
= IMG_Load(attribs_
.icon
.c_str());
168 SDL_WM_SetIcon(icon
, 0);
169 SDL_FreeSurface(icon
);
174 std::string
Video::getCaption() const
176 return attribs_
.caption
;
180 void Video::setFull(bool full
)
182 if (full
!= isFull() || !context_
)
186 flags_
^= SDL_FULLSCREEN
;
188 #if defined(linux) || defined(__linux) || defined(__linux__)
189 if (SDL_WM_ToggleFullScreen(context_
) == 0)
195 if (full
) flags_
|= SDL_FULLSCREEN
;
196 else flags_
&= ~SDL_FULLSCREEN
;
201 void Video::toggleFull()
206 bool Video::isFull() const
208 return flags_
& SDL_FULLSCREEN
;
212 void Video::setCursorVisible(bool hasCursor
)
214 SDL_ShowCursor(hasCursor
? SDL_ENABLE
: SDL_DISABLE
);
217 void Video::toggleCursorVisible()
219 setCursorVisible(!isCursorVisible());
222 bool Video::isCursorVisible() const
224 return (SDL_ShowCursor(SDL_QUERY
) == SDL_ENABLE
);
228 void Video::setResizable(bool resizable
)
230 if (resizable
!= isResizable() || !context_
)
234 flags_
^= SDL_RESIZABLE
;
239 if (resizable
) flags_
|= SDL_RESIZABLE
;
240 else flags_
&= ~SDL_RESIZABLE
;
245 void Video::toggleResizable()
247 setResizable(!isResizable());
250 bool Video::isResizable() const
252 return flags_
& SDL_RESIZABLE
;
256 bool Video::isCursorGrab() const
258 return (SDL_WM_GrabInput(SDL_GRAB_QUERY
) == SDL_GRAB_ON
);
261 void Video::toggleCursorGrab()
263 setCursorGrab(!isCursorGrab());
266 void Video::setCursorGrab(bool cursorGrab
)
268 SDL_WM_GrabInput(cursorGrab
? SDL_GRAB_ON
: SDL_GRAB_OFF
);
272 void Video::makeActive()
274 // NOP until the day SDL supports more than only one window.
280 SDL_GL_SwapBuffers();
284 Video::Attributes::Attributes()
286 // Set some sane GL and window defaults (see SDL_video.c:217)
300 multisampleBuffers
= 0;
301 multisampleSamples
= 0;
303 hardwareonly
= false;
309 cursorVisible
= true;
312 Settings
& settings
= Settings::getInstance();
314 Serializable::Array colors
;
315 settings
.get("video.colorbuffers", colors
);
316 if (colors
.size() > 0) colors
[0]->get(colorBuffer
[0]);
317 if (colors
.size() > 1) colors
[1]->get(colorBuffer
[1]);
318 if (colors
.size() > 2) colors
[2]->get(colorBuffer
[2]);
319 if (colors
.size() > 3) colors
[3]->get(colorBuffer
[3]);
321 settings
.get("video.framebuffer", frameBuffer
);
322 settings
.get("video.doublebuffer", doubleBuffer
);
323 settings
.get("video.depthbuffer", depthBuffer
);
324 settings
.get("video.stencilbuffer", stencilBuffer
);
326 Serializable::Array accum
;
327 settings
.get("video.accumbuffers", accum
);
328 if (accum
.size() > 0) accum
[0]->get(accumBuffer
[0]);
329 if (accum
.size() > 1) accum
[1]->get(accumBuffer
[1]);
330 if (accum
.size() > 2) accum
[2]->get(accumBuffer
[2]);
331 if (accum
.size() > 3) accum
[3]->get(accumBuffer
[3]);
333 settings
.get("video.stereo", stereo
);
334 settings
.get("video.multiesamplebuffers", multisampleBuffers
);
335 settings
.get("video.multiesamplesamples", multisampleSamples
);
336 settings
.get("video.swapcontrol", swapControl
);
337 settings
.get("video.hardwareonly", hardwareonly
);
339 if (!settings
.get("video.caption", caption
))
341 caption
= "Untitled";
343 settings
.get("video.icon", icon
);
345 Serializable::Array dimensions
;
346 settings
.get("video.mode", dimensions
);
347 if (dimensions
.size() > 0) dimensions
[0]->get(mode
[0]);
348 if (dimensions
.size() > 1) dimensions
[1]->get(mode
[1]);
349 if (dimensions
.size() > 2) dimensions
[2]->get(mode
[2]);
351 settings
.get("video.fullscreen", fullscreen
);
352 settings
.get("video.resizable", resizable
);
353 settings
.get("video.showcursor", cursorVisible
);
354 settings
.get("input.grab", cursorGrab
);
360 /** vim: set ts=4 sw=4 tw=80: *************************************************/