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"
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
);
89 void Video::setOpenGLAttributes()
91 SDL_GL_SetAttribute(SDL_GL_RED_SIZE
, attribs_
.colorBuffer
[0]);
92 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE
, attribs_
.colorBuffer
[1]);
93 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE
, attribs_
.colorBuffer
[2]);
94 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE
, attribs_
.colorBuffer
[3]);
95 SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE
, attribs_
.frameBuffer
);
96 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER
, attribs_
.doubleBuffer
);
97 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE
, attribs_
.depthBuffer
);
98 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE
, attribs_
.stencilBuffer
);
99 SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE
, attribs_
.accumBuffer
[0]);
100 SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE
, attribs_
.accumBuffer
[1]);
101 SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE
, attribs_
.accumBuffer
[2]);
102 SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE
, attribs_
.accumBuffer
[3]);
103 SDL_GL_SetAttribute(SDL_GL_STEREO
, attribs_
.stereo
);
104 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS
, attribs_
.multisampleBuffers
);
105 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES
, attribs_
.multisampleSamples
);
106 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL
, attribs_
.swapControl
);
107 SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL
, attribs_
.hardwareonly
);
113 SDL_FreeSurface(context_
);
117 void Video::setVideoMode(const long mode
[3])
119 if (mode
!= attribs_
.mode
|| !context_
)
121 if (context_
) SDL_FreeSurface(context_
);
123 context_
= SDL_SetVideoMode(mode
[0], mode
[1], mode
[2],
124 SDL_OPENGL
| flags_
);
128 attribs_
.mode
[0] = mode
[0];
129 attribs_
.mode
[1] = mode
[1];
130 attribs_
.mode
[2] = mode
[2];
132 #if defined(_WIN32) || defined (_WIN64) || defined(__WIN32__)
133 // on win32, creating a new context via SDL_SetVideoMode will wipe
134 // out the GL state, so we gotta notify everyone to reload their
135 // state after the change
136 Mf::dispatcher::dispatch("video.context_recreated");
137 logInfo("video context recreated");
140 else throw Exception(Exception::SDL_ERROR
);
144 Video::Attributes
Video::getAttributes() const
150 void Video::resize(int width
, int height
)
152 long mode
[] = {width
, height
, attribs_
.mode
[2]};
156 bool Video::iconify()
158 return SDL_WM_IconifyWindow();
162 void Video::setCaption(const std::string
& caption
)
164 attribs_
.caption
= caption
;
165 SDL_WM_SetCaption(caption
.c_str(), 0);
168 void Video::setIcon()
170 if (attribs_
.icon
!= "")
172 SDL_Surface
* icon
= IMG_Load(attribs_
.icon
.c_str());
175 SDL_WM_SetIcon(icon
, 0);
176 SDL_FreeSurface(icon
);
181 std::string
Video::getCaption() const
183 return attribs_
.caption
;
187 void Video::setFull(bool full
)
189 if (full
!= isFull() || !context_
)
193 flags_
^= SDL_FULLSCREEN
;
195 #if defined(linux) || defined(__linux) || defined(__linux__)
196 if (SDL_WM_ToggleFullScreen(context_
) == 0)
202 if (full
) flags_
|= SDL_FULLSCREEN
;
203 else flags_
&= ~SDL_FULLSCREEN
;
208 void Video::toggleFull()
213 bool Video::isFull() const
215 return flags_
& SDL_FULLSCREEN
;
219 void Video::setCursorVisible(bool hasCursor
)
221 SDL_ShowCursor(hasCursor
? SDL_ENABLE
: SDL_DISABLE
);
224 void Video::toggleCursorVisible()
226 setCursorVisible(!isCursorVisible());
229 bool Video::isCursorVisible() const
231 return (SDL_ShowCursor(SDL_QUERY
) == SDL_ENABLE
);
235 void Video::setResizable(bool resizable
)
237 if (resizable
!= isResizable() || !context_
)
241 flags_
^= SDL_RESIZABLE
;
246 if (resizable
) flags_
|= SDL_RESIZABLE
;
247 else flags_
&= ~SDL_RESIZABLE
;
252 void Video::toggleResizable()
254 setResizable(!isResizable());
257 bool Video::isResizable() const
259 return flags_
& SDL_RESIZABLE
;
263 bool Video::isCursorGrab() const
265 return (SDL_WM_GrabInput(SDL_GRAB_QUERY
) == SDL_GRAB_ON
);
268 void Video::toggleCursorGrab()
270 setCursorGrab(!isCursorGrab());
273 void Video::setCursorGrab(bool cursorGrab
)
275 SDL_WM_GrabInput(cursorGrab
? SDL_GRAB_ON
: SDL_GRAB_OFF
);
279 void Video::makeActive()
281 // NOP until the day SDL supports more than only one window.
287 SDL_GL_SwapBuffers();
291 Video::Attributes::Attributes()
293 // Set some sane GL and window defaults (see SDL_video.c:217)
307 multisampleBuffers
= 0;
308 multisampleSamples
= 0;
310 hardwareonly
= false;
316 cursorVisible
= true;
319 Settings
& settings
= Settings::getInstance();
321 std::vector
<long> colors
;
322 settings
.get("colorbuffers", colors
);
323 if (colors
.size() > 0) colorBuffer
[0] = colors
[0];
324 if (colors
.size() > 1) colorBuffer
[1] = colors
[1];
325 if (colors
.size() > 2) colorBuffer
[2] = colors
[2];
326 if (colors
.size() > 3) colorBuffer
[3] = colors
[3];
328 settings
.get("framebuffer", frameBuffer
);
329 settings
.get("doublebuffer", doubleBuffer
);
330 settings
.get("depthbuffer", depthBuffer
);
331 settings
.get("stencilbuffer", stencilBuffer
);
333 std::vector
<long> accum
;
334 settings
.get("accumbuffers", accum
);
335 if (accum
.size() > 0) accumBuffer
[0] = accum
[0];
336 if (accum
.size() > 1) accumBuffer
[1] = accum
[1];
337 if (accum
.size() > 2) accumBuffer
[2] = accum
[2];
338 if (accum
.size() > 3) accumBuffer
[3] = accum
[3];
340 settings
.get("stereo", stereo
);
341 settings
.get("multiesamplebuffers", multisampleBuffers
);
342 settings
.get("multiesamplesamples", multisampleSamples
);
343 settings
.get("swapcontrol", swapControl
);
344 settings
.get("hardwareonly", hardwareonly
);
346 if (!settings
.get("caption", caption
))
348 caption
= "Untitled";
350 settings
.get("icon", icon
);
352 std::vector
<long> dimensions
;
353 settings
.get("videomode", dimensions
);
354 if (dimensions
.size() > 1)
356 mode
[0] = dimensions
[0];
357 mode
[1] = dimensions
[1];
359 if (dimensions
.size() > 2) mode
[2] = dimensions
[2];
361 settings
.get("fullscreen", fullscreen
);
362 settings
.get("resizable", resizable
);
363 settings
.get("showcursor", cursorVisible
);
364 settings
.get("grab", cursorGrab
);
370 /** vim: set ts=4 sw=4 tw=80: *************************************************/