diff tools/ppl.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 8f06c23e197d
children 43e18726e54d
line wrap: on
line diff
--- a/tools/ppl.c	Sun May 13 05:59:42 2018 +0300
+++ b/tools/ppl.c	Sun May 13 06:00:50 2018 +0300
@@ -6,6 +6,7 @@
  * Please read file 'COPYING' for information on license and distribution.
  */
 #include "dmlib.h"
+#include <SDL.h>
 #include "libgutil.h"
 
 #include "jss.h"
@@ -23,6 +24,10 @@
 struct
 {
     BOOL exitFlag;
+
+    SDL_Window *window;
+    SDL_Renderer *renderer;
+    SDL_Texture *texture;
     SDL_Surface *screen;
     SDL_Event event;
 
@@ -101,7 +106,7 @@
             break;
 
         case 2:
-            engine.optVFlags |= SDL_FULLSCREEN;
+            engine.optVFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
             break;
 
         case 3:
@@ -189,15 +194,22 @@
 
 BOOL dmInitializeVideo()
 {
+    SDL_DestroyTexture(engine.texture);
     SDL_FreeSurface(engine.screen);
 
-    engine.screen = SDL_SetVideoMode(
-        engine.optScrWidth, engine.optScrHeight, engine.optScrDepth,
-        engine.optVFlags | SDL_RESIZABLE | SDL_SWSURFACE | SDL_HWPALETTE);
+    if ((engine.texture = SDL_CreateTexture(engine.renderer,
+        SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING,
+        engine.optScrWidth, engine.optScrHeight)) == NULL)
+    {
+        dmErrorMsg("Could not create SDL texture.\n");
+        return FALSE;
+    }
 
-    if (engine.screen == NULL)
+    if ((engine.screen = SDL_CreateRGBSurface(0,
+        engine.optScrWidth, engine.optScrHeight,
+        32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff)) == NULL)
     {
-        dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError());
+        dmErrorMsg("Could not create SDL surface.\n");
         return FALSE;
     }
 
@@ -677,13 +689,31 @@
         muteState = TRUE;
     }
 
-    // Initialize video
+    // Open window
+    if ((engine.window = SDL_CreateWindow(dmProgName,
+        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+        engine.optScrWidth, engine.optScrHeight,
+        engine.optVFlags | SDL_WINDOW_RESIZABLE
+        //| SDL_WINDOW_HIDDEN
+        )) == NULL)
+    {
+        dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError());
+        goto error_exit;
+    }
+
+    SDL_SetWindowTitle(engine.window, dmProgDesc);
+
+    if ((engine.renderer = SDL_CreateRenderer(engine.window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL)
+    {
+        dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError());
+        goto error_exit;
+    }
+
     if (!dmInitializeVideo())
         goto error_exit;
 
-    SDL_WM_SetCaption(dmProgDesc, dmProgName);
-
-    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+//    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
+//    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
 
     // okay, main loop here ... "play" module and print out info
     SDL_LockAudio();
@@ -694,7 +724,8 @@
     while (!engine.exitFlag)
     {
         currTick = SDL_GetTicks();
-        BOOL force = (currTick - prevTick > 500), updated = FALSE;
+        BOOL force = (currTick - prevTick > 500),
+             updated = FALSE;
 
         while (SDL_PollEvent(&engine.event))
         switch (engine.event.type)
@@ -764,8 +795,8 @@
                         break;
 
                     case SDLK_f:
-                        engine.optVFlags ^= SDL_FULLSCREEN;
-                        if (!dmInitializeVideo())
+                        engine.optVFlags ^= SDL_WINDOW_FULLSCREEN_DESKTOP;
+                        if (SDL_SetWindowFullscreen(engine.window, engine.optVFlags) != 0)
                             goto error_exit;
                         force = TRUE;
                         break;
@@ -776,16 +807,22 @@
 
                 break;
 
-            case SDL_VIDEORESIZE:
-                engine.optScrWidth = engine.event.resize.w;
-                engine.optScrHeight = engine.event.resize.h;
+            case SDL_WINDOWEVENT:
+                switch (engine.event.window.event)
+                {
+                    case SDL_WINDOWEVENT_EXPOSED:
+                        force = TRUE;
+                        break;
 
-                if (!dmInitializeVideo())
-                    goto error_exit;
+                    case SDL_WINDOWEVENT_RESIZED:
+                        engine.optScrWidth  = engine.event.window.data1;
+                        engine.optScrHeight = engine.event.window.data2;
+                        if (!dmInitializeVideo())
+                            goto error_exit;
 
-                break;
-
-            case SDL_VIDEOEXPOSE:
+                        force = TRUE;
+                        break;
+                }
                 break;
 
             case SDL_QUIT:
@@ -809,12 +846,6 @@
         }
 
         // Draw frame
-        if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0)
-        {
-            dmErrorMsg("Can't lock surface.\n");
-            goto error_exit;
-        }
-
         if (force)
         {
             dmClearSurface(engine.screen, col.boxBg);
@@ -856,18 +887,34 @@
 
 #endif
         // Flip screen
-        if (SDL_MUSTLOCK(engine.screen) != 0)
-            SDL_UnlockSurface(engine.screen);
+        if (updated)
+        {
+            SDL_Surface dst;
+            SDL_LockTexture(engine.texture, NULL, &dst.pixels, &dst.pitch);
 
-        if (updated)
-            SDL_Flip(engine.screen);
+            for (int yc = 0; yc < engine.screen->h; yc++)
+            {
+                memcpy(dst.pixels + dst.pitch * yc,
+                    engine.screen->pixels + engine.screen->pitch * yc,
+                    dst.pitch);
+            }
+
+            SDL_UnlockTexture(engine.texture);
+
+            SDL_SetRenderDrawColor(engine.renderer, 0, 0, 0, 255);
+            SDL_RenderClear(engine.renderer);
+            SDL_RenderCopy(engine.renderer, engine.texture, NULL, NULL);
+            SDL_RenderPresent(engine.renderer);
+        }
 
         SDL_Delay(engine.pauseFlag ? 100 : 30);
     }
 
 error_exit:
-    if (engine.screen)
-        SDL_FreeSurface(engine.screen);
+    SDL_DestroyTexture(engine.texture);
+    SDL_DestroyRenderer(engine.renderer);
+    SDL_DestroyWindow(engine.window);
+    SDL_FreeSurface(engine.screen);
 
     dmMsg(0, "Audio shutdown.\n");
     if (audioInit)