diff tools/64vw.c @ 1557:5e5f75b45f8d

Initial port to SDL2. Many things will not work now.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 13 May 2018 06:00:50 +0300
parents e68d3b16c79e
children 58aa34bb4f03
line wrap: on
line diff
--- a/tools/64vw.c	Sun May 13 05:59:42 2018 +0300
+++ b/tools/64vw.c	Sun May 13 06:00:50 2018 +0300
@@ -12,7 +12,7 @@
 #include <SDL.h>
 
 
-int    optVFlags = SDL_SWSURFACE | SDL_HWPALETTE;
+int    optVFlags = 0;
 int    optScrWidth, optScrHeight;
 int    optForcedFormat = -1;
 BOOL   optProbeOnly = FALSE;
@@ -72,7 +72,7 @@
             break;
 
         case 2:
-            optVFlags |= SDL_FULLSCREEN;
+            optVFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
             break;
 
         case 3:
@@ -152,18 +152,6 @@
 }
 
 
-BOOL dmInitializeVideo(SDL_Surface **screen)
-{
-    *screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 8, optVFlags | SDL_RESIZABLE);
-    if (*screen == NULL)
-    {
-        dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError());
-        return FALSE;
-    }
-    return TRUE;
-}
-
-
 int dmReadC64Image(const char *filename, const DMC64ImageFormat *forced, const DMC64ImageFormat **fmt, DMC64Image **cimage)
 {
     Uint8 *dataBuf = NULL;
@@ -203,7 +191,10 @@
 
 int main(int argc, char *argv[])
 {
-    SDL_Surface *screen = NULL, *surf = NULL;
+    SDL_Window *window = NULL;
+    SDL_Renderer *renderer = NULL;
+    SDL_Texture *texture = NULL;
+    SDL_Surface *surf = NULL;
     BOOL initSDL = FALSE, exitFlag, needRedraw;
     const DMC64ImageFormat *forced;
     size_t currIndex, prevIndex;
@@ -279,15 +270,26 @@
     }
     initSDL = TRUE;
 
-
-    // Open window/set video mode
-    screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 8, optVFlags | SDL_RESIZABLE);
-    if (screen == NULL)
+    // Open window
+    if ((window = SDL_CreateWindow(dmProgName,
+        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+        optScrWidth, optScrHeight,
+        optVFlags | SDL_WINDOW_RESIZABLE
+        //| SDL_WINDOW_HIDDEN
+        )) == NULL)
     {
-        dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError());
+        dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError());
         goto exit;
     }
 
+    if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL)
+    {
+        dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError());
+        goto exit;
+    }
+
+//    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
+
     // Start main loop
     currIndex = 0;
     prevIndex = 1;
@@ -342,17 +344,20 @@
                 needRedraw = TRUE;
                 break;
 
-            case SDL_VIDEORESIZE:
-                optScrWidth  = event.resize.w;
-                optScrHeight = event.resize.h;
-                if (!dmInitializeVideo(&screen))
-                    goto exit;
+            case SDL_WINDOWEVENT:
+                switch (event.window.event)
+                {
+                    case SDL_WINDOWEVENT_EXPOSED:
+                        needRedraw = TRUE;
+                        break;
 
-                needRedraw = TRUE;
-                break;
+                    case SDL_WINDOWEVENT_RESIZED:
+                        optScrWidth  = event.window.data1;
+                        optScrHeight = event.window.data2;
 
-            case SDL_VIDEOEXPOSE:
-                needRedraw = TRUE;
+                        needRedraw = TRUE;
+                        break;
+                }
                 break;
 
             case SDL_QUIT:
@@ -415,6 +420,17 @@
                 goto exit;
             }
 
+            SDL_SetPaletteColors(surf->format->palette, (SDL_Color *)dmDefaultC64Palette, 0, C64_NCOLORS);
+
+            if (texture != NULL)
+                SDL_DestroyTexture(texture);
+
+            if ((texture = SDL_CreateTextureFromSurface(renderer, surf)) == NULL)
+            {
+                dmErrorMsg("Could not create texture from surface: %s\n", SDL_GetError());
+                goto exit;
+            }
+
             if (title == NULL)
             {
                 title = dm_strdup_printf("%s - %s [%d / %d]",
@@ -422,7 +438,7 @@
                     currIndex + 1, noptFilenames2);
             }
 
-            SDL_WM_SetCaption(title, dmProgName);
+            SDL_SetWindowTitle(window, title);
             dmFree(title);
 
             needRedraw = TRUE;
@@ -431,23 +447,10 @@
 
         if (needRedraw)
         {
-            float aspect = (float) surf->h / (float) surf->w;
-            int sheight = optScrHeight / aspect;
-            int ypos = (optScrHeight - sheight) / 2;
-
-            if (SDL_MUSTLOCK(screen) != 0 && SDL_LockSurface(screen) != 0)
-            {
-                dmErrorMsg("Can't lock surface.\n");
-                goto exit;
-            }
-
-            dmScaledBlitSurface8to8(surf, 0, ypos, optScrWidth, sheight, screen);
-            SDL_SetColors(screen, (SDL_Color *)dmDefaultC64Palette, 0, C64_NCOLORS);
-
-            if (SDL_MUSTLOCK(screen) != 0)
-                SDL_UnlockSurface(screen);
-
-            SDL_Flip(screen);
+            //SDL_RenderSetLogicalSize(renderer, surf->w, surf->h);
+            SDL_RenderClear(renderer);
+            SDL_RenderCopy(renderer, texture, NULL, NULL);
+            SDL_RenderPresent(renderer);
             needRedraw = FALSE;
         }
 
@@ -458,8 +461,11 @@
     // Cleanup
     dmFree(optFilenames);
 
-    if (screen != NULL)
-        SDL_FreeSurface(screen);
+    if (window != NULL)
+        SDL_DestroyWindow(window);
+
+    if (texture != NULL)
+        SDL_DestroyTexture(texture);
 
     if (surf != NULL)
         SDL_FreeSurface(surf);