changeset 578:cf5d44b36851

Add some initial code for video setup screen.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 12 Apr 2013 04:44:25 +0300
parents 742a05f64929
children f87446a81887
files dmengine.h dmsimple.c
diffstat 2 files changed, 150 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/dmengine.h	Wed Apr 10 11:59:02 2013 +0300
+++ b/dmengine.h	Fri Apr 12 04:44:25 2013 +0300
@@ -211,7 +211,11 @@
     SDL_Surface *screen;
     SDL_Event event;
     SDL_AudioSpec optAfmt;
-    int optScrWidth, optScrHeight, optVFlags, optBitDepth, optResFlags;
+
+    int optScrWidth, optScrHeight,
+        optScrDepth, optVFlags, optScrAspect;
+
+    int optResFlags;
     char *optDataPath, *optPackFilename;
 
 #ifdef DM_USE_JSS
--- a/dmsimple.c	Wed Apr 10 11:59:02 2013 +0300
+++ b/dmsimple.c	Fri Apr 12 04:44:25 2013 +0300
@@ -114,8 +114,9 @@
 
 static int engineLoadResources()
 {
-    int err, loaded, total;
-    
+    int err, loaded = 0, total = 0;
+
+    // First preload outside of the loop
     err = dmres_preload(engine.resources, TRUE, &loaded, &total);
 
     while ((err = dmres_preload(engine.resources, FALSE, &loaded, &total)) == DMERR_PROGRESS)
@@ -132,23 +133,154 @@
 }
 
 
-static BOOL engineInitializeVideo()
+static BOOL engineGenInitializeVideo(int width, int height, int depth, Uint32 flags)
 {
     dmPrint(1, "Initializing SDL video %d x %d x %dbpp, flags=0x%08x\n",
-        engine.optScrWidth, engine.optScrHeight, engine.optBitDepth, engine.optVFlags);
+        width, height, depth, flags);
 
     SDL_FreeSurface(engine.screen);
 
-    engine.screen = SDL_SetVideoMode(engine.optScrWidth, engine.optScrHeight, engine.optBitDepth, engine.optVFlags);
+    engine.screen = SDL_SetVideoMode(width, height, depth, flags);
     if (engine.screen == NULL)
     {
         dmError("Can't SDL_SetVideoMode(): %s\n", SDL_GetError());
         return FALSE;
     }
+
+    SDL_ShowCursor(SDL_DISABLE);
+    SDL_WM_SetCaption(dmProgDesc, dmProgName);
+
     return TRUE;
 }
 
 
