]> git.jsancho.org Git - lugaru.git/blobdiff - Source/OpenGL_Windows.cpp
License: Update GPLv2+ header to match current FSF recommendation
[lugaru.git] / Source / OpenGL_Windows.cpp
index 433b8d134e55d0b25236cafa21889712b92895e6..6d684ba1d2cbe4e413aebc9264cf924459d2d065 100644 (file)
@@ -3,20 +3,18 @@ Copyright (C) 2003, 2010 - Wolfire Games
 
 This file is part of Lugaru.
 
-Lugaru is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+Lugaru is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
+Lugaru is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-See the GNU General Public License for more details.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 
@@ -65,6 +63,7 @@ extern float slomofreq;
 #include <string.h>
 #include <fstream>
 #include <iostream>
+#include <set>
 #include "gamegl.h"
 #include "MacCompatibility.h"
 #include "Settings.h"
@@ -78,7 +77,7 @@ extern SDL_Window *sdlwindow;
 
 using namespace std;
 
-SDL_Rect **resolutions = NULL;
+set<pair<int,int>> resolutions;
 
 Boolean SetUp ();
 void DoUpdate ();
@@ -128,10 +127,12 @@ static bool lookup_all_glsyms(void)
     return retval;
 }
 
+#ifndef __MINGW32__ // FIXME: Temporary workaround for GL-8
 static void GLAPIENTRY glDeleteTextures_doNothing(GLsizei n, const GLuint *textures)
 {
     // no-op.
 }
+#endif // __MINGW32__
 
 #ifdef MessageBox
 #undef MessageBox
@@ -216,8 +217,9 @@ void initGL()
     }
 }
 
-static void toggleFullscreen()
+void toggleFullscreen()
 {
+    fullscreen = !fullscreen;
     Uint32 flags = SDL_GetWindowFlags(sdlwindow);
     if (flags & SDL_WINDOW_FULLSCREEN) {
         flags &= ~SDL_WINDOW_FULLSCREEN;
@@ -268,8 +270,6 @@ static Point gMidPoint;
 
 Boolean SetUp ()
 {
-    char string[10];
-
     LOGFUNC;
 
     osx = 0;
@@ -280,8 +280,6 @@ Boolean SetUp ()
 
     DefaultSettings();
 
-    const int displayIdx = 0;  // !!! FIXME: other monitors?
-
     if (!SDL_WasInit(SDL_INIT_VIDEO))
         if (SDL_Init(SDL_INIT_VIDEO) == -1) {
             fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
@@ -301,19 +299,19 @@ Boolean SetUp ()
         return false;
     }
 
-    int count = 0;
-    const int nummodes = SDL_GetNumDisplayModes(displayIdx);
-    for (int i = 0; i < nummodes; i++)
-    {
-        SDL_DisplayMode mode;
-        if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1)
-            continue;
-        if ((mode.w < 640) || (mode.h < 480))
-            continue;  // sane lower limit.
-        count++;
+    for (int displayIdx = 0; displayIdx < SDL_GetNumVideoDisplays(); ++displayIdx) {
+        for (int i = 0; i < SDL_GetNumDisplayModes(displayIdx); ++i) {
+            SDL_DisplayMode mode;
+            if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1)
+                continue;
+            if ((mode.w < 640) || (mode.h < 480))
+                continue;  // sane lower limit.
+            pair<int,int> resolution(mode.w, mode.h);
+            resolutions.insert(resolution);
+        }
     }
 
-    if (count == 0) {
+    if (resolutions.empty()) {
         const std::string error = "No suitable video resolutions found.";
         cerr << error << endl;
         SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Lugaru init failed!", error.c_str(), NULL);
@@ -321,45 +319,25 @@ Boolean SetUp ()
         return false;
     }
 
-    static SDL_Rect *resolutions_block = NULL;
-    resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
-    resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
-    if ((resolutions_block == NULL) || (resolutions == NULL)) {
-        SDL_Quit();
-        fprintf(stderr, "Out of memory!\n");
-        return false;
-    }
-
-    resolutions[count--] = NULL;
-    for (int i = 0; count >= 0; i++, count--) {
-        /* FIXME - Pretty sure this should use nummodes and not count */
-        SDL_DisplayMode mode;
-        if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1)
-            continue;
-        if ((mode.w < 640) || (mode.h < 480))
-            continue;  // sane lower limit.
-        resolutions_block[count].x = resolutions_block[count].y = 0;
-        resolutions_block[count].w = mode.w;
-        resolutions_block[count].h = mode.h;
-        resolutions[count] = &resolutions_block[count];
-    }
-
     if (cmdline("showresolutions")) {
-        printf("Resolutions we think are okay:\n");
-        for (int i = 0; resolutions[i]; i++)
-            printf("  %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
+        printf("Available resolutions:\n");
+        for (auto resolution = resolutions.begin(); resolution != resolutions.end(); resolution++) {
+            printf("  %d x %d\n", (int) resolution->first, (int) resolution->second);
+        }
     }
 
     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
     SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
 
     Uint32 sdlflags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
-    if (!cmdline("windowed"))
+    if ((fullscreen || cmdline("fullscreen")) && !cmdline("windowed")) {
+        fullscreen = 1;
         sdlflags |= SDL_WINDOW_FULLSCREEN;
+    }
     if (!cmdline("nomousegrab"))
         sdlflags |= SDL_WINDOW_INPUT_GRABBED;
 
-    sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx),
+    sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0),
                                  kContextWidth, kContextHeight, sdlflags);
 
     if (!sdlwindow) {
@@ -367,13 +345,13 @@ Boolean SetUp ()
         fprintf(stderr, "forcing 640x480...\n");
         kContextWidth = 640;
         kContextHeight = 480;
-        sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx),
+        sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0),
                                      kContextWidth, kContextHeight, sdlflags);
         if (!sdlwindow) {
             fprintf(stderr, "SDL_CreateWindow() failed: %s\n", SDL_GetError());
             fprintf(stderr, "forcing 640x480 windowed mode...\n");
             sdlflags &= ~SDL_WINDOW_FULLSCREEN;
-            sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx),
+            sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0),
                                          kContextWidth, kContextHeight, sdlflags);
 
             if (!sdlwindow) {
@@ -426,6 +404,12 @@ Boolean SetUp ()
     newscreenwidth = screenwidth;
     newscreenheight = screenheight;
 
+    /* If saved resolution is not in the list, add it to the list (so that it’s selectable in the options) */
+    pair<int,int> startresolution(width,height);
+    if (resolutions.find(startresolution) == resolutions.end()) {
+        resolutions.insert(startresolution);
+    }
+
     InitGame();
 
     return true;
@@ -655,7 +639,6 @@ char *calcBaseDir(const char *argv0)
     char *retval;
     char *envr;
 
-    const char *ptr = strrchr((char *)argv0, '/');
     if (strchr(argv0, '/')) {
         retval = strdup(argv0);
         if (retval)
@@ -880,7 +863,6 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
     png_infop info_ptr = NULL;
     png_uint_32 width, height;
     int bit_depth, color_type, interlace_type;
-    png_byte **rows = NULL;
     bool retval = false;
     png_byte **row_pointers = NULL;
     FILE *fp = fopen(file_name, "rb");
@@ -926,7 +908,7 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
         png_byte *dst = tex.data;
         for (int i = height - 1; i >= 0; i--) {
             png_byte *src = row_pointers[i];
-            for (int j = 0; j < width; j++) {
+            for (unsigned j = 0; j < width; j++) {
                 dst[0] = src[0];
                 dst[1] = src[1];
                 dst[2] = src[2];