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 = 15;
200 uint16_t resolutions[numRes][2] = {
219 for (uint32_t i = 0; i < numBPP; ++i){
220 for (uint32_t j = 0; j < numFlags; ++j) {
221 for ( uint32_t k = 0; k < numRes; ++k) {
223 if (flags[j] & SDL_FULLSCREEN) {
224 bpp = SDL_VideoModeOK(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]);
227 m_screenModes.push_back(ScreenMode(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]));
233 bpp = SDL_VideoModeOK(resolutions[k][0],resolutions[k][1], bpps[i], flags[j]);
235 m_screenModes.push_back(ScreenMode(0,0, bpps[i], flags[j]));
246 std::sort(m_screenModes.begin(), m_screenModes.end());
247 std::reverse(m_screenModes.begin(), m_screenModes.end());
249 if(SDL_VideoDriverName(buffer, bufferSize) != NULL) {
250 m_driverName = std::string(buffer);
253 m_driverName =
"Unknown";
256 const SDL_VideoInfo* vInfo = SDL_GetVideoInfo();
258 m_hwAvailable = vInfo->hw_available;
259 m_wmAvailable = vInfo->wm_available;
260 m_hwBlitAccel = vInfo->blit_hw;
261 m_hwCCBlitAccel = vInfo->blit_hw_CC;
262 m_hwToHwAlphaBlitAccel = vInfo->blit_hw_A;
263 m_swToHwBlitAccel = vInfo->blit_sw;
264 m_swToHwCCBlistAccel = vInfo->blit_sw_CC;
265 m_swToHwAlphaBlitAccel = vInfo->blit_sw_A;
266 m_BlitFillAccel = vInfo->blit_fill;
267 m_videoMem = vInfo->video_mem;
270 ScreenMode DeviceCaps::getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp,
const std::string& renderer,
bool fs)
const {
272 bool foundMode =
false;
274 bool widthCheck =
false;
275 bool heightCheck =
false;
276 bool bppCheck =
false;
277 bool rendCheck =
false;
278 bool fsCheck =
false;
281 for (uint32_t i = 0; i < m_screenModes.size(); i++) {
282 if (m_screenModes[i].getWidth() == width) {
285 if (m_screenModes[i].getHeight() == height) {
288 if (m_screenModes[i].getBPP() == bpp) {
291 if (m_screenModes[i].isFullScreen() == fs) {
295 if ((m_screenModes[i].isOpenGL() && renderer ==
"OpenGL") || (!m_screenModes[i].isOpenGL() && renderer ==
"SDL")){
300 if (widthCheck && heightCheck && bppCheck && fsCheck && rendCheck) {
301 mode = m_screenModes[i];
308 if (m_screenModes[i].getWidth() == 0 && m_screenModes[i].getHeight() == 0 && bppCheck && fsCheck && rendCheck) {
309 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
315 if (widthCheck && heightCheck && bpp == 0 && fsCheck && rendCheck) {
316 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
321 if (m_screenModes[i].getWidth() == 0 && m_screenModes[i].getHeight() == 0 && bpp == 0 && fsCheck && rendCheck) {
322 mode = ScreenMode(width, height, bpp, m_screenModes[i].getSDLFlags());
336 throw NotSupported(
"Could not find a maching screen mode for the values given!");