+static BOOL engineInitializeVideo(int width, int height, int depth, Uint32 flags)
+{
+    return engineInitializeVideo(engine.optScrWidth, engine.optScrHeight,
+        engine.optScrDepth, engine.optVFlags);
+}
+
+
+int engineVideoSetup()
+{
+    DMBitmapFont *font = NULL;
+    DMResource *file = NULL;
+    SDL_Surface *menuBgImage = NULL;
+    int menuState = -1, nmenuList;
+    DMScaledBlitFunc menuBgBlit;
+
+    // Compute a list of valid modes
+
+
+    // Open video temporarily
+    if (!engineGenInitializeVideo(DM_VIDEO_SETUP_WIDTH, DM_VIDEO_SETUP_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF))
+        goto out;
+
+    // Fetch and decompress setup image, try regular resources first
+    file = dmf_open(engine.resources, "SetupImage.png");
+    if (file == NULL)
+        file = dmf_create_memio(NULL, "SetupImage", engineSetupImage, sizeof(engineSetupImage));
+
+    menuBgImage = dmLoadImageBitmapFont(file);
+    dmf_close(file);
+    if (menuBgImage == NULL)
+    {
+        dmError("Could not instantiate setup screen image, %d: %s\n",
+            result, dmErrorStr(result));
+        goto out;
+    }
+    
+    if (menuBgImage->w != DM_VIDEO_SETUP_WIDTH ||
+        menuBgImage->h != DM_VIDEO_SETUP_HEIGHT)
+    {
+        dmError("Setup screen background image does not match "
+            "required dimensions (%dx%d vs %dx%d)\n",
+            menuBgImage->w, menuBgImage->h,
+            DM_VIDEO_SETUP_WIDTH, DM_VIDEO_SETUP_HEIGHT);
+        goto out;
+    }
+
+
+    // Load up the bitmap font
+    file = dmf_open(engine.resources, "SetupFont.fnt");
+    if (file == NULL)
+        file = dmf_create_memio(NULL, "SetupFont", engineSetupFont, sizeof(engineSetupFont));
+
+    result = dmLoadBitmapFont(file, &font);
+    dmf_close(file);
+    if (result != DMERR_OK)
+    {
+        dmError("Could not instantiate setup screen font, %d: %s\n",
+            result, dmErrorStr(result));
+        goto out;
+    }
+    
+    menuBgBlit = dmGetScaledBlitFunc(menuBgImage, engine.screen->format, DMD_NONE);
+
+    // Enter the main loop of the menu
+    while (!menuState)
+    {
+        while (SDL_PollEvent(&engine.event))
+        switch (engine.event.type)
+        {
+            case SDL_KEYDOWN:
+                switch (engine.event.key.keysym.sym)
+                {
+                    case SDLK_ESCAPE:
+                        menuState = -1;
+                        break;
+
+                    case SDLK_SPACE:
+                    case SDLK_RETURN:
+                        menuState = 1;
+                        break;
+
+                    case SDLK_UP:
+                        if (menuChoice > 0)
+                            menuChoice--;
+                        break;
+
+                    case SDLK_DOWN:
+                        if (menuChoice < nmenuList - 1)
+                            menuChoice++;
+                        break;
+
+                    default:
+                        break;
+                }
+
+                break;
+
+            case SDL_QUIT:
+                menuState = -1;
+                break;
+        }
+
+        // Draw frame
+        if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0)
+        {
+            dmError("Can't lock surface.\n");
+            goto out;
+        }
+
+        // Render the menu
+        dmClearSurface(engine.screen, dmMapRGB(engine.screen, 0,0,0));
+        menuBgBlit(menuBgImage, 0, 0, engine.screen->w, engine.screen->h, engine.screen);
+        
+
+        // Flip screen
+        if (SDL_MUSTLOCK(engine.screen) != 0)
+            SDL_UnlockSurface(engine.screen);
+
+        SDL_Flip(engine.screen);
+        SDL_Delay(20);
+    }
+
+out:
+    return menuState;
+}
+
+
 int main(int argc, char *argv[])
 {
     int err;
@@ -172,14 +304,13 @@
 
     dmPrint(0,
     "Using libSDL, "
+#ifdef DM_USE_PACKFS
+    "zlib, "
+#endif
 #ifdef DM_USE_TREMOR
     "Tremor Vorbis codec"
 #endif
-#ifdef DM_USE_PACKFS
-    ", zlib and modified stb_image.\n"
-#else
     " and modified stb_image.\n"
-#endif
     "See README.txt for more information.\n");
 
     // Initialize resource subsystem
@@ -199,6 +330,11 @@
     }
     initSDL = TRUE;
 
+
+    // Present video mode selector
+    if (engine.optVidSetup)
+        engineVideoSetup();
+
     // Initialize audio parts
     if (engine.optAfmt.freq == 0 && engine.optAfmt.channels == 0)
     {
@@ -259,9 +395,6 @@
     if (!engineInitializeVideo())
         goto error_exit;
 
-    SDL_ShowCursor(SDL_DISABLE);
-    SDL_WM_SetCaption(dmProgDesc, dmProgName);
-
     if (engine.demoInitPostVideo != NULL &&
        (err = engine.demoInitPostVideo(&engine)) != DMERR_OK)
     {
@@ -422,9 +555,6 @@
     dmPrint(1, "Shutting down.\n");
     SDL_ShowCursor(SDL_ENABLE);
 
-    if (engine.screen)
-        SDL_FreeSurface(engine.screen);
-
     SDL_LockAudio();
     SDL_PauseAudio(1);
 #ifdef DM_USE_JSS