changeset 1054:d98fcb10df6a

Work on dmzlib.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 01 Mar 2015 22:37:39 +0200
parents a726c1b9a41e
children 2858b56bdbe5
files src/dmsimple.c src/dmzlib.c src/dmzlib.h
diffstat 3 files changed, 59 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/dmsimple.c	Sun Mar 01 22:27:08 2015 +0200
+++ b/src/dmsimple.c	Sun Mar 01 22:37:39 2015 +0200
@@ -592,7 +592,7 @@
 
     // Pre-initialization
     if ((err = demoPreInit(&engine)) != DMERR_OK)
-        goto error_exit;
+        goto out;
 
     if (!dmArgsProcess(argc, argv, optList, optListN,
         argHandleOpt, NULL, OPTH_BAILOUT))
@@ -615,7 +615,13 @@
     "See README.txt for more information.\n");
 
     // Initialize dmZlib
-    dmZLibInit();
+    if ((err = dmZLibInit()) != DMERR_OK)
+    {
+        dmErrorDBGMsg(
+            "Failed to initialize dmzlib: %d, %s.\n",
+            err, dmErrorStr(err));
+        goto out;
+    }
 
     // Initialize resource subsystem
     dmPrint(1, "Initializing resources subsystem.\n");
@@ -625,7 +631,7 @@
         dmErrorDBGMsg(
             "Could not initialize resource manager, #%d: %s.\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Initialize SDL components
@@ -635,7 +641,7 @@
         dmError(DMERR_INIT_FAIL,
             "Could not initialize SDL: %s\n",
             SDL_GetError());
-        goto error_exit;
+        goto out;
     }
     initSDL = TRUE;
 
@@ -650,7 +656,7 @@
     if (engine.optVidSetup)
     {
         if ((err = engineVideoSetup()) <= 0)
-            goto error_exit;
+            goto out;
     }
 
     // Initialize audio parts
@@ -685,14 +691,14 @@
             {
                 dmErrorDBGMsg(
                     "jvmInit() returned NULL, voi perkele.\n");
-                goto error_exit;
+                goto out;
             }
 
             if ((engine.jssPlr = jmpInit(engine.jssDev)) == NULL)
             {
                 dmErrorDBGMsg(
                     "jmpInit() returned NULL\n");
-                goto error_exit;
+                goto out;
             }
 #else
             dmErrorDBGMsg("miniJSS support not included.\n");
@@ -716,7 +722,7 @@
         dmErrorDBGMsg(
             "engineInitAudioParts() failed: #%d: %s\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Initialize SDL video
@@ -726,11 +732,11 @@
         dmErrorDBGMsg(
             "demoInitPreVideo() failed, #%d: %s\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     if (!engineInitializeVideo())
-        goto error_exit;
+        goto out;
 
     if (engine.demoInitPostVideo != NULL &&
        (err = engine.demoInitPostVideo(&engine)) != DMERR_OK)
@@ -738,7 +744,7 @@
         dmErrorDBGMsg(
             "demoInitPostVideo() failed, #%d: %s\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Hide cursor
@@ -751,7 +757,7 @@
         dmErrorDBGMsg(
             "Error loading resources, #%d: %s.\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Final initializations
@@ -760,7 +766,7 @@
         dmErrorDBGMsg(
             "Failure in demoInit(), #%d: %s\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Initialize effects
@@ -769,7 +775,7 @@
         dmErrorDBGMsg(
             "Effects initialization failed, #%d: %s\n",
             err, dmErrorStr(err));
-        goto error_exit;
+        goto out;
     }
 
     // Use a timeline, if set
@@ -781,7 +787,7 @@
             dmErrorDBGMsg(
                 "Error loading timeline, #%d: %s\n",
                 err, dmErrorStr(err));
-            goto error_exit;
+            goto out;
         }
 
         if ((err = dmPrepareTimeline(engine.tl, engine.ptl)) != DMERR_OK)
@@ -789,7 +795,7 @@
             dmErrorDBGMsg(
                 "Error creating prepared timeline, #%d: %s\n",
                 err, dmErrorStr(err));
-            goto error_exit;
+            goto out;
         }
     }
 #endif
@@ -821,7 +827,7 @@
                     case SDLK_f:
                         engine.optVFlags ^= SDL_FULLSCREEN;
                         if (!engineInitializeVideo())
-                            goto error_exit;
+                            goto out;
                         break;
 
                     case SDLK_RETURN:
@@ -829,7 +835,7 @@
                         {
                             engine.optVFlags ^= SDL_FULLSCREEN;
                             if (!engineInitializeVideo())
-                                goto error_exit;
+                                goto out;
                         }
                         break;
 
@@ -863,20 +869,20 @@
         if (SDL_MUSTLOCK(engine.screen) && SDL_LockSurface(engine.screen) != 0)
         {
             dmError(DMERR_INTERNAL, "Can't lock surface.\n");
-            goto error_exit;
+            goto out;
         }
 
         // Call main tick
         if (engine.demoRender != NULL)
         {
             if ((err = engine.demoRender(&engine)) != DMERR_OK)
-                goto error_exit;
+                goto out;
         }
 #ifdef DM_USE_TIMELINE
         else
         {
             if ((err = dmExecuteTimeline(engine.ptl, engine.screen, engineGetTick(&engine))) != DMERR_OK)
-                goto error_exit;
+                goto out;
         }
 #endif
 
@@ -899,7 +905,7 @@
     dmPrint(1, "startTime=%d, startTimeAudio=%d, offsetTime=%d\n",
         engine.startTime, engine.startTimeAudio, engine.offsetTime);
 
-error_exit:
+out:
 
     dmPrint(1, "Shutting down.\n");
     SDL_ShowCursor(SDL_ENABLE);
@@ -944,6 +950,8 @@
 
     if (engine.demoQuit != NULL)
         engine.demoQuit(&engine);
-    
+
+    dmZLibClose();
+
     return 0;
 }
