# HG changeset patch # User Matti Hamalainen # Date 1425242259 -7200 # Node ID d98fcb10df6acb49416a9af86bfa0098028f754b # Parent a726c1b9a41e019e3fb61eade6de90493ca60efc Work on dmzlib. diff -r a726c1b9a41e -r d98fcb10df6a src/dmsimple.c --- 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; } diff -r a726c1b9a41e -r d98fcb10df6a src/dmzlib.c --- 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; diff -r a726c1b9a41e -r d98fcb10df6a src/dmzlib.h --- 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);