28 #include <SDL_video.h>
34 #include "util/base/exception.h"
36 #include "devicecaps.h"
40 ScreenMode::ScreenMode() :
41 m_width(0), m_height(0), m_bpp(0), m_SDLFlags(0){
44 ScreenMode::ScreenMode(uint16_t width, uint16_t height, uint16_t bpp, uint32_t SDLFlags) :
45 m_width(width), m_height(height), m_bpp(bpp), m_SDLFlags(SDLFlags){
48 ScreenMode::ScreenMode(
const ScreenMode& rhs){
49 m_width = rhs.getWidth();
50 m_height = rhs.getHeight();
52 m_SDLFlags = rhs.getSDLFlags();
55 bool ScreenMode::operator <(
const ScreenMode& rhs)
const {
58 if (!isFullScreen() && rhs.isFullScreen()){
61 else if (isFullScreen() && !rhs.isFullScreen()){
66 if (m_bpp < rhs.getBPP()){
69 else if (m_bpp > rhs.getBPP()){
74 if (m_width == rhs.getWidth() && m_height == rhs.getHeight()){
75 if (!(m_SDLFlags & SDL_HWSURFACE) && (rhs.getSDLFlags() & SDL_HWSURFACE)) {
83 else if (m_width < rhs.getWidth() || m_height < rhs.getHeight()) {
90 DeviceCaps::DeviceCaps() :
91 m_driverName(
"Invalid"),
95 m_hwCCBlitAccel(false),
96 m_hwToHwAlphaBlitAccel(false),
97 m_swToHwBlitAccel(false),
98 m_swToHwCCBlistAccel(false),
99 m_swToHwAlphaBlitAccel(false),
100 m_BlitFillAccel(false),
103 fillAvailableDrivers();
107 DeviceCaps::~DeviceCaps() {
110 void DeviceCaps::reset() {
111 m_screenModes.clear();
112 m_driverName =
"Invalid";
113 m_hwAvailable =
false;
114 m_wmAvailable =
false;
115 m_hwBlitAccel =
false;
116 m_hwCCBlitAccel =
false;
117 m_hwToHwAlphaBlitAccel =
false;
118 m_swToHwBlitAccel =
false;
119 m_swToHwCCBlistAccel =
false;
120 m_swToHwAlphaBlitAccel =
false;
121 m_BlitFillAccel =
false;
126 void DeviceCaps::fillAvailableDrivers() {
127 m_availableDrivers.clear();
128 #if defined( __unix__ )
129 m_availableDrivers.push_back(
"x11");
130 m_availableDrivers.push_back(
"nanox");
131 m_availableDrivers.push_back(
"qtopia");
132 m_availableDrivers.push_back(
"fbcon");
133 m_availableDrivers.push_back(
"directfb");
134 m_availableDrivers.push_back(
"svgalib");
139 m_availableDrivers.push_back(
"directx");
140 m_availableDrivers.push_back(
"windib");
144 #if defined( __APPLE_CC__ )
145 m_availableDrivers.push_back(
"Quartz");
146 m_availableDrivers.push_back(
"x11");
150 void DeviceCaps::fillDeviceCaps() {
152 const uint32_t bufferSize = 256;
153 char buffer[bufferSize];
160 const uint32_t numFlags = 6;
161 uint32_t flags[numFlags];
164 flags[0] = ScreenMode::HW_WINDOWED_OPENGL;
166 flags[1] = ScreenMode::HW_FULLSCREEN_OPENGL;
168 flags[2] = ScreenMode::WINDOWED_SDL;
170 flags[3] = ScreenMode::WINDOWED_SDL_DB_HW;
172 flags[4] = ScreenMode::FULLSCREEN_SDL;
174 flags[5] = ScreenMode::FULLSCREEN_SDL_DB_HW;
177 const uint32_tnumFlags = 4;
178 uint32_t flags[numFlags];
181 flags[0] = ScreenMode::WINDOWED_SDL;
183 flags[1] = ScreenMode::WINDOWED_SDL_DB_HW;
185 flags[2] = ScreenMode::FULLSCREEN_SDL;
187 flags[3] = ScreenMode::FULLSCREEN_SDL_DB_HW;
191 const uint32_t numBPP = 3;
192 uint16_t bpps[numBPP];
199 const uint32_t numRes = 16;
200 uint16_t resolutions[numRes][2] = {
220 for (uint32_t i = 0; i < numBPP; ++i){
221 for (uint32_t j = 0; j < numFlags; ++j) {
222 for ( uint32_t k = 0; k < numRes; ++k) {
224 if (flags[j] & SDL_FULLSCREEN) {
225 bpp = SDL_VideoModeOK(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]);
228 m_screenModes.push_back(ScreenMode(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]));
234 bpp = SDL_VideoModeOK(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]);
236 m_screenModes.push_back(ScreenMode(0,0, bpps[i], flags[j]));
247 std::sort(m_screenModes.begin(), m_screenModes.end());
248 std::reverse(m_screenModes.begin(), m_screenModes.end());
250 if(SDL_VideoDriverName(buffer, bufferSize) != NULL) {
251 m_driverName = std::string(buffer);
254 m_driverName =
"Unknown";
257 const SDL_VideoInfo* vInfo = SDL_GetVideoInfo();
259 m_hwAvailable = vInfo->hw_available;
260 m_wmAvailable = vInfo->wm_available;
261 m_hwBlitAccel = vInfo->blit_hw;
262 m_hwCCBlitAccel = vInfo->blit_hw_CC;
263 m_hwToHwAlphaBlitAccel = vInfo->blit_hw_A;
264 m_swToHwBlitAccel = vInfo->blit_sw;
265 m_swToHwCCBlistAccel = vInfo->blit_sw_CC;
266 m_swToHwAlphaBlitAccel = vInfo->blit_sw_A;
267 m_BlitFillAccel = vInfo->blit_fill;
268 m_videoMem = vInfo->video_mem;
271 ScreenMode DeviceCaps::getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp,
const std::string& renderer,
bool fs)
const {
273 bool foundMode =
false;
275 bool widthCheck =
false;
276 bool heightCheck =
false;
277 bool bppCheck =
false;
278 bool rendCheck =
false;
279 bool fsCheck =
false;
282 for (uint32_t i = 0; i < m_screenModes.size(); i++) {
283 if (m_screenModes[i].getWidth() == width) {
286 if (m_screenModes[i].getHeight() == height) {
289 if (m_screenModes[i].getBPP() == bpp) {
292 if (m_screenModes[i].isFullScreen() == fs) {
296 if ((m_screenModes[i].isOpenGL() && (renderer ==
"OpenGL" || renderer ==
"OpenGLe")) || (!m_screenModes[i].isOpenGL() && renderer ==
"SDL")){
301 if (widthCheck && heightCheck && bppCheck && fsCheck && rendCheck) {
302 mode = m_screenModes[i];
309 if (m_screenModes[i].getWidth() == 0 && m_screenModes[i].getHeight() == 0 && bppCheck && fsCheck && rendCheck) {
310 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
316 if (widthCheck && heightCheck && bpp == 0 && fsCheck && rendCheck) {
317 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
322 if (m_screenModes[i].getWidth() == 0 && m_screenModes[i].getHeight() == 0 && bpp == 0 && fsCheck && rendCheck) {
323 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
337 throw NotSupported(
"Could not find a maching screen mode for the values given!");
credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the qua...