--- a/src/dmzlib.c	Sun Mar 01 22:27:08 2015 +0200
+++ b/src/dmzlib.c	Sun Mar 01 22:37:39 2015 +0200
@@ -17,14 +17,21 @@
 
 
 // @TODO: should statically initialize these for optimal thread safety
-static Uint8 dm_zdefault_length[288], dm_zdefault_distance[32];
+static Uint8 *dm_zdefault_length = NULL,
+             *dm_zdefault_distance = NULL;
 
 
-void dmZLibInit()
+int dmZLibInit()
 {
     int i;
 
     // Use <= to match clearly with DEFLATE spec
+    if ((dm_zdefault_length   = dmMalloc(288)) == NULL ||
+        (dm_zdefault_distance = dmMalloc(32)) == NULL)
+    {
+        return dmErrorDBG(DMERR_MALLOC,
+            "Failed to allocate zlib decompression tables.\n");
+    }
 
     // Literals 0  ..143:  8 bits, codes 00110000 .. 10111111
     for (i = 0; i <= 143; i++)
@@ -45,6 +52,17 @@
     // Default distances
     for (i = 0; i <= 31; i++)
         dm_zdefault_distance[i] = 5;
+
+    return DMERR_OK;
+}
+
+
+void dmZLibClose()
+{
+    dmFree(dm_zdefault_length);
+    dm_zdefault_length = NULL;
+    dmFree(dm_zdefault_distance);
+    dm_zdefault_distance = NULL;
 }
 
 
@@ -352,7 +370,9 @@
 }
 
 
-static const Uint8 dm_zlib_length_dezigzag[19] =
+#define DM_ZLIB_NCODELENGTH_SIZES 19
+
+static const Uint8 dm_zlib_length_dezigzag[DM_ZLIB_NCODELENGTH_SIZES] =
 {
     16, 17, 18,  0,  8,  7,  9,
     6 , 10, 5 , 11,  4, 12,  3,
@@ -363,8 +383,8 @@
 static int dmZLibComputeHuffmanCodes(DMZLibContext * ctx)
 {
     DMZHuffmanContext z_codelength;
-    Uint8 codeLengths[286 + 32 + 137];     // padding for maximum single op
-    Uint8 codeLengthSizes[19];
+    Uint8 codeLengths[288 + 32 + 137];     // padding for maximum single op
+    Uint8 codeLengthSizes[DM_ZLIB_NCODELENGTH_SIZES];
     int i, n, ret;
 
     int hlit  = dmZReceive(ctx, 5) + 257;
@@ -389,7 +409,7 @@
         if ((ret = dmZLibHuffmanDecode(ctx, &z_codelength, &c)) != DMERR_OK)
             return ret;
 
-        DMSTBI_ASSERT(c >= 0 && c < 19);
+        DMSTBI_ASSERT(c >= 0 && c < DM_ZLIB_NCODELENGTH_SIZES);
 
         if (c < 16)
             codeLengths[n++] = (Uint8) c;
--- a/src/dmzlib.h	Sun Mar 01 22:27:08 2015 +0200
+++ b/src/dmzlib.h	Sun Mar 01 22:37:39 2015 +0200
@@ -45,7 +45,8 @@
 } DMZLibContext;
 
 
-void   dmZLibInit();
+int    dmZLibInit();
+void   dmZLibClose();
 int    dmZLibParseHeader(DMZLibContext * ctx, BOOL checkPNG);
 int    dmZLibDecode(DMZLibContext * ctx);