From: <Mee...@us...> - 2008-08-22 19:57:38
|
Revision: 3043 http://sc2.svn.sourceforge.net/sc2/?rev=3043&view=rev Author: Meep-Eep Date: 2008-08-22 19:57:35 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Support drive letters and UNC paths on some non-Windows platforms. Modified Paths: -------------- trunk/sc2/src/port.h trunk/sc2/src/sc2code/libs/file/dirs.c trunk/sc2/src/sc2code/libs/file.h Modified: trunk/sc2/src/port.h =================================================================== --- trunk/sc2/src/port.h 2008-08-22 19:04:26 UTC (rev 3042) +++ trunk/sc2/src/port.h 2008-08-22 19:57:35 UTC (rev 3043) @@ -503,5 +503,19 @@ # define UNBUFFERED_LOGFILE #endif +#if defined(WIN32) || defined(__SYMBIAN32__) + // HAVE_DRIVE_LETTERS is defined to signify that DOS/Windows style drive + // letters are to be recognised on this platform. +# define HAVE_DRIVE_LETTERS + // HAVE_UNC_PATHS is defined to signify that Universal Naming Convention + // style paths are to be recognised on this platform. +# define HAVE_UNC_PATHS + // BACKSLASH_IS_PATH_SEPARATOR is defined to signify that the backslash + // character is to be recognised as a path separator on this platform. + // This does not affect the acceptance of forward slashes as path + // separators. +# define BACKSLASH_IS_PATH_SEPARATOR +#endif + #endif /* _PORT_H */ Modified: trunk/sc2/src/sc2code/libs/file/dirs.c =================================================================== --- trunk/sc2/src/sc2code/libs/file/dirs.c 2008-08-22 19:04:26 UTC (rev 3042) +++ trunk/sc2/src/sc2code/libs/file/dirs.c 2008-08-22 19:57:35 UTC (rev 3043) @@ -29,11 +29,16 @@ #include "misc.h" #include "libs/log.h" +#ifdef HAVE_DRIVE_LETTERS +# include <ctype.h> + // For tolower() +#endif /* HAVE_DRIVE_LETTERS */ #ifdef WIN32 # include <direct.h> -# include <ctype.h> + // For _getdcwd() #else # include <pwd.h> + // For getpwuid() #endif /* Try to find a suitable value for %APPDATA% if it isn't defined on @@ -72,7 +77,7 @@ ptr = buf; pathstart = path; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(pathstart[0]) && pathstart[1] == ':') { // Driveletter + semicolon on Windows. @@ -87,8 +92,13 @@ log_add (log_Error, "Can't stat \"%s\": %s", buf, strerror (errno)); goto err; } - } else if (pathstart[0] == '\\' && pathstart[1] == '\\') { - // Windows UNC path. (\\server\share\...) + } + else +#endif /* HAVE_DRIVE_LETTERS */ +#ifdef HAVE_UNC_PATHS + if (pathstart[0] == '\\' && pathstart[1] == '\\') + { + // Universal Naming Convention path. (\\server\share\...) // Copy the server part as is; don't try to create directories for // it, or stat it. Don't create a dir for the share either. *(ptr++) = *(pathstart++); @@ -119,7 +129,12 @@ goto err; } } -#endif +#else + { + // Making sure that there is an 'else' case if HAVE_DRIVE_LETTERS is + // defined. + } +#endif /* HAVE_UNC_PATHS */ if (*pathstart == '/') *(ptr++) = *(pathstart++); @@ -487,9 +502,9 @@ { /* Replacing backslashes in path by slashes. */ destptr = dest; -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS { - // A Windows UNC path should always start with two backslashes + // A UNC path should always start with two backslashes // and have a backslash in between the server and share part. size_t skip = skipUNCServerShare (destptr); if (skip != 0) @@ -500,7 +515,7 @@ destptr += skip; } } -#endif +#endif /* HAVE_UNC_PATHS */ while (*destptr != '\0') { if (*destptr == '\\') @@ -521,17 +536,24 @@ char *endPart; pathStart = dest; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(pathStart[0]) && (pathStart[1] == ':')) { pathStart += 2; } else +#endif /* HAVE_DRIVE_LETTERS */ +#ifdef HAVE_UNC_PATHS { - // Test for a UNC path. + // Test for a Universal Naming Convention path. pathStart += skipUNCServerShare(pathStart); } -#endif +#else + { + // Making sure that there is an 'else' case if HAVE_DRIVE_LETTERS is + // defined. + } +#endif /* HAVE_UNC_PATHS */ if (pathStart[0] == '/') pathStart++; @@ -619,7 +641,7 @@ return -1; } -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS // letter is 0 based: 0 = A, 1 = B, ... bool driveLetterExists(int letter) @@ -630,7 +652,7 @@ return ((drives >> letter) & 1) != 0; } -#endif +#endif /* HAVE_DRIVE_LETTERS */ // helper for expandPath, expanding an absolute path // returns a pointer to the end of the filled in part of dest. @@ -648,7 +670,7 @@ } orgSrc = src; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(src[0]) && (src[1] == ':')) { int letter; @@ -686,7 +708,7 @@ src += 2; } else -#endif +#endif /* HAVE_DRIVE_LETTERS */ { // Relative dir if (getcwd (dest, destLen) == NULL) @@ -709,9 +731,9 @@ destLen -= tempLen; } if (dest[-1] != '/' -#ifdef WIN32 +#ifdef BACKSLASH_IS_PATH_SEPARATOR && dest[-1] != '\\' -#endif +#endif /* BACKSLASH_IS_PATH_SEPARATOR */ ) { // Need to add a slash. @@ -738,7 +760,7 @@ } } -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS // returns 0 if the path is not a valid UNC path. // Does not skip trailing slashes. size_t @@ -766,6 +788,6 @@ return (size_t) (path - inPath); } -#endif +#endif /* HAVE_UNC_PATHS */ Modified: trunk/sc2/src/sc2code/libs/file.h =================================================================== --- trunk/sc2/src/sc2code/libs/file.h 2008-08-22 19:04:26 UTC (rev 3042) +++ trunk/sc2/src/sc2code/libs/file.h 2008-08-22 19:57:35 UTC (rev 3043) @@ -72,16 +72,16 @@ uio_DirHandle *dstDir, const char *newName); bool fileExists (const char *name); bool fileExists2(uio_DirHandle *dir, const char *fileName); -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS size_t skipUNCServerShare(const char *inPath); -#endif +#endif /* HAVE_UNC_PATHS */ -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS static inline int isDriveLetter(int c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); } -#endif +#endif /* HAVE_DRIVE_LETTERS */ #endif /* _FILE_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gew...@us...> - 2008-08-30 14:08:05
|
Revision: 3056 http://sc2.svn.sourceforge.net/sc2/?rev=3056&view=rev Author: gewlitys Date: 2008-08-30 14:08:02 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Some includes added to avoid calling functions w/o prototypes. Modified Paths: -------------- trunk/sc2/src/getopt/getopt.c trunk/sc2/src/sc2code/libs/resource/resinit.c Modified: trunk/sc2/src/getopt/getopt.c =================================================================== --- trunk/sc2/src/getopt/getopt.c 2008-08-30 13:26:18 UTC (rev 3055) +++ trunk/sc2/src/getopt/getopt.c 2008-08-30 14:08:02 UTC (rev 3056) @@ -28,6 +28,7 @@ #endif #include <config.h> +#include <string.h> #ifndef HAVE_GETOPT_LONG #if !defined __STDC__ || !__STDC__ Modified: trunk/sc2/src/sc2code/libs/resource/resinit.c =================================================================== --- trunk/sc2/src/sc2code/libs/resource/resinit.c 2008-08-30 13:26:18 UTC (rev 3055) +++ trunk/sc2/src/sc2code/libs/resource/resinit.c 2008-08-30 14:08:02 UTC (rev 3056) @@ -22,6 +22,9 @@ #include "nameref.h" #include "types.h" #include "libs/log.h" +#include "libs/gfxlib.h" +#include "libs/sndlib.h" +#include "coderes.h" #include "propfile.h" #include <ctype.h> #include <stdlib.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Mee...@us...> - 2008-08-30 18:25:43
|
Revision: 3057 http://sc2.svn.sourceforge.net/sc2/?rev=3057&view=rev Author: Meep-Eep Date: 2008-08-30 18:25:41 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Handle paths of the form "d:foo/bar" on platforms which don't have a current working directory per drive. Modified Paths: -------------- trunk/sc2/src/port.h trunk/sc2/src/sc2code/libs/file/dirs.c Modified: trunk/sc2/src/port.h =================================================================== --- trunk/sc2/src/port.h 2008-08-30 14:08:02 UTC (rev 3056) +++ trunk/sc2/src/port.h 2008-08-30 18:25:41 UTC (rev 3057) @@ -518,7 +518,12 @@ // HAVE_UNC_PATHS is defined to signify that Universal Naming Convention // style paths are to be recognised on this platform. # define HAVE_UNC_PATHS + // HAVE_CWD_PER_DRIVE is defined to signify that every drive has its own + // current working directory. +# define HAVE_CWD_PER_DRIVE #endif +// REJECT_DRIVE_PATH_WITHOUT_SLASH can also be defined, if paths of the form +// "d:foo/bar" (without a slash after the drive letter) are to be rejected. #endif /* _PORT_H */ Modified: trunk/sc2/src/sc2code/libs/file/dirs.c =================================================================== --- trunk/sc2/src/sc2code/libs/file/dirs.c 2008-08-30 14:08:02 UTC (rev 3056) +++ trunk/sc2/src/sc2code/libs/file/dirs.c 2008-08-30 18:25:41 UTC (rev 3057) @@ -685,6 +685,13 @@ // Path is of the form "d:path", without a (back)slash after the // semicolon. +#ifdef REJECT_DRIVE_PATH_WITHOUT_SLASH + // We reject paths of the form "d:foo/bar". + errno = EINVAL; + return NULL; +#elif defined(HAVE_CWD_PER_DRIVE) + // Paths of the form "d:foo/bar" are treated as "foo/bar" relative + // to the working directory of d:. letter = tolower(src[0]) - 'a'; // _getdcwd() should only be called on drives that exist. @@ -706,6 +713,19 @@ } src += 2; +#else /* if !defined(HAVE_CWD_PER_DRIVE) */ + // We treat paths of the form "d:foo/bar" as "d:/foo/bar". + if (destLen < 3) { + errno = ERANGE; + return NULL; + } + dest[0] = src[0]; + dest[1] = ':'; + dest[2] = '/'; + *skipSrc = 2; + dest += 3; + return dest; +#endif /* HAVE_CWD_PER_DRIVE */ } else #endif /* HAVE_DRIVE_LETTERS */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gew...@us...> - 2008-10-17 20:49:27
|
Revision: 3091 http://sc2.svn.sourceforge.net/sc2/?rev=3091&view=rev Author: gewlitys Date: 2008-10-17 20:49:24 +0000 (Fri, 17 Oct 2008) Log Message: ----------- Mounting packed ani/font files does not actually need to be relative to content mount. Modified Paths: -------------- trunk/sc2/src/options.c trunk/sc2/src/options.h trunk/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c Modified: trunk/sc2/src/options.c =================================================================== --- trunk/sc2/src/options.c 2008-10-15 17:45:17 UTC (rev 3090) +++ trunk/sc2/src/options.c 2008-10-17 20:49:24 UTC (rev 3091) @@ -60,7 +60,6 @@ uio_DirHandle *configDir; uio_DirHandle *saveDir; uio_DirHandle *meleeDir; -uio_MountHandle *contentMountHandle; char baseContentPath[PATH_MAX]; @@ -315,6 +314,8 @@ { uio_DirHandle *packagesDir, *addonsDir; static uio_AutoMount *autoMount[] = { NULL }; + uio_MountHandle *contentMountHandle; + availableAddons = NULL; contentMountHandle = uio_mountDir (repository, "/", Modified: trunk/sc2/src/options.h =================================================================== --- trunk/sc2/src/options.h 2008-10-15 17:45:17 UTC (rev 3090) +++ trunk/sc2/src/options.h 2008-10-17 20:49:24 UTC (rev 3091) @@ -50,8 +50,6 @@ extern uio_DirHandle *meleeDir; extern char baseContentPath[PATH_MAX]; -extern uio_MountHandle *contentMountHandle; - extern uio_DirList *availableAddons; extern const char **optAddons; Modified: trunk/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c =================================================================== --- trunk/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c 2008-10-15 17:45:17 UTC (rev 3090) +++ trunk/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c 2008-10-17 20:49:24 UTC (rev 3091) @@ -426,8 +426,8 @@ aniDir = uio_openDir (repository, aniDirName, 0); aniMount = uio_mountDir (repository, aniDirName, uio_FSTYPE_ZIP, aniDir, aniFileName, "/", autoMount, - uio_MOUNT_RDONLY | uio_MOUNT_ABOVE, - contentMountHandle); + uio_MOUNT_RDONLY | uio_MOUNT_TOP, + NULL); aniFile = uio_fopen (aniDir, aniFileName, "r"); opos = 0; n = 0; @@ -631,8 +631,8 @@ fontDirHandle = uio_openDir (repository, fontDirName, 0); fontMount = uio_mountDir (repository, _cur_resfile_name, uio_FSTYPE_ZIP, fontDirHandle, fontZipName, "/", autoMount, - uio_MOUNT_RDONLY | uio_MOUNT_ABOVE, - contentMountHandle); + uio_MOUNT_RDONLY | uio_MOUNT_TOP, + NULL); uio_closeDir (fontDirHandle); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcm...@us...> - 2009-01-03 22:16:32
|
Revision: 3105 http://sc2.svn.sourceforge.net/sc2/?rev=3105&view=rev Author: mcmartin Date: 2009-01-03 22:16:29 +0000 (Sat, 03 Jan 2009) Log Message: ----------- All file access involving resource indices to operate on or create subtrees Modified Paths: -------------- trunk/sc2/src/sc2code/libs/input/sdl/input.c trunk/sc2/src/sc2code/libs/reslib.h trunk/sc2/src/sc2code/libs/resource/mapres.c trunk/sc2/src/sc2code/libs/resource/propfile.c trunk/sc2/src/sc2code/libs/resource/propfile.h trunk/sc2/src/sc2code/libs/resource/resinit.c trunk/sc2/src/sc2code/setupmenu.c trunk/sc2/src/starcon2.c Modified: trunk/sc2/src/sc2code/libs/input/sdl/input.c =================================================================== --- trunk/sc2/src/sc2code/libs/input/sdl/input.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/input/sdl/input.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -150,7 +150,7 @@ int i; /* First, load in the menu keys */ - res_LoadFilename (contentDir, "menu.key"); + res_LoadFilename (contentDir, "menu.key", NULL); for (i = 0; i < NUM_MENU_KEYS; i++) { if (!menu_res_names[i]) @@ -178,7 +178,9 @@ } } - res_LoadFile (fp); + res_LoadFile (fp, NULL); + // TODO RES070 + // res_LoadFile (fp, "keys."); res_CloseResFile (fp); register_flight_controls (); @@ -457,7 +459,9 @@ f = res_OpenResFile (path, fname, "wb"); if (f) { - res_SaveFile (f, "keys."); + res_SaveFile (f, "keys.", FALSE); + // TODO RES070 + // res_SaveFile (f, "keys.", TRUE); res_CloseResFile (f); } } Modified: trunk/sc2/src/sc2code/libs/reslib.h =================================================================== --- trunk/sc2/src/sc2code/libs/reslib.h 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/reslib.h 2009-01-03 22:16:29 UTC (rev 3105) @@ -99,11 +99,11 @@ /* Key-Value resources */ void res_ClearTables (void); -void res_LoadFilename (uio_DirHandle *path, const char *fname); -void res_SaveFilename (uio_DirHandle *path, const char *fname, const char *root); +void res_LoadFilename (uio_DirHandle *path, const char *fname, const char *prefix); +void res_SaveFilename (uio_DirHandle *path, const char *fname, const char *root, BOOLEAN strip_root); -void res_LoadFile (uio_Stream *fname); -void res_SaveFile (uio_Stream *fname, const char *root); +void res_LoadFile (uio_Stream *fname, const char *prefix); +void res_SaveFile (uio_Stream *fname, const char *root, BOOLEAN strip_root); BOOLEAN res_HasKey (const char *key); Modified: trunk/sc2/src/sc2code/libs/resource/mapres.c =================================================================== --- trunk/sc2/src/sc2code/libs/resource/mapres.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/resource/mapres.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -178,7 +178,7 @@ } void -res_LoadFile (uio_Stream *s) +res_LoadFile (uio_Stream *s, const char *prefix) { check_map_init (); @@ -187,11 +187,11 @@ return; } - PropFile_from_file (s, res_PutString); + PropFile_from_file (s, res_PutString, prefix); } void -res_LoadFilename (uio_DirHandle *path, const char *fname) +res_LoadFilename (uio_DirHandle *path, const char *fname, const char *prefix) { check_map_init (); @@ -200,11 +200,11 @@ return; } - PropFile_from_filename (path, fname, res_PutString); + PropFile_from_filename (path, fname, res_PutString, prefix); } void -res_SaveFile (uio_Stream *f, const char *prefix) +res_SaveFile (uio_Stream *f, const char *prefix, BOOLEAN strip_root) { CharHashTable_Iterator *i; int prefix_len = 0; @@ -220,7 +220,11 @@ const char *key = CharHashTable_iteratorKey (i); const char *value = (const char *)CharHashTable_iteratorValue (i); if (!prefix || !strncmp (prefix, key, prefix_len)) { - WriteResFile (key, 1, strlen (key), f); + if (prefix && strip_root) { + WriteResFile (key+prefix_len, 1, strlen (key) - prefix_len, f); + } else { + WriteResFile (key, 1, strlen (key), f); + } PutResFileChar(' ', f); PutResFileChar('=', f); PutResFileChar(' ', f); @@ -233,14 +237,14 @@ } void -res_SaveFilename (uio_DirHandle *path, const char *fname, const char *prefix) +res_SaveFilename (uio_DirHandle *path, const char *fname, const char *prefix, BOOLEAN strip_root) { uio_Stream *f; check_map_init (); f = res_OpenResFile (path, fname, "wb"); if (f) { - res_SaveFile (f, prefix); + res_SaveFile (f, prefix, strip_root); res_CloseResFile (f); } } Modified: trunk/sc2/src/sc2code/libs/resource/propfile.c =================================================================== --- trunk/sc2/src/sc2code/libs/resource/propfile.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/resource/propfile.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -24,7 +24,7 @@ #include "reslib.h" void -PropFile_from_string (char *d, PROPERTY_HANDLER handler) +PropFile_from_string (char *d, PROPERTY_HANDLER handler, const char *prefix) { int len, i; @@ -84,12 +84,19 @@ make a new map entry. */ d[key_end] = '\0'; d[value_end] = '\0'; - handler (d+key_start, d+value_start); + if (prefix) { + char buf[256]; + snprintf(buf, 255, "%s%s", prefix, d+key_start); + buf[255]=0; + handler(buf, d+value_start); + } else { + handler (d+key_start, d+value_start); + } } } void -PropFile_from_file (uio_Stream *f, PROPERTY_HANDLER handler) +PropFile_from_file (uio_Stream *f, PROPERTY_HANDLER handler, const char *prefix) { long flen; char *data; @@ -104,17 +111,17 @@ flen = ReadResFile (data, 1, flen, f); data[flen] = '\0'; - PropFile_from_string (data, handler); + PropFile_from_string (data, handler, prefix); free (data); } void -PropFile_from_filename (uio_DirHandle *path, const char *fname, PROPERTY_HANDLER handler) +PropFile_from_filename (uio_DirHandle *path, const char *fname, PROPERTY_HANDLER handler, const char *prefix) { uio_Stream *f = res_OpenResFile (path, fname, "rt"); if (!f) { return; } - PropFile_from_file (f, handler); + PropFile_from_file (f, handler, prefix); res_CloseResFile(f); } Modified: trunk/sc2/src/sc2code/libs/resource/propfile.h =================================================================== --- trunk/sc2/src/sc2code/libs/resource/propfile.h 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/resource/propfile.h 2009-01-03 22:16:29 UTC (rev 3105) @@ -23,8 +23,8 @@ typedef void (*PROPERTY_HANDLER) (const char *, const char *); -void PropFile_from_string (char *d, PROPERTY_HANDLER handler); -void PropFile_from_file (uio_Stream *f, PROPERTY_HANDLER handler); -void PropFile_from_filename (uio_DirHandle *path, const char *fname, PROPERTY_HANDLER handler); +void PropFile_from_string (char *d, PROPERTY_HANDLER handler, const char *prefix); +void PropFile_from_file (uio_Stream *f, PROPERTY_HANDLER handler, const char *prefix); +void PropFile_from_filename (uio_DirHandle *path, const char *fname, PROPERTY_HANDLER handler, const char *prefix); #endif Modified: trunk/sc2/src/sc2code/libs/resource/resinit.c =================================================================== --- trunk/sc2/src/sc2code/libs/resource/resinit.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/libs/resource/resinit.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -192,7 +192,7 @@ void LoadResourceIndex (uio_DirHandle *dir, const char *rmpfile) { - PropFile_from_filename (dir, rmpfile, process_resource_desc); + PropFile_from_filename (dir, rmpfile, process_resource_desc, NULL); } void Modified: trunk/sc2/src/sc2code/setupmenu.c =================================================================== --- trunk/sc2/src/sc2code/setupmenu.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/sc2code/setupmenu.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -1371,6 +1371,8 @@ res_PutString ("keys.5.name", input_templates[4].name); res_PutString ("keys.6.name", input_templates[5].name); - res_SaveFilename (configDir, "uqm.cfg", "config."); + res_SaveFilename (configDir, "uqm.cfg", "config.", FALSE); + // TODO RES070 + // res_SaveFilename (configDir, "uqm.cfg", "config.", TRUE); SaveKeyConfiguration (configDir, "flight.cfg"); } Modified: trunk/sc2/src/starcon2.c =================================================================== --- trunk/sc2/src/starcon2.c 2008-11-29 06:31:46 UTC (rev 3104) +++ trunk/sc2/src/starcon2.c 2009-01-03 22:16:29 UTC (rev 3105) @@ -210,7 +210,10 @@ PlayerControls[1] = CONTROL_TEMPLATE_JOY_1; // Fill in the options struct based on uqm.cfg - res_LoadFilename (configDir, "uqm.cfg"); + res_LoadFilename (configDir, "uqm.cfg", NULL); + // TODO RES070 + // res_LoadFilename (configDir, "uqm.cfg", "config."); + if (res_HasKey ("config.reswidth")) { options.width = res_GetInteger ("config.reswidth"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcm...@us...> - 2009-02-08 09:27:10
|
Revision: 3107 http://sc2.svn.sourceforge.net/sc2/?rev=3107&view=rev Author: mcmartin Date: 2009-02-08 09:27:07 +0000 (Sun, 08 Feb 2009) Log Message: ----------- Added routines to be able to save or reload fragments of a resource map. Modified Paths: -------------- trunk/sc2/src/options.c trunk/sc2/src/sc2code/dummy.c trunk/sc2/src/sc2code/libs/graphics/resgfx.c trunk/sc2/src/sc2code/libs/reslib.h trunk/sc2/src/sc2code/libs/resource/index.h trunk/sc2/src/sc2code/libs/resource/resinit.c trunk/sc2/src/sc2code/libs/sound/resinst.c trunk/sc2/src/sc2code/libs/strings/sresins.c trunk/sc2/src/sc2code/libs/video/vresins.c Modified: trunk/sc2/src/options.c =================================================================== --- trunk/sc2/src/options.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/options.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -481,7 +481,7 @@ for (i = 0; i < indices->numNames; i++) { log_add (log_Debug, "Loading resouce index '%s'", indices->names[i]); - LoadResourceIndex (dir, indices->names[i]); + LoadResourceIndex (dir, indices->names[i], NULL); numLoaded++; } } Modified: trunk/sc2/src/sc2code/dummy.c =================================================================== --- trunk/sc2/src/sc2code/dummy.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/dummy.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -319,7 +319,7 @@ InstallCodeResType () { return (InstallResTypeVectors ("SHIP", - GetCodeResData, _ReleaseCodeResData)); + GetCodeResData, _ReleaseCodeResData, NULL)); } Modified: trunk/sc2/src/sc2code/libs/graphics/resgfx.c =================================================================== --- trunk/sc2/src/sc2code/libs/graphics/resgfx.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/graphics/resgfx.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -34,8 +34,8 @@ BOOLEAN InstallGraphicResTypes (void) { - InstallResTypeVectors ("GFXRES", GetCelFileData, _ReleaseCelData); - InstallResTypeVectors ("FONTRES", GetFontFileData, _ReleaseFontData); + InstallResTypeVectors ("GFXRES", GetCelFileData, _ReleaseCelData, NULL); + InstallResTypeVectors ("FONTRES", GetFontFileData, _ReleaseFontData, NULL); return (TRUE); } Modified: trunk/sc2/src/sc2code/libs/reslib.h =================================================================== --- trunk/sc2/src/sc2code/libs/reslib.h 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/reslib.h 2009-02-08 09:27:07 UTC (rev 3107) @@ -41,6 +41,7 @@ typedef void (ResourceLoadFun) (const char *pathname, RESOURCE_DATA *resdata); typedef BOOLEAN (ResourceFreeFun) (void *handle); +typedef void (ResourceStringFun) (RESOURCE_DATA *handle, char *buf, unsigned int size); typedef void *(ResourceLoadFileFun) (uio_Stream *fp, DWORD len); @@ -60,7 +61,7 @@ RESOURCE_INDEX InitResourceSystem (); void UninitResourceSystem (void); -BOOLEAN InstallResTypeVectors (const char *res_type, ResourceLoadFun *loadFun, ResourceFreeFun *freeFun); +BOOLEAN InstallResTypeVectors (const char *res_type, ResourceLoadFun *loadFun, ResourceFreeFun *freeFun, ResourceStringFun *stringFun); void *res_GetResource (RESOURCE res); void *res_DetachResource (RESOURCE res); BOOLEAN FreeResource (RESOURCE res); @@ -69,7 +70,8 @@ BOOLEAN res_GetBooleanResource (RESOURCE res); const char *res_GetResourceType (RESOURCE res); -void LoadResourceIndex (uio_DirHandle *dir, const char *filename); +void LoadResourceIndex (uio_DirHandle *dir, const char *filename, const char *prefix); +void SaveResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *root, BOOLEAN strip_root); void *GetResourceData (uio_Stream *fp, DWORD length); Modified: trunk/sc2/src/sc2code/libs/resource/index.h =================================================================== --- trunk/sc2/src/sc2code/libs/resource/index.h 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/resource/index.h 2009-02-08 09:27:07 UTC (rev 3107) @@ -28,6 +28,7 @@ const char *resType; ResourceLoadFun *loadFun; ResourceFreeFun *freeFun; + ResourceStringFun *toString; } ResourceHandlers; typedef struct resource_desc Modified: trunk/sc2/src/sc2code/libs/resource/resinit.c =================================================================== --- trunk/sc2/src/sc2code/libs/resource/resinit.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/resource/resinit.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -144,19 +144,19 @@ } } -void +static void UseDescriptorAsRes (const char *descriptor, RESOURCE_DATA *resdata) { resdata->ptr = (void *)descriptor; } -void +static void DescriptorToInt (const char *descriptor, RESOURCE_DATA *resdata) { resdata->num = atoi (descriptor); } -void +static void DescriptorToBoolean (const char *descriptor, RESOURCE_DATA *resdata) { if (!strcasecmp (descriptor, "true")) @@ -169,6 +169,25 @@ } } +static void +RawDescriptor (RESOURCE_DATA *resdata, char *buf, unsigned int size) +{ + snprintf (buf, size, "%s", (char *)resdata->ptr); +} + +static void +IntToString (RESOURCE_DATA *resdata, char *buf, unsigned int size) +{ + snprintf (buf, size, "%d", resdata->num); +} + + +static void +BooleanToString (RESOURCE_DATA *resdata, char *buf, unsigned int size) +{ + snprintf (buf, size, "%s", resdata->num ? "true" : "false"); +} + RESOURCE_INDEX InitResourceSystem (void) { @@ -176,10 +195,10 @@ _set_current_index_header (ndx); - InstallResTypeVectors ("UNKNOWNRES", UseDescriptorAsRes, NULL); - InstallResTypeVectors ("STRING", UseDescriptorAsRes, NULL); - InstallResTypeVectors ("INT32", DescriptorToInt, NULL); - InstallResTypeVectors ("BOOLEAN", DescriptorToBoolean, NULL); + InstallResTypeVectors ("UNKNOWNRES", UseDescriptorAsRes, NULL, NULL); + InstallResTypeVectors ("STRING", UseDescriptorAsRes, NULL, RawDescriptor); + InstallResTypeVectors ("INT32", DescriptorToInt, NULL, IntToString); + InstallResTypeVectors ("BOOLEAN", DescriptorToBoolean, NULL, BooleanToString); InstallGraphicResTypes (); InstallStringTableResType (); InstallAudioResTypes (); @@ -190,12 +209,58 @@ } void -LoadResourceIndex (uio_DirHandle *dir, const char *rmpfile) +LoadResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *prefix) { - PropFile_from_filename (dir, rmpfile, process_resource_desc, NULL); + PropFile_from_filename (dir, rmpfile, process_resource_desc, prefix); } void +SaveResourceIndex (uio_DirHandle *dir, const char *rmpfile, const char *root, BOOLEAN strip_root) +{ + uio_Stream *f; + CharHashTable_Iterator *it; + unsigned int prefix_len; + + f = res_OpenResFile (dir, rmpfile, "wb"); + if (!f) { + /* TODO: Warning message */ + return; + } + prefix_len = root ? strlen (root) : 0; + for (it = CharHashTable_getIterator (_get_current_index_header ()->map); + !CharHashTable_iteratorDone (it); + it = CharHashTable_iteratorNext (it)) { + char *key = CharHashTable_iteratorKey (it); + if (!root || !strncmp (root, key, prefix_len)) { + ResourceDesc *value = CharHashTable_iteratorValue (it); + if (!value) { + log_add(log_Warning, "Resource %s had no value", key); + } else if (!value->vtable) { + log_add(log_Warning, "Resource %s had no type", key); + } else if (value->vtable->toString) { + char buf[256]; + value->vtable->toString (&value->resdata, buf, 256); + buf[255]=0; + if (root && strip_root) { + WriteResFile (key+prefix_len, 1, strlen (key) - prefix_len, f); + } else { + WriteResFile (key, 1, strlen (key), f); + } + PutResFileChar(' ', f); + PutResFileChar('=', f); + PutResFileChar(' ', f); + WriteResFile (value->vtable->resType, 1, strlen (value->vtable->resType), f); + PutResFileChar(':', f); + WriteResFile (buf, 1, strlen (buf), f); + PutResFileNewline(f); + } + } + } + res_CloseResFile (f); + CharHashTable_freeIterator (it); +} + +void UninitResourceSystem (void) { freeResourceIndex (_get_current_index_header ()); @@ -204,7 +269,7 @@ BOOLEAN InstallResTypeVectors (const char *resType, ResourceLoadFun *loadFun, - ResourceFreeFun *freeFun) + ResourceFreeFun *freeFun, ResourceStringFun *stringFun) { ResourceHandlers *handlers; ResourceDesc *result; @@ -223,6 +288,7 @@ } handlers->loadFun = loadFun; handlers->freeFun = freeFun; + handlers->toString = stringFun; handlers->resType = resType; result = HMalloc (sizeof (ResourceDesc)); Modified: trunk/sc2/src/sc2code/libs/sound/resinst.c =================================================================== --- trunk/sc2/src/sc2code/libs/sound/resinst.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/sound/resinst.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -33,8 +33,8 @@ BOOLEAN InstallAudioResTypes (void) { - InstallResTypeVectors ("SNDRES", GetSoundBankFileData, _ReleaseSoundBankData); - InstallResTypeVectors ("MUSICRES", GetMusicFileData, _ReleaseMusicData); + InstallResTypeVectors ("SNDRES", GetSoundBankFileData, _ReleaseSoundBankData, NULL); + InstallResTypeVectors ("MUSICRES", GetMusicFileData, _ReleaseMusicData, NULL); return (TRUE); } Modified: trunk/sc2/src/sc2code/libs/strings/sresins.c =================================================================== --- trunk/sc2/src/sc2code/libs/strings/sresins.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/strings/sresins.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -33,9 +33,9 @@ BOOLEAN InstallStringTableResType (void) { - InstallResTypeVectors ("STRTAB", GetStringTableFileData, FreeResourceData); - InstallResTypeVectors ("BINTAB", GetBinaryTableFileData, FreeResourceData); - InstallResTypeVectors ("CONVERSATION", _GetConversationData, FreeResourceData); + InstallResTypeVectors ("STRTAB", GetStringTableFileData, FreeResourceData, NULL); + InstallResTypeVectors ("BINTAB", GetBinaryTableFileData, FreeResourceData, NULL); + InstallResTypeVectors ("CONVERSATION", _GetConversationData, FreeResourceData, NULL); return TRUE; } Modified: trunk/sc2/src/sc2code/libs/video/vresins.c =================================================================== --- trunk/sc2/src/sc2code/libs/video/vresins.c 2009-01-03 22:22:06 UTC (rev 3106) +++ trunk/sc2/src/sc2code/libs/video/vresins.c 2009-02-08 09:27:07 UTC (rev 3107) @@ -159,7 +159,7 @@ BOOLEAN InstallVideoResType (void) { - InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData); + InstallResTypeVectors ("3DOVID", GetLegacyVideoData, FreeLegacyVideoData, NULL); return TRUE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-07 02:44:45
|
Revision: 3187 http://sc2.svn.sourceforge.net/sc2/?rev=3187&view=rev Author: avolkov Date: 2009-10-07 02:44:38 +0000 (Wed, 07 Oct 2009) Log Message: ----------- Ignore files and hidden dirs which are not actually addons Modified Paths: -------------- trunk/sc2/src/options.c trunk/sc2/src/options.h Modified: trunk/sc2/src/options.c =================================================================== --- trunk/sc2/src/options.c 2009-10-07 00:30:11 UTC (rev 3186) +++ trunk/sc2/src/options.c 2009-10-07 02:44:38 UTC (rev 3187) @@ -64,8 +64,6 @@ char baseContentPath[PATH_MAX]; -uio_DirList *availableAddons; - extern uio_Repository *repository; extern uio_DirHandle *rootDir; @@ -358,9 +356,8 @@ uio_DirHandle *addonsDir; static uio_AutoMount *autoMount[] = { NULL }; uio_MountHandle *mountHandle; + uio_DirList *availableAddons; - availableAddons = NULL; - if (addonDirName != NULL) { mountHandle = uio_mountDir (repository, "addons", @@ -396,22 +393,37 @@ if (availableAddons != NULL) { int i, count; - count = availableAddons->numNames; - if (count != 1) + // count the actual addon dirs + count = 0; + for (i = 0; i < availableAddons->numNames; ++i) { - log_add (log_Info, "%d available addon packs.", count); + struct stat sb; + + if (availableAddons->names[i][0] == '.' || + uio_stat (addonsDir, availableAddons->names[i], &sb) == -1 + || !S_ISDIR (sb.st_mode)) + { // this dir entry ignored + availableAddons->names[i] = NULL; + continue; + } + ++count; } - else + log_add (log_Info, "%d available addon pack%s.", count, + count == 1 ? "" : "s"); + + count = 0; + for (i = 0; i < availableAddons->numNames; ++i) { - log_add (log_Info, "1 available addon pack."); - } - for (i = 0; i < count; i++) - { static char mountname[128]; uio_DirHandle *addonDir; const char *addon = availableAddons->names[i]; - log_add (log_Info, " %d. %s", i+1, addon); + + if (!addon) + continue; + + ++count; + log_add (log_Info, " %d. %s", count, addon); snprintf(mountname, 128, "addons/%s", addon); mountname[127]=0; @@ -433,8 +445,6 @@ } uio_DirList_free (availableAddons); - availableAddons = NULL; - uio_closeDir (addonsDir); } Modified: trunk/sc2/src/options.h =================================================================== --- trunk/sc2/src/options.h 2009-10-07 00:30:11 UTC (rev 3186) +++ trunk/sc2/src/options.h 2009-10-07 02:44:38 UTC (rev 3187) @@ -50,7 +50,6 @@ extern uio_DirHandle *meleeDir; extern char baseContentPath[PATH_MAX]; -extern uio_DirList *availableAddons; extern const char **optAddons; /* These get edited by TEXTENTRY widgets, so they should have room to This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-09 15:26:24
|
Revision: 3210 http://sc2.svn.sourceforge.net/sc2/?rev=3210&view=rev Author: avolkov Date: 2009-10-09 15:26:18 +0000 (Fri, 09 Oct 2009) Log Message: ----------- Source tree reorg, stage 1: moving libs/ out of sc2code/ Added Paths: ----------- trunk/sc2/src/libs/ Removed Paths: ------------- trunk/sc2/src/sc2code/libs/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-09 16:32:22
|
Revision: 3212 http://sc2.svn.sourceforge.net/sc2/?rev=3212&view=rev Author: avolkov Date: 2009-10-09 16:32:11 +0000 (Fri, 09 Oct 2009) Log Message: ----------- Source tree reorg, stage 2: renaming sc2code/ to uqm/ Added Paths: ----------- trunk/sc2/src/uqm/ Removed Paths: ------------- trunk/sc2/src/sc2code/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-09 22:08:44
|
Revision: 3216 http://sc2.svn.sourceforge.net/sc2/?rev=3216&view=rev Author: avolkov Date: 2009-10-09 22:08:38 +0000 (Fri, 09 Oct 2009) Log Message: ----------- MSVC project dir thought to be MIA was actually AWOL hanging out here. Now it has been court-martialed and executed Modified Paths: -------------- trunk/sc2/src/uqm.c Removed Paths: ------------- trunk/sc2/src/..\build\msvc6/ Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-09 20:38:29 UTC (rev 3215) +++ trunk/sc2/src/uqm.c 2009-10-09 22:08:38 UTC (rev 3216) @@ -635,7 +635,7 @@ return EXIT_SUCCESS; } } - optind = 1; + optind = 0; return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-11 10:28:54
|
Revision: 3220 http://sc2.svn.sourceforge.net/sc2/?rev=3220&view=rev Author: avolkov Date: 2009-10-11 10:28:47 +0000 (Sun, 11 Oct 2009) Log Message: ----------- Graphics lib cleanup: don't include stuff from uqm/, so things moved around Modified Paths: -------------- trunk/sc2/src/libs/gfxlib.h trunk/sc2/src/libs/graphics/drawable.c trunk/sc2/src/libs/graphics/font.c trunk/sc2/src/libs/graphics/gfx_common.c trunk/sc2/src/libs/graphics/sdl/3do_funcs.c trunk/sc2/src/libs/graphics/sdl/sdl_common.c trunk/sc2/src/libs/graphics/sdl/sdl_common.h trunk/sc2/src/libs/graphics/tfb_draw.c trunk/sc2/src/libs/graphics/widgets.c trunk/sc2/src/libs/graphics/widgets.h trunk/sc2/src/uqm/confirm.c trunk/sc2/src/uqm/intro.c trunk/sc2/src/uqm/setupmenu.c trunk/sc2/src/uqm/starcon.c trunk/sc2/src/uqm/starcon.h trunk/sc2/src/uqm.c Modified: trunk/sc2/src/libs/gfxlib.h =================================================================== --- trunk/sc2/src/libs/gfxlib.h 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/gfxlib.h 2009-10-11 10:28:47 UTC (rev 3220) @@ -220,7 +220,7 @@ extern FRAME SetEquFrameIndex (FRAME DstFrame, FRAME SrcFrame); extern FRAME IncFrameIndex (FRAME Frame); extern FRAME DecFrameIndex (FRAME Frame); -extern DRAWABLE RotateFrame (FRAME Frame, COUNT angle); +extern DRAWABLE RotateFrame (FRAME Frame, int angle_deg); extern void SetFrameTransparentColor (FRAME Frame, COLOR c32k); extern FRAME CaptureDrawable (DRAWABLE Drawable); Modified: trunk/sc2/src/libs/graphics/drawable.c =================================================================== --- trunk/sc2/src/libs/graphics/drawable.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/drawable.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -19,11 +19,13 @@ #include "gfxintrn.h" #include "libs/misc.h" #include "tfb_draw.h" -#include "libs/mathlib.h" #include "gfxother.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/units.h" +#include <math.h> +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + FRAME _CurFramePtr; FRAME @@ -197,13 +199,13 @@ } DRAWABLE -RotateFrame (FRAME Frame, COUNT angle) +RotateFrame (FRAME Frame, int angle_deg) { DRAWABLE Drawable; FRAME RotFramePtr; - SIZE dx, dy; - SIZE d; - COUNT organg; + double dx, dy; + double d; + double angle = angle_deg * M_PI / 180; Drawable = _request_drawable (1, RAM_DRAWABLE, WANT_PIXMAP, 0, 0); if (!Drawable) @@ -216,22 +218,22 @@ } RotFramePtr->image = TFB_DrawImage_New_Rotated ( - Frame->image, -ANGLE_TO_DEGREES (angle)); + Frame->image, angle_deg); SetFrameBounds (RotFramePtr, RotFramePtr->image->extent.width, RotFramePtr->image->extent.height); /* now we need to rotate the hot-spot, eww */ dx = Frame->HotSpot.x - (GetFrameWidth (Frame) / 2); dy = Frame->HotSpot.y - (GetFrameHeight (Frame) / 2); - d = square_root ((long)dx*dx + (long)dy*dy); - if (d != 0) + d = sqrt ((double)dx*dx + (double)dy*dy); + if ((int)d != 0) { - organg = ARCTAN (dx, dy); - dx = COSINE (organg + angle, d); - dy = SINE (organg + angle, d); + double organg = atan2 (-dy, dx); + dx = cos (organg + angle) * d; + dy = -sin (organg + angle) * d; } - RotFramePtr->HotSpot.x = (GetFrameWidth (RotFramePtr) / 2) + dx; - RotFramePtr->HotSpot.y = (GetFrameHeight (RotFramePtr) / 2) + dy; + RotFramePtr->HotSpot.x = (GetFrameWidth (RotFramePtr) / 2) + (int)dx; + RotFramePtr->HotSpot.y = (GetFrameHeight (RotFramePtr) / 2) + (int)dy; ReleaseDrawable (RotFramePtr); Modified: trunk/sc2/src/libs/graphics/font.c =================================================================== --- trunk/sc2/src/libs/graphics/font.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/font.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -24,10 +24,7 @@ extern void FixContextFontEffect (void); static inline TFB_Char *getCharFrame (FONT_DESC *fontPtr, wchar_t ch); -static BYTE char_delta_array[MAX_DELTAS]; - // XXX: This does not seem to be used. - FONT SetContextFont (FONT Font) { @@ -115,6 +112,7 @@ BOOLEAN TextRect (TEXT *lpText, RECT *pRect, BYTE *pdelta) { + BYTE char_delta_array[MAX_DELTAS]; FONT FontPtr; FontPtr = _CurFontPtr; Modified: trunk/sc2/src/libs/graphics/gfx_common.c =================================================================== --- trunk/sc2/src/libs/graphics/gfx_common.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/gfx_common.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -16,8 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "libs/graphics/gfxintrn.h" -#include "libs/input/inpintrn.h" +#include "gfxintrn.h" #include "libs/graphics/gfx_common.h" #include "libs/graphics/drawcmd.h" Modified: trunk/sc2/src/libs/graphics/sdl/3do_funcs.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/3do_funcs.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/sdl/3do_funcs.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -24,8 +24,6 @@ #include "primitives.h" #include "libs/graphics/drawcmd.h" #include "libs/graphics/tfb_draw.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/units.h" int batch_depth = 0; @@ -109,15 +107,15 @@ rect->corner.y = 0; } - if (rect->corner.x + rect->extent.width + expansion <= SCREEN_WIDTH) + if (rect->corner.x + rect->extent.width + expansion <= ScreenWidth) rect->extent.width += expansion; else - rect->extent.width = SCREEN_WIDTH - rect->corner.x; + rect->extent.width = ScreenWidth - rect->corner.x; - if (rect->corner.y + rect->extent.height + expansion <= SCREEN_HEIGHT) + if (rect->corner.y + rect->extent.height + expansion <= ScreenHeight) rect->extent.height += expansion; else - rect->extent.height = SCREEN_HEIGHT - rect->corner.y; + rect->extent.height = ScreenHeight - rect->corner.y; } void Modified: trunk/sc2/src/libs/graphics/sdl/sdl_common.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -26,15 +26,13 @@ #include "options.h" #include "uqmversion.h" #include "libs/graphics/drawcmd.h" -#include "libs/input/sdl/vcontrol.h" +#include "libs/input/sdl/input.h" + // for ProcessInputEvent() #include "bbox.h" #include "port.h" #include "libs/uio.h" #include "libs/log.h" #include "libs/vidlib.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/controls.h" -#include "uqm/uqmdebug.h" #include SDL_INCLUDE(SDL_thread.h) SDL_Surface *SDL_Video; @@ -216,29 +214,6 @@ break; } } - - if (ImmediateInputState.menu[KEY_ABORT]) - { - log_showBox (false, false); - exit (EXIT_SUCCESS); - } - - if (ImmediateInputState.menu[KEY_FULLSCREEN]) - { - int flags = GfxFlags ^ TFB_GFXFLAGS_FULLSCREEN; - FlushInput (); - TFB_ReInitGraphics (GraphicsDriver, flags, ScreenWidthActual, - ScreenHeightActual); - TFB_SwapBuffers (TFB_REDRAW_YES); - } - -#if defined(DEBUG) || defined(USE_DEBUG_KEY) - if (ImmediateInputState.menu[KEY_DEBUG]) - { - FlushInput (); - debugKeyPressed (); - } -#endif /* DEBUG */ } static BOOLEAN system_box_active = 0; @@ -900,6 +875,7 @@ exit (EXIT_FAILURE); } } + TFB_SwapBuffers (TFB_REDRAW_YES); break; } case TFB_DRAWCOMMANDTYPE_CALLBACK: Modified: trunk/sc2/src/libs/graphics/sdl/sdl_common.h =================================================================== --- trunk/sc2/src/libs/graphics/sdl/sdl_common.h 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/sdl/sdl_common.h 2009-10-11 10:28:47 UTC (rev 3220) @@ -24,12 +24,9 @@ #include SDL_INCLUDE(SDL_byteorder.h) #include SDL_IMAGE_INCLUDE(SDL_image.h) -#include "libs/graphics/gfxintrn.h" +#include "../gfxintrn.h" #include "libs/graphics/tfb_draw.h" -#include "libs/input/inpintrn.h" #include "libs/graphics/gfx_common.h" -#include "libs/input/sdl/input.h" -#include "libs/threadlib.h" // The Graphics Backend vtable typedef struct _tfb_graphics_backend { Modified: trunk/sc2/src/libs/graphics/tfb_draw.c =================================================================== --- trunk/sc2/src/libs/graphics/tfb_draw.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/tfb_draw.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -18,8 +18,6 @@ #include "tfb_draw.h" #include "drawcmd.h" #include "libs/log.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/units.h" static const HOT_SPOT NullHs = {0, 0}; @@ -51,8 +49,8 @@ if (!rect) { locRect.corner.x = locRect.corner.y = 0; - locRect.extent.width = SCREEN_WIDTH; - locRect.extent.height = SCREEN_HEIGHT; + locRect.extent.width = ScreenWidth; + locRect.extent.height = ScreenHeight; rect = &locRect; } @@ -143,8 +141,8 @@ if (!r) { locRect.corner.x = locRect.corner.y = 0; - locRect.extent.width = SCREEN_WIDTH; - locRect.extent.height = SCREEN_HEIGHT; + locRect.extent.width = ScreenWidth; + locRect.extent.height = ScreenHeight; r = &locRect; } Modified: trunk/sc2/src/libs/graphics/widgets.c =================================================================== --- trunk/sc2/src/libs/graphics/widgets.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/widgets.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -17,10 +17,6 @@ #include "gfx_common.h" #include "widgets.h" #include "libs/strlib.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/colors.h" -#include "uqm/setup.h" -#include "uqm/units.h" WIDGET *widget_focus = NULL; @@ -38,6 +34,12 @@ #define WIDGET_DIALOG_TEXT_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00) +static COLOR win_bg_clr = BUILD_COLOR (MAKE_RGB15 (0x18, 0x18, 0x1F), 0x00); +static COLOR win_medium_clr = BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x18), 0x00); +static COLOR win_dark_clr = BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x10), 0x00); + +static FONT cur_font; + void DrawShadowedBox (RECT *r, COLOR bg, COLOR dark, COLOR medium) { @@ -78,15 +80,18 @@ } void -DrawLabelAsWindow(WIDGET_LABEL *label) +DrawLabelAsWindow (WIDGET_LABEL *label) { COLOR oldfg = SetContextForeGroundColor (WIDGET_DIALOG_TEXT_COLOR); - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); RECT r; TEXT t; int i, win_w, win_h; + if (cur_font) + oldfont = SetContextFont (cur_font); + /* Compute the dimensions of the label */ win_h = label->height ((WIDGET *)label) + 16; win_w = 0; @@ -101,12 +106,11 @@ win_w = (win_w * 6) + 16; BatchGraphics (); - r.corner.x = (SCREEN_WIDTH - win_w) >> 1; - r.corner.y = (SCREEN_HEIGHT - win_h) >> 1; + r.corner.x = (ScreenWidth - win_w) >> 1; + r.corner.y = (ScreenHeight - win_h) >> 1; r.extent.width = win_w; r.extent.height = win_h; - DrawShadowedBox (&r, SHADOWBOX_BACKGROUND_COLOR, - SHADOWBOX_DARK_COLOR, SHADOWBOX_MEDIUM_COLOR); + DrawShadowedBox (&r, win_bg_clr, win_dark_clr, win_medium_clr); t.baseline.x = r.corner.x + (r.extent.width >> 1); t.baseline.y = r.corner.y + 16; @@ -122,24 +126,44 @@ UnbatchGraphics (); SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldfg); } +void +Widget_SetWindowColors (COLOR bg, COLOR dark, COLOR medium) +{ + win_bg_clr = bg; + win_dark_clr = dark; + win_medium_clr = medium; +} + +FONT +Widget_SetFont (FONT newFont) +{ + FONT oldFont = cur_font; + cur_font = newFont; + return oldFont; +} + static void Widget_DrawToolTips (int numlines, const char **tips) { RECT r; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); COLOR oldtext = SetContextForeGroundColor (WIDGET_INACTIVE_SELECTED_COLOR); TEXT t; int i; + if (cur_font) + oldfont = SetContextFont (cur_font); + r.corner.x = 2; r.corner.y = 2; - r.extent.width = SCREEN_WIDTH - 4; - r.extent.height = SCREEN_HEIGHT - 4; + r.extent.width = ScreenWidth - 4; + r.extent.height = ScreenHeight - 4; t.align = ALIGN_CENTER; t.CharCount = ~0; @@ -154,7 +178,8 @@ } SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); } @@ -164,17 +189,20 @@ RECT r; COLOR title, oldtext; COLOR inactive, default_color, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; int widget_index, height, widget_y; WIDGET_MENU_SCREEN *self = (WIDGET_MENU_SCREEN *)_self; + + if (cur_font) + oldfont = SetContextFont (cur_font); r.corner.x = 2; r.corner.y = 2; - r.extent.width = SCREEN_WIDTH - 4; - r.extent.height = SCREEN_HEIGHT - 4; + r.extent.width = ScreenWidth - 4; + r.extent.height = ScreenHeight - 4; title = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; @@ -204,7 +232,7 @@ height -= 8; - widget_y = (SCREEN_HEIGHT - height) >> 1; + widget_y = (ScreenHeight - height) >> 1; for (widget_index = 0; widget_index < self->num_children; widget_index++) { WIDGET *c = self->child[widget_index]; @@ -213,7 +241,8 @@ } SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); (void) x; @@ -226,10 +255,13 @@ WIDGET_CHOICE *self = (WIDGET_CHOICE *)_self; COLOR oldtext; COLOR inactive, default_color, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; int i, home_x, home_y; + + if (cur_font) + oldfont = SetContextFont (cur_font); default_color = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; @@ -250,12 +282,12 @@ } font_DrawText (&t); - home_x = t.baseline.x + 3 * (SCREEN_WIDTH / ((self->maxcolumns + 1) * 2)); + home_x = t.baseline.x + 3 * (ScreenWidth / ((self->maxcolumns + 1) * 2)); home_y = t.baseline.y; t.align = ALIGN_CENTER; for (i = 0; i < self->numopts; i++) { - t.baseline.x = home_x + ((i % 3) * (SCREEN_WIDTH / (self->maxcolumns + 1))); + t.baseline.x = home_x + ((i % 3) * (ScreenWidth / (self->maxcolumns + 1))); t.baseline.y = home_y + (8 * (i / 3)); t.pStr = self->options[i].optname; if ((widget_focus == _self) && @@ -275,7 +307,8 @@ font_DrawText (&t); } SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); } @@ -285,9 +318,12 @@ WIDGET_BUTTON *self = (WIDGET_BUTTON *)_self; COLOR oldtext; COLOR inactive, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; + + if (cur_font) + oldfont = SetContextFont (cur_font); selected = WIDGET_ACTIVE_COLOR; inactive = WIDGET_INACTIVE_COLOR; @@ -308,7 +344,8 @@ } font_DrawText (&t); SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); (void) x; } @@ -318,10 +355,13 @@ { WIDGET_LABEL *self = (WIDGET_LABEL *)_self; COLOR oldtext = SetContextForeGroundColor (WIDGET_INACTIVE_SELECTED_COLOR); - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; int i; + + if (cur_font) + oldfont = SetContextFont (cur_font); t.baseline.x = 160; t.baseline.y = y; @@ -335,7 +375,8 @@ t.baseline.y += 8; } SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); (void) x; } @@ -346,11 +387,14 @@ WIDGET_SLIDER *self = (WIDGET_SLIDER *)_self; COLOR oldtext; COLOR inactive, default_color, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; RECT r; - int tick = (SCREEN_WIDTH - x) / 8; + int tick = (ScreenWidth - x) / 8; + + if (cur_font) + oldfont = SetContextFont (cur_font); default_color = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; @@ -388,7 +432,8 @@ (*self->draw_value)(self, t.baseline.x + 7 * tick, t.baseline.y); SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); } @@ -415,9 +460,12 @@ WIDGET_TEXTENTRY *self = (WIDGET_TEXTENTRY *)_self; COLOR oldtext; COLOR inactive, default_color, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; + + if (cur_font) + oldfont = SetContextFont (cur_font); default_color = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; @@ -538,7 +586,8 @@ UnbatchGraphics (); SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); } @@ -548,10 +597,13 @@ WIDGET_CONTROLENTRY *self = (WIDGET_CONTROLENTRY *)_self; COLOR oldtext; COLOR inactive, default_color, selected; - FONT oldfont = SetContextFont (StarConFont); + FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; int i, home_x, home_y; + + if (cur_font) + oldfont = SetContextFont (cur_font); default_color = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; @@ -572,13 +624,13 @@ } font_DrawText (&t); - // 3 * SCREEN_WIDTH / ((self->maxcolumns + 1) * 2)) as per CHOICE, but only two options. - home_x = t.baseline.x + (SCREEN_WIDTH / 2); + // 3 * ScreenWidth / ((self->maxcolumns + 1) * 2)) as per CHOICE, but only two options. + home_x = t.baseline.x + (ScreenWidth / 2); home_y = t.baseline.y; t.align = ALIGN_CENTER; for (i = 0; i < 2; i++) { - t.baseline.x = home_x + ((i % 3) * (SCREEN_WIDTH / 3)); // self->maxcolumns + 1 as per CHOICE. + t.baseline.x = home_x + ((i % 3) * (ScreenWidth / 3)); // self->maxcolumns + 1 as per CHOICE. t.baseline.y = home_y + (8 * (i / 3)); t.pStr = self->controlname[i]; if (!t.pStr[0]) @@ -597,7 +649,8 @@ font_DrawText (&t); } SetContextFontEffect (oldFontEffect); - SetContextFont (oldfont); + if (oldfont) + SetContextFont (oldfont); SetContextForeGroundColor (oldtext); } @@ -611,7 +664,7 @@ Widget_HeightFullScreen (WIDGET *_self) { (void)_self; - return SCREEN_HEIGHT; + return ScreenHeight; } int @@ -632,7 +685,7 @@ Widget_WidthFullScreen (WIDGET *_self) { (void)_self; - return SCREEN_WIDTH; + return ScreenWidth; } int Modified: trunk/sc2/src/libs/graphics/widgets.h =================================================================== --- trunk/sc2/src/libs/graphics/widgets.h 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/libs/graphics/widgets.h 2009-10-11 10:28:47 UTC (rev 3220) @@ -176,8 +176,11 @@ } WIDGET_CONTROLENTRY; void DrawShadowedBox (RECT *r, COLOR bg, COLOR dark, COLOR medium); -void DrawLabelAsWindow(WIDGET_LABEL *label); +void DrawLabelAsWindow (WIDGET_LABEL *label); +void Widget_SetWindowColors (COLOR bg, COLOR dark, COLOR medium); +FONT Widget_SetFont (FONT newFont); + int Widget_Event (int event); /* Methods for filling in widgets with */ Modified: trunk/sc2/src/uqm/confirm.c =================================================================== --- trunk/sc2/src/uqm/confirm.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm/confirm.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -207,7 +207,7 @@ } void -DoPopupWindow(const char *msg) +DoPopupWindow (const char *msg) { stringbank *bank = StringBank_Create (); const char *lines[30]; @@ -253,6 +253,9 @@ s.origin = r.corner; s.frame = F; + Widget_SetFont (StarConFont); + Widget_SetWindowColors (SHADOWBOX_BACKGROUND_COLOR, SHADOWBOX_DARK_COLOR, + SHADOWBOX_MEDIUM_COLOR); DrawLabelAsWindow (&label); GetMenuSounds (&s0, &s1); Modified: trunk/sc2/src/uqm/intro.c =================================================================== --- trunk/sc2/src/uqm/intro.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm/intro.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -634,7 +634,7 @@ { DestroyDrawable (ReleaseDrawable (pPIS->RotatedFrame)); pPIS->RotatedFrame = CaptureDrawable ( - RotateFrame (s.frame, DEGREES_TO_ANGLE (angle))); + RotateFrame (s.frame, -angle)); pPIS->LastAngle = angle; pPIS->LastDrawKind = draw_what; } Modified: trunk/sc2/src/uqm/setupmenu.c =================================================================== --- trunk/sc2/src/uqm/setupmenu.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm/setupmenu.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -22,6 +22,7 @@ #include "options.h" #include "setup.h" #include "sounds.h" +#include "colors.h" #include "libs/gfxlib.h" #include "libs/graphics/gfx_common.h" #include "libs/graphics/widgets.h" @@ -434,6 +435,9 @@ SetDefaultMenuRepeatDelay (); pInputState->NextTime = GetTimeCounter (); SetDefaults (); + Widget_SetFont (StarConFont); + Widget_SetWindowColors (SHADOWBOX_BACKGROUND_COLOR, + SHADOWBOX_DARK_COLOR, SHADOWBOX_MEDIUM_COLOR); current = NULL; next = (WIDGET *)(&menus[0]); Modified: trunk/sc2/src/uqm/starcon.c =================================================================== --- trunk/sc2/src/uqm/starcon.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm/starcon.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -35,6 +35,9 @@ #include "uqmdebug.h" #include "libs/tasklib.h" #include "libs/log.h" +#include "libs/gfxlib.h" +#include "libs/graphics/gfx_common.h" +#include "libs/inplib.h" #include "uqmversion.h" #include "options.h" @@ -105,6 +108,34 @@ GLOBAL (CurrentActivity) |= CHECK_ABORT; } +void +ProcessUtilityKeys (void) +{ + if (ImmediateInputState.menu[KEY_ABORT]) + { + log_showBox (false, false); + exit (EXIT_SUCCESS); + } + + if (ImmediateInputState.menu[KEY_FULLSCREEN]) + { + int flags = GfxFlags ^ TFB_GFXFLAGS_FULLSCREEN; + // clear ImmediateInputState so we don't repeat this next frame + FlushInput (); + TFB_DrawScreen_ReinitVideo (GraphicsDriver, flags, ScreenWidthActual, + ScreenHeightActual); + } + +#if defined(DEBUG) || defined(USE_DEBUG_KEY) + if (ImmediateInputState.menu[KEY_DEBUG]) + { + // clear ImmediateInputState so we don't repeat this next frame + FlushInput (); + debugKeyPressed (); + } +#endif /* DEBUG */ +} + /* TODO: Remove these declarations once threading is gone. */ extern int snddriver, soundflags; Modified: trunk/sc2/src/uqm/starcon.h =================================================================== --- trunk/sc2/src/uqm/starcon.h 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm/starcon.h 2009-10-11 10:28:47 UTC (rev 3220) @@ -19,6 +19,7 @@ extern volatile int MainExited; extern void SignalStopMainThread (void); +extern void ProcessUtilityKeys (void); extern int Starcon2Main (void *threadArg); extern void FreeGameData (void); Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-09 22:26:07 UTC (rev 3219) +++ trunk/sc2/src/uqm.c 2009-10-11 10:28:47 UTC (rev 3220) @@ -495,6 +495,7 @@ } TFB_ProcessEvents (); + ProcessUtilityKeys (); ProcessThreadLifecycles (); TFB_FlushGraphics (); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-11 21:42:13
|
Revision: 3222 http://sc2.svn.sourceforge.net/sc2/?rev=3222&view=rev Author: avolkov Date: 2009-10-11 21:42:05 +0000 (Sun, 11 Oct 2009) Log Message: ----------- Cleanup of memlib and its use: removed legacy handle code, moved memory alloc funcs into memlib.h Modified Paths: -------------- trunk/sc2/src/abxadec/abxaud.c trunk/sc2/src/libs/decomp/lzdecode.c trunk/sc2/src/libs/decomp/lzh.h trunk/sc2/src/libs/file/dirs.c trunk/sc2/src/libs/file/files.c trunk/sc2/src/libs/file/temp.c trunk/sc2/src/libs/graphics/context.h trunk/sc2/src/libs/graphics/drawable.c trunk/sc2/src/libs/graphics/font.h trunk/sc2/src/libs/graphics/gfx_common.c trunk/sc2/src/libs/graphics/gfx_common.h trunk/sc2/src/libs/graphics/sdl/3do_getbody.c trunk/sc2/src/libs/graphics/sdl/canvas.c trunk/sc2/src/libs/graphics/sdl/dcqueue.c trunk/sc2/src/libs/graphics/sdl/rotozoom.c trunk/sc2/src/libs/graphics/sdl/sdl_common.c trunk/sc2/src/libs/graphics/sdl/sdluio.c trunk/sc2/src/libs/graphics/tfb_draw.c trunk/sc2/src/libs/input/sdl/input.c trunk/sc2/src/libs/input/sdl/vcontrol.c trunk/sc2/src/libs/list/list.c trunk/sc2/src/libs/math/random2.c trunk/sc2/src/libs/memlib.h trunk/sc2/src/libs/memory/w_memlib.c trunk/sc2/src/libs/misc.h trunk/sc2/src/libs/reslib.h trunk/sc2/src/libs/resource/direct.c trunk/sc2/src/libs/resource/getres.c trunk/sc2/src/libs/resource/loadres.c trunk/sc2/src/libs/resource/resinit.c trunk/sc2/src/libs/sound/decoders/aiffaud.c trunk/sc2/src/libs/sound/decoders/decoder.c trunk/sc2/src/libs/sound/decoders/dukaud.c trunk/sc2/src/libs/sound/decoders/modaud.c trunk/sc2/src/libs/sound/decoders/oggaud.c trunk/sc2/src/libs/sound/decoders/wav.c trunk/sc2/src/libs/sound/mixer/mixer.c trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c trunk/sc2/src/libs/sound/music.c trunk/sc2/src/libs/sound/openal/audiodrv_openal.c trunk/sc2/src/libs/sound/sfx.c trunk/sc2/src/libs/sound/sndintrn.h trunk/sc2/src/libs/sound/sound.c trunk/sc2/src/libs/sound/sound.h trunk/sc2/src/libs/sound/stream.c trunk/sc2/src/libs/sound/trackplayer.c trunk/sc2/src/libs/strings/getstr.c trunk/sc2/src/libs/strings/strings.c trunk/sc2/src/libs/threads/pthread/posixthreads.c trunk/sc2/src/libs/threads/sdl/sdlthreads.c trunk/sc2/src/libs/threads/thrcommon.c trunk/sc2/src/libs/video/dukvid.c trunk/sc2/src/libs/video/video.c trunk/sc2/src/libs/video/video.h trunk/sc2/src/libs/video/videodec.c trunk/sc2/src/libs/video/vidplayer.c trunk/sc2/src/libs/video/vresins.c trunk/sc2/src/options.c trunk/sc2/src/uqm/battlecontrols.c trunk/sc2/src/uqm/displist.h trunk/sc2/src/uqm/dummy.c trunk/sc2/src/uqm/encount.c trunk/sc2/src/uqm/flash.c trunk/sc2/src/uqm/getchar.c trunk/sc2/src/uqm/loadmele.c trunk/sc2/src/uqm/netplay/checkbuf.c trunk/sc2/src/uqm/netplay/checksum.c trunk/sc2/src/uqm/planets/plangen.c trunk/sc2/src/uqm/planets/pstarmap.c trunk/sc2/src/uqm/process.c trunk/sc2/src/uqm/save.c trunk/sc2/src/uqm/setup.c trunk/sc2/src/uqm/setupmenu.c trunk/sc2/src/uqm/starcon.c trunk/sc2/src/uqm/state.c trunk/sc2/src/uqm/uqmdebug.c Modified: trunk/sc2/src/abxadec/abxaud.c =================================================================== --- trunk/sc2/src/abxadec/abxaud.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/abxadec/abxaud.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -29,7 +29,6 @@ #include <stdio.h> #include <string.h> #include <errno.h> -//#include "libs/misc.h" //#include "port.h" #include "types.h" #include "port.h" Modified: trunk/sc2/src/libs/decomp/lzdecode.c =================================================================== --- trunk/sc2/src/libs/decomp/lzdecode.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/decomp/lzdecode.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -28,7 +28,7 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> -#include "libs/decomp/lzh.h" +#include "lzh.h" #include "libs/reslib.h" PLZHCODE_DESC _lpCurCodeDesc; Modified: trunk/sc2/src/libs/decomp/lzh.h =================================================================== --- trunk/sc2/src/libs/decomp/lzh.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/decomp/lzh.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,7 @@ #define _LZH_H #include "libs/declib.h" -#include "libs/misc.h" +#include "libs/memlib.h" /* LZSS Parameters */ Modified: trunk/sc2/src/libs/file/dirs.c =================================================================== --- trunk/sc2/src/libs/file/dirs.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/file/dirs.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -26,7 +26,7 @@ #include "config.h" #include "filintrn.h" #include "libs/compiler.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/log.h" #ifdef HAVE_DRIVE_LETTERS Modified: trunk/sc2/src/libs/file/files.c =================================================================== --- trunk/sc2/src/libs/file/files.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/file/files.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -26,7 +26,7 @@ #include "config.h" #include "types.h" #include "filintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/log.h" static int copyError(uio_Handle *srcHandle, uio_Handle *dstHandle, Modified: trunk/sc2/src/libs/file/temp.c =================================================================== --- trunk/sc2/src/libs/file/temp.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/file/temp.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -29,7 +29,7 @@ #include "port.h" #include "libs/compiler.h" #include "libs/log.h" -#include "libs/misc.h" +#include "libs/memlib.h" static char *tempDirName; uio_DirHandle *tempDir; Modified: trunk/sc2/src/libs/graphics/context.h =================================================================== --- trunk/sc2/src/libs/graphics/context.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/context.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,6 +20,7 @@ #define _CONTEXT_H #include "tfb_draw.h" +#include "libs/memlib.h" typedef UWORD FBK_FLAGS; #define FBK_DIRTY (1 << 0) Modified: trunk/sc2/src/libs/graphics/drawable.c =================================================================== --- trunk/sc2/src/libs/graphics/drawable.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/drawable.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,7 +17,7 @@ */ #include "gfxintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "tfb_draw.h" #include "gfxother.h" #include <math.h> Modified: trunk/sc2/src/libs/graphics/font.h =================================================================== --- trunk/sc2/src/libs/graphics/font.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/font.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,8 @@ #ifndef _FONT_H #define _FONT_H +#include "libs/memlib.h" + #define MAX_DELTAS 100 typedef struct FontPage Modified: trunk/sc2/src/libs/graphics/gfx_common.c =================================================================== --- trunk/sc2/src/libs/graphics/gfx_common.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/gfx_common.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,8 @@ #include "gfxintrn.h" #include "libs/graphics/gfx_common.h" #include "libs/graphics/drawcmd.h" +#include "libs/misc.h" + // for TFB_DEBUG_HALT DISPLAY_INTERFACE *_pCurDisplay; //Not a function. Probably has to be initialized... Modified: trunk/sc2/src/libs/graphics/gfx_common.h =================================================================== --- trunk/sc2/src/libs/graphics/gfx_common.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/gfx_common.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -23,7 +23,6 @@ #include <stdlib.h> #include "libs/gfxlib.h" -#include "libs/misc.h" // driver for TFB_InitGraphics enum Modified: trunk/sc2/src/libs/graphics/sdl/3do_getbody.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/3do_getbody.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/3do_getbody.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -30,6 +30,7 @@ #include "libs/file.h" #include "libs/reslib.h" #include "libs/log.h" +#include "libs/memlib.h" #include "../font.h" #include "primitives.h" Modified: trunk/sc2/src/libs/graphics/sdl/canvas.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/canvas.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/canvas.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -21,6 +21,7 @@ #include "libs/graphics/sdl/primitives.h" #include "libs/graphics/tfb_draw.h" #include "libs/log.h" +#include "libs/memlib.h" #include "rotozoom.h" #include "options.h" #include "types.h" Modified: trunk/sc2/src/libs/graphics/sdl/dcqueue.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/dcqueue.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/dcqueue.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -25,6 +25,8 @@ #include "libs/graphics/drawcmd.h" #include "libs/graphics/sdl/dcqueue.h" #include "libs/log.h" +#include "libs/misc.h" + // for TFB_DEBUG_HALT static RecursiveMutex DCQ_Mutex; Modified: trunk/sc2/src/libs/graphics/sdl/rotozoom.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/rotozoom.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/rotozoom.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -13,7 +13,7 @@ #include <stdlib.h> #include <string.h> -#include "libs/misc.h" +#include "libs/memlib.h" #include "port.h" #include "rotozoom.h" Modified: trunk/sc2/src/libs/graphics/sdl/sdl_common.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -32,6 +32,7 @@ #include "port.h" #include "libs/uio.h" #include "libs/log.h" +#include "libs/memlib.h" #include "libs/vidlib.h" #include SDL_INCLUDE(SDL_thread.h) Modified: trunk/sc2/src/libs/graphics/sdl/sdluio.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/sdluio.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/sdl/sdluio.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,7 +22,7 @@ #include SDL_INCLUDE(SDL_error.h) #include SDL_INCLUDE(SDL_rwops.h) #include SDL_IMAGE_INCLUDE(SDL_image.h) -#include "libs/misc.h" +#include "libs/memlib.h" #include <errno.h> #include <string.h> Modified: trunk/sc2/src/libs/graphics/tfb_draw.c =================================================================== --- trunk/sc2/src/libs/graphics/tfb_draw.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/graphics/tfb_draw.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -18,7 +18,9 @@ #include "tfb_draw.h" #include "drawcmd.h" #include "libs/log.h" +#include "libs/memlib.h" + static const HOT_SPOT NullHs = {0, 0}; void Modified: trunk/sc2/src/libs/input/sdl/input.c =================================================================== --- trunk/sc2/src/libs/input/sdl/input.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/input/sdl/input.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -24,7 +24,7 @@ #include "libs/input/input_common.h" #include "libs/input/sdl/vcontrol.h" #include "libs/input/sdl/keynames.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/file.h" #include "libs/log.h" #include "libs/reslib.h" Modified: trunk/sc2/src/libs/input/sdl/vcontrol.c =================================================================== --- trunk/sc2/src/libs/input/sdl/vcontrol.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/input/sdl/vcontrol.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,7 @@ #include <string.h> #include <ctype.h> #include "vcontrol.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "keynames.h" #include "libs/log.h" #include "libs/reslib.h" Modified: trunk/sc2/src/libs/list/list.c =================================================================== --- trunk/sc2/src/libs/list/list.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/list/list.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -25,7 +25,7 @@ # include "list.h" #endif -#include "libs/misc.h" +#include "libs/memlib.h" #define malloc HMalloc #define free HFree #define realloc HRealloc Modified: trunk/sc2/src/libs/math/random2.c =================================================================== --- trunk/sc2/src/libs/math/random2.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/math/random2.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -24,7 +24,7 @@ #define RANDOM2_INTERNAL #include "random.h" -#include "libs/misc.h" +#include "libs/memlib.h" #define A 16807 /* a relatively prime number -- also M div Q */ Modified: trunk/sc2/src/libs/memlib.h =================================================================== --- trunk/sc2/src/libs/memlib.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/memlib.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,45 +19,15 @@ #ifndef _MEMLIB_H #define _MEMLIB_H -#include "libs/compiler.h" +#include "types.h" -extern BOOLEAN mem_init (void); -extern BOOLEAN mem_uninit (void); +extern bool mem_init (void); +extern bool mem_uninit (void); -#ifdef LEGACY_HANDLE_ALLOCATOR +extern void *HMalloc (int size); +extern void HFree (void *p); +extern void *HCalloc (int size); +extern void *HRealloc (void *p, int size); -#define NULL_HANDLE (MEM_HANDLE)(0L) - -typedef signed long MEM_SIZE; - -typedef SWORD MEM_HANDLE; -typedef UWORD MEM_FLAGS; - -#define DEFAULT_MEM_FLAGS (MEM_FLAGS)0 -#define MEM_PRIMARY (MEM_FLAGS)(1 << 8) -#define MEM_ZEROINIT (MEM_FLAGS)(1 << 9) -#define MEM_GRAPHICS (MEM_FLAGS)(1 << 10) -#define MEM_SOUND (MEM_FLAGS)(1 << 11) - -typedef struct mem_header { - MEM_HANDLE handle; -} _ALIGNED_ANY MEM_HEADER; -// _ALIGNED_ANY adds padding to the end of MEM_HEADER, so that the following -// address is aligned for any object (if the address of the MEM_HEADER -// itself is aligned for any object). - -#define GET_MEM_HEADER(addr) ((MEM_HEADER *) \ - (((char *) addr) - sizeof (MEM_HEADER))) - -extern MEM_HANDLE mem_allocate (MEM_SIZE size, MEM_FLAGS flags); -extern BOOLEAN mem_release (MEM_HANDLE handle); - -extern void* mem_lock (MEM_HANDLE handle); -extern BOOLEAN mem_unlock (MEM_HANDLE handle); - -extern MEM_SIZE mem_get_size (MEM_HANDLE handle); - -#endif /* LEGACY_HANDLE_ALLOCATOR */ - #endif /* _MEMLIB_H */ Modified: trunk/sc2/src/libs/memory/w_memlib.c =================================================================== --- trunk/sc2/src/libs/memory/w_memlib.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/memory/w_memlib.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,564 +20,31 @@ #include <stdlib.h> #include <stdarg.h> #include <string.h> -//#include "3d.h" -//#include "tool.h" -//#include "utils.h" -//#include "pcwin.h" -#include "libs/compiler.h" -#ifdef LEGACY_HANDLE_ALLOCATOR -#include "libs/threadlib.h" -#endif #include "libs/memlib.h" #include "libs/log.h" #include "libs/misc.h" -#ifdef LEGACY_HANDLE_ALLOCATOR -#define GetToolFrame() 1 - -//#define MEM_DEBUG - -#ifdef MEM_DEBUG -#include <crtdbg.h> -#endif - -#define LEAK_DEBUG - -#ifdef LEAK_DEBUG -BOOLEAN leak_debug; -int leak_idx = -1; -int leak_size = -1; -#endif -static Mutex _MemoryLock; - -//#define MAX_EXTENTS 100000 -#define MAX_EXTENTS (MEM_HANDLE) 32766 - // Changed to 32766 to get rid of warnings that an expression - // 'h <= MAX_EXTENTS' is always true due to limited range of - // MEM_HANDLE. - -/* Keep track of memory allocations. */ - -typedef struct _szMemoryNode { - void *memory; - struct _szMemoryNode *next; - MEM_HANDLE handle; - MEM_SIZE size; - int refcount; -} szMemoryNode; - -static szMemoryNode extents[MAX_EXTENTS]; -static szMemoryNode *freeListHead = NULL; - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** CheckMemory() -** -** DESCRIPTION -** Checks integrity of memory allocation: diagnostic only. -** Either aborts or spits messages to stdout if there's a -** problem. -** -** INPUT -** -** OUTPUT -** -** HISTORY -** 04-Sept-96:AKL Creation. -** -** ASSUMPTIONS -** -**END*/ - -#ifdef MEM_DEBUG - -void CheckMemory(void) -{ - // Send all reports to STDOUT - _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT ); - _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT ); - _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT ); - - _CrtCheckMemory(); - fflush(stdout); -} -#endif - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** mem = SafeMalloc (coreSize, diagnostic) -** -** DESCRIPTION -** Mallocs the required memory. If the malloc fails, the game -** is killed with a diagnostic string. -** -** INPUT -** int coreSize = How much memory to malloc (in bytes). -** char *diagnostic = String identifying the caller. -** -** OUTPUT -** void *mem = Ptr to memory. Never returns NULL. -** -** HISTORY -** 14-Jan-08:Cleanups and conversion from MallocWithRetry. -** 06-Nov-96:AKL Creation. -** -** ASSUMPTIONS -** -**END*/ - -static void * -SafeMalloc (int bytes, char *diagStr) -{ - void *ptr; - - ptr = malloc (bytes); - if (!ptr) - { - log_add (log_Fatal, "Malloc failed for %s. #Bytes %d.", diagStr, bytes); - fflush (stderr); - explode (); - } - return ptr; -} - -MEM_HANDLE -mem_allocate (MEM_SIZE coreSize, MEM_FLAGS flags) -{ - szMemoryNode *node; - - LockMutex (_MemoryLock); - -#ifdef MEM_DEBUG - CheckMemory(); -#endif - - if ((node = freeListHead) == NULL) - log_add (log_Error, "mem_allocate: out of extents."); - else if ((node->memory = MallocWithRetry (coreSize, "mem_allocate:")) == 0 - && coreSize) - log_add (log_Error, "mem_allocate: couldn't allocate %ld bytes.", - coreSize); - else - { - freeListHead = node->next; - - node->size = coreSize; - node->handle = node - extents + 1; - node->refcount = 0; - if (flags & MEM_ZEROINIT) - memset (node->memory, 0, node->size); -#ifdef LEAK_DEBUG - if (leak_debug) - { - log_add (log_Debug, "alloc %d: %p, %lu", (int) node->handle, - (void *) node->memory, node->size); - // Preferred form: - //log_add (log_Debug, "alloc %d: %#8" PRIxPTR ", %lu", - // (int) node->handle, (intptr_t) node->memory, node->size); - } - if (node->handle == leak_idx && node->size == leak_size) - node = node; - if (node->size == leak_size) - node = node; -#endif /* LEAK_DEBUG */ - - UnlockMutex (_MemoryLock); - return (node->handle); - } - - UnlockMutex (_MemoryLock); - return (0); -} - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** size = mem_get_size(h) -** -** DESCRIPTION -** Returns the number of bytes in the given memory allocation. -** -** INPUT -** int h = Handle to memory allocation. -** -** OUTPUT -** int size = Number of bytes in allocation or zero on error. -** -** HISTORY -** 09-Jul-96:AKL Creation. Original version in LIBS\MEMORY\DATAINFO.C. -** -** ASSUMPTIONS -** -**END*/ - -MEM_SIZE -mem_get_size (MEM_HANDLE h) -{ - LockMutex (_MemoryLock); - if (h > 0 && h <= MAX_EXTENTS && extents[h - 1].handle == h) - { - UnlockMutex (_MemoryLock); - return ((int)extents[h - 1].size); - } - UnlockMutex (_MemoryLock); - - return (0); -} - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** done = mem_init(coreSize, pma, diskName) -** -** DESCRIPTION -** Initialize data that tracks allocation extents. -** -** INPUT -** int coreSize = IGNORED! -** int * pma = IGNORED! -** PSTR diskName = IGNORED! -** -** OUTPUT -** int done = TRUE. -** -** HISTORY -** 09-Jul-96:AKL Creation. Original version in LIBS\MEMORY\INIT.C. -** -** ASSUMPTIONS -** -**END*/ - -BOOLEAN +bool mem_init (void) -{ - int i; - - _MemoryLock = CreateMutex ("memory lock", SYNC_CLASS_RESOURCE); - LockMutex (_MemoryLock); - - freeListHead = &extents[0]; - for (i=0; i<MAX_EXTENTS; i++) - { - extents[i].memory = NULL; - extents[i].handle = -1; - extents[i].next = &extents[i+1]; - extents[i].size = 0; - } - extents[MAX_EXTENTS-1].next = NULL; - - UnlockMutex (_MemoryLock); - - return TRUE; +{ // This is a stub + return true; } -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** mem_uninit() -** -** DESCRIPTION -** Free allocated memory. -** -** INPUT -** -** OUTPUT -** -** HISTORY -** 14-Oct-96:AKL Creation. -** -** ASSUMPTIONS -** -**END*/ - -BOOLEAN -mem_uninit(void) -{ - int i; - - LockMutex (_MemoryLock); - - for (i=0; i<MAX_EXTENTS; i++) - { - if (extents[i].handle != -1) - { - log_add (log_Debug, "LEAK: unreleased extent %d: %p, %lu", - extents[i].handle, (void *) extents[i].memory, - extents[i].size); - // Preferred form: - //log_add (log_Debug, "LEAK: unreleased extent %d: %#8" PRIxPTR - // ", %lu", extents[i].handle, - // (intptr_t) extents[i].memory, extents[i].size); - fflush (stderr); - extents[i].handle = -1; - if (extents[i].memory) - { - free (extents[i].memory); - extents[i].memory = 0; - } - } - extents[i].size = 0; - } - freeListHead = 0; - - UnlockMutex (_MemoryLock); - - return (TRUE); +bool +mem_uninit (void) +{ // This is a stub + return true; } -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** done = mem_release(h) -** -** DESCRIPTION -** Frees the given memory. -** -** INPUT -** int h = Handle to memory to be released. -** -** OUTPUT -** int done = TRUE. -** -** HISTORY -** 09-Jul-96:AKL Creation. Original version in LIBS\MEMORY\ALLOC.C. -** -** ASSUMPTIONS -** -**END*/ - -BOOLEAN -mem_release(MEM_HANDLE h) -{ - if (h == 0) - return (TRUE); - - LockMutex (_MemoryLock); - - --h; - if (h < 0 || h >= MAX_EXTENTS) - log_add (log_Debug, "LEAK: attempt to release invalid extent %d", h); - else if (extents[h].handle == -1) - log_add (log_Debug, "LEAK: attempt to release unallocated extent %d",h); - else if (extents[h].refcount == 0) - { -#ifdef LEAK_DEBUG - if (leak_debug) - { - log_add (log_Debug, "free %d: %p", - extents[h].handle, (void *) extents[h].memory); - // Preferred form: - //log_add (log_Debug, "free %d: %#8" PRIxPTR, - // extents[h].handle, (intptr_t) extents[h].memory); - } -#endif - if (extents[h].memory) - { - free (extents[h].memory); - extents[h].memory = 0; - } - extents[h].handle = -1; - extents[h].next = freeListHead; - freeListHead = &extents[h]; - UnlockMutex (_MemoryLock); - return TRUE; - } - - UnlockMutex (_MemoryLock); - return FALSE; -} - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** memp = mem_lock (h) -** -** DESCRIPTION -** Converts a MEM_HANDLE into its equivalent pointer. -** -** INPUT -** int h = Handle to memory to be accessed. -** -** OUTPUT -** void * memp = Ptr to memory. -** -** HISTORY -** 09-Jul-96:AKL Creation. Original version in LIBS\MEMORY\SIMPLE.C. -** -** ASSUMPTIONS -** -**END*/ - void * -mem_lock (MEM_HANDLE h) -{ - LockMutex (_MemoryLock); - - if (h > 0 && h <= MAX_EXTENTS && extents[h - 1].handle == h) - { - ++extents[h - 1].refcount; - UnlockMutex (_MemoryLock); - return (extents[h - 1].memory); - } - - UnlockMutex (_MemoryLock); - return (0); -} - -/*****************************************************************************/ -/*FUNCTION -** -** SYNOPSIS -** done = mem_simple_unaccess(h) -** -** DESCRIPTION -** Drops the refcount on a piece of memory. -** -** INPUT -** int h = Handle to memory to be unaccessed. -** -** OUTPUT -** int done = TRUE. -** -** HISTORY -** 09-Jul-96:AKL Creation. Original version in LIBS\MEMORY\SIMPLE.C. -** -** ASSUMPTIONS -** -**END*/ - -BOOLEAN -mem_unlock (MEM_HANDLE h) -{ - LockMutex (_MemoryLock); - if (h > 0 && h <= MAX_EXTENTS && extents[h - 1].handle == h) - { - if (extents[h - 1].refcount) - --extents[h - 1].refcount; - UnlockMutex (_MemoryLock); - return (1); - } - - UnlockMutex (_MemoryLock); - return (0); -} - -static void * -_alloc_mem (int size) -{ - void *p; - int h; - - h = mem_allocate (sizeof (MEM_HEADER) + size, DEFAULT_MEM_FLAGS); - p = (void *)mem_lock (h); - if (p) - { - ((MEM_HEADER *) p)->handle = h; - p = (char *)p + sizeof (MEM_HEADER); - } - - return (p); -} - -void * HMalloc (int size) { - void *p; - - if (size == 0) return (0); - - if ((p = _alloc_mem(size)) == NULL) { - log_add (log_Fatal, "Fatal Error: HMalloc(): out of memory."); - fflush (stderr); - explode (); - } - return (p); -} - -void -HFree (void *p) -{ - if (p) - { - MEM_HEADER *hdr; - MEM_HANDLE h; - - hdr = GET_MEM_HEADER(p); - h = hdr->handle; - mem_unlock (h); - mem_release (h); - } -} - -void * -HCalloc (int size) -{ void *p; - p = HMalloc (size); - if (p) - memset (p, 0, size); + if (size == 0) + return NULL; - return (p); -} - -void * -HRealloc (void *p, int size) -{ - void *np; - int osize; - - if ((np = _alloc_mem (size)) && p) - { - MEM_HEADER *hdr; - MEM_HANDLE h; - - hdr = GET_MEM_HEADER (p); - h = hdr->handle; - osize = mem_get_size (h) - sizeof (MEM_HEADER); - if (size > osize) - size = osize; - memcpy (np, p, size); - HFree (p); - } - - return (np); -} - -#else /* !LEGACY_HANDLE_ALLOCATOR */ - -BOOLEAN -mem_init (void) -{ - return TRUE; -} - -BOOLEAN -mem_uninit(void) -{ - return (TRUE); -} - -void * -HMalloc (int size) -{ - void *p; - - if (size == 0) return NULL; - if (size < 0) { log_add (log_Fatal, "Fatal Error: Request for negative amount of memory %d!", size); @@ -585,7 +52,8 @@ explode (); } - if ((p = malloc (size)) == NULL) + p = malloc (size); + if (p == NULL) { log_add (log_Fatal, "Fatal Error: HMalloc(): out of memory."); fflush (stderr); @@ -617,7 +85,7 @@ void * HRealloc (void *p, int size) { + // XXX: We assume throughout that HRealloc returns a valid pointer. + // Checks similar to HMalloc are needed here. return realloc (p, size); } - -#endif /* LEGACY_HANDLE_ALLOCATOR */ Modified: trunk/sc2/src/libs/misc.h =================================================================== --- trunk/sc2/src/libs/misc.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/misc.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -27,11 +27,6 @@ #include "port.h" -extern void *HMalloc (int size); -extern void HFree (void *p); -extern void *HCalloc (int size); -extern void *HRealloc (void *p, int size); - extern int TFB_DEBUG_HALT; static inline void explode (void) _NORETURN; Modified: trunk/sc2/src/libs/reslib.h =================================================================== --- trunk/sc2/src/libs/reslib.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/reslib.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,7 +22,7 @@ //#include <stdio.h> #include "libs/compiler.h" #include "port.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/uio.h" typedef struct resource_index_desc RESOURCE_INDEX_DESC; Modified: trunk/sc2/src/libs/resource/direct.c =================================================================== --- trunk/sc2/src/libs/resource/direct.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/resource/direct.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,7 +17,7 @@ */ #include "libs/strings/strintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "port.h" #include "libs/uio.h" #include <sys/stat.h> Modified: trunk/sc2/src/libs/resource/getres.c =================================================================== --- trunk/sc2/src/libs/resource/getres.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/resource/getres.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,7 +19,7 @@ #include "options.h" #include "port.h" #include "resintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/log.h" #include "libs/uio/charhashtable.h" Modified: trunk/sc2/src/libs/resource/loadres.c =================================================================== --- trunk/sc2/src/libs/resource/loadres.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/resource/loadres.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -18,7 +18,9 @@ #include "resintrn.h" #include "libs/declib.h" +#include "libs/memlib.h" + void * GetResourceData (uio_Stream *fp, DWORD length) { Modified: trunk/sc2/src/libs/resource/resinit.c =================================================================== --- trunk/sc2/src/libs/resource/resinit.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/resource/resinit.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,7 +17,7 @@ */ #include "resintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "options.h" #include "types.h" #include "libs/log.h" Modified: trunk/sc2/src/libs/sound/decoders/aiffaud.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/aiffaud.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/aiffaud.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -33,7 +33,6 @@ #include "types.h" #include "libs/uio.h" #include "endian_uqm.h" -#include "libs/misc.h" #include "libs/log.h" #include "aiffaud.h" Modified: trunk/sc2/src/libs/sound/decoders/decoder.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/decoder.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/decoder.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -21,7 +21,7 @@ #include <string.h> #include <stdlib.h> #include "port.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/file.h" #include "libs/log.h" #include "decoder.h" Modified: trunk/sc2/src/libs/sound/decoders/dukaud.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/dukaud.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/dukaud.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,7 @@ #include <stdio.h> #include <string.h> #include <errno.h> -#include "libs/misc.h" +#include "libs/memlib.h" #include "port.h" #include "types.h" #include "libs/uio.h" Modified: trunk/sc2/src/libs/sound/decoders/modaud.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/modaud.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/modaud.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,7 @@ #include <stdio.h> #include <string.h> #include <errno.h> -#include "libs/misc.h" +#include "libs/memlib.h" #include "port.h" #include "types.h" #include "endian_uqm.h" Modified: trunk/sc2/src/libs/sound/decoders/oggaud.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/oggaud.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/oggaud.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,6 @@ #include <stdio.h> #include <string.h> #include <errno.h> -#include "libs/misc.h" #include "libs/log.h" #include "port.h" #include "types.h" Modified: trunk/sc2/src/libs/sound/decoders/wav.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/wav.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/decoders/wav.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -24,7 +24,6 @@ #include "types.h" #include "libs/uio.h" #include "endian_uqm.h" -#include "libs/misc.h" #include "libs/log.h" #include "wav.h" Modified: trunk/sc2/src/libs/sound/mixer/mixer.c =================================================================== --- trunk/sc2/src/libs/sound/mixer/mixer.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/mixer/mixer.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -25,6 +25,7 @@ #include "libs/misc.h" #include "libs/threadlib.h" #include "libs/log.h" +#include "libs/memlib.h" static uint32 mixer_initialized = 0; static uint32 mixer_format; Modified: trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c =================================================================== --- trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,6 +22,7 @@ #include "audiodrv_nosound.h" #include "libs/tasklib.h" #include "libs/log.h" +#include "libs/memlib.h" #include <stdlib.h> Modified: trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c =================================================================== --- trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,6 +22,7 @@ #include "audiodrv_sdl.h" #include "libs/tasklib.h" #include "libs/log.h" +#include "libs/memlib.h" #include <stdlib.h> Modified: trunk/sc2/src/libs/sound/music.c =================================================================== --- trunk/sc2/src/libs/sound/music.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/music.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,6 +20,7 @@ #include "sound.h" #include "libs/reslib.h" #include "libs/log.h" +#include "libs/memlib.h" static MUSIC_REF curMusicRef; Modified: trunk/sc2/src/libs/sound/openal/audiodrv_openal.c =================================================================== --- trunk/sc2/src/libs/sound/openal/audiodrv_openal.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/openal/audiodrv_openal.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -23,6 +23,7 @@ #include "audiodrv_openal.h" #include "libs/tasklib.h" #include "libs/log.h" +#include "libs/memlib.h" #include <stdlib.h> Modified: trunk/sc2/src/libs/sound/sfx.c =================================================================== --- trunk/sc2/src/libs/sound/sfx.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/sfx.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,7 @@ #include "libs/reslib.h" #include "libs/log.h" #include "libs/strings/strintrn.h" +#include "libs/memlib.h" #include <math.h> Modified: trunk/sc2/src/libs/sound/sndintrn.h =================================================================== --- trunk/sc2/src/libs/sound/sndintrn.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/sndintrn.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,6 +22,7 @@ #include <stdio.h> #include "libs/sndlib.h" #include "libs/reslib.h" +#include "libs/memlib.h" extern void *_GetMusicData (uio_Stream *fp, DWORD length); extern BOOLEAN _ReleaseMusicData (void *handle); Modified: trunk/sc2/src/libs/sound/sound.c =================================================================== --- trunk/sc2/src/libs/sound/sound.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/sound.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,9 @@ #include "libs/compiler.h" #include "libs/tasklib.h" #include "libs/inplib.h" +#include "libs/memlib.h" + static Task FadeTask; static SIZE TTotal; static SIZE volume_end; Modified: trunk/sc2/src/libs/sound/sound.h =================================================================== --- trunk/sc2/src/libs/sound/sound.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/sound.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,7 +17,6 @@ #ifndef _UQM_SOUND_H // try avoiding collisions on id #define _UQM_SOUND_H -#include "libs/misc.h" #include "sndintrn.h" #include "audiocore.h" #include "decoders/decoder.h" Modified: trunk/sc2/src/libs/sound/stream.c =================================================================== --- trunk/sc2/src/libs/sound/stream.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/stream.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,7 @@ #include "sound.h" #include "libs/tasklib.h" #include "libs/log.h" +#include "libs/memlib.h" void Modified: trunk/sc2/src/libs/sound/trackplayer.c =================================================================== --- trunk/sc2/src/libs/sound/trackplayer.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/sound/trackplayer.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -18,6 +18,7 @@ #include "libs/sound/trackplayer.h" #include "libs/sound/trackint.h" #include "libs/log.h" +#include "libs/memlib.h" #include "options.h" #include <ctype.h> #include <stdlib.h> Modified: trunk/sc2/src/libs/strings/getstr.c =================================================================== --- trunk/sc2/src/libs/strings/getstr.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/strings/getstr.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -21,7 +21,9 @@ #include "libs/graphics/gfx_common.h" #include "libs/reslib.h" #include "libs/log.h" +#include "libs/memlib.h" + #define MAX_STRINGS 2048 #define POOL_SIZE 4096 Modified: trunk/sc2/src/libs/strings/strings.c =================================================================== --- trunk/sc2/src/libs/strings/strings.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/strings/strings.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,7 +17,7 @@ */ #include "strintrn.h" -#include "libs/misc.h" +#include "libs/memlib.h" STRING_TABLE AllocStringTable (int num_entries, int flags) Modified: trunk/sc2/src/libs/threads/pthread/posixthreads.c =================================================================== --- trunk/sc2/src/libs/threads/pthread/posixthreads.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/threads/pthread/posixthreads.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -16,6 +16,7 @@ #include <stdlib.h> #include "libs/misc.h" +#include "libs/memlib.h" #include "posixthreads.h" #include <pthread.h> #include <unistd.h> Modified: trunk/sc2/src/libs/threads/sdl/sdlthreads.c =================================================================== --- trunk/sc2/src/libs/threads/sdl/sdlthreads.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/threads/sdl/sdlthreads.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -16,6 +16,7 @@ #include <stdlib.h> #include "libs/misc.h" +#include "libs/memlib.h" #include "sdlthreads.h" #ifdef PROFILE_THREADS #include <signal.h> Modified: trunk/sc2/src/libs/threads/thrcommon.c =================================================================== --- trunk/sc2/src/libs/threads/thrcommon.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/threads/thrcommon.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -18,8 +18,8 @@ #include <stdlib.h> #include "libs/threadlib.h" #include "libs/timelib.h" -#include "libs/misc.h" #include "libs/log.h" +#include "libs/memlib.h" #include "thrcommon.h" #define LIFECYCLE_SIZE 8 Modified: trunk/sc2/src/libs/video/dukvid.c =================================================================== --- trunk/sc2/src/libs/video/dukvid.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/dukvid.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -24,6 +24,7 @@ #include <stdio.h> #include <string.h> #include "libs/uio.h" +#include "libs/memlib.h" #include "endian_uqm.h" #define THIS_PTR TFB_VideoDecoder* This Modified: trunk/sc2/src/libs/video/video.c =================================================================== --- trunk/sc2/src/libs/video/video.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/video.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -16,8 +16,10 @@ #include "video.h" +#include "options.h" #include "vidplayer.h" #include "libs/inplib.h" +#include "libs/memlib.h" // XXX: we should not include anything from uqm/ inside libs/ #include "uqm/setup.h" Modified: trunk/sc2/src/libs/video/video.h =================================================================== --- trunk/sc2/src/libs/video/video.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/video.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -17,8 +17,6 @@ #ifndef _UQM_VIDEO_H #define _UQM_VIDEO_H -#include "options.h" -#include "libs/misc.h" #include "libs/vidlib.h" #include "libs/graphics/tfb_draw.h" #include "types.h" Modified: trunk/sc2/src/libs/video/videodec.c =================================================================== --- trunk/sc2/src/libs/video/videodec.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/videodec.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,7 @@ #include "videodec.h" #include "dukvid.h" #include "libs/log.h" +#include "libs/memlib.h" #define MAX_REG_DECODERS 31 Modified: trunk/sc2/src/libs/video/vidplayer.c =================================================================== --- trunk/sc2/src/libs/video/vidplayer.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/vidplayer.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,6 +19,7 @@ #include "libs/graphics/gfx_common.h" #include "libs/graphics/tfb_draw.h" #include "libs/log.h" +#include "libs/memlib.h" // XXX: we should not include anything from uqm/ inside libs/ #include "uqm/controls.h" #include "uqm/settings.h" Modified: trunk/sc2/src/libs/video/vresins.c =================================================================== --- trunk/sc2/src/libs/video/vresins.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/libs/video/vresins.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,7 +20,9 @@ #include <string.h> #include "vidintrn.h" #include "libs/log.h" +#include "libs/memlib.h" + static BOOLEAN FreeLegacyVideoData (void *data) { Modified: trunk/sc2/src/options.c =================================================================== --- trunk/sc2/src/options.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/options.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -30,6 +30,7 @@ #include "libs/strlib.h" #include "libs/log.h" #include "libs/reslib.h" +#include "libs/memlib.h" #include <stdlib.h> #include <stdio.h> Modified: trunk/sc2/src/uqm/battlecontrols.c =================================================================== --- trunk/sc2/src/uqm/battlecontrols.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/battlecontrols.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -20,8 +20,8 @@ // For computer_intelligence() #include "tactrans.h" // For battleEndReady* -#include "libs/misc.h" - // For HFree() +#include "libs/memlib.h" + // For HMalloc(), HFree() #ifdef NETPLAY # include "netplay/netmelee.h" #endif /* NETPLAY */ Modified: trunk/sc2/src/uqm/displist.h =================================================================== --- trunk/sc2/src/uqm/displist.h 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/displist.h 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,7 +22,7 @@ #include <assert.h> #include "port.h" #include "libs/compiler.h" -#include "libs/misc.h" +#include "libs/memlib.h" // Note that we MUST use the QUEUE_TABLE variant at this time, because // certain gameplay elements depend on it. Namely, the maximum number @@ -32,12 +32,7 @@ // code works now. #define QUEUE_TABLE -#ifdef QUEUE_TABLE typedef void* QUEUE_HANDLE; -#else /* !QUEUE_TABLE */ -#include "libs/memlib.h" -typedef MEM_HANDLE QUEUE_HANDLE; -#endif /* QUEUE_TABLE */ typedef UWORD OBJ_SIZE; typedef QUEUE_HANDLE HLINK; @@ -66,6 +61,9 @@ #ifdef QUEUE_TABLE +extern HLINK AllocLink (QUEUE *pq); +extern void FreeLink (QUEUE *pq, HLINK hLink); + static inline LINK * LockLink (const QUEUE *pq, HLINK h) { @@ -96,10 +94,10 @@ #define SizeQueueTab(pq) (COUNT)((pq)->num_objects) #define GetLinkAddr(pq,i) (HLINK)((pq)->pq_tab + ((pq)->object_size * ((i) - 1))) #else /* !QUEUE_TABLE */ -#define AllocLink(pq) (HLINK)mem_allocate ((pq)->object_size, DEFAULT_MEM_FLAGS) -#define LockLink(pq, h) (LINK*)mem_lock (h) -#define UnlockLink(pq, h) mem_unlock (h) -#define FreeLink(pq,h) mem_release (h) +#define AllocLink(pq) (HLINK)HMalloc ((pq)->object_size) +#define LockLink(pq, h) ((LINK*)(h)) +#define UnlockLink(pq, h) ((void)(h)) +#define FreeLink(pq,h) HFree (h) #endif /* QUEUE_TABLE */ #define SetLinkSize(pq,s) ((pq)->object_size = (COUNT)(s)) @@ -121,10 +119,6 @@ extern void RemoveQueue (QUEUE *pq, HLINK hLink); extern COUNT CountLinks (QUEUE *pq); void ForAllLinks(QUEUE *pq, void (*callback)(LINK *, void *), void *arg); -#ifdef QUEUE_TABLE -extern HLINK AllocLink (QUEUE *pq); -extern void FreeLink (QUEUE *pq, HLINK hLink); -#endif /* QUEUE_TABLE */ #endif /* _DISPLIST_H */ Modified: trunk/sc2/src/uqm/dummy.c =================================================================== --- trunk/sc2/src/uqm/dummy.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/dummy.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -27,6 +27,7 @@ #include "libs/compiler.h" #include "libs/log.h" +#include "libs/memlib.h" #include <stdlib.h> #include <ctype.h> Modified: trunk/sc2/src/uqm/encount.c =================================================================== --- trunk/sc2/src/uqm/encount.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/encount.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -39,6 +39,7 @@ #include "libs/log.h" #include "libs/mathlib.h" #include "libs/inplib.h" +#include "libs/misc.h" static void DrawFadeText (const UNICODE *str1, const UNICODE *str2, Modified: trunk/sc2/src/uqm/flash.c =================================================================== --- trunk/sc2/src/uqm/flash.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/flash.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -29,7 +29,7 @@ #include "setup.h" #include "libs/log.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/threadlib.h" Modified: trunk/sc2/src/uqm/getchar.c =================================================================== --- trunk/sc2/src/uqm/getchar.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/getchar.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,7 +19,7 @@ #include "port.h" #include "controls.h" #include "libs/inplib.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/log.h" #include "globdata.h" #include "sounds.h" Modified: trunk/sc2/src/uqm/loadmele.c =================================================================== --- trunk/sc2/src/uqm/loadmele.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/loadmele.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -30,7 +30,7 @@ #include "sounds.h" #include "options.h" #include "libs/log.h" -#include "libs/misc.h" +#include "libs/memlib.h" #define LOAD_TEAM_NAME_TEXT_COLOR \ Modified: trunk/sc2/src/uqm/netplay/checkbuf.c =================================================================== --- trunk/sc2/src/uqm/netplay/checkbuf.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/netplay/checkbuf.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -22,7 +22,6 @@ #include "netplay.h" #include "checkbuf.h" #include "libs/log.h" -#include "libs/misc.h" #include "../battle.h" // for battleFrameCount Modified: trunk/sc2/src/uqm/netplay/checksum.c =================================================================== --- trunk/sc2/src/uqm/netplay/checksum.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/netplay/checksum.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -32,7 +32,6 @@ // for new_ship #include "libs/log.h" #include "libs/mathlib.h" -#include "libs/misc.h" ChecksumBuffer localChecksumBuffer; Modified: trunk/sc2/src/uqm/planets/plangen.c =================================================================== --- trunk/sc2/src/uqm/planets/plangen.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/planets/plangen.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -26,6 +26,7 @@ #include "libs/graphics/drawable.h" #include "libs/mathlib.h" #include "libs/log.h" +#include "libs/memlib.h" #include <math.h> #include <time.h> Modified: trunk/sc2/src/uqm/planets/pstarmap.c =================================================================== --- trunk/sc2/src/uqm/planets/pstarmap.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/planets/pstarmap.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -34,6 +34,7 @@ #include "libs/strlib.h" #include "libs/graphics/gfx_common.h" #include "libs/mathlib.h" +#include "libs/memlib.h" static inline long Modified: trunk/sc2/src/uqm/process.c =================================================================== --- trunk/sc2/src/uqm/process.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/process.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -31,7 +31,9 @@ #include "libs/graphics/drawcmd.h" #include "libs/graphics/gfx_common.h" #include "libs/log.h" +#include "libs/misc.h" + //#define DEBUG_PROCESS COUNT DisplayFreeList; Modified: trunk/sc2/src/uqm/save.c =================================================================== --- trunk/sc2/src/uqm/save.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/save.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -36,6 +36,7 @@ #include "util.h" #include "libs/inplib.h" #include "libs/log.h" +#include "libs/memlib.h" // XXX: these should handle endian conversions later Modified: trunk/sc2/src/uqm/setup.c =================================================================== --- trunk/sc2/src/uqm/setup.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/setup.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -36,6 +36,7 @@ #include "libs/threadlib.h" #include "libs/vidlib.h" #include "libs/log.h" +#include "libs/misc.h" #include <assert.h> #include <errno.h> Modified: trunk/sc2/src/uqm/setupmenu.c =================================================================== --- trunk/sc2/src/uqm/setupmenu.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/setupmenu.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -34,6 +34,7 @@ #include "libs/sound/sound.h" #include "libs/resource/stringbank.h" #include "libs/log.h" +#include "libs/memlib.h" #include "resinst.h" #include "nameref.h" Modified: trunk/sc2/src/uqm/starcon.c =================================================================== --- trunk/sc2/src/uqm/starcon.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/starcon.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -38,6 +38,7 @@ #include "libs/gfxlib.h" #include "libs/graphics/gfx_common.h" #include "libs/inplib.h" +#include "libs/misc.h" #include "uqmversion.h" #include "options.h" Modified: trunk/sc2/src/uqm/state.c =================================================================== --- trunk/sc2/src/uqm/state.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/state.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -19,7 +19,7 @@ #include "state.h" #include "encount.h" -#include "libs/misc.h" +#include "libs/memlib.h" #include "libs/log.h" #ifdef HAVE_UNISTD_H #include <unistd.h> Modified: trunk/sc2/src/uqm/uqmdebug.c =================================================================== --- trunk/sc2/src/uqm/uqmdebug.c 2009-10-11 12:36:55 UTC (rev 3221) +++ trunk/sc2/src/uqm/uqmdebug.c 2009-10-11 21:42:05 UTC (rev 3222) @@ -32,7 +32,6 @@ #include "setup.h" #include "state.h" #include "libs/mathlib.h" -#include "libs/misc.h" #include <stdio.h> #include <errno.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-12 02:19:55
|
Revision: 3223 http://sc2.svn.sourceforge.net/sc2/?rev=3223&view=rev Author: avolkov Date: 2009-10-12 02:19:46 +0000 (Mon, 12 Oct 2009) Log Message: ----------- Cleanup of vidlib: move uqm/-specific code out of vidplayer; other Modified Paths: -------------- trunk/sc2/src/libs/graphics/sdl/dcqueue.c trunk/sc2/src/libs/video/legacyplayer.c trunk/sc2/src/libs/video/video.c trunk/sc2/src/libs/video/video.h trunk/sc2/src/libs/video/videodec.c trunk/sc2/src/libs/video/vidintrn.h trunk/sc2/src/libs/video/vidplayer.c trunk/sc2/src/libs/video/vidplayer.h trunk/sc2/src/libs/video/vresins.c trunk/sc2/src/libs/vidlib.h trunk/sc2/src/uqm/intro.c Modified: trunk/sc2/src/libs/graphics/sdl/dcqueue.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/dcqueue.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/graphics/sdl/dcqueue.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -206,6 +206,14 @@ UnlockRecursiveMutex (DCQ_Mutex); } +static inline int +rects_equal (RECT *r1, RECT *r2) +{ + return r1->corner.x == r2->corner.x && r1->corner.y == r2->corner.y + && r1->extent.width == r2->extent.width + && r1->extent.height == r2->extent.height; +} + void TFB_EnqueueDrawCommand (TFB_DrawCommand* DrawCommand) { @@ -220,17 +228,17 @@ static RECT scissor_rect; // Set the clipping region. - if (scissor_rect.corner.x != _pCurContext->ClipRect.corner.x - || scissor_rect.corner.y != _pCurContext->ClipRect.corner.y - || scissor_rect.extent.width != - _pCurContext->ClipRect.extent.width - || scissor_rect.extent.height != - _pCurContext->ClipRect.extent.height) + // We allow drawing with no current context set, so the whole screen + if ((_pCurContext && !rects_equal (&scissor_rect, &_pCurContext->ClipRect)) + || (!_pCurContext && scissor_rect.extent.width != 0)) { // Enqueue command to set the glScissor spec TFB_DrawCommand DC; - scissor_rect = _pCurContext->ClipRect; + if (_pCurContext) + scissor_rect = _pCurContext->ClipRect; + else + scissor_rect.extent.width = 0; if (scissor_rect.extent.width) { Modified: trunk/sc2/src/libs/video/legacyplayer.c =================================================================== --- trunk/sc2/src/libs/video/legacyplayer.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/legacyplayer.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -1,39 +1,82 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + #include "vidintrn.h" +#include "video.h" +#include "vidplayer.h" +#include "libs/memlib.h" -BOOLEAN + +LEGACY_VIDEO_REF PlayLegacyVideo (LEGACY_VIDEO vid) { const char *name, *audname, *speechname; - DWORD loopframe; - VIDEO_REF VidRef; - MUSIC_REF AudRef = 0; - MUSIC_REF SpeechRef = 0; + uint32 loopframe; + LEGACY_VIDEO_REF ref; + VIDEO_TYPE type; if (!vid) - return FALSE; + return NULL; + ref = HCalloc (sizeof (*ref)); + if (!ref) + return NULL; name = vid->video; audname = vid->audio; speechname = vid->speech; loopframe = vid->loop; - VidRef = LoadVideoFile (name); - if (!VidRef) - return FALSE; + ref->vidref = LoadVideoFile (name); + if (!ref->vidref) + return NULL; if (audname) - AudRef = LoadMusicFile (audname); + ref->audref = LoadMusicFile (audname); if (speechname) - SpeechRef = LoadMusicFile (speechname); + ref->speechref = LoadMusicFile (speechname); - VidPlayEx (VidRef, AudRef, SpeechRef, loopframe); - VidDoInput (); - VidStop (); + type = VidPlayEx (ref->vidref, ref->audref, ref->speechref, loopframe); + if (type == NO_FMV) + { // Video failed to start + StopLegacyVideo (ref); + return NULL; + } - DestroyVideo (VidRef); - if (SpeechRef) - DestroyMusic (SpeechRef); - if (AudRef) - DestroyMusic (AudRef); + return ref; +} - return TRUE; +void +StopLegacyVideo (LEGACY_VIDEO_REF ref) +{ + if (!ref) + return; + if (TFB_VideoPlaying (ref->vidref)) + VidStop (); + + DestroyVideo (ref->vidref); + if (ref->speechref) + DestroyMusic (ref->speechref); + if (ref->audref) + DestroyMusic (ref->audref); + + HFree (ref); } +BOOLEAN +PlayingLegacyVideo (LEGACY_VIDEO_REF ref) +{ + if (!ref) + return FALSE; + return TFB_VideoPlaying (ref->vidref); +} Modified: trunk/sc2/src/libs/video/video.c =================================================================== --- trunk/sc2/src/libs/video/video.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/video.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -16,12 +16,11 @@ #include "video.h" +#include "vidintrn.h" #include "options.h" #include "vidplayer.h" -#include "libs/inplib.h" #include "libs/memlib.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/setup.h" +#include "libs/sndlib.h" #define NULL_VIDEO_REF (0) @@ -52,21 +51,18 @@ } void -VidStop () +VidStop (void) { if (_cur_speech) snd_StopSpeech (); if (_cur_video) - { TFB_StopVideo (_cur_video); - TFB_FadeClearScreen (); - } _cur_speech = 0; _cur_video = NULL_VIDEO_REF; } VIDEO_REF -VidPlaying () +VidPlaying (void) // this should just probably return BOOLEAN { if (!_cur_video) @@ -78,6 +74,24 @@ return NULL_VIDEO_REF; } +// return current video position in milliseconds +DWORD +VidGetPosition (void) +{ + if (!VidPlaying ()) + return 0; + return TFB_GetVideoPosition (_cur_video); +} + +BOOLEAN +VidSeek (DWORD pos) + // pos in milliseconds +{ + if (!VidPlaying ()) + return FALSE; + return TFB_SeekVideo (_cur_video, pos); +} + VIDEO_TYPE VidPlayEx (VIDEO_REF vid, MUSIC_REF AudRef, MUSIC_REF SpeechRef, DWORD LoopFrame) @@ -105,13 +119,10 @@ _cur_speech = 0; _cur_video = NULL_VIDEO_REF; - TFB_FadeClearScreen (); - FlushInput (); LockMutex (GraphicsLock); - SetContext (ScreenContext); // play video in the center of the screen - if (TFB_PlayVideo (vid, (SCREEN_WIDTH - vid->w) / 2, - (SCREEN_HEIGHT - vid->h) / 2)) + if (TFB_PlayVideo (vid, (ScreenWidth - vid->w) / 2, + (ScreenHeight - vid->h) / 2)) { _cur_video = vid; ret = SOFTWARE_FMV; @@ -136,13 +147,6 @@ return VidPlayEx (VidRef, 0, 0, VID_NO_LOOP); } -void -VidDoInput (void) -{ - if (_cur_video) - TFB_VideoInput (_cur_video); -} - VIDEO_REF _init_video_file (const char *pStr) { @@ -153,7 +157,7 @@ if (!dec) return NULL_VIDEO_REF; - vid = (TFB_VideoClip*) HCalloc (sizeof (*vid)); + vid = HCalloc (sizeof (*vid)); vid->decoder = dec; vid->length = dec->length; vid->w = vid->decoder->w; Modified: trunk/sc2/src/libs/video/video.h =================================================================== --- trunk/sc2/src/libs/video/video.h 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/video.h 2009-10-12 02:19:46 UTC (rev 3223) @@ -18,6 +18,7 @@ #define _UQM_VIDEO_H #include "libs/vidlib.h" +#include "libs/sndlib.h" #include "libs/graphics/tfb_draw.h" #include "types.h" #include "videodec.h" Modified: trunk/sc2/src/libs/video/videodec.c =================================================================== --- trunk/sc2/src/libs/video/videodec.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/videodec.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -245,7 +245,7 @@ return NULL; } - decoder = (TFB_VideoDecoder*) HCalloc (info->funcs->GetStructSize ()); + decoder = HCalloc (info->funcs->GetStructSize ()); decoder->funcs = info->funcs; if (!decoder->funcs->Init (decoder, &vd_vidfmt)) { Modified: trunk/sc2/src/libs/video/vidintrn.h =================================================================== --- trunk/sc2/src/libs/video/vidintrn.h 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/vidintrn.h 2009-10-12 02:19:46 UTC (rev 3223) @@ -19,11 +19,29 @@ #ifndef VIDINTERN_H_ #define VIDINTERN_H_ +#include "types.h" #include "libs/vidlib.h" +#include "libs/threadlib.h" -typedef struct legacy_video_desc { +struct legacy_video_desc +{ char *video, *audio, *speech; - DWORD loop; -} LEGACY_VIDEO_DESC; + uint32 loop; +}; +typedef struct legacy_video_desc LEGACY_VIDEO_DESC; + +struct legacy_video_ref +{ + VIDEO_REF vidref; + MUSIC_REF audref; + MUSIC_REF speechref; +}; + +// XXX: There has to be a better way to synchronize gfx calls with the rest +// of the game. The only thing we need to sync is the current context, and +// even there only the cliprect. Perhaps a DCQ command that takes an +// explicit cliprect would be better. +extern Mutex GraphicsLock; + #endif Modified: trunk/sc2/src/libs/video/vidplayer.c =================================================================== --- trunk/sc2/src/libs/video/vidplayer.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/vidplayer.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -16,15 +16,12 @@ #include "vidplayer.h" +#include "vidintrn.h" #include "libs/graphics/gfx_common.h" #include "libs/graphics/tfb_draw.h" #include "libs/log.h" #include "libs/memlib.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/controls.h" -#include "uqm/settings.h" -#include "uqm/setup.h" -#include "uqm/sounds.h" +#include "libs/sndlib.h" // video callbacks static void vp_BeginFrame (TFB_VideoDecoder*); @@ -62,16 +59,6 @@ static Semaphore vp_interthread_lock = 0; static void* vp_interthread_clip = NULL; -typedef struct -{ - // standard state required by DoInput - BOOLEAN (*InputFunc) (void *pInputState); - COUNT MenuRepeatDelay; - - VIDEO_REF CurVideo; - -} VIDEO_INPUT_STATE; - bool TFB_InitVideoPlayer (void) { @@ -87,29 +74,6 @@ DestroySemaphore (vp_interthread_lock); } -void -TFB_FadeClearScreen (void) -{ - BYTE xform_buf[1]; - RECT r = {{0, 0}, {SCREEN_WIDTH, SCREEN_HEIGHT}}; - - xform_buf[0] = FadeAllToBlack; - SleepThreadUntil (XFormColorMap ( - (COLORMAPPTR) xform_buf, ONE_SECOND / 2)); - - // paint black rect over screen - LockMutex (GraphicsLock); - SetContext (ScreenContext); - SetContextForeGroundColor ( - BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00)); - DrawFilledRectangle (&r); - UnlockMutex (GraphicsLock); - - // fade in black rect instantly - xform_buf[0] = FadeAllToColor; - XFormColorMap ((COLORMAPPTR) xform_buf, 0); -} - // audio-synced video playback task // the frame rate and timing is dictated by the audio static int @@ -131,7 +95,7 @@ LockMutex (vid->guard); want_frame = vid->want_frame; if (vid->hAudio) - PlayMusic (vid->hAudio, FALSE, 1); + PLRPlaySong (vid->hAudio, FALSE, 1); UnlockMutex (vid->guard); clagged = 0; @@ -201,11 +165,15 @@ // draw the frame if (ret > 0) { + CONTEXT oldContext; + LockMutex (GraphicsLock); - SetContext (ScreenContext); + // We have the cliprect precalculated and don't need the rest + oldContext = SetContext (NULL); TFB_DrawScreen_Image (vid->frame, vid->dst_rect.corner.x, vid->dst_rect.corner.y, GSCALE_IDENTITY, NULL, TFB_SCREEN_MAIN); + SetContext (oldContext); UnlockMutex (GraphicsLock); FlushGraphics (); // needed to prevent half-frame updates } @@ -217,7 +185,7 @@ ret = VideoDecoder_Decode (vid->decoder); } if (vid->hAudio) - StopMusic (); + PLRStop (vid->hAudio); vid->playing = false; FinishTask (task); @@ -241,7 +209,7 @@ LockMutex (vid->guard); if (vid->hAudio) - PlayMusic (vid->hAudio, (vid->loop_frame != VID_NO_LOOP), 1); + PLRPlaySong (vid->hAudio, (vid->loop_frame != VID_NO_LOOP), 1); UnlockMutex (vid->guard); @@ -258,15 +226,19 @@ while (!Task_ReadState (task, TASK_EXIT) && ret > 0) { + CONTEXT oldContext; + // wait till its time to render next frame SleepThreadUntil (vid->frame_time); vid->cur_frame = vid->decoder->cur_frame; LockMutex (GraphicsLock); - SetContext (ScreenContext); + // We have the cliprect precalculated and don't need the rest + oldContext = SetContext (NULL); TFB_DrawScreen_Image (vid->frame, vid->dst_rect.corner.x, vid->dst_rect.corner.y, GSCALE_IDENTITY, NULL, TFB_SCREEN_MAIN); + SetContext (oldContext); UnlockMutex (GraphicsLock); FlushGraphics (); // needed to prevent half-frame updates @@ -277,7 +249,7 @@ } vid->playing = false; if (vid->hAudio) - StopMusic (); + PLRStop (vid->hAudio); FinishTask (task); @@ -289,7 +261,7 @@ { RECT scrn_r; RECT clip_r = {{0, 0}, {vid->w, vid->h}}; - RECT vid_r = {{0, 0}, {SCREEN_WIDTH, SCREEN_HEIGHT}}; + RECT vid_r = {{0, 0}, {ScreenWidth, ScreenHeight}}; RECT dr = {{x, y}, {vid->w, vid->h}}; RECT sr; @@ -333,8 +305,6 @@ vid->own_audio = true; } - StopMusic (); - if (vid->decoder->audio_synced) { TFB_SoundSample **pmus; @@ -389,7 +359,7 @@ if (vid->hAudio) { - StopMusic (); + PLRStop (vid->hAudio); if (vid->own_audio) { DestroyMusic (vid->hAudio); @@ -413,69 +383,44 @@ return vid->playing; } -static BOOLEAN -TFB_DoVideoInput (void *pIS) +uint32 +TFB_GetVideoPosition (VIDEO_REF vid) { - VIDEO_INPUT_STATE* pVIS = (VIDEO_INPUT_STATE*) pIS; - TFB_VideoClip* vid = pVIS->CurVideo; + uint32 pos; - if (!pVIS->CurVideo || !TFB_VideoPlaying (pVIS->CurVideo)) - return FALSE; + if (!TFB_VideoPlaying (vid)) + return 0; - if (PulsedInputState.menu[KEY_MENU_SELECT] - || PulsedInputState.menu[KEY_MENU_CANCEL] - || PulsedInputState.menu[KEY_MENU_SPECIAL] - || (GLOBAL (CurrentActivity) & CHECK_ABORT)) - { // abort movie - TFB_StopVideo (pVIS->CurVideo); - return FALSE; - } - else if (PulsedInputState.menu[KEY_MENU_LEFT] || PulsedInputState.menu[KEY_MENU_RIGHT]) - { - if (vid->decoder->audio_synced) - { - float newpos; - - LockMutex (vid->guard); - newpos = vid->decoder->pos; - UnlockMutex (vid->guard); + LockMutex (vid->guard); + pos = (uint32) (vid->decoder->pos * 1000); + UnlockMutex (vid->guard); - if (PulsedInputState.menu[KEY_MENU_LEFT]) - newpos -= 2; - else if (PulsedInputState.menu[KEY_MENU_RIGHT]) - newpos += 1; - if (newpos < 0) - newpos = 0; + return pos; +} - LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); - SeekStream (MUSIC_SOURCE, (uint32) (newpos * 1000)); - UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); +bool +TFB_SeekVideo (VIDEO_REF vid, uint32 pos) +{ + if (!TFB_VideoPlaying (vid)) + return false; - TaskSwitch (); - } - // non a/s decoder seeking is not supported yet + if (vid->decoder->audio_synced) + { + LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + SeekStream (MUSIC_SOURCE, pos); + UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + TaskSwitch (); + return true; } else - { - SleepThread (ONE_SECOND / 30); + { // TODO: Non-a/s decoder seeking is not supported yet + // Decide what to do with these. Seeking this kind of + // video is trivial, but we may not want to do it. + // The only non-a/s videos right now are ship spins. + return false; } - - return TRUE; } -void -TFB_VideoInput (VIDEO_REF VidRef) -{ - VIDEO_INPUT_STATE vis; - - vis.MenuRepeatDelay = 0; - vis.InputFunc = TFB_DoVideoInput; - vis.CurVideo = VidRef; - - SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); - DoInput (&vis, TRUE); -} - static void vp_BeginFrame (TFB_VideoDecoder* decoder) { Modified: trunk/sc2/src/libs/video/vidplayer.h =================================================================== --- trunk/sc2/src/libs/video/vidplayer.h 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/vidplayer.h 2009-10-12 02:19:46 UTC (rev 3223) @@ -19,13 +19,12 @@ #include "video.h" -bool TFB_InitVideoPlayer (void); -void TFB_UninitVideoPlayer (void); -void TFB_FadeClearScreen (void); -bool TFB_PlayVideo (VIDEO_REF VidRef, uint32 x, uint32 y); -void TFB_StopVideo (VIDEO_REF VidRef); -bool TFB_VideoPlaying (VIDEO_REF VidRef); -void TFB_VideoInput (VIDEO_REF VidRef); +extern bool TFB_InitVideoPlayer (void); +extern void TFB_UninitVideoPlayer (void); +extern bool TFB_PlayVideo (VIDEO_REF VidRef, uint32 x, uint32 y); +extern void TFB_StopVideo (VIDEO_REF VidRef); +extern bool TFB_VideoPlaying (VIDEO_REF VidRef); +extern uint32 TFB_GetVideoPosition (VIDEO_REF VidRef); +extern bool TFB_SeekVideo (VIDEO_REF VidRef, uint32 pos); - #endif // _VIDPLAYER_H Modified: trunk/sc2/src/libs/video/vresins.c =================================================================== --- trunk/sc2/src/libs/video/vresins.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/video/vresins.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -47,7 +47,7 @@ { void *result = NULL; char paths[1024], *audio_path, *speech_path, *loop_str; - DWORD LoopFrame = VID_NO_LOOP; + uint32 LoopFrame = VID_NO_LOOP; /* Parse out the video components. */ strncpy (paths, path, 1023); @@ -93,13 +93,13 @@ if (loop_str) { char *end; - LoopFrame = (DWORD) strtol (loop_str, &end, 10); + LoopFrame = strtol (loop_str, &end, 10); // We allow whitespace at the end, but nothing printable. if (*end > 32) { log_add (log_Warning, "Warning: Unparsable loop frame '%s'. Disabling loop.", loop_str); LoopFrame = VID_NO_LOOP; } - log_add (log_Info, "\tLoop frame is %d", LoopFrame); + log_add (log_Info, "\tLoop frame is %u", LoopFrame); } else log_add (log_Info, "\tNo specified loop frame"); Modified: trunk/sc2/src/libs/vidlib.h =================================================================== --- trunk/sc2/src/libs/vidlib.h 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/libs/vidlib.h 2009-10-12 02:19:46 UTC (rev 3223) @@ -32,6 +32,7 @@ typedef struct tfb_videoclip *VIDEO_REF; typedef struct legacy_video_desc *LEGACY_VIDEO; +typedef struct legacy_video_ref *LEGACY_VIDEO_REF; extern BOOLEAN InstallVideoResType (void); @@ -39,17 +40,20 @@ extern void UninitVideoPlayer (void); extern VIDEO_REF LoadVideoFile (const char *pStr); -extern BOOLEAN DestroyVideo (VIDEO_REF VideoRef); +extern BOOLEAN DestroyVideo (VIDEO_REF VidRef); extern VIDEO_TYPE VidPlay (VIDEO_REF VidRef); extern VIDEO_TYPE VidPlayEx (VIDEO_REF VidRef, MUSIC_REF AudRef, MUSIC_REF SpeechRef, DWORD LoopFrame); #define VID_NO_LOOP (0U-1) extern void VidStop (void); extern VIDEO_REF VidPlaying (void); -extern void VidDoInput (void); +extern DWORD VidGetPosition (void); // position in milliseconds +extern BOOLEAN VidSeek (DWORD pos); // position in milliseconds -LEGACY_VIDEO LoadLegacyVideoInstance (RESOURCE res); -BOOLEAN PlayLegacyVideo (LEGACY_VIDEO vid); -BOOLEAN DestroyLegacyVideo (LEGACY_VIDEO vid); +extern LEGACY_VIDEO LoadLegacyVideoInstance (RESOURCE res); +extern BOOLEAN DestroyLegacyVideo (LEGACY_VIDEO vid); +extern LEGACY_VIDEO_REF PlayLegacyVideo (LEGACY_VIDEO vid); +extern void StopLegacyVideo (LEGACY_VIDEO_REF ref); +extern BOOLEAN PlayingLegacyVideo (LEGACY_VIDEO_REF ref); #endif /* _VIDLIB_H */ Modified: trunk/sc2/src/uqm/intro.c =================================================================== --- trunk/sc2/src/uqm/intro.c 2009-10-11 21:42:05 UTC (rev 3222) +++ trunk/sc2/src/uqm/intro.c 2009-10-12 02:19:46 UTC (rev 3223) @@ -85,6 +85,16 @@ int debounce; } SPINANIM_INPUT_STATE; +typedef struct +{ + // standard state required by DoInput + BOOLEAN (*InputFunc) (void *pInputState); + COUNT MenuRepeatDelay; + + LEGACY_VIDEO_REF CurVideo; + +} VIDEO_INPUT_STATE; + static BOOLEAN DoPresentation (void *pIS); static BOOLEAN @@ -795,7 +805,6 @@ DestroyDrawable (ReleaseDrawable (pis.Frame)); for (i = 0; i < MAX_FONTS; ++i) DestroyFont (pis.Fonts[i]); - DestroyStringTable (ReleaseStringTable (pis.SlideShow)); LockMutex (GraphicsLock); SetContextFont (OldFont); @@ -806,6 +815,96 @@ return TRUE; } +static BOOLEAN +DoVideoInput (void *pIS) +{ + VIDEO_INPUT_STATE* pVIS = (VIDEO_INPUT_STATE*) pIS; + + if (!PlayingLegacyVideo (pVIS->CurVideo)) + { // Video probably finished + // Have to call VidStop anyway to cleanup + VidStop (); + return FALSE; + } + + if (PulsedInputState.menu[KEY_MENU_SELECT] + || PulsedInputState.menu[KEY_MENU_CANCEL] + || PulsedInputState.menu[KEY_MENU_SPECIAL] + || (GLOBAL (CurrentActivity) & CHECK_ABORT)) + { // abort movie + VidStop (); + return FALSE; + } + else if (PulsedInputState.menu[KEY_MENU_LEFT] + || PulsedInputState.menu[KEY_MENU_RIGHT]) + { + SDWORD newpos = VidGetPosition (); + if (PulsedInputState.menu[KEY_MENU_LEFT]) + newpos -= 2000; + else if (PulsedInputState.menu[KEY_MENU_RIGHT]) + newpos += 1000; + if (newpos < 0) + newpos = 0; + + VidSeek (newpos); + } + else + { + SleepThread (ONE_SECOND / 30); + } + + return TRUE; +} + +static void +FadeClearScreen (void) +{ + BYTE xform_buf[1]; + RECT r = {{0, 0}, {SCREEN_WIDTH, SCREEN_HEIGHT}}; + + xform_buf[0] = FadeAllToBlack; + SleepThreadUntil (XFormColorMap ( + (COLORMAPPTR) xform_buf, ONE_SECOND / 2)); + + // paint black rect over screen + LockMutex (GraphicsLock); + SetContext (ScreenContext); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00)); + DrawFilledRectangle (&r); + UnlockMutex (GraphicsLock); + + // fade in black rect instantly + xform_buf[0] = FadeAllToColor; + XFormColorMap ((COLORMAPPTR) xform_buf, 0); +} + +static BOOLEAN +ShowLegacyVideo (LEGACY_VIDEO vid) +{ + VIDEO_INPUT_STATE vis; + LEGACY_VIDEO_REF ref; + + FadeClearScreen (); + + ref = PlayLegacyVideo (vid); + if (!ref) + return FALSE; + + // XXX: FlushInput() won't be need once DoInput(reset-input) works right + FlushInput (); + vis.MenuRepeatDelay = 0; + vis.InputFunc = DoVideoInput; + vis.CurVideo = ref; + SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); + DoInput (&vis, TRUE); + + StopLegacyVideo (ref); + FadeClearScreen (); + + return TRUE; +} + BOOLEAN ShowPresentation (RESOURCE res) { @@ -816,13 +915,15 @@ } if (!strcmp (resType, "STRTAB")) { - return ShowSlidePresentation (CaptureStringTable ( - LoadStringTable (res))); + STRING pres = CaptureStringTable (LoadStringTable (res)); + BOOLEAN result = ShowSlidePresentation (pres); + DestroyStringTable (ReleaseStringTable (pres)); + return result; } else if (!strcmp (resType, "3DOVID")) { LEGACY_VIDEO vid = LoadLegacyVideoInstance (res); - BOOLEAN result = PlayLegacyVideo (vid); + BOOLEAN result = ShowLegacyVideo (vid); DestroyLegacyVideo (vid); return result; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-14 13:35:57
|
Revision: 3226 http://sc2.svn.sourceforge.net/sc2/?rev=3226&view=rev Author: avolkov Date: 2009-10-14 13:35:37 +0000 (Wed, 14 Oct 2009) Log Message: ----------- Cleanup of inplib: don't include stuff from uqm/, some funcs and vars moved around, some dead stuff removed, others Modified Paths: -------------- trunk/sc2/src/libs/inplib.h trunk/sc2/src/libs/input/inpintrn.h trunk/sc2/src/libs/input/input_common.c trunk/sc2/src/libs/input/input_common.h trunk/sc2/src/libs/input/sdl/input.c trunk/sc2/src/libs/input/sdl/input.h trunk/sc2/src/uqm/comm/starbas/starbas.c trunk/sc2/src/uqm/confirm.c trunk/sc2/src/uqm/controls.h trunk/sc2/src/uqm/cyborg.c trunk/sc2/src/uqm/gameinp.c trunk/sc2/src/uqm/gameopt.c trunk/sc2/src/uqm/intro.c trunk/sc2/src/uqm/melee.c trunk/sc2/src/uqm/planets/devices.c trunk/sc2/src/uqm/planets/solarsys.c trunk/sc2/src/uqm/restart.c trunk/sc2/src/uqm/save.c trunk/sc2/src/uqm/starbase.c trunk/sc2/src/uqm/starcon.c trunk/sc2/src/uqm.c Modified: trunk/sc2/src/libs/inplib.h =================================================================== --- trunk/sc2/src/libs/inplib.h 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/inplib.h 2009-10-14 13:35:37 UTC (rev 3226) @@ -23,13 +23,10 @@ #include "libs/compiler.h" #include "libs/uio.h" -typedef DWORD INPUT_STATE; -extern BOOLEAN InitInput (void); -extern BOOLEAN UninitInput (void); extern BOOLEAN AnyButtonPress (BOOLEAN DetectSpecial); -extern void FlushInput (void); +extern void TFB_ResetControls (void); /* * Not used right now Modified: trunk/sc2/src/libs/input/inpintrn.h =================================================================== --- trunk/sc2/src/libs/input/inpintrn.h 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/input/inpintrn.h 2009-10-14 13:35:37 UTC (rev 3226) @@ -20,6 +20,6 @@ #define _INPINTRN_H #include "libs/inplib.h" +#include "libs/input/input_common.h" - #endif /* _INPINTRN_H */ Modified: trunk/sc2/src/libs/input/input_common.c =================================================================== --- trunk/sc2/src/libs/input/input_common.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/input/input_common.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -17,7 +17,4 @@ */ #include "port.h" -#include "input_common.h" #include "inpintrn.h" - -volatile BOOLEAN ExitRequested, GamePaused; Modified: trunk/sc2/src/libs/input/input_common.h =================================================================== --- trunk/sc2/src/libs/input/input_common.h 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/input/input_common.h 2009-10-14 13:35:37 UTC (rev 3226) @@ -28,7 +28,12 @@ // flags for TFB_InitInput //#define TFB_INPUTFLAGS_ETC (1<<0) -int TFB_InitInput (int driver, int flags); -void TFB_UninitInput (void); +extern int TFB_InitInput (int driver, int flags); +extern void TFB_UninitInput (void); +#define MAX_FLIGHT_ALTERNATES 2 + +extern void TFB_SetInputVectors (volatile int menu[], int num_menu, + volatile int flight[], int num_templ, int num_flight); + #endif Modified: trunk/sc2/src/libs/input/sdl/input.c =================================================================== --- trunk/sc2/src/libs/input/sdl/input.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/input/sdl/input.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -20,8 +20,8 @@ #include <assert.h> #include <errno.h> +#include "../inpintrn.h" #include "libs/graphics/sdl/sdl_common.h" -#include "libs/input/input_common.h" #include "libs/input/sdl/vcontrol.h" #include "libs/input/sdl/keynames.h" #include "libs/memlib.h" @@ -29,8 +29,6 @@ #include "libs/log.h" #include "libs/reslib.h" #include "options.h" -// XXX: we should not include anything from uqm/ inside libs/ -#include "uqm/controls.h" #define KBDBUFSIZE (1 << 8) @@ -41,6 +39,14 @@ static int *kbdstate = NULL; // Holds all SDL keys +1 for holding invalid values +static volatile int *menu_vec; +static int num_menu; +// The last vector element is the character repeat "key" +#define KEY_MENU_ANY (num_menu - 1) +static volatile int *flight_vec; +static int num_templ; +static int num_flight; + static BOOLEAN InputInitialized = FALSE; static BOOLEAN in_character_mode = FALSE; @@ -98,13 +104,16 @@ if (!res_HasKey (buf)) break; VControl_ParseGesture (&g, res_GetString (buf)); - VControl_AddGestureBinding (&g, (int *)&ImmediateInputState.menu[index]); + VControl_AddGestureBinding (&g, (int *)&menu_vec[index]); i++; } } -static VCONTROL_GESTURE controls[NUM_TEMPLATES][NUM_KEYS][2]; +static VCONTROL_GESTURE *controls; +#define CONTROL_PTR(i, j, k) \ + (controls + ((i) * num_flight + (j)) * MAX_FLIGHT_ALTERNATES + (k)) + static void register_flight_controls (void) { @@ -113,7 +122,7 @@ buf[39] = '\0'; - for (i = 0; i < NUM_TEMPLATES; i++) + for (i = 0; i < num_templ; i++) { /* Copy in name */ snprintf (buf, 39, "keys.%d.name", i+1); @@ -126,11 +135,11 @@ { input_templates[i].name[0] = '\0'; } - for (j = 0; j < NUM_KEYS; j++) + for (j = 0; j < num_flight; j++) { - for (k = 0; k < 2; k++) + for (k = 0; k < MAX_FLIGHT_ALTERNATES; k++) { - VCONTROL_GESTURE *g = &controls[i][j][k]; + VCONTROL_GESTURE *g = CONTROL_PTR(i, j, k); snprintf (buf, 39, "keys.%d.%s.%d", i+1, flight_res_names[j], k+1); if (!res_HasKey (buf)) { @@ -138,7 +147,7 @@ continue; } VControl_ParseGesture (g, res_GetString (buf)); - VControl_AddGestureBinding (g, (int *)&ImmediateInputState.key[i][j]); + VControl_AddGestureBinding (g, (int *)(flight_vec + i * num_flight + j)); } } } @@ -149,10 +158,19 @@ { int i; + if (!menu_vec || !flight_vec) + { + log_add (log_Fatal, "initKeyConfig(): invalid input vectors"); + exit (EXIT_FAILURE); + } + + controls = HCalloc (sizeof (*controls) * num_templ * num_flight + * MAX_FLIGHT_ALTERNATES); + /* First, load in the menu keys */ LoadResourceIndex (contentDir, "menu.key", "menu."); LoadResourceIndex (configDir, "override.cfg", "menu."); - for (i = 0; i < NUM_MENU_KEYS; i++) + for (i = 0; i < num_menu; i++) { if (!menu_res_names[i]) break; @@ -178,9 +196,25 @@ resetKeyboardState (void) { memset (kbdstate, 0, sizeof (int) * num_keys); - ImmediateInputState.menu[KEY_MENU_ANY] = 0; + menu_vec[KEY_MENU_ANY] = 0; } +void +TFB_SetInputVectors (volatile int menu[], int num_menu_, volatile int flight[], + int num_templ_, int num_flight_) +{ + if (num_menu_ < 0 || num_templ_ < 0 || num_flight_ < 0) + { + log_add (log_Fatal, "TFB_SetInputVectors(): invalid vector size"); + exit (EXIT_FAILURE); + } + menu_vec = menu; + num_menu = num_menu_; + flight_vec = flight; + num_templ = num_templ_; + num_flight = num_flight_; +} + int TFB_InitInput (int driver, int flags) { @@ -189,8 +223,6 @@ (void)driver; (void)flags; - GamePaused = ExitRequested = FALSE; - SDL_EnableUNICODE(1); (void)SDL_GetKeyState (&num_keys); kbdstate = (int *)HMalloc (sizeof (int) * (num_keys + 1)); @@ -237,6 +269,7 @@ TFB_UninitInput (void) { VControl_Uninit (); + HFree (controls); HFree (kbdstate); } @@ -342,7 +375,7 @@ kbdbuf[kbdtail] = map_key; kbdtail = newtail; lastchar = map_key; - ImmediateInputState.menu[KEY_MENU_ANY]++; + menu_vec[KEY_MENU_ANY]++; } } else if (Event->type == SDL_KEYUP) @@ -350,13 +383,13 @@ if (kbdstate[k] == 0) { // something is fishy -- better to reset the // repeatable state to avoid big problems - ImmediateInputState.menu[KEY_MENU_ANY] = 0; + menu_vec[KEY_MENU_ANY] = 0; } else { kbdstate[k]--; - if (ImmediateInputState.menu[KEY_MENU_ANY] > 0) - ImmediateInputState.menu[KEY_MENU_ANY]--; + if (menu_vec[KEY_MENU_ANY] > 0) + menu_vec[KEY_MENU_ANY]--; } } } @@ -373,17 +406,18 @@ } void -FlushInput (void) -{ - TFB_ResetControls (); - FlushInputState (); -} - -void InterrogateInputState (int template, int control, int index, char *buffer, int maxlen) { - VCONTROL_GESTURE *g = &controls[template][control][index]; + VCONTROL_GESTURE *g = CONTROL_PTR(template, control, index); + if (template >= num_templ || control >= num_flight + || index >= MAX_FLIGHT_ALTERNATES) + { + log_add (log_Warning, "InterrogateInputState(): invalid control index"); + buffer[0] = 0; + return; + } + switch (g->type) { case VCONTROL_KEY: @@ -411,11 +445,19 @@ void RemoveInputState (int template, int control, int index) { - VCONTROL_GESTURE *g = &controls[template][control][index]; + VCONTROL_GESTURE *g = CONTROL_PTR(template, control, index); char keybuf[40]; keybuf[39] = '\0'; - VControl_RemoveGestureBinding (g, (int *)&ImmediateInputState.key[template][control]); + if (template >= num_templ || control >= num_flight + || index >= MAX_FLIGHT_ALTERNATES) + { + log_add (log_Warning, "RemoveInputState(): invalid control index"); + return; + } + + VControl_RemoveGestureBinding (g, + (int *)(flight_vec + template * num_flight + control)); g->type = VCONTROL_NONE; snprintf (keybuf, 39, "keys.%d.%s.%d", template+1, flight_res_names[control], index+1); @@ -431,6 +473,13 @@ char keybuf[40], valbuf[40]; keybuf[39] = valbuf[39] = '\0'; + if (template >= num_templ || control >= num_flight + || index >= MAX_FLIGHT_ALTERNATES) + { + log_add (log_Warning, "RebindInputState(): invalid control index"); + return; + } + /* Remove the old binding on this spot */ RemoveInputState (template, control, index); @@ -442,8 +491,9 @@ } /* And now, add the new binding. */ - VControl_AddGestureBinding (&g, (int *)&ImmediateInputState.key[template][control]); - controls[template][control][index] = g; + VControl_AddGestureBinding (&g, + (int *)(flight_vec + template * num_flight + control)); + *CONTROL_PTR(template, control, index) = g; snprintf (keybuf, 39, "keys.%d.%s.%d", template+1, flight_res_names[control], index+1); VControl_DumpGesture (valbuf, 39, &g); res_PutString (keybuf, valbuf); Modified: trunk/sc2/src/libs/input/sdl/input.h =================================================================== --- trunk/sc2/src/libs/input/sdl/input.h 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/libs/input/sdl/input.h 2009-10-14 13:35:37 UTC (rev 3226) @@ -19,7 +19,6 @@ #ifndef INPUT_H #define INPUT_H -void FlushInput (void); -void ProcessInputEvent (const SDL_Event *Event); +extern void ProcessInputEvent (const SDL_Event *Event); #endif Modified: trunk/sc2/src/uqm/comm/starbas/starbas.c =================================================================== --- trunk/sc2/src/uqm/comm/starbas/starbas.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/comm/starbas/starbas.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -24,7 +24,6 @@ #include "uqm/setup.h" #include "uqm/shipcont.h" #include "libs/graphics/gfx_common.h" -#include "libs/inplib.h" #include "libs/mathlib.h" #include "libs/inplib.h" #include "libs/sound/sound.h" Modified: trunk/sc2/src/uqm/confirm.c =================================================================== --- trunk/sc2/src/uqm/confirm.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/confirm.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -25,7 +25,6 @@ #include "sounds.h" #include "gamestr.h" #include "libs/graphics/widgets.h" -#include "libs/inplib.h" #include "libs/sound/trackplayer.h" #include "libs/log.h" #include "libs/resource/stringbank.h" @@ -266,7 +265,6 @@ DrawStamp (&s); DestroyDrawable (ReleaseDrawable (s.frame)); - FlushInput (); SetContextClipRect (&oldRect); SetContext (oldContext); UnlockMutex (GraphicsLock); Modified: trunk/sc2/src/uqm/controls.h =================================================================== --- trunk/sc2/src/uqm/controls.h 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/controls.h 2009-10-14 13:35:37 UTC (rev 3226) @@ -95,8 +95,7 @@ extern CONTROL_TEMPLATE PlayerControls[]; void UpdateInputState (void); -void FlushInputState (void); -void TFB_ResetControls (void); +extern void FlushInput (void); void SetMenuRepeatDelay (DWORD min, DWORD max, DWORD step, BOOLEAN gestalt); void SetDefaultMenuRepeatDelay (void); void ResetKeyRepeat (void); Modified: trunk/sc2/src/uqm/cyborg.c =================================================================== --- trunk/sc2/src/uqm/cyborg.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/cyborg.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -24,7 +24,6 @@ #include "intel.h" #include "setup.h" #include "units.h" -#include "libs/inplib.h" #include "libs/mathlib.h" #include "libs/log.h" @@ -572,7 +571,7 @@ void Pursue (ELEMENT *ShipPtr, EVALUATE_DESC *EvalDescPtr) { - INPUT_STATE maneuver_state; + BYTE maneuver_state; COUNT desired_thrust_angle, desired_turn_angle; SIZE delta_x, delta_y; SIZE ship_delta_x, ship_delta_y; @@ -703,7 +702,7 @@ void Entice (ELEMENT *ShipPtr, EVALUATE_DESC *EvalDescPtr) { - INPUT_STATE maneuver_state; + BYTE maneuver_state; COUNT desired_thrust_angle, desired_turn_angle; COUNT cone_of_fire, travel_angle; SIZE delta_x, delta_y; Modified: trunk/sc2/src/uqm/gameinp.c =================================================================== --- trunk/sc2/src/uqm/gameinp.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/gameinp.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -65,6 +65,9 @@ volatile CONTROLLER_INPUT_STATE ImmediateInputState; +volatile BOOLEAN ExitRequested; +volatile BOOLEAN GamePaused; + static void _clear_menu_state (void) { @@ -291,8 +294,9 @@ } void -FlushInputState (void) +FlushInput (void) { + TFB_ResetControls (); _clear_menu_state (); } @@ -334,7 +338,7 @@ SetMenuRepeatDelay (ACCELERATION_INCREMENT, MENU_REPEAT_DELAY, ACCELERATION_INCREMENT, FALSE); if (resetInput) - TFB_ResetControls (); + FlushInput (); do { @@ -376,7 +380,7 @@ } while (((INPUT_STATE_DESC*)pInputState)->InputFunc (pInputState)); if (resetInput) - TFB_ResetControls (); + FlushInput (); } void Modified: trunk/sc2/src/uqm/gameopt.c =================================================================== --- trunk/sc2/src/uqm/gameopt.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/gameopt.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -25,7 +25,6 @@ #include "encount.h" #include "planets/lander.h" #include "gamestr.h" -#include "libs/inplib.h" #include "load.h" #include "options.h" #include "save.h" Modified: trunk/sc2/src/uqm/intro.c =================================================================== --- trunk/sc2/src/uqm/intro.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/intro.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -28,7 +28,6 @@ #include "libs/graphics/drawable.h" #include "libs/sound/sound.h" #include "libs/vidlib.h" -#include "libs/inplib.h" #include "libs/log.h" #include <ctype.h> @@ -785,7 +784,6 @@ OldFont = SetContextFont (NULL); UnlockMutex (GraphicsLock); - FlushInput (); SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); pis.MenuRepeatDelay = 0; pis.InputFunc = DoPresentation; @@ -891,8 +889,6 @@ if (!ref) return FALSE; - // XXX: FlushInput() won't be need once DoInput(reset-input) works right - FlushInput (); vis.MenuRepeatDelay = 0; vis.InputFunc = DoVideoInput; vis.CurVideo = ref; Modified: trunk/sc2/src/uqm/melee.c =================================================================== --- trunk/sc2/src/uqm/melee.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/melee.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -48,7 +48,6 @@ #include "util.h" #include "libs/graphics/drawable.h" #include "libs/gfxlib.h" -#include "libs/inplib.h" #include "libs/mathlib.h" #include "libs/log.h" @@ -1098,7 +1097,7 @@ pMS->Initialized = 0; else pMS->Initialized = -1; - TFB_ResetControls (); + FlushInput (); DoPickShip (pMS); } else if (pMS->row < NUM_MELEE_ROWS && Modified: trunk/sc2/src/uqm/planets/devices.c =================================================================== --- trunk/sc2/src/uqm/planets/devices.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/planets/devices.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -651,7 +651,7 @@ pMS->first_item.y = 0; pMS->CurFrame = (FRAME)DeviceMap; - TFB_ResetControls (); + FlushInput (); DoManipulateDevices (pMS); /* to make sure it's initialized */ SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); DoInput (pMS, TRUE); Modified: trunk/sc2/src/uqm/planets/solarsys.c =================================================================== --- trunk/sc2/src/uqm/planets/solarsys.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/planets/solarsys.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -35,7 +35,6 @@ #include "../uqmdebug.h" #include "libs/graphics/gfx_common.h" #include "libs/mathlib.h" -#include "libs/inplib.h" #include "libs/log.h" Modified: trunk/sc2/src/uqm/restart.c =================================================================== --- trunk/sc2/src/uqm/restart.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/restart.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -317,7 +317,6 @@ if (TimeOut == ONE_SECOND / 8) SleepThread (ONE_SECOND * 3); DrawRestartMenuGraphic (pMS); - FlushInput (); GLOBAL (CurrentActivity) &= ~CHECK_ABORT; SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); DoInput (pMS, TRUE); Modified: trunk/sc2/src/uqm/save.c =================================================================== --- trunk/sc2/src/uqm/save.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/save.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -606,7 +606,8 @@ FlushGraphics (); UnlockMutex (GraphicsLock); - while (AnyButtonPress (FALSE)); + while (AnyButtonPress (FALSE)) + ; do { TaskSwitch (); @@ -622,8 +623,6 @@ SetContext (OldContext); DestroyDrawable (ReleaseDrawable (s.frame)); UnlockMutex (GraphicsLock); - - return; } // This function first writes to a memory file, and then writes the whole Modified: trunk/sc2/src/uqm/starbase.c =================================================================== --- trunk/sc2/src/uqm/starbase.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/starbase.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -30,7 +30,6 @@ #include "sounds.h" #include "libs/graphics/gfx_common.h" #include "libs/tasklib.h" -#include "libs/inplib.h" MENU_STATE *pMenuState; Modified: trunk/sc2/src/uqm/starcon.c =================================================================== --- trunk/sc2/src/uqm/starcon.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm/starcon.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -37,7 +37,6 @@ #include "libs/log.h" #include "libs/gfxlib.h" #include "libs/graphics/gfx_common.h" -#include "libs/inplib.h" #include "libs/misc.h" #include "uqmversion.h" Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-12 21:04:48 UTC (rev 3225) +++ trunk/sc2/src/uqm.c 2009-10-14 13:35:37 UTC (rev 3226) @@ -482,6 +482,11 @@ initAudio calls AssignTask, which currently blocks on ProcessThreadLifecycles... */ // initAudio (snddriver, soundflags); + // Make sure that the compiler treats multidim arrays the way we expect + assert (sizeof (int [NUM_TEMPLATES * NUM_KEYS]) == + sizeof (int [NUM_TEMPLATES][NUM_KEYS])); + TFB_SetInputVectors (ImmediateInputState.menu, NUM_MENU_KEYS, + (volatile int *)ImmediateInputState.key, NUM_TEMPLATES, NUM_KEYS); TFB_InitInput (TFB_INPUTDRIVER_SDL, 0); StartThread (Starcon2Main, NULL, 1024, "Starcon2Main"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcm...@us...> - 2009-10-19 01:02:28
|
Revision: 3229 http://sc2.svn.sourceforge.net/sc2/?rev=3229&view=rev Author: mcmartin Date: 2009-10-19 01:02:22 +0000 (Mon, 19 Oct 2009) Log Message: ----------- When reading options, perform more thorough type-checking. This should solve a crash some modders found when modifying menu.key. Modified Paths: -------------- trunk/sc2/src/libs/input/sdl/input.c trunk/sc2/src/libs/reslib.h trunk/sc2/src/libs/resource/resinit.c trunk/sc2/src/uqm/setupmenu.c trunk/sc2/src/uqm.c Modified: trunk/sc2/src/libs/input/sdl/input.c =================================================================== --- trunk/sc2/src/libs/input/sdl/input.c 2009-10-18 16:53:27 UTC (rev 3228) +++ trunk/sc2/src/libs/input/sdl/input.c 2009-10-19 01:02:22 UTC (rev 3229) @@ -101,7 +101,7 @@ { VCONTROL_GESTURE g; snprintf (buf, 39, "menu.%s.%d", menu_res_names[index], i); - if (!res_HasKey (buf)) + if (!res_IsString (buf)) break; VControl_ParseGesture (&g, res_GetString (buf)); VControl_AddGestureBinding (&g, (int *)&menu_vec[index]); @@ -126,7 +126,7 @@ { /* Copy in name */ snprintf (buf, 39, "keys.%d.name", i+1); - if (res_HasKey (buf)) + if (res_IsString (buf)) { strncpy (input_templates[i].name, res_GetString (buf), 29); input_templates[i].name[29] = '\0'; @@ -141,7 +141,7 @@ { VCONTROL_GESTURE *g = CONTROL_PTR(i, j, k); snprintf (buf, 39, "keys.%d.%s.%d", i+1, flight_res_names[j], k+1); - if (!res_HasKey (buf)) + if (!res_IsString (buf)) { g->type = VCONTROL_NONE; continue; Modified: trunk/sc2/src/libs/reslib.h =================================================================== --- trunk/sc2/src/libs/reslib.h 2009-10-18 16:53:27 UTC (rev 3228) +++ trunk/sc2/src/libs/reslib.h 2009-10-19 01:02:22 UTC (rev 3229) @@ -102,6 +102,7 @@ BOOLEAN res_HasKey (const char *key); +BOOLEAN res_IsString (const char *key); const char *res_GetString (const char *key); void res_PutString (const char *key, const char *value); Modified: trunk/sc2/src/libs/resource/resinit.c =================================================================== --- trunk/sc2/src/libs/resource/resinit.c 2009-10-18 16:53:27 UTC (rev 3228) +++ trunk/sc2/src/libs/resource/resinit.c 2009-10-19 01:02:22 UTC (rev 3229) @@ -318,13 +318,21 @@ } /* These replace the mapres.c calls and probably should be split out at some point. */ +BOOLEAN +res_IsString (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "STRING"); +} + const char * res_GetString (const char *key) { RESOURCE_INDEX idx = _get_current_index_header (); ResourceDesc *desc = lookupResourceDesc (idx, key); if (!desc || !desc->resdata.ptr || strcmp(desc->vtable->resType, "STRING")) - return NULL; + return ""; /* TODO: Work out exact STRING semantics, specifically, the lifetime of * the returned value. If caller is allowed to reference the returned * value forever, STRING has to be ref-counted. */ @@ -358,6 +366,14 @@ } } +BOOLEAN +res_IsInteger (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "INT32"); +} + int res_GetInteger (const char *key) { @@ -386,6 +402,14 @@ } BOOLEAN +res_IsBoolean (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "BOOLEAN"); +} + +BOOLEAN res_GetBoolean (const char *key) { RESOURCE_INDEX idx = _get_current_index_header (); Modified: trunk/sc2/src/uqm/setupmenu.c =================================================================== --- trunk/sc2/src/uqm/setupmenu.c 2009-10-18 16:53:27 UTC (rev 3228) +++ trunk/sc2/src/uqm/setupmenu.c 2009-10-19 01:02:22 UTC (rev 3229) @@ -1183,7 +1183,7 @@ break; } - if (res_HasKey ("config.alwaysgl")) + if (res_IsBoolean ("config.alwaysgl")) { if (res_GetBoolean ("config.alwaysgl")) { Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-18 16:53:27 UTC (rev 3228) +++ trunk/sc2/src/uqm.c 2009-10-19 01:02:22 UTC (rev 3229) @@ -215,31 +215,31 @@ // Fill in the options struct based on uqm.cfg LoadResourceIndex (configDir, "uqm.cfg", "config."); - if (res_HasKey ("config.reswidth")) + if (res_IsInteger ("config.reswidth")) { options.width = res_GetInteger ("config.reswidth"); } - if (res_HasKey ("config.resheight")) + if (res_IsInteger ("config.resheight")) { options.height = res_GetInteger ("config.resheight"); } - if (res_HasKey("config.keepaspectratio")) + if (res_IsBoolean("config.keepaspectratio")) { options.keepAspectRatio = res_GetBoolean ("config.keepaspectratio"); } - if (res_HasKey ("config.alwaysgl")) + if (res_IsBoolean ("config.alwaysgl")) { if (res_GetBoolean ("config.alwaysgl")) { options.gfxDriver = TFB_GFXDRIVER_SDL_OPENGL; } } - if (res_HasKey ("config.usegl")) + if (res_IsBoolean ("config.usegl")) { options.gfxDriver = res_GetBoolean ("config.usegl") ? TFB_GFXDRIVER_SDL_OPENGL : TFB_GFXDRIVER_SDL_PURE; } - if (res_HasKey ("config.scaler")) + if (res_IsString ("config.scaler")) { const char *arg = res_GetString ("config.scaler"); @@ -254,67 +254,67 @@ else if (!strcmp (arg, "hq")) options.gfxFlags |= TFB_GFXFLAGS_SCALE_HQXX; } - if (res_HasKey ("config.scanlines") && + if (res_IsBoolean ("config.scanlines") && res_GetBoolean ("config.scanlines")) { options.gfxFlags |= TFB_GFXFLAGS_SCANLINES; } - if (res_HasKey ("config.fullscreen") && + if (res_IsBoolean ("config.fullscreen") && res_GetBoolean ("config.fullscreen")) { options.gfxFlags |= TFB_GFXFLAGS_FULLSCREEN; } - if (res_HasKey ("config.subtitles")) + if (res_IsBoolean ("config.subtitles")) { options.subTitles = res_GetBoolean ("config.subtitles"); } - if (res_HasKey ("config.textmenu")) + if (res_IsBoolean ("config.textmenu")) { options.whichMenu = res_GetBoolean ("config.textmenu") ? OPT_PC : OPT_3DO; } - if (res_HasKey ("config.textgradients")) + if (res_IsBoolean ("config.textgradients")) { options.whichFonts = res_GetBoolean ("config.textgradients") ? OPT_PC : OPT_3DO; } - if (res_HasKey ("config.iconicscan")) + if (res_IsBoolean ("config.iconicscan")) { options.whichCoarseScan = res_GetBoolean ("config.iconicscan") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.smoothscroll")) + if (res_IsBoolean ("config.smoothscroll")) { options.smoothScroll = res_GetBoolean ("config.smoothscroll") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.3domusic")) + if (res_IsBoolean ("config.3domusic")) { options.use3doMusic = res_GetBoolean ("config.3domusic"); } - if (res_HasKey ("config.remixmusic")) + if (res_IsBoolean ("config.remixmusic")) { options.usePrecursorsMusic = res_GetBoolean ("config.remixmusic"); } - if (res_HasKey ("config.3domovies")) + if (res_IsBoolean ("config.3domovies")) { options.whichIntro = res_GetBoolean ("config.3domovies") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.showfps") && res_GetBoolean ("config.showfps")) + if (res_IsBoolean ("config.showfps") && res_GetBoolean ("config.showfps")) { options.gfxFlags |= TFB_GFXFLAGS_SHOWFPS; } - if (res_HasKey ("config.smoothmelee")) + if (res_IsBoolean ("config.smoothmelee")) { options.meleeScale = res_GetBoolean ("config.smoothmelee") ? TFB_SCALE_TRILINEAR : TFB_SCALE_STEP; } - if (res_HasKey ("config.positionalsfx")) + if (res_IsBoolean ("config.positionalsfx")) { options.stereoSFX = res_GetBoolean ("config.positionalsfx"); } - if (res_HasKey ("config.audiodriver")) + if (res_IsString ("config.audiodriver")) { const char *driverstr = res_GetString ("config.audiodriver"); if (!strcmp (driverstr, "openal")) @@ -335,7 +335,7 @@ /* Can't figure it out, leave as initial default */ } } - if (res_HasKey ("config.audioquality")) + if (res_IsString ("config.audioquality")) { const char *qstr = res_GetString ("config.audioquality"); if (!strcmp (qstr, "low")) @@ -361,12 +361,12 @@ /* Can't figure it out, leave as initial default */ } } - if (res_HasKey ("config.pulseshield")) + if (res_IsBoolean ("config.pulseshield")) { options.whichShield = res_GetBoolean ("config.pulseshield") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.player1control")) + if (res_IsInteger ("config.player1control")) { PlayerControls[0] = res_GetInteger ("config.player1control"); /* This is an unsigned, so no < 0 check is necessary */ @@ -377,7 +377,7 @@ PlayerControls[0] = CONTROL_TEMPLATE_KB_1; } } - if (res_HasKey ("config.player2control")) + if (res_IsInteger ("config.player2control")) { /* This is an unsigned, so no < 0 check is necessary */ PlayerControls[1] = res_GetInteger ("config.player2control"); @@ -388,17 +388,17 @@ PlayerControls[1] = CONTROL_TEMPLATE_JOY_1; } } - if (res_HasKey ("config.musicvol")) + if (res_IsInteger ("config.musicvol")) { parseIntVolume (res_GetInteger ("config.musicvol"), &options.musicVolumeScale); } - if (res_HasKey ("config.sfxvol")) + if (res_IsInteger ("config.sfxvol")) { parseIntVolume (res_GetInteger ("config.sfxvol"), &options.sfxVolumeScale); } - if (res_HasKey ("config.speechvol")) + if (res_IsInteger ("config.speechvol")) { parseIntVolume (res_GetInteger ("config.speechvol"), &options.speechVolumeScale); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-19 19:13:34
|
Revision: 3232 http://sc2.svn.sourceforge.net/sc2/?rev=3232&view=rev Author: avolkov Date: 2009-10-19 19:13:24 +0000 (Mon, 19 Oct 2009) Log Message: ----------- Sndlib cleanup: do not expose internals; some dead stuff removed; a few bugs fixed; stream decoder reorg; some memory optimizations; use intptr_t for tags (64-bit cleanliness) Modified Paths: -------------- trunk/sc2/src/libs/sndlib.h trunk/sc2/src/libs/sound/decoders/decoder.c trunk/sc2/src/libs/sound/fileinst.c trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.h trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c trunk/sc2/src/libs/sound/music.c trunk/sc2/src/libs/sound/openal/audiodrv_openal.c trunk/sc2/src/libs/sound/resinst.c trunk/sc2/src/libs/sound/sfx.c trunk/sc2/src/libs/sound/sndintrn.h trunk/sc2/src/libs/sound/sound.c trunk/sc2/src/libs/sound/sound.h trunk/sc2/src/libs/sound/stream.c trunk/sc2/src/libs/sound/stream.h trunk/sc2/src/libs/sound/trackplayer.c trunk/sc2/src/libs/video/vidplayer.c trunk/sc2/src/uqm/settings.c Modified: trunk/sc2/src/libs/sndlib.h =================================================================== --- trunk/sc2/src/libs/sndlib.h 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sndlib.h 2009-10-19 19:13:24 UTC (rev 3232) @@ -69,11 +69,12 @@ Priority); extern void PLRStop (MUSIC_REF MusicRef); extern BOOLEAN PLRPlaying (MUSIC_REF MusicRef); +extern void PLRSeek (MUSIC_REF MusicRef, DWORD pos); extern void PLRPause (MUSIC_REF MusicRef); extern void PLRResume (MUSIC_REF MusicRef); extern void snd_PlaySpeech (MUSIC_REF SpeechRef); extern void snd_StopSpeech (void); -extern void PlayChannel (COUNT channel, void *sample, SoundPosition pos, +extern void PlayChannel (COUNT channel, SOUND snd, SoundPosition pos, void *positional_object, unsigned char priority); extern BOOLEAN ChannelPlaying (COUNT Channel); extern void * GetPositionalObject (COUNT channel); @@ -83,7 +84,6 @@ extern void SetMusicVolume (COUNT Volume); extern void SetChannelVolume (COUNT Channel, COUNT Volume, BYTE Priority); -extern void SetChannelRate (COUNT Channel, DWORD Rate, BYTE Priority); extern void StopSound (void); extern BOOLEAN SoundPlaying (void); @@ -91,13 +91,6 @@ extern void WaitForSoundEnd (COUNT Channel); #define TFBSOUND_WAIT_ALL ((COUNT)~0) -extern BOOLEAN AllocHardwareSample (BYTE *lpSnd, DWORD SampleRate, COUNT - SampleLength, COUNT LoopBegin, COUNT LoopLen); -extern BOOLEAN FreeHardwareSample (BYTE *lpSnd, COUNT SampleLength); - -extern COUNT GetSampleRate (SOUND Sound); -extern COUNT GetSampleLength (SOUND Sound); -extern BYTE* GetSampleAddress (SOUND Sound); extern DWORD FadeMusic (BYTE end_vol, SIZE TimeInterval); #endif /* _SNDLIB_H */ Modified: trunk/sc2/src/libs/sound/decoders/decoder.c =================================================================== --- trunk/sc2/src/libs/sound/decoders/decoder.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/decoders/decoder.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -575,6 +575,8 @@ } decoder->buffer_size = decoded_bytes; decoder->pos += decoded_bytes; + // Free up some unused memory + decoder->buffer = HRealloc (decoder->buffer, decoded_bytes); if (decoder->need_swap && decoded_bytes > 0 && (decoder->format == decoder_formats.stereo16 || Modified: trunk/sc2/src/libs/sound/fileinst.c =================================================================== --- trunk/sc2/src/libs/sound/fileinst.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/fileinst.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "sound.h" #include "sndintrn.h" #include "options.h" #include "libs/reslib.h" Modified: trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c =================================================================== --- trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -1,5 +1,3 @@ -//Copyright Paul Reiche, Fred Ford. 1992-2002 - /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +18,7 @@ */ #include "audiodrv_nosound.h" +#include "../../sndintrn.h" #include "libs/tasklib.h" #include "libs/log.h" #include "libs/memlib.h" @@ -136,13 +135,7 @@ for (i = 0; i < NUM_SOUNDSOURCES; ++i) { audio_GenSources (1, &soundSource[i].handle); - soundSource[i].sample = NULL; - soundSource[i].stream_should_be_playing = FALSE; soundSource[i].stream_mutex = CreateMutex ("Nosound stream mutex", SYNC_CLASS_AUDIO); - soundSource[i].sbuffer = NULL; - soundSource[i].sbuf_start = 0; - soundSource[i].sbuf_size = 0; - soundSource[i].sbuf_offset = 0; } atexit (unInitAudio); Modified: trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.h =================================================================== --- trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.h 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/mixer/nosound/audiodrv_nosound.h 2009-10-19 19:13:24 UTC (rev 3232) @@ -24,6 +24,7 @@ #include "libs/sound/sound.h" #include "libs/sound/mixer/mixer.h" + /* Playback task */ int PlaybackTaskFunc (void *data); Modified: trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c =================================================================== --- trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -1,5 +1,3 @@ -//Copyright Paul Reiche, Fred Ford. 1992-2002 - /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +18,7 @@ */ #include "audiodrv_sdl.h" +#include "../../sndintrn.h" #include "libs/tasklib.h" #include "libs/log.h" #include "libs/memlib.h" @@ -200,13 +199,7 @@ for (i = 0; i < NUM_SOUNDSOURCES; ++i) { audio_GenSources (1, &soundSource[i].handle); - soundSource[i].sample = NULL; - soundSource[i].stream_should_be_playing = FALSE; soundSource[i].stream_mutex = CreateMutex ("MixSDL stream mutex", SYNC_CLASS_AUDIO); - soundSource[i].sbuffer = NULL; - soundSource[i].sbuf_start = 0; - soundSource[i].sbuf_size = 0; - soundSource[i].sbuf_offset = 0; } atexit (unInitAudio); Modified: trunk/sc2/src/libs/sound/music.c =================================================================== --- trunk/sc2/src/libs/sound/music.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/music.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -18,6 +18,7 @@ #include "libs/file.h" #include "options.h" #include "sound.h" +#include "sndintrn.h" #include "libs/reslib.h" #include "libs/log.h" #include "libs/memlib.h" @@ -75,6 +76,17 @@ } void +PLRSeek (MUSIC_REF MusicRef, DWORD pos) +{ + if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0) + { + LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + SeekStream (MUSIC_SOURCE, pos); + UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + } +} + +void PLRPause (MUSIC_REF MusicRef) { if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0) @@ -152,45 +164,38 @@ _GetMusicData (uio_Stream *fp, DWORD length) { MUSIC_REF h; + TFB_SoundSample *sample; + TFB_SoundDecoder *decoder; + char filename[256]; - if (_cur_resfile_name && (h = AllocMusicData (sizeof (void *)))) - { - TFB_SoundSample **pmus = h; + if (!_cur_resfile_name) + return NULL; - if (!pmus) - { - return NULL; - } - else - { - char filename[256]; + strncpy (filename, _cur_resfile_name, sizeof(filename) - 1); + filename[sizeof(filename) - 1] = '\0'; + CheckMusicResName (filename); - *pmus = (TFB_SoundSample *) HCalloc (sizeof (TFB_SoundSample)); - strncpy (filename, _cur_resfile_name, sizeof(filename) - 1); - filename[sizeof(filename) - 1] = '\0'; - CheckMusicResName (filename); + log_add (log_Info, "_GetMusicData(): loading %s", filename); + decoder = SoundDecoder_Load (contentDir, filename, 4096, 0, 0); + if (!decoder) + { + log_add (log_Warning, "_GetMusicData(): couldn't load %s", filename); + return NULL; + } - log_add (log_Info, "_GetMusicData(): loading %s", filename); - if (((*pmus)->decoder = SoundDecoder_Load (contentDir, filename, - 4096, 0, 0)) == 0) - { - log_add (log_Warning, "_GetMusicData(): couldn't load %s", filename); + h = AllocMusicData (sizeof (void *)); + if (!h) + { + SoundDecoder_Free (decoder); + return NULL; + } - HFree (h); - return NULL; - } - else - { - log_add (log_Info, " decoder: %s, rate %d format %x", - SoundDecoder_GetName ((*pmus)->decoder), - (*pmus)->decoder->frequency, (*pmus)->decoder->format); + sample = TFB_CreateSoundSample (decoder, 64, NULL); + *h = sample; - (*pmus)->num_buffers = 64; - (*pmus)->buffer = (audio_Object *) HMalloc (sizeof (audio_Object) * (*pmus)->num_buffers); - audio_GenBuffers ((*pmus)->num_buffers, (*pmus)->buffer); - } - } - } + log_add (log_Info, " decoder: %s, rate %d format %x", + SoundDecoder_GetName (sample->decoder), + sample->decoder->frequency, sample->decoder->format); (void) fp; /* satisfy compiler (unused parameter) */ (void) length; /* satisfy compiler (unused parameter) */ @@ -201,28 +206,27 @@ _ReleaseMusicData (void *data) { TFB_SoundSample **pmus = data; + TFB_SoundSample *sample; if (pmus == NULL) return (FALSE); - if ((*pmus)->decoder) + sample = *pmus; + assert (sample != 0); + if (sample->decoder) { - TFB_SoundDecoder *decoder = (*pmus)->decoder; + TFB_SoundDecoder *decoder = sample->decoder; LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); - if (soundSource[MUSIC_SOURCE].sample == (*pmus)) - { + if (soundSource[MUSIC_SOURCE].sample == sample) + { // Currently playing this sample! Not good. StopStream (MUSIC_SOURCE); } UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); - (*pmus)->decoder = NULL; + sample->decoder = NULL; SoundDecoder_Free (decoder); - audio_DeleteBuffers ((*pmus)->num_buffers, (*pmus)->buffer); - HFree ((*pmus)->buffer); - if ((*pmus)->buffer_tag) - HFree ((*pmus)->buffer_tag); } - HFree (*pmus); + TFB_DestroySoundSample (sample); HFree (pmus); return (TRUE); Modified: trunk/sc2/src/libs/sound/openal/audiodrv_openal.c =================================================================== --- trunk/sc2/src/libs/sound/openal/audiodrv_openal.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/openal/audiodrv_openal.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -21,6 +21,7 @@ #include "audiodrv_openal.h" +#include "../sndintrn.h" #include "libs/tasklib.h" #include "libs/log.h" #include "libs/memlib.h" @@ -182,13 +183,7 @@ alSourcefv (soundSource[i].handle, AL_VELOCITY, zero); alSourcefv (soundSource[i].handle, AL_DIRECTION, zero); - soundSource[i].sample = NULL; - soundSource[i].stream_should_be_playing = FALSE; soundSource[i].stream_mutex = CreateMutex ("OpenAL stream mutex", SYNC_CLASS_AUDIO); - soundSource[i].sbuffer = NULL; - soundSource[i].sbuf_start = 0; - soundSource[i].sbuf_size = 0; - soundSource[i].sbuf_offset = 0; } SetSFXVolume (sfxVolumeScale); Modified: trunk/sc2/src/libs/sound/resinst.c =================================================================== --- trunk/sc2/src/libs/sound/resinst.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/resinst.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "sound.h" #include "sndintrn.h" static void Modified: trunk/sc2/src/libs/sound/sfx.c =================================================================== --- trunk/sc2/src/libs/sound/sfx.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/sfx.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -16,6 +16,7 @@ #include "options.h" #include "sound.h" +#include "sndintrn.h" #include "libs/reslib.h" #include "libs/log.h" #include "libs/strings/strintrn.h" @@ -27,24 +28,30 @@ void -PlayChannel (COUNT channel, void *sample, SoundPosition pos, +PlayChannel (COUNT channel, SOUND snd, SoundPosition pos, void *positional_object, unsigned char priority) { - TFB_SoundSample *tfb_sample = *(TFB_SoundSample**) sample; + void *snd_ptr = GetSoundAddress (snd); + TFB_SoundSample *sample; StopSource (channel); // all finished (stopped) channels can be cleaned up at this point // since this is the only func that can initiate an sfx sound CheckFinishedChannels (); - soundSource[channel].sample = tfb_sample; + if (!snd_ptr) + return; // nothing to play + + sample = *(TFB_SoundSample**) snd_ptr; + + soundSource[channel].sample = sample; soundSource[channel].positional_object = positional_object; if (optStereoSFX) UpdateSoundPosition (channel, pos); audio_Sourcei (soundSource[channel].handle, audio_BUFFER, - tfb_sample->buffer[0]); + sample->buffer[0]); audio_SourcePlay (soundSource[channel].handle); (void) priority; } @@ -145,39 +152,6 @@ (void)priority; // ignored } -// Status: Ignored -BYTE* -GetSampleAddress (SOUND sound) - // I might be prototyping this wrong, type-wise. -{ - return ((BYTE*)GetSoundAddress (sound)); -} - -// Status: Ignored -COUNT -GetSampleLength (SOUND sound) -{ - (void)sound; - return 0; -} - -// Status: Ignored -void -SetChannelRate (COUNT channel, DWORD rate_hz, unsigned char priority) -{ - (void) channel; - (void) rate_hz; - (void) priority; -} - -// Status: Ignored -COUNT -GetSampleRate (SOUND sound) -{ - (void) sound; - return 0; -} - void * _GetSoundBankData (uio_Stream *fp, DWORD length) { @@ -187,6 +161,8 @@ #define MAX_FX 256 TFB_SoundSample *sndfx[MAX_FX]; STRING_TABLE Snd; + STRING str; + int i; (void) length; // ignored opos = uio_ftell (fp); @@ -211,84 +187,67 @@ while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp) && snd_ct < MAX_FX) { - if (sscanf(CurrentLine, "%s", &filename[n]) == 1) + TFB_SoundSample* sample; + TFB_SoundDecoder* decoder; + uint32 decoded_bytes; + + if (sscanf (CurrentLine, "%s", &filename[n]) != 1) { - log_add (log_Info, "_GetSoundBankData(): loading %s", filename); + log_add (log_Warning, "_GetSoundBankData: bad line: '%s'", + CurrentLine); + continue; + } - sndfx[snd_ct] = (TFB_SoundSample *) HCalloc (sizeof (TFB_SoundSample)); + log_add (log_Info, "_GetSoundBankData(): loading %s", filename); - sndfx[snd_ct]->decoder = SoundDecoder_Load (contentDir, - filename, 4096, 0, 0); - if (!sndfx[snd_ct]->decoder) - { - log_add (log_Warning, "_GetSoundBankData(): couldn't load %s", filename); - HFree (sndfx[snd_ct]); - } - else - { - uint32 decoded_bytes; - - decoded_bytes = SoundDecoder_DecodeAll (sndfx[snd_ct]->decoder); - log_add (log_Info, "_GetSoundBankData(): decoded_bytes %d", decoded_bytes); - - sndfx[snd_ct]->num_buffers = 1; - sndfx[snd_ct]->buffer = (audio_Object *) HMalloc ( - sizeof (audio_Object) * sndfx[snd_ct]->num_buffers); - audio_GenBuffers (sndfx[snd_ct]->num_buffers, sndfx[snd_ct]->buffer); - audio_BufferData (sndfx[snd_ct]->buffer[0], sndfx[snd_ct]->decoder->format, - sndfx[snd_ct]->decoder->buffer, decoded_bytes, - sndfx[snd_ct]->decoder->frequency); - - SoundDecoder_Free (sndfx[snd_ct]->decoder); - sndfx[snd_ct]->decoder = NULL; - - ++snd_ct; - } - } - else + decoder = SoundDecoder_Load (contentDir, filename, 4096, 0, 0); + if (!decoder) { - log_add (log_Warning, "_GetSoundBankData: Bad file!"); + log_add (log_Warning, "_GetSoundBankData(): couldn't load %s", + filename); + continue; } - // pkunk insult fix 2002/11/12 (ftell shouldn't be needed for loop to terminate) - /*if (uio_ftell (fp) - opos >= length) - break;*/ - } + // SFX samples don't have decoders, everything is pre-decoded below + sample = TFB_CreateSoundSample (NULL, 1, NULL); - Snd = NULL; - if (snd_ct && (Snd = AllocStringTable (snd_ct, 0))) - { - STRING_TABLE fxTab = Snd; + // Decode everything and stash it in 1 buffer + decoded_bytes = SoundDecoder_DecodeAll (decoder); + log_add (log_Info, "_GetSoundBankData(): decoded bytes %d", + decoded_bytes); + + audio_BufferData (sample->buffer[0], decoder->format, + decoder->buffer, decoded_bytes, decoder->frequency); + // just for informational purposes + sample->length = decoder->length; - if (fxTab == 0) - { - while (snd_ct--) - { - if (sndfx[snd_ct]->decoder) - SoundDecoder_Free (sndfx[snd_ct]->decoder); - HFree (sndfx[snd_ct]); - } + SoundDecoder_Free (decoder); - FreeStringTable (Snd); - Snd = 0; - } - else - { - STRING str; - int i; + sndfx[snd_ct] = sample; + ++snd_ct; + } - str = fxTab->strings; - for (i = 0; i < snd_ct; i++) - { - TFB_SoundSample **target = HMalloc (sizeof (sndfx[0])); - *target = sndfx[i]; - str->data = (STRINGPTR)target; - str->length = sizeof (sndfx[0]); - str++; - } - } + if (!snd_ct) + return NULL; // no sounds decoded + + Snd = AllocStringTable (snd_ct, 0); + if (!Snd) + { // Oops, have to delete everything now + while (snd_ct--) + TFB_DestroySoundSample (sndfx[snd_ct]); + + return NULL; } + // Populate the STRING_TABLE with ptrs to sample + for (i = 0, str = Snd->strings; i < snd_ct; ++i, ++str) + { + TFB_SoundSample **target = HMalloc (sizeof (sndfx[0])); + *target = sndfx[i]; + str->data = (STRINGPTR)target; + str->length = sizeof (sndfx[0]); + } + return Snd; } @@ -296,45 +255,37 @@ _ReleaseSoundBankData (void *Snd) { STRING_TABLE fxTab = Snd; + int index; + + if (!fxTab) + return FALSE; - if (fxTab) + for (index = 0; index < fxTab->size; ++index) { - int snd_ct, index; - TFB_SoundSample **sptr; + int i; + void **sptr = (void**)fxTab->strings[index].data; + TFB_SoundSample *sample = (TFB_SoundSample*)*sptr; - snd_ct = fxTab->size; - index = 0; - while (snd_ct--) + // Check all sources and see if we are currently playing this sample + for (i = 0; i < NUM_SOUNDSOURCES; ++i) { - int i; - - sptr = (TFB_SoundSample **)(fxTab->strings[index].data); - - for (i = 0; i < NUM_SOUNDSOURCES; ++i) - { - if (soundSource[i].sample == (*sptr)) - { - StopSource (i); - soundSource[i].sample = NULL; - } + if (soundSource[i].sample == sample) + { // Playing this sample. Have to stop it. + StopSource (i); + soundSource[i].sample = NULL; } - - if ((*sptr)->decoder) - SoundDecoder_Free ((*sptr)->decoder); - audio_DeleteBuffers ((*sptr)->num_buffers, (*sptr)->buffer); - HFree ((*sptr)->buffer); - if ((*sptr)->buffer_tag) - HFree ((*sptr)->buffer_tag); - HFree (*sptr); - *sptr = 0; - index++; } - FreeStringTable (Snd); - return (TRUE); + if (sample->decoder) + SoundDecoder_Free (sample->decoder); + sample->decoder = NULL; + TFB_DestroySoundSample (sample); + // sptr will be deleted by FreeStringTable() below } + + FreeStringTable (fxTab); - return (FALSE); + return TRUE; } BOOLEAN Modified: trunk/sc2/src/libs/sound/sndintrn.h =================================================================== --- trunk/sc2/src/libs/sound/sndintrn.h 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/sndintrn.h 2009-10-19 19:13:24 UTC (rev 3232) @@ -20,10 +20,12 @@ #define _SNDINTRN_H #include <stdio.h> -#include "libs/sndlib.h" +#include "types.h" #include "libs/reslib.h" #include "libs/memlib.h" +#define PAD_SCOPE_BYTES 256 + extern void *_GetMusicData (uio_Stream *fp, DWORD length); extern BOOLEAN _ReleaseMusicData (void *handle); @@ -35,5 +37,40 @@ extern char* CheckMusicResName (char* filename); +// audio data +struct tfb_soundsample +{ + TFB_SoundDecoder *decoder; // decoder to read from + float length; // total length of decoder chain in seconds + audio_Object *buffer; + uint32 num_buffers; + TFB_SoundTag *buffer_tag; + sint32 offset; // initial offset + intptr_t data; // user-defined data + TFB_SoundCallbacks callbacks; // user-defined callbacks +}; + +// equivalent to channel in legacy sound code +typedef struct tfb_soundsource +{ + TFB_SoundSample *sample; + audio_Object handle; + bool stream_should_be_playing; + Mutex stream_mutex; + sint32 start_time; // for tracks played-time math + uint32 pause_time; // keep track for paused tracks + void *positional_object; + + audio_Object last_q_buf; // for callbacks processing + + // Cyclic waveform buffer for oscilloscope + void *sbuffer; + uint32 sbuf_size; + uint32 sbuf_tail; + uint32 sbuf_head; + uint32 sbuf_lasttime; // timestamp of the first queued buffer +} TFB_SoundSource; + +extern TFB_SoundSource soundSource[]; + #endif /* _SNDINTRN_H */ - Modified: trunk/sc2/src/libs/sound/sound.c =================================================================== --- trunk/sc2/src/libs/sound/sound.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/sound.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -17,6 +17,7 @@ */ #include "sound.h" +#include "sndintrn.h" #include "libs/compiler.h" #include "libs/tasklib.h" #include "libs/inplib.h" Modified: trunk/sc2/src/libs/sound/sound.h =================================================================== --- trunk/sc2/src/libs/sound/sound.h 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/sound.h 2009-10-19 19:13:24 UTC (rev 3232) @@ -17,10 +17,11 @@ #ifndef _UQM_SOUND_H // try avoiding collisions on id #define _UQM_SOUND_H -#include "sndintrn.h" +#include "types.h" #include "audiocore.h" #include "decoders/decoder.h" #include "libs/threadlib.h" +#include "libs/sndlib.h" #define FIRST_SFX_SOURCE 0 @@ -28,13 +29,12 @@ #define MUSIC_SOURCE (LAST_SFX_SOURCE + 1) #define SPEECH_SOURCE (MUSIC_SOURCE + 1) #define NUM_SOUNDSOURCES (SPEECH_SOURCE + 1) -#define PAD_SCOPE_BYTES 8096 typedef struct { int in_use; audio_Object buf_name; - void *data; // user-defined data + intptr_t data; // user-defined data } TFB_SoundTag; typedef struct tfb_soundcallbacks @@ -51,42 +51,7 @@ void (* OnQueueBuffer) (TFB_SoundSample*, audio_Object); } TFB_SoundCallbacks; -// audio data -struct tfb_soundsample -{ - TFB_SoundDecoder *decoder; // decoder to read from - float length; // total length of decoder chain in seconds - audio_Object *buffer; - uint32 num_buffers; - TFB_SoundTag *buffer_tag; - sint32 offset; // initial offset - void* data; // user-defined data - TFB_SoundCallbacks callbacks; // user-defined callbacks -}; -// equivalent to channel in legacy sound code -typedef struct tfb_soundsource -{ - TFB_SoundSample *sample; - audio_Object handle; - bool stream_should_be_playing; - Mutex stream_mutex; - sint32 start_time; - void *positional_object; - - // Cyclic waveform buffer for oscilloscope - void *sbuffer; - uint32 sbuf_start; // cyclic buffer tail (confusing, eh?) - uint32 sbuf_size; - uint32 sbuf_offset; // cyclic buffer head - uint32 sbuf_lasttime; - // keep track for paused tracks - uint32 pause_time; -} TFB_SoundSource; - - -extern TFB_SoundSource soundSource[]; - extern int musicVolume; extern float musicVolumeScale; extern float sfxVolumeScale; @@ -98,6 +63,19 @@ void SetSFXVolume (float volume); void SetSpeechVolume (float volume); +TFB_SoundSample *TFB_CreateSoundSample (TFB_SoundDecoder*, uint32 num_buffers, + const TFB_SoundCallbacks* /* can be NULL */); +void TFB_DestroySoundSample (TFB_SoundSample*); +void TFB_SetSoundSampleData (TFB_SoundSample*, intptr_t data); +intptr_t TFB_GetSoundSampleData (TFB_SoundSample*); +void TFB_SetSoundSampleCallbacks (TFB_SoundSample*, + const TFB_SoundCallbacks* /* can be NULL */); +TFB_SoundDecoder* TFB_GetSoundSampleDecoder (TFB_SoundSample*); + +TFB_SoundTag* TFB_FindTaggedBuffer (TFB_SoundSample*, audio_Object buffer); +void TFB_ClearBufferTag (TFB_SoundTag*); +bool TFB_TagBuffer (TFB_SoundSample*, audio_Object buffer, intptr_t data); + #include "stream.h" #endif // _UQM_SOUND_H Modified: trunk/sc2/src/libs/sound/stream.c =================================================================== --- trunk/sc2/src/libs/sound/stream.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/stream.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -19,17 +19,22 @@ #include <stdlib.h> // for abs() #include "sound.h" +#include "sndintrn.h" #include "libs/tasklib.h" #include "libs/log.h" #include "libs/memlib.h" +static void add_scope_data (TFB_SoundSource *source, uint32 bytes); + + void PlayStream (TFB_SoundSample *sample, uint32 source, bool looping, bool scope, bool rewind) { - uint32 i, pos = 0; - sint32 offset = 0; + uint32 i; + sint32 offset; + TFB_SoundDecoder *decoder; if (!sample) return; @@ -43,64 +48,65 @@ memset (sample->buffer_tag, 0, sample->num_buffers * sizeof (sample->buffer_tag[0])); + decoder = sample->decoder; offset = sample->offset; if (rewind) - SoundDecoder_Rewind (sample->decoder); + SoundDecoder_Rewind (decoder); else - offset += (sint32)(SoundDecoder_GetTime (sample->decoder) * - (float)ONE_SECOND); + offset += (sint32)(SoundDecoder_GetTime (decoder) * ONE_SECOND); + soundSource[source].sample = sample; - soundSource[source].sample->decoder->looping = looping; + decoder->looping = looping; audio_Sourcei (soundSource[source].handle, audio_LOOPING, false); if (scope) - { - soundSource[source].sbuffer = HMalloc (PAD_SCOPE_BYTES); + { // Prealloc the scope buffer in advance so that we do not + // realloc it a zillion times + soundSource[source].sbuf_size = sample->num_buffers * + decoder->buffer_size + PAD_SCOPE_BYTES; + soundSource[source].sbuffer = HMalloc (soundSource[source].sbuf_size); } for (i = 0; i < sample->num_buffers; ++i) { uint32 decoded_bytes; - decoded_bytes = SoundDecoder_Decode (sample->decoder); + decoded_bytes = SoundDecoder_Decode (decoder); #if 0 - log_add (log_Debug, "PlayStream(): source:%d filename:%s start:%d position:%d bytes:%d\n", - source, sample->decoder->filename, sample->decoder->start_sample, - sample->decoder->pos, decoded_bytes); + log_add (log_Debug, "PlayStream(): source:%d filename:%s start:%d " + "position:%d bytes:%d\n", + source, decoder->filename, decoder->start_sample, + decoder->pos, decoded_bytes); #endif if (decoded_bytes == 0) break; - audio_BufferData (sample->buffer[i], sample->decoder->format, - sample->decoder->buffer, decoded_bytes, - sample->decoder->frequency); + audio_BufferData (sample->buffer[i], decoder->format, + decoder->buffer, decoded_bytes, decoder->frequency); audio_SourceQueueBuffers (soundSource[source].handle, 1, &sample->buffer[i]); if (sample->callbacks.OnQueueBuffer) sample->callbacks.OnQueueBuffer (sample, sample->buffer[i]); if (scope) - { - UBYTE *p; - soundSource[source].sbuffer = HRealloc ( - soundSource[source].sbuffer, - pos + decoded_bytes + PAD_SCOPE_BYTES); - p = (UBYTE *)soundSource[source].sbuffer; - memcpy (&p[pos], sample->decoder->buffer, decoded_bytes); - pos += decoded_bytes; - } + add_scope_data (&soundSource[source], decoded_bytes); - if (sample->decoder->error) + if (decoder->error != SOUNDDECODER_OK) { - if (sample->decoder->error != SOUNDDECODER_EOF || + if (decoder->error != SOUNDDECODER_EOF || !sample->callbacks.OnEndChunk || !sample->callbacks.OnEndChunk (sample, sample->buffer[i])) + { // Decoder probably run out of data before we could fill + // all buffers, and OnEndChunk() did not set a new one break; + } + else + { // OnEndChunk() probably set a new decoder, get it + decoder = sample->decoder; + } } } - soundSource[source].sbuf_size = pos + PAD_SCOPE_BYTES; - soundSource[source].sbuf_start = pos; soundSource[source].sbuf_lasttime = GetTimeCounter (); // Adjust the start time so it looks like the stream has been playing // from the very beginning @@ -124,9 +130,9 @@ soundSource[source].sbuffer = NULL; HFree (sbuffer); } - soundSource[source].sbuf_start = 0; soundSource[source].sbuf_size = 0; - soundSource[source].sbuf_offset = 0; + soundSource[source].sbuf_head = 0; + soundSource[source].sbuf_tail = 0; soundSource[source].pause_time = 0; } @@ -176,11 +182,73 @@ return soundSource[source].stream_should_be_playing; } + +TFB_SoundSample * +TFB_CreateSoundSample (TFB_SoundDecoder *decoder, uint32 num_buffers, + const TFB_SoundCallbacks *pcbs /* can be NULL */) +{ + TFB_SoundSample *sample; + + sample = HCalloc (sizeof (*sample)); + sample->decoder = decoder; + sample->num_buffers = num_buffers; + sample->buffer = HCalloc (sizeof (audio_Object) * num_buffers); + audio_GenBuffers (num_buffers, sample->buffer); + if (pcbs) + sample->callbacks = *pcbs; + + return sample; +} + +// Deletes all TFB_SoundSample data structures, except decoder +void +TFB_DestroySoundSample (TFB_SoundSample *sample) +{ + if (sample->buffer) + { + audio_DeleteBuffers (sample->num_buffers, sample->buffer); + HFree (sample->buffer); + } + HFree (sample->buffer_tag); + HFree (sample); +} + +void +TFB_SetSoundSampleData (TFB_SoundSample *sample, intptr_t data) +{ + sample->data = data; +} + +intptr_t +TFB_GetSoundSampleData (TFB_SoundSample *sample) +{ + return sample->data; +} + +void +TFB_SetSoundSampleCallbacks (TFB_SoundSample *sample, + const TFB_SoundCallbacks *pcbs /* can be NULL */) +{ + if (pcbs) + sample->callbacks = *pcbs; + else + memset (&sample->callbacks, 0, sizeof (sample->callbacks)); +} + +TFB_SoundDecoder* +TFB_GetSoundSampleDecoder (TFB_SoundSample *sample) +{ + return sample->decoder; +} + TFB_SoundTag* -TFB_FindTaggedBuffer (TFB_SoundSample* sample, audio_Object buffer) +TFB_FindTaggedBuffer (TFB_SoundSample *sample, audio_Object buffer) { uint32 buf_num; + if (!sample->buffer_tag) + return NULL; // do not have any tags + for (buf_num = 0; buf_num < sample->num_buffers && (!sample->buffer_tag[buf_num].in_use || @@ -193,11 +261,15 @@ &sample->buffer_tag[buf_num] : NULL; } -void -TFB_TagBuffer (TFB_SoundSample* sample, audio_Object buffer, void* data) +bool +TFB_TagBuffer (TFB_SoundSample *sample, audio_Object buffer, intptr_t data) { uint32 buf_num; + if (!sample->buffer_tag) + sample->buffer_tag = HCalloc (sizeof (TFB_SoundTag) * + sample->num_buffers); + for (buf_num = 0; buf_num < sample->num_buffers && sample->buffer_tag[buf_num].in_use && @@ -206,258 +278,247 @@ ; if (buf_num >= sample->num_buffers) - return; // no empty slot + return false; // no empty slot sample->buffer_tag[buf_num].in_use = 1; sample->buffer_tag[buf_num].buf_name = buffer; sample->buffer_tag[buf_num].data = data; + + return true; } void -TFB_ClearBufferTag (TFB_SoundTag* ptag) +TFB_ClearBufferTag (TFB_SoundTag *ptag) { ptag->in_use = 0; ptag->buf_name = 0; } -int -StreamDecoderTaskFunc (void *data) +static void +remove_scope_data (TFB_SoundSource *source, audio_Object buffer) { - Task task = (Task)data; - int i; - audio_Object last_buffer[NUM_SOUNDSOURCES]; + audio_IntVal buf_size; - for (i = 0; i < NUM_SOUNDSOURCES; i++) - last_buffer[i] = 0; + audio_GetBufferi (buffer, audio_SIZE, &buf_size); + source->sbuf_head += buf_size; + // the buffer is cyclic + source->sbuf_head %= source->sbuf_size; - while (!Task_ReadState (task, TASK_EXIT)) + source->sbuf_lasttime = GetTimeCounter (); +} + +static void +add_scope_data (TFB_SoundSource *source, uint32 bytes) +{ + uint8 *sbuffer = source->sbuffer; + uint8 *dec_buf = source->sample->decoder->buffer; + uint32 tail_bytes; + uint32 wrap_bytes; + + if (source->sbuf_tail + bytes > source->sbuf_size) + { // does not fit at the tail, have to split it up + tail_bytes = source->sbuf_size - source->sbuf_tail; + wrap_bytes = bytes - tail_bytes; + } + else + { // all fits at the tail + tail_bytes = bytes; + wrap_bytes = 0; + } + + if (tail_bytes) { + memcpy (sbuffer + source->sbuf_tail, dec_buf, tail_bytes); + source->sbuf_tail += tail_bytes; + } - TaskSwitch (); + if (wrap_bytes) + { + memcpy (sbuffer, dec_buf + tail_bytes, wrap_bytes); + source->sbuf_tail = wrap_bytes; + } +} - for (i = MUSIC_SOURCE; i < NUM_SOUNDSOURCES; ++i) - { - audio_IntVal processed, queued; - audio_IntVal state; +static void +process_stream (TFB_SoundSource *source) +{ + TFB_SoundSample *sample = source->sample; + TFB_SoundDecoder *decoder = sample->decoder; + bool end_chunk_failed = false; + audio_IntVal processed; + audio_IntVal queued; - LockMutex (soundSource[i].stream_mutex); + audio_GetSourcei (source->handle, audio_BUFFERS_PROCESSED, &processed); + audio_GetSourcei (source->handle, audio_BUFFERS_QUEUED, &queued); - if (!soundSource[i].sample || - !soundSource[i].sample->decoder || - !soundSource[i].stream_should_be_playing || - soundSource[i].sample->decoder->error == SOUNDDECODER_ERROR) - { - UnlockMutex (soundSource[i].stream_mutex); - continue; - } + if (processed == 0) + { // Nothing was played + audio_IntVal state; - audio_GetSourcei (soundSource[i].handle, audio_BUFFERS_PROCESSED, - &processed); - audio_GetSourcei (soundSource[i].handle, audio_BUFFERS_QUEUED, - &queued); - - if (processed == 0) - { - audio_GetSourcei (soundSource[i].handle, audio_SOURCE_STATE, - &state); - if (state != audio_PLAYING) - { - if (queued == 0 && soundSource[i].sample->decoder->error - == SOUNDDECODER_EOF) - { - log_add (log_Info, "StreamDecoderTaskFunc(): " - "finished playing %s, source %d", - soundSource[i].sample->decoder->filename, i); - soundSource[i].stream_should_be_playing = FALSE; - if (soundSource[i].sample->callbacks.OnEndStream) - soundSource[i].sample->callbacks.OnEndStream ( - soundSource[i].sample); - } - else - { - log_add (log_Warning, "StreamDecoderTaskFunc(): buffer " - "underrun when playing %s, source %d", - soundSource[i].sample->decoder->filename, i); - audio_SourcePlay (soundSource[i].handle); - } - } + audio_GetSourcei (source->handle, audio_SOURCE_STATE, &state); + if (state != audio_PLAYING) + { + if (queued == 0 && decoder->error == SOUNDDECODER_EOF) + { // The stream has reached the end + log_add (log_Info, "StreamDecoderTaskFunc(): " + "finished playing %s", decoder->filename); + source->stream_should_be_playing = FALSE; + + if (sample->callbacks.OnEndStream) + sample->callbacks.OnEndStream (sample); + } + else + { + log_add (log_Warning, "StreamDecoderTaskFunc(): " + "buffer underrun playing %s", decoder->filename); + audio_SourcePlay (source->handle); } - -#if 0 - log_add (log_Debug, "StreamDecoderTaskFunc(): source %d, processed %d queued %d", - i, processed, queued); -#endif + } + } + + // Unqueue processed buffers and replace them with new ones + for (processed; processed > 0; --processed) + { + uint32 error; + audio_Object buffer; + uint32 decoded_bytes; - while (processed) - { - uint32 error; - audio_Object buffer; - uint32 decoded_bytes; + audio_GetError (); // clear error state - audio_GetError (); // clear error state + // Get the buffer that finished playing + audio_SourceUnqueueBuffers (source->handle, 1, &buffer); + error = audio_GetError(); + if (error != audio_NO_ERROR) + { + log_add (log_Warning, "StreamDecoderTaskFunc(): " + "error after audio_SourceUnqueueBuffers: %x, file %s", + error, decoder->filename); + break; + } - audio_SourceUnqueueBuffers (soundSource[i].handle, 1, &buffer); + // Process a callback on a tagged buffer, if any + if (sample->callbacks.OnTaggedBuffer) + { + TFB_SoundTag* tag = TFB_FindTaggedBuffer (sample, buffer); + if (tag) + sample->callbacks.OnTaggedBuffer (sample, tag); + } + + if (source->sbuffer) + remove_scope_data (source, buffer); - error = audio_GetError(); - if (error != audio_NO_ERROR) - { - log_add (log_Warning, "StreamDecoderTaskFunc(): OpenAL " - "error after alSourceUnqueueBuffers: %x, " - "file %s, source %d", error, - soundSource[i].sample->decoder->filename, i); - break; - } + // See what state the decoder was left in last time around + if (decoder->error != SOUNDDECODER_OK) + { + if (decoder->error == SOUNDDECODER_EOF) + { + if (end_chunk_failed) + continue; // should not do it again - if (soundSource[i].sample->callbacks.OnTaggedBuffer) - { - TFB_SoundTag* tag = TFB_FindTaggedBuffer ( - soundSource[i].sample, buffer); - if (tag) - { - soundSource[i].sample->callbacks.OnTaggedBuffer ( - soundSource[i].sample, tag); - } + if (!sample->callbacks.OnEndChunk || + !sample->callbacks.OnEndChunk (sample, source->last_q_buf)) + { // Reached the end of the current stream and we did not + // get another sample to play (relevant for Trackplayer) + end_chunk_failed = true; + continue; } - { - audio_IntVal buf_size; - soundSource[i].sbuf_lasttime = GetTimeCounter (); - audio_GetBufferi(buffer, audio_SIZE, &buf_size); - soundSource[i].sbuf_offset += buf_size; - if (soundSource[i].sbuf_offset > soundSource[i].sbuf_size) - soundSource[i].sbuf_offset -= - soundSource[i].sbuf_size; + else + { // OnEndChunk succeeded, so someone (read: Trackplayer) + // wants to keep going, probably with a new decoder. + // Get the new decoder + decoder = sample->decoder; } - //soundSource[i].total_decoded += soundSource[i].sample->decoder->buffer_size; - - if (soundSource[i].sample->decoder->error) - { - if (soundSource[i].sample->decoder->error == - SOUNDDECODER_EOF) - { - if (!soundSource[i].sample->callbacks.OnEndChunk || - !soundSource[i].sample->callbacks.OnEndChunk ( - soundSource[i].sample, last_buffer[i])) - { + } + else + { // Decoder returned a real error, keep going #if 0 - log_add (log_Debug, "StreamDecoderTaskFunc(): decoder->error is eof for %s", - soundSource[i].sample->decoder->filename); + log_add (log_Debug, "StreamDecoderTaskFunc(): " + "decoder->error is %d for %s", decoder->error, + decoder->filename); #endif - processed--; - continue; - } - } - else - { -#if 0 - log_add (log_Debug, "StreamDecoderTaskFunc(): decoder->error is %d for %s", - soundSource[i].sample->decoder->error, - soundSource[i].sample->decoder->filename); -#endif - processed--; - continue; - } - } + continue; + } + } - decoded_bytes = SoundDecoder_Decode ( - soundSource[i].sample->decoder); - if (soundSource[i].sample->decoder->error == - SOUNDDECODER_ERROR) - { - log_add (log_Warning, "StreamDecoderTaskFunc(): " - "SoundDecoder_Decode error %d, file %s, " - "source %d", - soundSource[i].sample->decoder->error, - soundSource[i].sample->decoder->filename, i); - soundSource[i].stream_should_be_playing = FALSE; - processed--; - continue; - } + // Now replace the unqueued buffer with a new one + decoded_bytes = SoundDecoder_Decode (decoder); + if (decoder->error == SOUNDDECODER_ERROR) + { + log_add (log_Warning, "StreamDecoderTaskFunc(): " + "SoundDecoder_Decode error %d, file %s", + decoder->error, decoder->filename); + source->stream_should_be_playing = FALSE; + continue; + } - if (decoded_bytes > 0) - { - audio_BufferData (buffer, - soundSource[i].sample->decoder->format, - soundSource[i].sample->decoder->buffer, - decoded_bytes, - soundSource[i].sample->decoder->frequency); + if (decoded_bytes == 0) + { // Nothing was decoded, keep going + continue; + // This loses a stream buffer, which we cannot get back + // w/o restarting the stream, but we should never get here. + } - error = audio_GetError(); - if (error != audio_NO_ERROR) - { - log_add (log_Warning, "StreamDecoderTaskFunc(): " - "TFBSound error after audio_BufferData: " - "%x, file %s, source %d, decoded_bytes %d", - error, soundSource[i].sample->decoder->filename, - i, decoded_bytes); - } - else - { - last_buffer[i] = buffer; - audio_SourceQueueBuffers (soundSource[i].handle, 1, - &buffer); - // do OnQueue callback - if (soundSource[i].sample->callbacks.OnQueueBuffer) - soundSource[i].sample->callbacks.OnQueueBuffer ( - soundSource[i].sample, buffer); - - if (soundSource[i].sbuffer) - { - // copies decoded data to oscilloscope buffer + // And a new buffer is born + audio_BufferData (buffer, decoder->format, decoder->buffer, + decoded_bytes, decoder->frequency); + error = audio_GetError(); + if (error != audio_NO_ERROR) + { + log_add (log_Warning, "StreamDecoderTaskFunc(): " + "error after audio_BufferData: %x, file %s, decoded %d", + error, decoder->filename, decoded_bytes); + continue; + } - uint32 j, remaining_bytes = 0; - UBYTE *sbuffer = (UBYTE *) soundSource[i].sbuffer; - UBYTE *decoder_buffer = (UBYTE *) soundSource[i]. - sample->decoder->buffer; - - if (soundSource[i].sbuf_start + decoded_bytes > - soundSource[i].sbuf_size) - { - j = soundSource[i].sbuf_size; - remaining_bytes = decoded_bytes - - (j - soundSource[i].sbuf_start); - } - else - { - j = soundSource[i].sbuf_start + decoded_bytes; - } - - if (j - soundSource[i].sbuf_start >= 1) - { - memcpy (&sbuffer[soundSource[i].sbuf_start], - decoder_buffer, - j - soundSource[i].sbuf_start); - } + // Now queue the buffer + audio_SourceQueueBuffers (source->handle, 1, &buffer); + error = audio_GetError(); + if (error != audio_NO_ERROR) + { + log_add (log_Warning, "StreamDecoderTaskFunc(): " + "error after audio_SourceQueueBuffers: %x, file %s, " + "decoded %d", error, decoder->filename, decoded_bytes); + continue; + } + + // Remember the last queued buffer so we can pass it to callbacks + source->last_q_buf = buffer; + if (sample->callbacks.OnQueueBuffer) + sample->callbacks.OnQueueBuffer (sample, buffer); + + if (source->sbuffer) + add_scope_data (source, decoded_bytes); + } +} - if (remaining_bytes) - { - memcpy (sbuffer, &decoder_buffer[ - j - soundSource[i].sbuf_start], - remaining_bytes); - soundSource[i].sbuf_start = remaining_bytes; - } - else - { - soundSource[i].sbuf_start += decoded_bytes; - } - } +int +StreamDecoderTaskFunc (void *data) +{ + Task task = (Task)data; + int i; + + while (!Task_ReadState (task, TASK_EXIT)) + { + TaskSwitch (); - error = audio_GetError(); - if (error != audio_NO_ERROR) - { - log_add (log_Warning, "StreamDecoderTaskFunc(): " - "TFBSound error after " - "audio_SourceQueueBuffers: %x, file %s, " - "source %d, decoded_bytes %d", error, - soundSource[i].sample->decoder->filename, - i, decoded_bytes); - } - } - } + for (i = MUSIC_SOURCE; i < NUM_SOUNDSOURCES; ++i) + { + TFB_SoundSource *source = &soundSource[i]; - processed--; + LockMutex (source->stream_mutex); + + if (!source->sample || + !source->sample->decoder || + !source->stream_should_be_playing || + source->sample->decoder->error == SOUNDDECODER_ERROR) + { + UnlockMutex (source->stream_mutex); + continue; } - UnlockMutex (soundSource[i].stream_mutex); + process_stream (source); + + UnlockMutex (source->stream_mutex); } } @@ -582,7 +643,7 @@ step *= full_sample; sbuffer = source->sbuffer; - pos = source->sbuf_offset + delta; + pos = source->sbuf_head + delta; // We are not basing the scaling factor on signal energy, because we // want it to *look* pretty instead of sounding nice and even Modified: trunk/sc2/src/libs/sound/stream.h =================================================================== --- trunk/sc2/src/libs/sound/stream.h 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/stream.h 2009-10-19 19:13:24 UTC (rev 3232) @@ -26,10 +26,6 @@ BOOLEAN PlayingStream (uint32 source); int StreamDecoderTaskFunc (void *data); -TFB_SoundTag* FindTaggedBuffer (TFB_SoundSample* sample, audio_Object buffer); -void TFB_ClearBufferTag (TFB_SoundTag* ptag); -void TFB_TagBuffer (TFB_SoundSample* sample, audio_Object buffer, void* data); - int GraphForegroundStream (uint8 *data, sint32 width, sint32 height); #endif Modified: trunk/sc2/src/libs/sound/trackplayer.c =================================================================== --- trunk/sc2/src/libs/sound/trackplayer.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/sound/trackplayer.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -15,6 +15,7 @@ */ #include "sound.h" +#include "sndintrn.h" #include "libs/sound/trackplayer.h" #include "trackint.h" #include "libs/log.h" @@ -54,7 +55,6 @@ // structures the same way. static void seek_track (sint32 offset); -static void destroy_SoundSample (TFB_SoundSample *sample); // stream callbacks static bool OnStreamStart (TFB_SoundSample* sample); @@ -190,7 +190,9 @@ } if (sound_sample) { - destroy_SoundSample (sound_sample); + // We delete the decoders ourselves + sound_sample->decoder = NULL; + TFB_DestroySoundSample (sound_sample); sound_sample = NULL; } } @@ -250,7 +252,7 @@ if (cur_chunk->tag_me) { // Tag the last buffer of the chunk with the next chunk - TFB_TagBuffer (sample, buffer, cur_chunk); + TFB_TagBuffer (sample, buffer, (intptr_t)cur_chunk); } return true; @@ -276,6 +278,8 @@ { TFB_SoundChunk* chunk = (TFB_SoundChunk*) tag->data; + assert (sizeof (tag->data) >= sizeof (chunk)); + if (sample != sound_sample) return; // Huh? Why did we get called on this? @@ -562,13 +566,7 @@ if (!sound_sample) { - sound_sample = HCalloc (sizeof (*sound_sample)); - sound_sample->callbacks = trackCBs; - sound_sample->num_buffers = 8; - sound_sample->buffer_tag = HCalloc (sizeof (TFB_SoundTag) * sound_sample->num_buffers); - sound_sample->buffer = HCalloc (sizeof (audio_Object) * sound_sample->num_buffers); - sound_sample->length = 0; - audio_GenBuffers (sound_sample->num_buffers, sound_sample->buffer); + sound_sample = TFB_CreateSoundSample (NULL, 8, &trackCBs); chunks_head = create_SoundChunk (decoder, 0.0); chunks_tail = chunks_head; } @@ -800,19 +798,6 @@ } } -static void -destroy_SoundSample (TFB_SoundSample *sample) -{ - if (sample->buffer) - { - audio_DeleteBuffers (sample->num_buffers, sample->buffer); - HFree (sample->buffer); - } - HFree (sample->buffer_tag); - HFree (sample->data); - HFree (sample); -} - // Returns the next chunk with a subtitle TFB_SoundChunk * find_next_page (TFB_SoundChunk *cur) Modified: trunk/sc2/src/libs/video/vidplayer.c =================================================================== --- trunk/sc2/src/libs/video/vidplayer.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/libs/video/vidplayer.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -31,7 +31,7 @@ static bool vp_SetTimer (TFB_VideoDecoder*, uint32 msecs); -TFB_VideoCallbacks vp_DecoderCBs = +static const TFB_VideoCallbacks vp_DecoderCBs = { vp_BeginFrame, vp_EndFrame, @@ -46,7 +46,7 @@ static void vp_BufferTag (TFB_SoundSample* sample, TFB_SoundTag* tag); static void vp_QueueBuffer (TFB_SoundSample* sample, audio_Object buffer); -static TFB_SoundCallbacks vp_AudioCBs = +static const TFB_SoundCallbacks vp_AudioCBs = { vp_AudioStart, NULL, @@ -307,8 +307,6 @@ if (vid->decoder->audio_synced) { - TFB_SoundSample **pmus; - if (!vid->hAudio) { log_add (log_Warning, "TFB_PlayVideo: " @@ -316,12 +314,8 @@ return false; } - // nasty hack for now - pmus = vid->hAudio; - (*pmus)->buffer_tag = HCalloc ( - sizeof (TFB_SoundTag) * (*pmus)->num_buffers); - (*pmus)->callbacks = vp_AudioCBs; - (*pmus)->data = vid; // hijack data ;) + TFB_SetSoundSampleCallbacks (*vid->hAudio, &vp_AudioCBs); + TFB_SetSoundSampleData (*vid->hAudio, (intptr_t)vid); } SetSemaphore (vp_interthread_lock); @@ -406,9 +400,7 @@ if (vid->decoder->audio_synced) { - LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); - SeekStream (MUSIC_SOURCE, pos); - UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + PLRSeek (vid->hAudio, pos); TaskSwitch (); return true; } @@ -475,10 +467,16 @@ static bool vp_AudioStart (TFB_SoundSample* sample) { - TFB_VideoClip* vid = sample->data; + TFB_VideoClip* vid = (TFB_VideoClip*) TFB_GetSoundSampleData (sample); + TFB_SoundDecoder *decoder; + assert (sizeof (intptr_t) >= sizeof (vid)); + assert (vid != NULL); + + decoder = TFB_GetSoundSampleDecoder (sample); + LockMutex (vid->guard); - vid->want_frame = SoundDecoder_GetFrame (sample->decoder); + vid->want_frame = SoundDecoder_GetFrame (decoder); UnlockMutex (vid->guard); return true; @@ -487,8 +485,10 @@ static void vp_AudioEnd (TFB_SoundSample* sample) { - TFB_VideoClip* vid = sample->data; + TFB_VideoClip* vid = (TFB_VideoClip*) TFB_GetSoundSampleData (sample); + assert (vid != NULL); + LockMutex (vid->guard); vid->want_frame = vid->decoder->frame_count; // end it UnlockMutex (vid->guard); @@ -497,9 +497,12 @@ static void vp_BufferTag (TFB_SoundSample* sample, TFB_SoundTag* tag) { - TFB_VideoClip* vid = sample->data; - uint32 frame = (uint32) (intptr_t) tag->data; - + TFB_VideoClip* vid = (TFB_VideoClip*) TFB_GetSoundSampleData (sample); + uint32 frame = (uint32) tag->data; + + assert (sizeof (tag->data) >= sizeof (frame)); + assert (vid != NULL); + LockMutex (vid->guard); vid->want_frame = frame; // let it go! UnlockMutex (vid->guard); @@ -508,9 +511,10 @@ static void vp_QueueBuffer (TFB_SoundSample* sample, audio_Object buffer) { - //TFB_VideoClip* vid = sample->data; + //TFB_VideoClip* vid = (TFB_VideoClip*) TFB_GetSoundSampleData (sample); + TFB_SoundDecoder *decoder = TFB_GetSoundSampleDecoder (sample); TFB_TagBuffer (sample, buffer, - (void *) (intptr_t) SoundDecoder_GetFrame (sample->decoder)); + (intptr_t) SoundDecoder_GetFrame (decoder)); } Modified: trunk/sc2/src/uqm/settings.c =================================================================== --- trunk/sc2/src/uqm/settings.c 2009-10-19 10:32:15 UTC (rev 3231) +++ trunk/sc2/src/uqm/settings.c 2009-10-19 19:13:24 UTC (rev 3232) @@ -90,8 +90,8 @@ if (!(GLOBAL (glob_flags) & SOUND_DISABLED)) { SetChannelVolume (Channel, MAX_VOLUME >> 1, Priority); - SetChannelRate (Channel, GetSampleRate (S), Priority); - PlayChannel (Channel, GetSampleAddress (S), Pos, PositionalObject, Priority); + //SetChannelRate (Channel, GetSampleRate (S), Priority); + PlayChannel (Channel, S, Pos, PositionalObject, Priority); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Mee...@us...> - 2009-10-21 16:49:36
|
Revision: 3233 http://sc2.svn.sourceforge.net/sc2/?rev=3233&view=rev Author: Meep-Eep Date: 2009-10-21 16:49:26 +0000 (Wed, 21 Oct 2009) Log Message: ----------- Redefining "absurd". Also small cleanup. Modified Paths: -------------- trunk/sc2/src/uqm/netplay/packethandlers.c trunk/sc2/src/uqm.c Modified: trunk/sc2/src/uqm/netplay/packethandlers.c =================================================================== --- trunk/sc2/src/uqm/netplay/packethandlers.c 2009-10-19 19:13:24 UTC (rev 3232) +++ trunk/sc2/src/uqm/netplay/packethandlers.c 2009-10-21 16:49:26 UTC (rev 3233) @@ -487,12 +487,12 @@ battleStateData = (BattleStateData *) NetConnection_getStateData(conn); delay = ntoh32(packet->delay); - if (delay > 60 * BATTLE_FRAME_RATE) { + if (delay > BATTLE_FRAME_RATE) { log_add(log_Error, "NETPLAY: [%d] Received absurdly large " "input delay value (%d).", conn->player, delay); return -1; } - conn->stateFlags.inputDelay = ntoh32(packet->delay); + conn->stateFlags.inputDelay = delay; return 0; } Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-19 19:13:24 UTC (rev 3232) +++ trunk/sc2/src/uqm.c 2009-10-21 16:49:26 UTC (rev 3233) @@ -916,7 +916,7 @@ } netplayOptions.inputDelay = temp; - if (netplayOptions.inputDelay > 60 * BATTLE_FRAME_RATE) + if (netplayOptions.inputDelay > BATTLE_FRAME_RATE) { log_add (log_Fatal, "Network input delay is absurdly " "large."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-10-21 20:21:38
|
Revision: 3234 http://sc2.svn.sourceforge.net/sc2/?rev=3234&view=rev Author: avolkov Date: 2009-10-21 20:21:25 +0000 (Wed, 21 Oct 2009) Log Message: ----------- Cleanup of options processing: parse all options at the very first thing we do, so do not have to screw with optind; fixes failures when running with no args on mingw Modified Paths: -------------- trunk/sc2/src/options.c trunk/sc2/src/options.h trunk/sc2/src/uqm/setup.c trunk/sc2/src/uqm/setupmenu.c trunk/sc2/src/uqm.c Modified: trunk/sc2/src/options.c =================================================================== --- trunk/sc2/src/options.c 2009-10-21 16:49:26 UTC (rev 3233) +++ trunk/sc2/src/options.c 2009-10-21 20:21:25 UTC (rev 3234) @@ -53,7 +53,7 @@ const char **optAddons; BOOLEAN opt3doMusic; -BOOLEAN optPrecursorsMusic; +BOOLEAN optRemixMusic; BOOLEAN optSubtitles; BOOLEAN optStereoSFX; BOOLEAN optKeepAspectRatio; Modified: trunk/sc2/src/options.h =================================================================== --- trunk/sc2/src/options.h 2009-10-21 16:49:26 UTC (rev 3233) +++ trunk/sc2/src/options.h 2009-10-21 20:21:25 UTC (rev 3234) @@ -39,7 +39,7 @@ extern int optMeleeScale; extern BOOLEAN opt3doMusic; -extern BOOLEAN optPrecursorsMusic; +extern BOOLEAN optRemixMusic; extern BOOLEAN optSubtitles; extern BOOLEAN optStereoSFX; extern BOOLEAN optKeepAspectRatio; Modified: trunk/sc2/src/uqm/setup.c =================================================================== --- trunk/sc2/src/uqm/setup.c 2009-10-21 16:49:26 UTC (rev 3233) +++ trunk/sc2/src/uqm/setup.c 2009-10-21 20:21:25 UTC (rev 3234) @@ -125,7 +125,7 @@ if (!loadAddon ("3dovoice")) speechVolumeScale = 0.0f; // XXX: need better no-speech indicator - if (optPrecursorsMusic) + if (optRemixMusic) { loadAddon ("remix"); } Modified: trunk/sc2/src/uqm/setupmenu.c =================================================================== --- trunk/sc2/src/uqm/setupmenu.c 2009-10-21 16:49:26 UTC (rev 3233) +++ trunk/sc2/src/uqm/setupmenu.c 2009-10-21 20:21:25 UTC (rev 3234) @@ -1092,7 +1092,7 @@ opts->stereo = optStereoSFX ? OPTVAL_ENABLED : OPTVAL_DISABLED; /* These values are read in, but won't change during a run. */ opts->music3do = opt3doMusic ? OPTVAL_ENABLED : OPTVAL_DISABLED; - opts->musicremix = optPrecursorsMusic ? OPTVAL_ENABLED : OPTVAL_DISABLED; + opts->musicremix = optRemixMusic ? OPTVAL_ENABLED : OPTVAL_DISABLED; switch (snddriver) { case audio_DRIVER_OPENAL: opts->adriver = OPTVAL_OPENAL; Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-10-21 16:49:26 UTC (rev 3233) +++ trunk/sc2/src/uqm.c 2009-10-21 20:21:25 UTC (rev 3234) @@ -26,6 +26,7 @@ # include "getopt/getopt.h" #endif +#include <stdarg.h> #include "libs/graphics/gfx_common.h" #include "libs/sound/sound.h" #include "libs/input/input_common.h" @@ -35,6 +36,7 @@ #include "uqm/battle.h" // For BATTLE_FRAME_RATE #include "libs/file.h" +#include "types.h" #include "port.h" #include "libs/memlib.h" #include "libs/platform.h" @@ -58,58 +60,166 @@ // Including this is actually necessary on OSX. #endif -struct options_struct { +struct bool_option +{ + bool value; + bool set; +}; + +struct int_option +{ + int value; + bool set; +}; + +struct float_option +{ + float value; + bool set; +}; + +struct options_struct +{ +#define DECL_CONFIG_OPTION(type, name) \ + struct type##_option name + +#define DECL_CONFIG_OPTION2(type, name, val1, val2) \ + struct { type val1; type val2; bool set; } name + + // Commandline-only options const char *logFile; enum { runMode_normal, runMode_usage, runMode_version, } runMode; - int gfxDriver; - int gfxFlags; - int soundDriver; - int soundFlags; - int width; - int height; - BOOLEAN keepAspectRatio; + const char *configDir; const char *contentDir; + const char *addonDir; const char **addons; - const char *addonDir; int numAddons; - int gammaSet; - float gamma; - BOOLEAN use3doMusic; - BOOLEAN usePrecursorsMusic; - int whichCoarseScan; - int whichMenu; - int whichFonts; - int whichIntro; - int whichShield; - int smoothScroll; - int meleeScale; - BOOLEAN subTitles; - BOOLEAN stereoSFX; - float musicVolumeScale; - float sfxVolumeScale; - float speechVolumeScale; + + // Commandline and user config options + DECL_CONFIG_OPTION(bool, opengl); + DECL_CONFIG_OPTION2(int, resolution, width, height); + DECL_CONFIG_OPTION(bool, fullscreen); + DECL_CONFIG_OPTION(bool, scanlines); + DECL_CONFIG_OPTION(int, scaler); + DECL_CONFIG_OPTION(bool, showFps); + DECL_CONFIG_OPTION(bool, keepAspectRatio); + DECL_CONFIG_OPTION(float, gamma); + DECL_CONFIG_OPTION(int, soundDriver); + DECL_CONFIG_OPTION(int, soundQuality); + DECL_CONFIG_OPTION(bool, use3doMusic); + DECL_CONFIG_OPTION(bool, useRemixMusic); + DECL_CONFIG_OPTION(int, whichCoarseScan); + DECL_CONFIG_OPTION(int, whichMenu); + DECL_CONFIG_OPTION(int, whichFonts); + DECL_CONFIG_OPTION(int, whichIntro); + DECL_CONFIG_OPTION(int, whichShield); + DECL_CONFIG_OPTION(int, smoothScroll); + DECL_CONFIG_OPTION(int, meleeScale); + DECL_CONFIG_OPTION(bool, subtitles); + DECL_CONFIG_OPTION(bool, stereoSFX); + DECL_CONFIG_OPTION(float, musicVolumeScale); + DECL_CONFIG_OPTION(float, sfxVolumeScale); + DECL_CONFIG_OPTION(float, speechVolumeScale); + +#define INIT_CONFIG_OPTION(name, val) \ + { val, false } + +#define INIT_CONFIG_OPTION2(name, val1, val2) \ + { val1, val2, false } }; -static int preParseOptions (int argc, char *argv[], - struct options_struct *options); +struct option_list_value +{ + const char *str; + int value; +}; + +static const struct option_list_value scalerList[] = +{ + {"bilinear", TFB_GFXFLAGS_SCALE_BILINEAR}, + {"biadapt", TFB_GFXFLAGS_SCALE_BIADAPT}, + {"biadv", TFB_GFXFLAGS_SCALE_BIADAPTADV}, + {"triscan", TFB_GFXFLAGS_SCALE_TRISCAN}, + {"hq", TFB_GFXFLAGS_SCALE_HQXX}, + {"none", 0}, + {"no", 0}, /* uqm.cfg value */ + {NULL, 0} +}; + +static const struct option_list_value meleeScaleList[] = +{ + {"smooth", TFB_SCALE_TRILINEAR}, + {"3do", TFB_SCALE_TRILINEAR}, + {"step", TFB_SCALE_STEP}, + {"pc", TFB_SCALE_STEP}, + {"bilinear", TFB_SCALE_BILINEAR}, + {NULL, 0} +}; + +static const struct option_list_value audioDriverList[] = +{ + {"openal", audio_DRIVER_OPENAL}, + {"mixsdl", audio_DRIVER_MIXSDL}, + {"none", audio_DRIVER_NOSOUND}, + {"nosound", audio_DRIVER_NOSOUND}, + {NULL, 0} +}; + +static const struct option_list_value audioQualityList[] = +{ + {"low", audio_QUALITY_LOW}, + {"medium", audio_QUALITY_MEDIUM}, + {"high", audio_QUALITY_HIGH}, + {NULL, 0} +}; + +static const struct option_list_value choiceList[] = +{ + {"pc", OPT_PC}, + {"3do", OPT_3DO}, + {NULL, 0} +}; + +static const struct option_list_value accelList[] = +{ + {"mmx", PLATFORM_MMX}, + {"sse", PLATFORM_SSE}, + {"3dnow", PLATFORM_3DNOW}, + {"none", PLATFORM_C}, + {"detect", PLATFORM_NULL}, + {NULL, 0} +}; + +// Looks up the given string value in the given list and passes +// the associated int value back. returns true if value was found. +// The list is terminated by a NULL 'str' value. +static bool lookupOptionValue (const struct option_list_value *list, + const char *strval, int *ret); + +// Error message buffer used for when we cannot use logging facility yet +static char errBuffer[512]; + +static void saveError (const char *fmt, ...) + PRINTF_FUNCTION(1, 2); + static int parseOptions (int argc, char *argv[], struct options_struct *options); +static void getUserConfigOptions (struct options_struct *options); static void usage (FILE *out, const struct options_struct *defaultOptions); static int parseIntOption (const char *str, int *result, const char *optName); static int parseFloatOption (const char *str, float *f, const char *optName); static void parseIntVolume (int intVol, float *vol); -static int parseVolume (const char *str, float *vol, const char *optName); static int InvalidArgument (const char *supplied, const char *opt_name); -static int Check_PC_3DO_opt (const char *value, DWORD mask, const char *opt, - int *result); -static const char *PC_3DO_optString (DWORD optMask); +static const char *choiceOptString (const struct int_option *option); +static const char *boolOptString (const struct bool_option *option); +static const char *boolNotOptString (const struct bool_option *option); int main (int argc, char *argv[]) @@ -117,47 +227,50 @@ struct options_struct options = { /* .logFile = */ NULL, /* .runMode = */ runMode_normal, - /* .gfxdriver = */ TFB_GFXDRIVER_SDL_PURE, - /* .gfxflags = */ 0, - /* .soundDriver = */ audio_DRIVER_MIXSDL, - /* .soundFlags = */ audio_QUALITY_MEDIUM, - /* .width = */ 640, - /* .height = */ 480, - /* .keepAspectRatio = */ FALSE, /* .configDir = */ NULL, /* .contentDir = */ NULL, + /* .addonDir = */ NULL, /* .addons = */ NULL, - /* .addonDir = */ NULL, /* .numAddons = */ 0, - /* .gammaSet = */ 0, - /* .gamma = */ 0.0f, - /* .use3doMusic = */ TRUE, - /* .usePrecursorsMusic = */ FALSE, - /* .whichCoarseScan = */ OPT_PC, - /* .whichMenu = */ OPT_PC, - /* .whichFont = */ OPT_PC, - /* .whichIntro = */ OPT_PC, - /* .whichShield = */ OPT_PC, - /* .smoothScroll = */ OPT_PC, - /* .meleeScale = */ TFB_SCALE_TRILINEAR, - /* .subtitles = */ TRUE, - /* .stereoSFX = */ FALSE, - /* .musicVolumeScale = */ 1.0f, - /* .sfxVolumeScale = */ 1.0f, - /* .speechVolumeScale = */ 1.0f, + + INIT_CONFIG_OPTION( opengl, false ), + INIT_CONFIG_OPTION2( resolution, 640, 480 ), + INIT_CONFIG_OPTION( fullscreen, false ), + INIT_CONFIG_OPTION( scanlines, false ), + INIT_CONFIG_OPTION( scaler, 0 ), + INIT_CONFIG_OPTION( showFps, false ), + INIT_CONFIG_OPTION( keepAspectRatio, false ), + INIT_CONFIG_OPTION( gamma, 0.0f ), + INIT_CONFIG_OPTION( soundDriver, audio_DRIVER_MIXSDL ), + INIT_CONFIG_OPTION( soundQuality, audio_QUALITY_MEDIUM ), + INIT_CONFIG_OPTION( use3doMusic, true ), + INIT_CONFIG_OPTION( useRemixMusic, false ), + INIT_CONFIG_OPTION( whichCoarseScan, OPT_PC ), + INIT_CONFIG_OPTION( whichMenu, OPT_PC ), + INIT_CONFIG_OPTION( whichFonts, OPT_PC ), + INIT_CONFIG_OPTION( whichIntro, OPT_PC ), + INIT_CONFIG_OPTION( whichShield, OPT_PC ), + INIT_CONFIG_OPTION( smoothScroll, OPT_PC ), + INIT_CONFIG_OPTION( meleeScale, TFB_SCALE_TRILINEAR ), + INIT_CONFIG_OPTION( subtitles, true ), + INIT_CONFIG_OPTION( stereoSFX, false ), + INIT_CONFIG_OPTION( musicVolumeScale, 1.0f ), + INIT_CONFIG_OPTION( sfxVolumeScale, 1.0f ), + INIT_CONFIG_OPTION( speechVolumeScale, 1.0f ), }; + struct options_struct defaults = options; int optionsResult; + int gfxDriver; + int gfxFlags; int i; + // NOTE: we cannot use the logging facility yet because we may have to + // log to a file, and we'll only get the log file name after parsing + // the options. + optionsResult = parseOptions (argc, argv, &options); + log_init (15); - optionsResult = preParseOptions (argc, argv, &options); - if (optionsResult != 0) - { - // TODO: various uninitialisations - return optionsResult; - } - if (options.logFile != NULL) { int i; @@ -191,17 +304,25 @@ NETPLAY_MIN_UQM_VERSION_PATCH); #endif + if (errBuffer[0] != '\0') + { // Have some saved error to log + log_add (log_Error, errBuffer); + errBuffer[0] = '\0'; + } + if (options.runMode == runMode_usage) { - usage (stdout, &options); + usage (stdout, &defaults); log_showBox (true, false); return EXIT_SUCCESS; } - /* mem_init () uses mutexes. Mutex creation cannot use - the memory system until the memory system is rewritten - to rely on a thread-safe allocator. - */ + if (optionsResult != EXIT_SUCCESS) + { // Options parsing failed. Oh, well. + log_add (log_Fatal, "Run with -h to see the allowed arguments."); + return optionsResult; + } + TFB_PreInit (); mem_init (); InitThreadSystem (); @@ -214,196 +335,8 @@ // Fill in the options struct based on uqm.cfg LoadResourceIndex (configDir, "uqm.cfg", "config."); - - if (res_IsInteger ("config.reswidth")) - { - options.width = res_GetInteger ("config.reswidth"); - } - if (res_IsInteger ("config.resheight")) - { - options.height = res_GetInteger ("config.resheight"); - } - if (res_IsBoolean("config.keepaspectratio")) - { - options.keepAspectRatio = res_GetBoolean ("config.keepaspectratio"); - } - if (res_IsBoolean ("config.alwaysgl")) - { - if (res_GetBoolean ("config.alwaysgl")) - { - options.gfxDriver = TFB_GFXDRIVER_SDL_OPENGL; - } - } - if (res_IsBoolean ("config.usegl")) - { - options.gfxDriver = res_GetBoolean ("config.usegl") ? - TFB_GFXDRIVER_SDL_OPENGL : TFB_GFXDRIVER_SDL_PURE; - } - if (res_IsString ("config.scaler")) - { - const char *arg = res_GetString ("config.scaler"); + getUserConfigOptions (&options); - if (!strcmp (arg, "bilinear")) - options.gfxFlags |= TFB_GFXFLAGS_SCALE_BILINEAR; - else if (!strcmp (arg, "biadapt")) - options.gfxFlags |= TFB_GFXFLAGS_SCALE_BIADAPT; - else if (!strcmp (arg, "biadv")) - options.gfxFlags |= TFB_GFXFLAGS_SCALE_BIADAPTADV; - else if (!strcmp (arg, "triscan")) - options.gfxFlags |= TFB_GFXFLAGS_SCALE_TRISCAN; - else if (!strcmp (arg, "hq")) - options.gfxFlags |= TFB_GFXFLAGS_SCALE_HQXX; - } - if (res_IsBoolean ("config.scanlines") && - res_GetBoolean ("config.scanlines")) - { - options.gfxFlags |= TFB_GFXFLAGS_SCANLINES; - } - if (res_IsBoolean ("config.fullscreen") && - res_GetBoolean ("config.fullscreen")) - { - options.gfxFlags |= TFB_GFXFLAGS_FULLSCREEN; - } - if (res_IsBoolean ("config.subtitles")) - { - options.subTitles = res_GetBoolean ("config.subtitles"); - } - if (res_IsBoolean ("config.textmenu")) - { - options.whichMenu = res_GetBoolean ("config.textmenu") ? - OPT_PC : OPT_3DO; - } - if (res_IsBoolean ("config.textgradients")) - { - options.whichFonts = res_GetBoolean ("config.textgradients") ? - OPT_PC : OPT_3DO; - } - if (res_IsBoolean ("config.iconicscan")) - { - options.whichCoarseScan = res_GetBoolean ("config.iconicscan") ? - OPT_3DO : OPT_PC; - } - if (res_IsBoolean ("config.smoothscroll")) - { - options.smoothScroll = res_GetBoolean ("config.smoothscroll") ? - OPT_3DO : OPT_PC; - } - if (res_IsBoolean ("config.3domusic")) - { - options.use3doMusic = res_GetBoolean ("config.3domusic"); - } - if (res_IsBoolean ("config.remixmusic")) - { - options.usePrecursorsMusic = res_GetBoolean ("config.remixmusic"); - } - if (res_IsBoolean ("config.3domovies")) - { - options.whichIntro = res_GetBoolean ("config.3domovies") ? - OPT_3DO : OPT_PC; - } - if (res_IsBoolean ("config.showfps") && res_GetBoolean ("config.showfps")) - { - options.gfxFlags |= TFB_GFXFLAGS_SHOWFPS; - } - if (res_IsBoolean ("config.smoothmelee")) - { - options.meleeScale = res_GetBoolean ("config.smoothmelee") ? - TFB_SCALE_TRILINEAR : TFB_SCALE_STEP; - } - if (res_IsBoolean ("config.positionalsfx")) - { - options.stereoSFX = res_GetBoolean ("config.positionalsfx"); - } - if (res_IsString ("config.audiodriver")) - { - const char *driverstr = res_GetString ("config.audiodriver"); - if (!strcmp (driverstr, "openal")) - { - options.soundDriver = audio_DRIVER_OPENAL; - } - else if (!strcmp (driverstr, "none")) - { - options.soundDriver = audio_DRIVER_NOSOUND; - options.speechVolumeScale = 0.0f; - } - else if (!strcmp (driverstr, "mixsdl")) - { - options.soundDriver = audio_DRIVER_MIXSDL; - } - else - { - /* Can't figure it out, leave as initial default */ - } - } - if (res_IsString ("config.audioquality")) - { - const char *qstr = res_GetString ("config.audioquality"); - if (!strcmp (qstr, "low")) - { - options.soundFlags &= - ~(audio_QUALITY_MEDIUM | audio_QUALITY_HIGH); - options.soundFlags |= audio_QUALITY_LOW; - } - else if (!strcmp (qstr, "medium")) - { - options.soundFlags &= - ~(audio_QUALITY_HIGH | audio_QUALITY_LOW); - options.soundFlags |= audio_QUALITY_MEDIUM; - } - else if (!strcmp (qstr, "high")) - { - options.soundFlags &= - ~(audio_QUALITY_MEDIUM | audio_QUALITY_LOW); - options.soundFlags |= audio_QUALITY_HIGH; - } - else - { - /* Can't figure it out, leave as initial default */ - } - } - if (res_IsBoolean ("config.pulseshield")) - { - options.whichShield = - res_GetBoolean ("config.pulseshield") ? OPT_3DO : OPT_PC; - } - if (res_IsInteger ("config.player1control")) - { - PlayerControls[0] = res_GetInteger ("config.player1control"); - /* This is an unsigned, so no < 0 check is necessary */ - if (PlayerControls[0] >= NUM_TEMPLATES) - { - log_add (log_Error, "Illegal control template '%d' for Player " - "One.", PlayerControls[0]); - PlayerControls[0] = CONTROL_TEMPLATE_KB_1; - } - } - if (res_IsInteger ("config.player2control")) - { - /* This is an unsigned, so no < 0 check is necessary */ - PlayerControls[1] = res_GetInteger ("config.player2control"); - if (PlayerControls[1] >= NUM_TEMPLATES) - { - log_add (log_Error, "Illegal control template '%d' for Player " - "Two.", PlayerControls[1]); - PlayerControls[1] = CONTROL_TEMPLATE_JOY_1; - } - } - if (res_IsInteger ("config.musicvol")) - { - parseIntVolume (res_GetInteger ("config.musicvol"), - &options.musicVolumeScale); - } - if (res_IsInteger ("config.sfxvol")) - { - parseIntVolume (res_GetInteger ("config.sfxvol"), - &options.sfxVolumeScale); - } - if (res_IsInteger ("config.speechvol")) - { - parseIntVolume (res_GetInteger ("config.speechvol"), - &options.speechVolumeScale); - } - { /* remove old control template names */ int i; @@ -418,37 +351,30 @@ } } - optionsResult = parseOptions (argc, argv, &options); - if (optionsResult != 0) - { - // TODO: various uninitialisations - return optionsResult; - } - /* TODO: Once threading is gone, these become local variables again. In the meantime, they must be global so that initAudio (in StarCon2Main) can see them. initAudio needed to be moved there because calling AssignTask in the main thread doesn't work */ - snddriver = options.soundDriver; - soundflags = options.soundFlags; + snddriver = options.soundDriver.value; + soundflags = options.soundQuality.value; // Fill in global variables: - opt3doMusic = options.use3doMusic; - optPrecursorsMusic = options.usePrecursorsMusic; - optWhichCoarseScan = options.whichCoarseScan; - optWhichMenu = options.whichMenu; - optWhichFonts = options.whichFonts; - optWhichIntro = options.whichIntro; - optWhichShield = options.whichShield; - optSmoothScroll = options.smoothScroll; - optMeleeScale = options.meleeScale; - optKeepAspectRatio = options.keepAspectRatio; - optSubtitles = options.subTitles; - optStereoSFX = options.stereoSFX; - musicVolumeScale = options.musicVolumeScale; - sfxVolumeScale = options.sfxVolumeScale; - speechVolumeScale = options.speechVolumeScale; + opt3doMusic = options.use3doMusic.value; + optRemixMusic = options.useRemixMusic.value; + optWhichCoarseScan = options.whichCoarseScan.value; + optWhichMenu = options.whichMenu.value; + optWhichFonts = options.whichFonts.value; + optWhichIntro = options.whichIntro.value; + optWhichShield = options.whichShield.value; + optSmoothScroll = options.smoothScroll.value; + optMeleeScale = options.meleeScale.value; + optKeepAspectRatio = options.keepAspectRatio.value; + optSubtitles = options.subtitles.value; + optStereoSFX = options.stereoSFX.value; + musicVolumeScale = options.musicVolumeScale.value; + sfxVolumeScale = options.sfxVolumeScale.value; + speechVolumeScale = options.speechVolumeScale.value; optAddons = options.addons; prepareContentDir (options.contentDir, options.addonDir, argv[0]); @@ -472,10 +398,19 @@ GraphicsLock = CreateMutex ("Graphics", SYNC_CLASS_TOPLEVEL | SYNC_CLASS_VIDEO); - TFB_InitGraphics (options.gfxDriver, options.gfxFlags, - options.width, options.height); - if (options.gammaSet) - TFB_SetGamma (options.gamma); + gfxDriver = options.opengl.value ? + TFB_GFXDRIVER_SDL_OPENGL : TFB_GFXDRIVER_SDL_PURE; + gfxFlags = options.scaler.value; + if (options.fullscreen.value) + gfxFlags |= TFB_GFXFLAGS_FULLSCREEN; + if (options.scanlines.value) + gfxFlags |= TFB_GFXFLAGS_SCANLINES; + if (options.showFps.value) + gfxFlags |= TFB_GFXFLAGS_SHOWFPS; + TFB_InitGraphics (gfxDriver, gfxFlags, options.resolution.width, + options.resolution.height); + if (options.gamma.set) + TFB_SetGamma (options.gamma.value); InitColorMaps (); init_communication (); /* TODO: Once threading is gone, restore initAudio here. @@ -537,6 +472,191 @@ return EXIT_SUCCESS; } +static void +saveErrorV (const char *fmt, va_list list) +{ + int len = strlen (errBuffer); + int left = sizeof (errBuffer) - len; + if (len > 0 && left > 0) + { // Already something there + errBuffer[len] = '\n'; + ++len; + --left; + } + vsnprintf (errBuffer + len, left, fmt, list); + errBuffer[sizeof (errBuffer) - 1] = '\0'; +} + +static void +saveError (const char *fmt, ...) +{ + va_list list; + + va_start (list, fmt); + saveErrorV (fmt, list); + va_end (list); +} + + +static bool +lookupOptionValue (const struct option_list_value *list, + const char *strval, int *ret) +{ + if (!list) + return false; + + // The list is terminated by a NULL 'str' value. + while (list->str && strcmp (strval, list->str) != 0) + ++list; + if (!list->str) + return false; + + *ret = list->value; + return true; +} + +static void +getBoolConfigValue (struct bool_option *option, const char *config_val) +{ + if (option->set || !res_IsBoolean (config_val)) + return; + + option->value = res_GetBoolean (config_val); + option->set = true; +} + +static void +getBoolConfigValueXlat (struct int_option *option, const char *config_val, + int true_val, int false_val) +{ + if (option->set || !res_IsBoolean (config_val)) + return; + + option->value = res_GetBoolean (config_val) ? true_val : false_val; + option->set = true; +} + +static void +getVolumeConfigValue (struct float_option *option, const char *config_val) +{ + if (option->set || !res_IsInteger (config_val)) + return; + + parseIntVolume (res_GetInteger (config_val), &option->value); + option->set = true; +} + +static bool +getListConfigValue (struct int_option *option, const char *config_val, + const struct option_list_value *list) +{ + const char *strval; + bool found; + + if (option->set || !res_IsString (config_val) || !list) + return false; + + strval = res_GetString (config_val); + found = lookupOptionValue (list, strval, &option->value); + option->set = found; + + return found; +} + +static void +getUserConfigOptions (struct options_struct *options) +{ + // Most of the user config options are only applied if they + // have not already been set (i.e. on the commandline) + + if (res_IsInteger ("config.reswidth") && res_IsInteger ("config.resheight") + && !options->resolution.set) + { + options->resolution.width = res_GetInteger ("config.reswidth"); + options->resolution.height = res_GetInteger ("config.resheight"); + options->resolution.set = true; + } + + if (res_IsBoolean ("config.alwaysgl") && !options->opengl.set) + { // config.alwaysgl is processed differently than others + // Only set when it's 'true' + if (res_GetBoolean ("config.alwaysgl")) + { + options->opengl.value = true; + options->opengl.set = true; + } + } + getBoolConfigValue (&options->opengl, "config.usegl"); + + getListConfigValue (&options->scaler, "config.scaler", scalerList); + + getBoolConfigValue (&options->fullscreen, "config.fullscreen"); + getBoolConfigValue (&options->scanlines, "config.scanlines"); + getBoolConfigValue (&options->showFps, "config.showfps"); + getBoolConfigValue (&options->keepAspectRatio, "config.keepaspectratio"); + + getBoolConfigValue (&options->subtitles, "config.subtitles"); + + getBoolConfigValueXlat (&options->whichMenu, "config.textmenu", + OPT_PC, OPT_3DO); + getBoolConfigValueXlat (&options->whichFonts, "config.textgradients", + OPT_PC, OPT_3DO); + getBoolConfigValueXlat (&options->whichCoarseScan, "config.iconicscan", + OPT_3DO, OPT_PC); + getBoolConfigValueXlat (&options->smoothScroll, "config.smoothscroll", + OPT_3DO, OPT_PC); + getBoolConfigValueXlat (&options->whichShield, "config.pulseshield", + OPT_3DO, OPT_PC); + getBoolConfigValueXlat (&options->whichIntro, "config.3domovies", + OPT_3DO, OPT_PC); + + getBoolConfigValue (&options->use3doMusic, "config.3domusic"); + getBoolConfigValue (&options->useRemixMusic, "config.remixmusic"); + + getBoolConfigValueXlat (&options->meleeScale, "config.smoothmelee", + TFB_SCALE_TRILINEAR, TFB_SCALE_STEP); + + if (getListConfigValue (&options->soundDriver, "config.audiodriver", + audioDriverList)) + { + // XXX: I don't know if we should turn speech off in this case. + // This affects which version of the alien script will be used. + if (options->soundDriver.value == audio_DRIVER_NOSOUND) + options->speechVolumeScale.value = 0.0f; + } + + getListConfigValue (&options->soundQuality, "config.audioquality", + audioQualityList); + getBoolConfigValue (&options->stereoSFX, "config.positionalsfx"); + getVolumeConfigValue (&options->musicVolumeScale, "config.musicvol"); + getVolumeConfigValue (&options->sfxVolumeScale, "config.sfxvol"); + getVolumeConfigValue (&options->speechVolumeScale, "config.speechvol"); + + if (res_IsInteger ("config.player1control")) + { + PlayerControls[0] = res_GetInteger ("config.player1control"); + /* This is an unsigned, so no < 0 check is necessary */ + if (PlayerControls[0] >= NUM_TEMPLATES) + { + log_add (log_Error, "Illegal control template '%d' for Player " + "One.", PlayerControls[0]); + PlayerControls[0] = CONTROL_TEMPLATE_KB_1; + } + } + + if (res_IsInteger ("config.player2control")) + { + /* This is an unsigned, so no < 0 check is necessary */ + PlayerControls[1] = res_GetInteger ("config.player2control"); + if (PlayerControls[1] >= NUM_TEMPLATES) + { + log_add (log_Error, "Illegal control template '%d' for Player " + "Two.", PlayerControls[1]); + PlayerControls[1] = CONTROL_TEMPLATE_JOY_1; + } + } +} + enum { CSCAN_OPT = 1000, @@ -558,7 +678,7 @@ #endif }; -static const char *optString = "+r:d:foc:b:spC:n:?hM:S:T:m:q:ug:l:i:vwxk"; +static const char *optString = "+r:foc:b:spC:n:?hM:S:T:m:q:ug:l:i:vwxk"; static struct option longOptions[] = { {"res", 1, NULL, 'r'}, @@ -605,59 +725,73 @@ {0, 0, 0, 0} }; -static int -preParseOptions (int argc, char *argv[], struct options_struct *options) +static inline void +setBoolOption (struct bool_option *option, bool value) { - /* - * "pre-process" the cmdline args looking for a -l ("logfile") - * option. If it was given, redirect stderr to the named file. - * Also handle the switches were normal operation is inhibited. - */ - opterr = 0; - for (;;) - { - int c = getopt_long (argc, argv, optString, longOptions, 0); - if (c == -1) - break; + option->value = value; + option->set = true; +} - switch (c) - { - case 'l': - { - options->logFile = optarg; - break; - } - case 'C': - { - options->configDir = optarg; - break; - } - case '?': - case 'h': - options->runMode = runMode_usage; - return EXIT_SUCCESS; - case 'v': - options->runMode = runMode_version; - return EXIT_SUCCESS; - } - } - optind = 1; - return 0; +static bool +setFloatOption (struct float_option *option, const char *strval, + const char *optName) +{ + if (parseFloatOption (strval, &option->value, optName) != 0) + return false; + option->set = true; + return true; } +// returns true is value was found and set successfully +static bool +setListOption (struct int_option *option, const char *strval, + const struct option_list_value *list) +{ + bool found; + + if (!list) + return false; // not found + + found = lookupOptionValue (list, strval, &option->value); + option->set = found; + + return found; +} + +static inline bool +setChoiceOption (struct int_option *option, const char *strval) +{ + return setListOption (option, strval, choiceList); +} + +static bool +setVolumeOption (struct float_option *option, const char *strval, + const char *optName) +{ + int intVol; + + if (parseIntOption (strval, &intVol, optName) != 0) + return false; + parseIntVolume (intVol, &option->value); + option->set = true; + return true; +} + static int parseOptions (int argc, char *argv[], struct options_struct *options) { int optionIndex; - BOOLEAN badArg = FALSE; + bool badArg = false; + opterr = 0; + options->addons = HMalloc (1 * sizeof (const char *)); options->addons[0] = NULL; options->numAddons = 0; if (argc == 0) { - log_add (log_Fatal, "Error: Bad command line."); + saveError ("Error: Bad command line."); return EXIT_FAILURE; } @@ -669,200 +803,181 @@ if (c == -1) break; - switch (c) { + switch (c) + { + case '?': + if (optopt != '?') + { + saveError ("\nInvalid option or its argument"); + badArg = true; + break; + } + // fall through + case 'h': + options->runMode = runMode_usage; + return EXIT_SUCCESS; + case 'v': + options->runMode = runMode_version; + return EXIT_SUCCESS; case 'r': { int width, height; if (sscanf (optarg, "%dx%d", &width, &height) != 2) { - log_add (log_Fatal, "Error: invalid argument specified " + saveError ("Error: invalid argument specified " "as resolution."); - badArg = TRUE; + badArg = true; break; } - options->width = width; - options->height = height; + options->resolution.width = width; + options->resolution.height = height; + options->resolution.set = true; break; } case 'f': - options->gfxFlags |= TFB_GFXFLAGS_FULLSCREEN; + setBoolOption (&options->fullscreen, true); break; case 'w': - options->gfxFlags &= ~TFB_GFXFLAGS_FULLSCREEN; + setBoolOption (&options->fullscreen, false); break; case 'o': - options->gfxDriver = TFB_GFXDRIVER_SDL_OPENGL; + setBoolOption (&options->opengl, true); break; case 'x': - options->gfxDriver = TFB_GFXDRIVER_SDL_PURE; + setBoolOption (&options->opengl, false); break; case 'k': - options->keepAspectRatio = TRUE; + setBoolOption (&options->keepAspectRatio, true); break; case 'c': - // make sure whatever was set by saved config is cleared - options->gfxFlags &= ~TFB_GFXFLAGS_SCALE_ANY; - if (!strcmp (optarg, "bilinear")) - options->gfxFlags |= TFB_GFXFLAGS_SCALE_BILINEAR; - else if (!strcmp (optarg, "biadapt")) - options->gfxFlags |= TFB_GFXFLAGS_SCALE_BIADAPT; - else if (!strcmp (optarg, "biadv")) - options->gfxFlags |= TFB_GFXFLAGS_SCALE_BIADAPTADV; - else if (!strcmp (optarg, "triscan")) - options->gfxFlags |= TFB_GFXFLAGS_SCALE_TRISCAN; - else if (!strcmp (optarg, "hq")) - options->gfxFlags |= TFB_GFXFLAGS_SCALE_HQXX; - else if (strcmp (optarg, "none") != 0) + if (!setListOption (&options->scaler, optarg, scalerList)) { InvalidArgument (optarg, "--scale or -c"); - badArg = TRUE; + badArg = true; } break; case 'b': - if (!strcmp (optarg, "smooth") || !strcmp (optarg, "3do")) - options->meleeScale = TFB_SCALE_TRILINEAR; - else if (!strcmp (optarg, "step") || !strcmp (optarg, "pc")) - options->meleeScale = TFB_SCALE_STEP; - else if (!strcmp (optarg, "bilinear")) - options->meleeScale = TFB_SCALE_BILINEAR; - else + if (!setListOption (&options->meleeScale, optarg, + meleeScaleList)) { InvalidArgument (optarg, "--meleezoom or -b"); - badArg = TRUE; + badArg = true; } break; case 's': - options->gfxFlags |= TFB_GFXFLAGS_SCANLINES; + setBoolOption (&options->scanlines, true); break; case 'p': - options->gfxFlags |= TFB_GFXFLAGS_SHOWFPS; + setBoolOption (&options->showFps, true); break; case 'n': options->contentDir = optarg; break; case 'M': - { - int err = parseVolume (optarg, &options->musicVolumeScale, - "music volume"); - if (err) - badArg = TRUE; + if (!setVolumeOption (&options->musicVolumeScale, optarg, + "music volume")) + { + badArg = true; + } break; - } case 'S': - { - int err = parseVolume (optarg, &options->sfxVolumeScale, - "sfx volume"); - if (err) - badArg = TRUE; + if (!setVolumeOption (&options->sfxVolumeScale, optarg, + "sfx volume")) + { + badArg = true; + } break; - } case 'T': - { - int err = parseVolume (optarg, &options->speechVolumeScale, - "speech volume"); - if (err) - badArg = TRUE; + if (!setVolumeOption (&options->speechVolumeScale, optarg, + "speech volume")) + { + badArg = true; + } break; - } case 'q': - if (!strcmp (optarg, "high")) + if (!setListOption (&options->soundQuality, optarg, + audioQualityList)) { - options->soundFlags &= - ~(audio_QUALITY_MEDIUM | audio_QUALITY_LOW); - options->soundFlags |= audio_QUALITY_HIGH; - } - else if (!strcmp (optarg, "medium")) - { - options->soundFlags &= - ~(audio_QUALITY_MEDIUM | audio_QUALITY_LOW); - options->soundFlags |= audio_QUALITY_MEDIUM; - } - else if (!strcmp (optarg, "low")) - { - options->soundFlags &= - ~(audio_QUALITY_MEDIUM | audio_QUALITY_LOW); - options->soundFlags |= audio_QUALITY_LOW; - } - else - { InvalidArgument (optarg, "--audioquality or -q"); - badArg = TRUE; + badArg = true; } break; case 'u': - options->subTitles = FALSE; + setBoolOption (&options->subtitles, false); break; case 'g': - { - int result = parseFloatOption (optarg, &options->gamma, - "gamma correction"); - if (result == -1) - badArg = TRUE; - else - options->gammaSet = TRUE; + if (!setFloatOption (&options->gamma, optarg, + "gamma correction")) + { + badArg = true; + } break; - } case 'l': + options->logFile = optarg; + break; case 'C': - // -l and -C are no-ops on the second pass. + options->configDir = optarg; break; case 'i': - { - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - optionIndex >= 0 ? longOptions[optionIndex].name : "i", - &options->whichIntro) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->whichIntro, optarg)) + { + InvalidArgument (optarg, "--intro or -i"); + badArg = true; + } break; - } case CSCAN_OPT: - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - longOptions[optionIndex].name, - &options->whichCoarseScan) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->whichCoarseScan, optarg)) + { + InvalidArgument (optarg, "--cscan"); + badArg = true; + } break; case MENU_OPT: - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - longOptions[optionIndex].name, - &options->whichMenu) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->whichMenu, optarg)) + { + InvalidArgument (optarg, "--menu"); + badArg = true; + } break; case FONT_OPT: - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - longOptions[optionIndex].name, - &options->whichFonts) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->whichFonts, optarg)) + { + InvalidArgument (optarg, "--font"); + badArg = true; + } break; case SHIELD_OPT: - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - longOptions[optionIndex].name, - &options->whichShield) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->whichShield, optarg)) + { + InvalidArgument (optarg, "--shield"); + badArg = true; + } break; case SCROLL_OPT: - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - longOptions[optionIndex].name, - &options->smoothScroll) == -1) - badArg = TRUE; + if (!setChoiceOption (&options->smoothScroll, optarg)) + { + InvalidArgument (optarg, "--scroll"); + badArg = true; + } break; case SOUND_OPT: - if (!strcmp (optarg, "openal")) - options->soundDriver = audio_DRIVER_OPENAL; - else if (!strcmp (optarg, "mixsdl")) - options->soundDriver = audio_DRIVER_MIXSDL; - else if (!strcmp (optarg, "none")) + if (setListOption (&options->soundDriver, optarg, + audioDriverList)) { - options->soundDriver = audio_DRIVER_NOSOUND; - options->speechVolumeScale = 0.0f; + // XXX: I don't know if we should turn speech off in + // this case. This affects which version of the alien + // script will be used. + if (options->soundDriver.value == audio_DRIVER_NOSOUND) + options->speechVolumeScale.value = 0.0f; } else { - log_add (log_Fatal, "Error: Invalid sound driver " - "specified."); - badArg = TRUE; + InvalidArgument (optarg, "--sound"); + badArg = true; } break; case STEREOSFX_OPT: - options->stereoSFX = TRUE; + setBoolOption (&options->stereoSFX, true); break; case ADDON_OPT: options->numAddons++; @@ -875,21 +990,19 @@ options->addonDir = optarg; break; case ACCEL_OPT: - force_platform = PLATFORM_NULL; - if (!strcmp (optarg, "mmx")) - force_platform = PLATFORM_MMX; - else if (!strcmp (optarg, "sse")) - force_platform = PLATFORM_SSE; - else if (!strcmp (optarg, "3dnow")) - force_platform = PLATFORM_3DNOW; - else if (!strcmp (optarg, "none")) - force_platform = PLATFORM_C; - else if (strcmp (optarg, "detect") != 0) + { + int value; + if (lookupOptionValue (accelList, optarg, &value)) { + force_platform = value; + } + else + { InvalidArgument (optarg, "--accel"); - badArg = TRUE; + badArg = true; } break; + } #ifdef NETPLAY case NETHOST1_OPT: netplayOptions.peer[0].isServer = false; @@ -911,42 +1024,35 @@ if (parseIntOption (optarg, &temp, "network input delay") == -1) { - badArg = TRUE; + badArg = true; break; } netplayOptions.inputDelay = temp; if (netplayOptions.inputDelay > BATTLE_FRAME_RATE) { - log_add (log_Fatal, "Network input delay is absurdly " - "large."); - badArg = TRUE; + saveError ("Network input delay is absurdly large."); + badArg = true; } break; } #endif default: - log_add (log_Fatal, "Error: Invalid option '%s' not found.", - longOptions[optionIndex].name); - badArg = TRUE; + saveError ("Error: Unknown option '%s'", + optionIndex < 0 ? "<unknown>" : + longOptions[optionIndex].name); + badArg = true; break; } } - if (optind != argc) + if (!badArg && optind != argc) { - log_add (log_Fatal, "\nError: Extra arguments found on the command " - "line."); - badArg = TRUE; + saveError ("\nError: Extra arguments found on the command line."); + badArg = true; } - if (badArg) - { - log_add (log_Fatal, "Run with -h to see the allowed arguments."); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; + return badArg ? EXIT_FAILURE : EXIT_SUCCESS; } static void @@ -969,28 +1075,6 @@ } static int -parseVolume (const char *str, float *vol, const char *optName) -{ - char *endPtr; - int intVol; - - if (str[0] == '\0') - { - log_add (log_Error, "Error: Invalid value for '%s'.", optName); - return -1; - } - intVol = (int) strtol (str, &endPtr, 10); - if (*endPtr != '\0') - { - log_add (log_Error, "Error: Junk characters in volume specified " - "for '%s'.", optName); - return -1; - } - parseIntVolume (intVol, vol); - return 0; -} - -static int parseIntOption (const char *str, int *result, const char *optName) { char *endPtr; @@ -998,14 +1082,13 @@ if (str[0] == '\0') { - log_add (log_Error, "Error: Invalid value for '%s'.", optName); + saveError ("Error: Invalid value for '%s'.", optName); return -1; } temp = (int) strtol (str, &endPtr, 10); if (*endPtr != '\0') { - log_add (log_Error, "Error: Junk characters in argument '%s'.", - optName); + saveError ("Error: Junk characters in argument '%s'.", optName); return -1; } @@ -1021,14 +1104,13 @@ if (str[0] == '\0') { - log_add (log_Error, "Error: Invalid value for '%s'.", optName); + saveError ("Error: Invalid value for '%s'.", optName); return -1; } temp = (float) strtod (str, &endPtr); if (*endPtr != '\0') { - log_add (log_Error, "Error: Junk characters in argument '%s'.", - optName); + saveError ("Error: Junk characters in argument '%s'.", optName); return -1; } @@ -1037,7 +1119,7 @@ } static void -usage (FILE *out, const struct options_struct *defaultOptions) +usage (FILE *out, const struct options_struct *defaults) { FILE *old = log_setOutput (out); log_captureLines (LOG_CAPTURE_ALL); @@ -1045,17 +1127,24 @@ log_add (log_User, "Options:"); log_add (log_User, " -r, --res=WIDTHxHEIGHT (default 640x480, bigger " "works only with --opengl)"); - log_add (log_User, " -f, --fullscreen (default off)"); - log_add (log_User, " -w, --windowed (default on)"); - log_add (log_User, " -o, --opengl (default off)"); - log_add (log_User, " -x, --nogl (default on)"); - log_add (log_User, " -k, --keepaspectratio (default off)"); + log_add (log_User, " -f, --fullscreen (default %s)", + boolOptString (&defaults->fullscreen)); + log_add (log_User, " -w, --windowed (default %s)", + boolNotOptString (&defaults->fullscreen)); + log_add (log_User, " -o, --opengl (default %s)", + boolOptString (&defaults->opengl)); + log_add (log_User, " -x, --nogl (default %s)", + boolNotOptString (&defaults->opengl)); + log_add (log_User, " -k, --keepaspectratio (default %s)", + boolOptString (&defaults->keepAspectRatio)); log_add (log_User, " -c, --scale=MODE (bilinear, biadapt, biadv, " "triscan, hq or none (default) )"); log_add (log_User, " -b, --meleezoom=MODE (step, aka pc, or smooth, " "aka 3do; default is 3do)"); - log_add (log_User, " -s, --scanlines (default off)"); - log_add (log_User, " -p, --fps (default off)"); + log_add (log_User, " -s, --scanlines (default %s)", + boolOptString (&defaults->scanlines)); + log_add (log_User, " -p, --fps (default %s)", + boolOptString (&defaults->showFps)); log_add (log_User, " -g, --gamma=CORRECTIONVALUE (default 1.0, which " "causes no change)"); log_add (log_User, " -C, --configdir=CONFIGDIR"); @@ -1087,70 +1176,52 @@ log_add (log_User, "The following options can take either '3do' or 'pc' " "as an option:"); log_add (log_User, " -i, --intro : Intro/ending version (default %s)", - PC_3DO_optString (defaultOptions->whichIntro)); + choiceOptString (&defaults->whichIntro)); log_add (log_User, " --cscan : coarse-scan display, pc=text, " "3do=hieroglyphs (default %s)", - PC_3DO_optString (defaultOptions->whichCoarseScan)); + choiceOptString (&defaults->whichCoarseScan)); log_add (log_User, " --menu : menu type, pc=text, 3do=graphical " - "(default %s)", PC_3DO_optString(defaultOptions->whichMenu)); + "(default %s)", choiceOptString (&defaults->whichMenu)); log_add (log_User, " --font : font types and colors (default %s)", - PC_3DO_optString (defaultOptions->whichFonts)); + choiceOptString (&defaults->whichFonts)); log_add (log_User, " --shield : slave shield type; pc=static, " "3do=throbbing (default %s)", - PC_3DO_optString (defaultOptions->whichShield)); + choiceOptString (&defaults->whichShield)); log_add (log_User, " --scroll : ff/frev during comm. pc=per-page, " "3do=smooth (default %s)", - PC_3DO_optString (defaultOptions->smoothScroll)); + choiceOptString (&defaults->smoothScroll)); log_setOutput (old); } static int InvalidArgument (const char *supplied, const char *opt_name) { - log_add (log_Fatal, "Invalid argument '%s' to option %s.", - supplied, opt_name); + saveError ("Invalid argument '%s' to option %s.", supplied, opt_name); return EXIT_FAILURE; } -static int -Check_PC_3DO_opt (const char *value, DWORD mask, const char *optName, - int *result) -{ - if (value == NULL) - { - log_add (log_Error, "Error: option '%s' requires a value.", - optName); - return -1; - } - - if ((mask & OPT_3DO) && strcmp (value, "3do") == 0) - { - *result = OPT_3DO; - return 0; - } - if ((mask & OPT_PC) && strcmp (value, "pc") == 0) - { - *result = OPT_PC; - return 0; - } - log_add (log_Error, "Error: Invalid option '%s %s' found.", - optName, value); - return -1; -} - static const char * -PC_3DO_optString (DWORD optMask) +choiceOptString (const struct int_option *option) { - switch (optMask & (OPT_3DO | OPT_PC)) + switch (option->value) { case OPT_3DO: return "3do"; case OPT_PC: return "pc"; - case (OPT_3DO | OPT_PC): - return "both"; default: /* 0 */ return "none"; } } +static const char * +boolOptString (const struct bool_option *option) +{ + return option->value ? "on" : "off"; +} + +static const char * +boolNotOptString (const struct bool_option *option) +{ + return option->value ? "off" : "on"; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-11-11 08:03:29
|
Revision: 3297 http://sc2.svn.sourceforge.net/sc2/?rev=3297&view=rev Author: avolkov Date: 2009-11-11 08:03:22 +0000 (Wed, 11 Nov 2009) Log Message: ----------- Video player task retired; minor legacy video semantical changes; improved video playback jitter compensation Modified Paths: -------------- trunk/sc2/src/libs/video/dukvid.c trunk/sc2/src/libs/video/legacyplayer.c trunk/sc2/src/libs/video/video.c trunk/sc2/src/libs/video/video.h trunk/sc2/src/libs/video/videodec.h trunk/sc2/src/libs/video/vidplayer.c trunk/sc2/src/libs/video/vidplayer.h trunk/sc2/src/libs/vidlib.h trunk/sc2/src/uqm/intro.c Modified: trunk/sc2/src/libs/video/dukvid.c =================================================================== --- trunk/sc2/src/libs/video/dukvid.c 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/dukvid.c 2009-11-11 08:03:22 UTC (rev 3297) @@ -615,8 +615,7 @@ This->length = (float) dukv->cframes / DUCK_GENERAL_FPS; This->frame_count = dukv->cframes; - This->max_frame_wait = - (uint32) (1000.0f / DUCK_GENERAL_FPS * 1.1); + This->interframe_wait = (uint32) (1000.0 / DUCK_GENERAL_FPS); dukv->inbuf = HMalloc (DUCK_MAX_FRAME_SIZE); dukv->decbuf = HMalloc ( Modified: trunk/sc2/src/libs/video/legacyplayer.c =================================================================== --- trunk/sc2/src/libs/video/legacyplayer.c 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/legacyplayer.c 2009-11-11 08:03:22 UTC (rev 3297) @@ -61,8 +61,7 @@ { if (!ref) return; - if (TFB_VideoPlaying (ref->vidref)) - VidStop (); + VidStop (); DestroyVideo (ref->vidref); if (ref->speechref) Modified: trunk/sc2/src/libs/video/video.c =================================================================== --- trunk/sc2/src/libs/video/video.c 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/video.c 2009-11-11 08:03:22 UTC (rev 3297) @@ -74,6 +74,14 @@ return NULL_VIDEO_REF; } +BOOLEAN +VidProcessFrame (void) +{ + if (!_cur_video) + return FALSE; + return TFB_ProcessVideoFrame (_cur_video); +} + // return current video position in milliseconds DWORD VidGetPosition (void) @@ -173,6 +181,9 @@ if (!vid) return FALSE; + // just some armouring; should already be stopped + TFB_StopVideo (vid); + VideoDecoder_Free (vid->decoder); DestroyMutex (vid->guard); HFree (vid); Modified: trunk/sc2/src/libs/video/video.h =================================================================== --- trunk/sc2/src/libs/video/video.h 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/video.h 2009-11-11 08:03:22 UTC (rev 3297) @@ -23,7 +23,6 @@ #include "types.h" #include "videodec.h" #include "libs/sound/sound.h" -#include "libs/tasklib.h" typedef struct tfb_videoclip @@ -36,11 +35,9 @@ RECT dst_rect; // destination screen rect RECT src_rect; // source rect MUSIC_REF hAudio; - Task play_task; uint32 frame_time; // time when next frame should be rendered TFB_Image* frame; // frame preped and optimized for rendering uint32 cur_frame; // index of frame currently displayed - uint32 max_frame_wait; bool playing; bool own_audio; uint32 loop_frame; // frame index to loop from @@ -48,6 +45,7 @@ Mutex guard; uint32 want_frame; // audio-signaled desired frame index + int lag_cnt; // N of frames video is behind or ahead of audio void* data; // user-defined data Modified: trunk/sc2/src/libs/video/videodec.h =================================================================== --- trunk/sc2/src/libs/video/videodec.h 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/videodec.h 2009-11-11 08:03:22 UTC (rev 3297) @@ -74,7 +74,7 @@ uint32 w, h; float length; // total length in seconds uint32 frame_count; - uint32 max_frame_wait; // maximum interframe delay in msecs + uint32 interframe_wait; // nominal interframe delay in msecs bool audio_synced; // decoder callbacks TFB_VideoCallbacks callbacks; Modified: trunk/sc2/src/libs/video/vidplayer.c =================================================================== --- trunk/sc2/src/libs/video/vidplayer.c 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/vidplayer.c 2009-11-11 08:03:22 UTC (rev 3297) @@ -55,164 +55,131 @@ vp_QueueBuffer }; -// inter-thread param guarded by mutex -static Semaphore vp_interthread_lock = 0; -static void* vp_interthread_clip = NULL; bool TFB_InitVideoPlayer (void) { - // creation probably needs better handling - vp_interthread_lock = CreateSemaphore (1, "inter-thread param lock", - SYNC_CLASS_VIDEO); - return vp_interthread_lock != 0; + // now just a stub + return true; } void TFB_UninitVideoPlayer (void) { - DestroySemaphore (vp_interthread_lock); + // now just a stub } -// audio-synced video playback task +static inline sint32 +msecToTimeCount (sint32 msec) +{ + return msec * ONE_SECOND / 1000; +} + +// audio-synced video playback frame function // the frame rate and timing is dictated by the audio -static int -as_video_play_task (void *data) +static bool +processAudioSyncedFrame (VIDEO_REF vid) { - Task task = (Task) data; - volatile TFB_VideoClip* vid; +#define MAX_FRAME_LAG 8 +#define LAG_FRACTION 6 +#define SYNC_BIAS 1 / 3 int ret; uint32 want_frame; - TimeCount TimeOut; - int bTerm; - uint32 clagged; + uint32 prev_want_frame; + sint32 wait_msec; + CONTEXT oldContext; + TimeCount Now = GetTimeCounter (); - // snatch the clip pointer and release - vid = vp_interthread_clip; - vp_interthread_clip = NULL; - ClearSemaphore (vp_interthread_lock); + if (!vid->playing) + return false; + if (Now < vid->frame_time) + return true; // not time yet + LockMutex (vid->guard); want_frame = vid->want_frame; - if (vid->hAudio) - PLRPlaySong (vid->hAudio, FALSE, 1); UnlockMutex (vid->guard); - clagged = 0; + if (want_frame >= vid->decoder->frame_count) + { + vid->playing = false; + return false; + } // this works like so (audio-synced): // 1. you call VideoDecoder_Seek() [when necessary] and // VideoDecoder_Decode() - // 2. wait till the audio signals it's time for this frame - // or the maximum inter-frame timeout elapses; the timeout - // is necessary because the audio signaling is not precise - // (see vp_AudioStart, vp_AudioEnd, vp_BufferTag) - // 3. output the frame; if the timeout elapsed, increment the - // the lag counter - // 4. set the next frame timeout; lag counter increases the - // timeout to allow audio to catch up + // 2. wait till it's time for this frame to be drawn + // the timeout is necessary because the audio signaling is not + // precise (see vp_AudioStart, vp_AudioEnd, vp_BufferTag) + // 3. output the frame; if the audio is behind, the lag counter + // goes up; if the video is behind, the lag counter goes down + // 4. set the next frame timeout; lag counter increases or + // decreases the timeout to allow audio or video to catch up // 5. on a seek operation, the audio stream is moved to the // correct position and then the audio signals the frame // that should be rendered // The system of timeouts and lag counts should make the video // *relatively* smooth // - ret = VideoDecoder_Decode (vid->decoder); - TimeOut = GetTimeCounter () + vid->decoder->max_frame_wait * - ONE_SECOND / 1000; - - while (!(bTerm = Task_ReadState (task, TASK_EXIT)) && ret > 0) + prev_want_frame = vid->cur_frame - vid->lag_cnt; + if (want_frame > prev_want_frame - MAX_FRAME_LAG + && want_frame <= prev_want_frame + MAX_FRAME_LAG) { - // wait till its time to render next frame - while (!(bTerm = Task_ReadState (task, TASK_EXIT)) - && want_frame == vid->cur_frame - clagged - && TimeOut > GetTimeCounter ()) - { - TaskSwitch (); - LockMutex (vid->guard); - want_frame = vid->want_frame; - UnlockMutex (vid->guard); + // we will draw the next frame right now, thus +1 + vid->lag_cnt = vid->cur_frame + 1 - want_frame; + } + else + { // out of sequence frame, let's get it + vid->lag_cnt = 0; + vid->cur_frame = VideoDecoder_SeekFrame (vid->decoder, want_frame); + ret = VideoDecoder_Decode (vid->decoder); + if (ret < 0) + { // decoder returned a failure + vid->playing = false; + return false; } + } + vid->cur_frame = vid->decoder->cur_frame; - if (bTerm) - break; - - if (want_frame == vid->cur_frame - clagged) - { // timed out - draw the next frame - ++clagged; - } - else if (want_frame > vid->cur_frame - clagged - && want_frame <= vid->cur_frame) - { - // catching up - clagged = vid->cur_frame - want_frame; - // try again - continue; - } - else if (want_frame != vid->cur_frame + 1) - { // out of sequence frame, let's get it - vid->cur_frame = VideoDecoder_SeekFrame ( - vid->decoder, want_frame); - ret = VideoDecoder_Decode (vid->decoder); - clagged = 0; - } - else - { - clagged = 0; - } - vid->cur_frame = vid->decoder->cur_frame; + // draw the frame + LockMutex (GraphicsLock); + // We have the cliprect precalculated and don't need the rest + oldContext = SetContext (NULL); + TFB_DrawScreen_Image (vid->frame, + vid->dst_rect.corner.x, vid->dst_rect.corner.y, + GSCALE_IDENTITY, NULL, TFB_SCREEN_MAIN); + SetContext (oldContext); + UnlockMutex (GraphicsLock); + FlushGraphics (); // needed to prevent half-frame updates - // draw the frame - if (ret > 0) - { - CONTEXT oldContext; - - LockMutex (GraphicsLock); - // We have the cliprect precalculated and don't need the rest - oldContext = SetContext (NULL); - TFB_DrawScreen_Image (vid->frame, - vid->dst_rect.corner.x, vid->dst_rect.corner.y, - GSCALE_IDENTITY, NULL, TFB_SCREEN_MAIN); - SetContext (oldContext); - UnlockMutex (GraphicsLock); - FlushGraphics (); // needed to prevent half-frame updates - } + // increase interframe with positive lag-count to allow audio to catch up + // decrease interframe with negative lag-count to allow video to catch up + wait_msec = vid->decoder->interframe_wait + - (int)vid->decoder->interframe_wait * SYNC_BIAS + + (int)vid->decoder->interframe_wait * vid->lag_cnt / LAG_FRACTION; + vid->frame_time = Now + msecToTimeCount (wait_msec); - // increase timeout with lag-count to allow audio to catch up - TimeOut = GetTimeCounter () + vid->decoder->max_frame_wait * - ONE_SECOND / 1000 + clagged * ONE_SECOND / 100; - - ret = VideoDecoder_Decode (vid->decoder); + ret = VideoDecoder_Decode (vid->decoder); + if (ret < 0) + { + // TODO: decide what to do on error } - if (vid->hAudio) - PLRStop (vid->hAudio); - vid->playing = false; - FinishTask (task); - - return 0; + return vid->playing; } -// audio-independent video playback task +// audio-independent video playback frame function // the frame rate and timing is dictated by the video decoder -static int -video_play_task (void *data) +static bool +processMuteFrame (VIDEO_REF vid) { - Task task = (Task) data; - TFB_VideoClip* vid; int ret; + TimeCount Now = GetTimeCounter (); - // snatch the clip pointer and release - vid = vp_interthread_clip; - vp_interthread_clip = NULL; - ClearSemaphore (vp_interthread_lock); + if (!vid->playing) + return false; - LockMutex (vid->guard); - if (vid->hAudio) - PLRPlaySong (vid->hAudio, (vid->loop_frame != VID_NO_LOOP), 1); - - UnlockMutex (vid->guard); - // this works like so: // 1. you call VideoDecoder_Seek() [when necessary] and // VideoDecoder_Decode() @@ -222,14 +189,10 @@ // On a seek operation, the decoder should reset its internal // clock and call vp_GetTicks() again // - ret = VideoDecoder_Decode (vid->decoder); - - while (!Task_ReadState (task, TASK_EXIT) && ret > 0) + if (Now >= vid->frame_time) { CONTEXT oldContext; - // wait till its time to render next frame - SleepThreadUntil (vid->frame_time); vid->cur_frame = vid->decoder->cur_frame; LockMutex (GraphicsLock); @@ -246,14 +209,11 @@ VideoDecoder_SeekFrame (vid->decoder, vid->loop_to); ret = VideoDecoder_Decode (vid->decoder); + if (ret <= 0) + vid->playing = false; } - vid->playing = false; - if (vid->hAudio) - PLRStop (vid->hAudio); - FinishTask (task); - - return 0; + return vid->playing; } bool @@ -264,6 +224,8 @@ RECT vid_r = {{0, 0}, {ScreenWidth, ScreenHeight}}; RECT dr = {{x, y}, {vid->w, vid->h}}; RECT sr; + bool loop_music = false; + int ret; if (!vid) return false; @@ -318,24 +280,21 @@ TFB_SetSoundSampleData (*vid->hAudio, (intptr_t)vid); } - SetSemaphore (vp_interthread_lock); - vp_interthread_clip = vid; + // get the first frame + ret = VideoDecoder_Decode (vid->decoder); + if (ret < 0) + return false; vid->playing = true; - if (vid->decoder->audio_synced) - vid->play_task = AssignTask ( - as_video_play_task, 4096, "a/s video player"); - else - vid->play_task = AssignTask ( - video_play_task, 4096, "video player"); + + loop_music = !vid->decoder->audio_synced && vid->loop_frame != VID_NO_LOOP; + if (vid->hAudio) + PLRPlaySong (vid->hAudio, loop_music, 1); - if (!vid->play_task) + if (vid->decoder->audio_synced) { - vid->playing = false; - ClearSemaphore (vp_interthread_lock); - TFB_StopVideo (vid); - - return false; + // draw the first frame now + vid->frame_time = GetTimeCounter (); } return true; @@ -348,8 +307,6 @@ return; vid->playing = false; - if (vid->play_task) - ConcludeTask (vid->play_task); if (vid->hAudio) { @@ -377,6 +334,18 @@ return vid->playing; } +bool +TFB_ProcessVideoFrame (VIDEO_REF vid) +{ + if (!vid) + return false; + + if (vid->decoder->audio_synced) + return processAudioSyncedFrame (vid); + else + return processMuteFrame (vid); +} + uint32 TFB_GetVideoPosition (VIDEO_REF vid) { Modified: trunk/sc2/src/libs/video/vidplayer.h =================================================================== --- trunk/sc2/src/libs/video/vidplayer.h 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/video/vidplayer.h 2009-11-11 08:03:22 UTC (rev 3297) @@ -24,6 +24,7 @@ extern bool TFB_PlayVideo (VIDEO_REF VidRef, uint32 x, uint32 y); extern void TFB_StopVideo (VIDEO_REF VidRef); extern bool TFB_VideoPlaying (VIDEO_REF VidRef); +extern bool TFB_ProcessVideoFrame (VIDEO_REF vid); extern uint32 TFB_GetVideoPosition (VIDEO_REF VidRef); extern bool TFB_SeekVideo (VIDEO_REF VidRef, uint32 pos); Modified: trunk/sc2/src/libs/vidlib.h =================================================================== --- trunk/sc2/src/libs/vidlib.h 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/libs/vidlib.h 2009-11-11 08:03:22 UTC (rev 3297) @@ -47,6 +47,7 @@ #define VID_NO_LOOP (0U-1) extern void VidStop (void); extern VIDEO_REF VidPlaying (void); +extern BOOLEAN VidProcessFrame (void); extern DWORD VidGetPosition (void); // position in milliseconds extern BOOLEAN VidSeek (DWORD pos); // position in milliseconds Modified: trunk/sc2/src/uqm/intro.c =================================================================== --- trunk/sc2/src/uqm/intro.c 2009-11-10 21:53:39 UTC (rev 3296) +++ trunk/sc2/src/uqm/intro.c 2009-11-11 08:03:22 UTC (rev 3297) @@ -822,8 +822,6 @@ if (!PlayingLegacyVideo (pVIS->CurVideo)) { // Video probably finished - // Have to call VidStop anyway to cleanup - VidStop (); return FALSE; } @@ -832,7 +830,6 @@ || PulsedInputState.menu[KEY_MENU_SPECIAL] || (GLOBAL (CurrentActivity) & CHECK_ABORT)) { // abort movie - VidStop (); return FALSE; } else if (PulsedInputState.menu[KEY_MENU_LEFT] @@ -850,7 +847,10 @@ } else { - SleepThread (ONE_SECOND / 30); + if (!VidProcessFrame ()) + return FALSE; + + SleepThread (ONE_SECOND / 40); } return TRUE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcm...@us...> - 2009-11-25 03:38:58
|
Revision: 3349 http://sc2.svn.sourceforge.net/sc2/?rev=3349&view=rev Author: mcmartin Date: 2009-11-25 03:38:49 +0000 (Wed, 25 Nov 2009) Log Message: ----------- Fix some format string warnings Modified Paths: -------------- trunk/sc2/src/uqm/gameopt.c trunk/sc2/src/uqm.c Modified: trunk/sc2/src/uqm/gameopt.c =================================================================== --- trunk/sc2/src/uqm/gameopt.c 2009-11-24 18:40:38 UTC (rev 3348) +++ trunk/sc2/src/uqm/gameopt.c 2009-11-25 03:38:49 UTC (rev 3349) @@ -1041,7 +1041,7 @@ t.baseline.x = r.corner.x + 3; if (((SUMMARY_DESC *)pMS->Extra)[NewState - SHIFT + i].year_index == 0) - sprintf (buf, GAME_STRING (SAVEGAME_STRING_BASE + 3)); // "Empty Slot" + sprintf (buf, "%s", GAME_STRING (SAVEGAME_STRING_BASE + 3)); // "Empty Slot" else { DateToString (buf2, sizeof buf2, Modified: trunk/sc2/src/uqm.c =================================================================== --- trunk/sc2/src/uqm.c 2009-11-24 18:40:38 UTC (rev 3348) +++ trunk/sc2/src/uqm.c 2009-11-25 03:38:49 UTC (rev 3349) @@ -306,7 +306,7 @@ if (errBuffer[0] != '\0') { // Have some saved error to log - log_add (log_Error, errBuffer); + log_add (log_Error, "%s", errBuffer); errBuffer[0] = '\0'; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-11-25 21:44:00
|
Revision: 3354 http://sc2.svn.sourceforge.net/sc2/?rev=3354&view=rev Author: avolkov Date: 2009-11-25 21:43:48 +0000 (Wed, 25 Nov 2009) Log Message: ----------- Fold two input-dependent comm functions into DoInput() paradigm Modified Paths: -------------- trunk/sc2/src/libs/sound/trackplayer.c trunk/sc2/src/uqm/comm/melnorm/melnorm.c trunk/sc2/src/uqm/comm/zoqfot/zoqfotc.c trunk/sc2/src/uqm/comm.c trunk/sc2/src/uqm/comm.h Modified: trunk/sc2/src/libs/sound/trackplayer.c =================================================================== --- trunk/sc2/src/libs/sound/trackplayer.c 2009-11-25 12:48:27 UTC (rev 3353) +++ trunk/sc2/src/libs/sound/trackplayer.c 2009-11-25 21:43:48 UTC (rev 3354) @@ -97,8 +97,6 @@ LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); seek_track (tracks_length + 1); UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); - - PlayingTrack(); } // This should just start playing a stream Modified: trunk/sc2/src/uqm/comm/melnorm/melnorm.c =================================================================== --- trunk/sc2/src/uqm/comm/melnorm/melnorm.c 2009-11-25 12:48:27 UTC (rev 3353) +++ trunk/sc2/src/uqm/comm/melnorm/melnorm.c 2009-11-25 21:43:48 UTC (rev 3354) @@ -22,6 +22,7 @@ #include "uqm/gameev.h" #include "uqm/setup.h" + // for GraphicsLock #include "uqm/shipcont.h" #include "libs/inplib.h" #include "libs/mathlib.h" Modified: trunk/sc2/src/uqm/comm/zoqfot/zoqfotc.c =================================================================== --- trunk/sc2/src/uqm/comm/zoqfot/zoqfotc.c 2009-11-25 12:48:27 UTC (rev 3353) +++ trunk/sc2/src/uqm/comm/zoqfot/zoqfotc.c 2009-11-25 21:43:48 UTC (rev 3354) @@ -123,6 +123,10 @@ { if (LastAlien != ZOQ_ALIEN) { + // XXX: This should hold the GraphicsLock to block comm anims and + // prevent CommData half-updates, but if we do so, the stream + // decoder will deadlock with the drawing thread. + // Transition to neutral state first if Pik was talking if (LastAlien != FOT_ALIEN) CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE; @@ -145,6 +149,10 @@ { if (LastAlien != PIK_ALIEN) { + // XXX: This should hold the GraphicsLock to block comm anims and + // prevent CommData half-updates, but if we do so, the stream + // decoder will deadlock with the drawing thread. + // Transition to neutral state first if Zoq was talking if (LastAlien != FOT_ALIEN) CommData.AlienTransitionDesc.AnimFlags |= TALK_DONE; Modified: trunk/sc2/src/uqm/comm.c =================================================================== --- trunk/sc2/src/uqm/comm.c 2009-11-25 12:48:27 UTC (rev 3353) +++ trunk/sc2/src/uqm/comm.c 2009-11-25 21:43:48 UTC (rev 3354) @@ -71,7 +71,10 @@ COUNT MenuRepeatDelay; COUNT Initialized; - BYTE num_responses, cur_response, top_response; + TimeCount NextTime; // framerate control + BYTE num_responses; + BYTE cur_response; + BYTE top_response; RESPONSE_ENTRY response_list[MAX_RESPONSES]; Task AnimTask; @@ -506,149 +509,118 @@ SetContext (OldContext); } -static BOOLEAN -SpewPhrases (COUNT wait_track) +// Derived from INPUT_STATE_DESC +typedef struct talking_state { - BOOLEAN ContinuityBreak; - DWORD TimeIn; - COUNT which_track; - BOOLEAN rewind = FALSE; + // Fields required by DoInput() + BOOLEAN (*InputFunc) (struct talking_state *); + COUNT MenuRepeatDelay; - TimeIn = GetTimeCounter (); + TimeCount NextTime; // framerate control + COUNT waitTrack; + bool rewind; + bool seeking; + bool ended; - ContinuityBreak = FALSE; - if (wait_track == 0) - { // Restarting with a rewind - wait_track = (COUNT)~0; - which_track = (COUNT)~0; - rewind = TRUE; - } +} TALKING_STATE; - which_track = PlayingTrack (); - if (which_track == 0 && !rewind) - { // initial start of player - UnlockMutex (GraphicsLock); - PlayTrack (); - // wait for the trackplayer to start playing - do - { - TaskSwitch (); - which_track = PlayingTrack (); - } while (!which_track); - LockMutex (GraphicsLock); +static BOOLEAN +DoTalkSegue (TALKING_STATE *pTS) +{ + bool left = false; + bool right = false; + COUNT curTrack; + + if (GLOBAL (CurrentActivity) & CHECK_ABORT) + { + pTS->ended = true; + return FALSE; } - else if (which_track <= wait_track) - { // XXX: I don't know why this is here, but it is not harmful. - // We never actually pause in comm. - ResumeTrack (); + + if (PulsedInputState.menu[KEY_MENU_CANCEL]) + { + JumpTrack (); + pTS->ended = true; + return FALSE; } - do + if (optSmoothScroll == OPT_PC) { - BOOLEAN left = FALSE; - BOOLEAN right = FALSE; + left = PulsedInputState.menu[KEY_MENU_LEFT] != 0; + right = PulsedInputState.menu[KEY_MENU_RIGHT] != 0; + } + else if (optSmoothScroll == OPT_3DO) + { + left = CurrentInputState.menu[KEY_MENU_LEFT] != 0; + right = CurrentInputState.menu[KEY_MENU_RIGHT] != 0; + } - if (GLOBAL (CurrentActivity) & CHECK_ABORT) - { - which_track = 0; // abort - break; - } - - UnlockMutex (GraphicsLock); - // XXX: Executing this loop 64 times a second is a bit extreme - SleepThreadUntil (TimeIn + (ONE_SECOND / 64)); - TimeIn = GetTimeCounter (); #if DEMO_MODE || CREATE_JOURNAL - InputState = 0; -#else /* !(DEMO_MODE || CREATE_JOURNAL) */ - UpdateInputState (); + left = false; + right = false; #endif - LockMutex (GraphicsLock); - if (PulsedInputState.menu[KEY_MENU_CANCEL]) - { - JumpTrack (); - which_track = 0; // player stopped - break; - } + LockMutex (GraphicsLock); - CheckSubtitles (); - + if (right) + { + SetSliderImage (SetAbsFrameIndex (ActivityFrame, 3)); if (optSmoothScroll == OPT_PC) - { - left = PulsedInputState.menu[KEY_MENU_LEFT]; - right = PulsedInputState.menu[KEY_MENU_RIGHT]; - } + FastForward_Page (); else if (optSmoothScroll == OPT_3DO) - { - left = ImmediateInputState.menu[KEY_MENU_LEFT]; - right = ImmediateInputState.menu[KEY_MENU_RIGHT]; - } - - if (right) - { - SetSliderImage (SetAbsFrameIndex (ActivityFrame, 3)); - if (optSmoothScroll == OPT_PC) - FastForward_Page (); - else if (optSmoothScroll == OPT_3DO) - FastForward_Smooth (); - ContinuityBreak = TRUE; - // XXX: This causes all animations (talking and ambient) - // in ambient_anim_task to stop progressing. I see no reason why - // the animations cannot continue while seeking. - PauseAnimTask = TRUE; - } - else if (left || rewind) - { - rewind = FALSE; - SetSliderImage (SetAbsFrameIndex (ActivityFrame, 4)); - if (optSmoothScroll == OPT_PC) - FastReverse_Page (); - else if (optSmoothScroll == OPT_3DO) - FastReverse_Smooth (); - ContinuityBreak = TRUE; - // XXX: See pause discussion above - PauseAnimTask = TRUE; - } - else if (ContinuityBreak) - { - // This is only done once the seeking is over (in the smooth - // scroll case, once the user releases the seek button) - ContinuityBreak = FALSE; - SetSliderImage (SetAbsFrameIndex (ActivityFrame, 2)); - } - else - { // XXX: See pause discussion above - // Additionally, this used to have a buggy guard condition, which - // would cause the animations to remain paused in a couple cases - // after seeking back to the beginning. - // Broken cases were: Syreen "several hours later" and Starbase - // VUX Beast analysis by the scientist. - PauseAnimTask = FALSE; - } - - which_track = PlayingTrack (); + FastForward_Smooth (); + pTS->seeking = true; + // XXX: This causes all animations (talking and ambient) + // in ambient_anim_task to stop progressing. I see no reason why + // the animations cannot continue while seeking. + PauseAnimTask = TRUE; + } + else if (left || pTS->rewind) + { + pTS->rewind = false; + SetSliderImage (SetAbsFrameIndex (ActivityFrame, 4)); + if (optSmoothScroll == OPT_PC) + FastReverse_Page (); + else if (optSmoothScroll == OPT_3DO) + FastReverse_Smooth (); + pTS->seeking = true; + // XXX: See pause discussion above + PauseAnimTask = TRUE; + } + else if (pTS->seeking) + { + // This is only done once the seeking is over (in the smooth + // scroll case, once the user releases the seek button) + pTS->seeking = false; + SetSliderImage (SetAbsFrameIndex (ActivityFrame, 2)); + } + else + { // XXX: See pause discussion above + // Additionally, this used to have a buggy guard condition, which + // would cause the animations to remain paused in a couple cases + // after seeking back to the beginning. + // Broken cases were: Syreen "several hours later" and Starbase + // VUX Beast analysis by the scientist. + PauseAnimTask = FALSE; + CheckSubtitles (); + } + + UnlockMutex (GraphicsLock); - } while (ContinuityBreak || (which_track && which_track <= wait_track)); + curTrack = PlayingTrack (); + pTS->ended = !pTS->seeking && !curTrack; - PauseAnimTask = FALSE; - ClearSubtitles (); + SleepThreadUntil (pTS->NextTime); + // Need a high enough framerate for 3DO smooth seeking + pTS->NextTime = GetTimeCounter () + ONE_SECOND / 60; - if (!which_track || wait_track == (COUNT)~0) - { // reached the end - SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8)); - return (FALSE); - } - - // We can only get here when we got to the requested track - // without ending or aborting - return TRUE; + return pTS->seeking || (curTrack && curTrack <= pTS->waitTrack); } static BOOLEAN -DoTalkSegue (COUNT wait_track) +TalkSegue (COUNT wait_track) { - BOOLEAN done; + TALKING_STATE talkingState; // Transition animation to talking state, if necessary if (wantTalkingAnim () && haveTalkingAnim ()) @@ -666,13 +638,41 @@ } } - done = !SpewPhrases (wait_track); + memset (&talkingState, 0, sizeof talkingState); + if (wait_track == 0) + { // Restarting with a rewind + wait_track = WAIT_TRACK_ALL; + talkingState.rewind = true; + } + else if (!PlayingTrack ()) + { // initial start of player + PlayTrack (); + assert (PlayingTrack ()); + } + + UnlockMutex (GraphicsLock); + + // Run the talking controls + talkingState.InputFunc = DoTalkSegue; + talkingState.waitTrack = wait_track; + DoInput (&talkingState, FALSE); + + LockMutex (GraphicsLock); + + PauseAnimTask = FALSE; + ClearSubtitles (); + + if (talkingState.ended) + { // reached the end; set STOP icon + SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8)); + } + // transition back to silent, if necessary if (runningTalkingAnim ()) setStopTalkingAnim (); - return done; + return talkingState.ended; } static void @@ -768,14 +768,14 @@ LastActivity &= ~CHECK_LOAD; } - done = DoTalkSegue (wait_track); - if (done || wait_track == (COUNT)~0) + done = TalkSegue (wait_track); + if (done) FadeMusic (FOREGROUND_VOL, ONE_SECOND); UnlockMutex (GraphicsLock); FlushTalkSegue (); - if (!done && wait_track != (COUNT)~0) + if (!done) { // there is more to come TalkingFinished = FALSE; } @@ -957,7 +957,8 @@ SUMMARY_STATE SummaryState; LockMutex (GraphicsLock); - FeedbackPlayerPhrase (pES->phrase_buf); + if (pES) + FeedbackPlayerPhrase (pES->phrase_buf); PauseAnimTask = TRUE; UnlockMutex (GraphicsLock); // wait for ambient anim task to pause @@ -967,17 +968,30 @@ DoConvSummary (&SummaryState); LockMutex (GraphicsLock); - RefreshResponses (pES); + if (pES) + RefreshResponses (pES); clear_subtitles = TRUE; PauseAnimTask = FALSE; UnlockMutex (GraphicsLock); } static void +SelectReplay (ENCOUNTER_STATE *pES) +{ + FadeMusic (BACKGROUND_VOL, ONE_SECOND); + LockMutex (GraphicsLock); + if (pES) + FeedbackPlayerPhrase (pES->phrase_buf); + TalkingFinished = FALSE; + TalkSegue (0); + UnlockMutex (GraphicsLock); + FlushTalkSegue (); +} + +static void PlayerResponseInput (ENCOUNTER_STATE *pES) { BYTE response; - DWORD TimeIn = GetTimeCounter (); if (pES->top_response == (BYTE)~0) { @@ -1001,20 +1015,15 @@ response = pES->cur_response; if (PulsedInputState.menu[KEY_MENU_LEFT]) { - FadeMusic (BACKGROUND_VOL, ONE_SECOND); - LockMutex (GraphicsLock); - FeedbackPlayerPhrase (pES->phrase_buf); - TalkingFinished = FALSE; - DoTalkSegue (0); + SelectReplay (pES); if (!(GLOBAL (CurrentActivity) & CHECK_ABORT)) { + LockMutex (GraphicsLock); RefreshResponses (pES); + UnlockMutex (GraphicsLock); FadeMusic (FOREGROUND_VOL, ONE_SECOND); } - - UnlockMutex (GraphicsLock); - FlushTalkSegue (); } else if (PulsedInputState.menu[KEY_MENU_UP]) response = (BYTE)((response + (BYTE)(pES->num_responses - 1)) @@ -1049,49 +1058,72 @@ UnlockMutex (GraphicsLock); } - SleepThreadUntil (TimeIn + ONE_SECOND / 20); + SleepThreadUntil (pES->NextTime); + pES->NextTime = GetTimeCounter () + ONE_SECOND / 20; } } +// Derived from INPUT_STATE_DESC +typedef struct last_replay_state +{ + // Fields required by DoInput() + BOOLEAN (*InputFunc) (struct last_replay_state *); + COUNT MenuRepeatDelay; + + TimeCount NextTime; // framerate control + TimeCount TimeOut; + +} LAST_REPLAY_STATE; + static BOOLEAN +DoLastReplay (LAST_REPLAY_STATE *pLRS) +{ + if (GLOBAL (CurrentActivity) & CHECK_ABORT) + return FALSE; + + if (GetTimeCounter () > pLRS->TimeOut) + return FALSE; // timed out and done + + if (PulsedInputState.menu[KEY_MENU_CANCEL] && + LOBYTE (GLOBAL (CurrentActivity)) != WON_LAST_BATTLE) + { + FadeMusic (BACKGROUND_VOL, ONE_SECOND); + SelectConversationSummary (NULL); + pLRS->TimeOut = FadeMusic (0, ONE_SECOND * 2) + ONE_SECOND / 60; + } + else if (PulsedInputState.menu[KEY_MENU_LEFT]) + { + SelectReplay (NULL); + pLRS->TimeOut = FadeMusic (0, ONE_SECOND * 2) + ONE_SECOND / 60; + } + + SleepThreadUntil (pLRS->NextTime); + pLRS->NextTime = GetTimeCounter () + ONE_SECOND / 60; + + return TRUE; +} + +static BOOLEAN DoCommunication (ENCOUNTER_STATE *pES) { SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); // First, finish playing all queued tracks if not done yet if (!TalkingFinished) - AlienTalkSegue ((COUNT)~0); + AlienTalkSegue (WAIT_TRACK_ALL); if (GLOBAL (CurrentActivity) & CHECK_ABORT) ; else if (pES->num_responses == 0) { - // The player doesn't get a chance to say anything. - DWORD TimeIn, TimeOut; + // The player doesn't get a chance to say anything, + // but can still review alien's last phrases. + LAST_REPLAY_STATE replayState; - TimeOut = FadeMusic (0, ONE_SECOND * 3) + ONE_SECOND / 60; - TimeIn = GetTimeCounter (); - do - { - SleepThreadUntil (TimeIn + ONE_SECOND / 120); - TimeIn = GetTimeCounter (); - // Warning! This used to re-gather input data to check for rewind. - UpdateInputState (); - if (PulsedInputState.menu[KEY_MENU_LEFT]) - { - FadeMusic (BACKGROUND_VOL, ONE_SECOND); - LockMutex (GraphicsLock); - TalkingFinished = FALSE; - DoTalkSegue (0); - UnlockMutex (GraphicsLock); - FlushTalkSegue (); - - if (GLOBAL (CurrentActivity) & CHECK_ABORT) - break; - TimeOut = FadeMusic (0, ONE_SECOND * 2) + ONE_SECOND / 60; - TimeIn = GetTimeCounter (); - } - } while (TimeIn <= TimeOut); + memset (&replayState, 0, sizeof replayState); + replayState.TimeOut = FadeMusic (0, ONE_SECOND * 3) + ONE_SECOND / 60; + replayState.InputFunc = DoLastReplay; + DoInput (&replayState, FALSE); } else { Modified: trunk/sc2/src/uqm/comm.h =================================================================== --- trunk/sc2/src/uqm/comm.h 2009-11-25 12:48:27 UTC (rev 3353) +++ trunk/sc2/src/uqm/comm.h 2009-11-25 21:43:48 UTC (rev 3354) @@ -111,6 +111,7 @@ extern COUNT InitCommunication (CONVERSATION which_comm); extern void RaceCommunication (void); +#define WAIT_TRACK_ALL ((COUNT)~0) extern void AlienTalkSegue (COUNT wait_track); BOOLEAN getLineWithinWidth(TEXT *pText, const unsigned char **startNext, SIZE maxWidth, COUNT maxChars); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Mee...@us...> - 2009-11-28 18:00:55
|
Revision: 3361 http://sc2.svn.sourceforge.net/sc2/?rev=3361&view=rev Author: Meep-Eep Date: 2009-11-28 18:00:46 +0000 (Sat, 28 Nov 2009) Log Message: ----------- Make snprintf/vsnprintf more compatible with the C standard on MSVC. Modified Paths: -------------- trunk/sc2/src/libs/uio/uioport.h trunk/sc2/src/port.c trunk/sc2/src/port.h Modified: trunk/sc2/src/libs/uio/uioport.h =================================================================== --- trunk/sc2/src/libs/uio/uioport.h 2009-11-28 16:36:40 UTC (rev 3360) +++ trunk/sc2/src/libs/uio/uioport.h 2009-11-28 18:00:46 UTC (rev 3361) @@ -171,11 +171,36 @@ // String formatting #ifdef _MSC_VER -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#endif +# include <stdarg.h> +# include <stdio.h> +// MSVC does not have snprintf() and vsnprintf(). It does have a _snprintf() +// and _vsnprintf(), but these do not terminate a truncated string as +// the C standard prescribes. +static inline int +snprintf(char *str, size_t size, const char *format, ...) +{ + int result; + va_list args; + + va_start (args, format); + result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + va_end (args); + return result; +} + +static inline int +vsnprintf(char *str, size_t size, const char *format, va_list args) +{ + int result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + return result; +} +#endif /* _MSC_VER */ + #endif /* _UIOPORT_H */ - Modified: trunk/sc2/src/port.c =================================================================== --- trunk/sc2/src/port.c 2009-11-28 16:36:40 UTC (rev 3360) +++ trunk/sc2/src/port.c 2009-11-28 18:00:46 UTC (rev 3361) @@ -24,6 +24,10 @@ #include <ctype.h> #include <errno.h> +#ifdef _MSC_VER +# include <stdarg.h> +# include <stdio.h> +#endif /* _MSC_VER */ #include <stdlib.h> #include <string.h> #if !defined (_MSC_VER) && !defined (HAVE_READDIR_R) @@ -110,3 +114,32 @@ } #endif +#ifdef _MSC_VER +// MSVC does not have snprintf() and vsnprintf(). It does have a _snprintf() +// and _vsnprintf(), but these do not terminate a truncated string as +// the C standard prescribes. +int +snprintf(char *str, size_t size, const char *format, ...) +{ + int result; + va_list args; + + va_start (args, format); + result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + va_end (args); + + return result; +} + +int +vsnprintf(char *str, size_t size, const char *format, va_list args) +{ + int result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + return result; +} +#endif /* _MSC_VER */ + Modified: trunk/sc2/src/port.h =================================================================== --- trunk/sc2/src/port.h 2009-11-28 16:36:40 UTC (rev 3360) +++ trunk/sc2/src/port.h 2009-11-28 18:00:46 UTC (rev 3361) @@ -140,11 +140,12 @@ # include <alloca.h> #endif -// Printf +// String formatting #ifdef _MSC_VER -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#endif +// Defined in port.c +int snprintf(char *str, size_t size, const char *format, ...); +int vsnprintf(char *str, size_t size, const char *format, va_list args); +#endif /* _MSC_VER */ // setenv() #ifndef HAVE_SETENV This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Mee...@us...> - 2009-11-29 19:55:09
|
Revision: 3369 http://sc2.svn.sourceforge.net/sc2/?rev=3369&view=rev Author: Meep-Eep Date: 2009-11-29 19:54:51 +0000 (Sun, 29 Nov 2009) Log Message: ----------- Drawing functions take their color as a Color argument, instead of as separate r, g, and b arguments. This paves the way for using draw operations with an alpha channel. Modified Paths: -------------- trunk/sc2/src/libs/graphics/context.c trunk/sc2/src/libs/graphics/drawable.c trunk/sc2/src/libs/graphics/drawcmd.h trunk/sc2/src/libs/graphics/sdl/canvas.c trunk/sc2/src/libs/graphics/sdl/primitives.c trunk/sc2/src/libs/graphics/sdl/sdl_common.c trunk/sc2/src/libs/graphics/tfb_draw.c trunk/sc2/src/libs/graphics/tfb_draw.h trunk/sc2/src/libs/graphics/tfb_prim.c trunk/sc2/src/uqm/oscill.c Modified: trunk/sc2/src/libs/graphics/context.c =================================================================== --- trunk/sc2/src/libs/graphics/context.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/context.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -303,7 +303,7 @@ RECT r = { {0, 0}, {w, h} }; Color color = _get_context_fg_color (); - TFB_DrawImage_Rect (&r, color.r, color.g, color.b, img); + TFB_DrawImage_Rect (&r, color, img); } _pCurContext->FontBacking = img; Modified: trunk/sc2/src/libs/graphics/drawable.c =================================================================== --- trunk/sc2/src/libs/graphics/drawable.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/drawable.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -254,7 +254,7 @@ void SetFrameTransparentColor (FRAME Frame, Color color) { - TFB_DrawCanvas_SetTransparentColor (Frame->image->NormalImg, - color.r, color.g, color.b, FALSE); + TFB_DrawCanvas_SetTransparentColor (Frame->image->NormalImg, color, + FALSE); } Modified: trunk/sc2/src/libs/graphics/drawcmd.h =================================================================== --- trunk/sc2/src/libs/graphics/drawcmd.h 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/drawcmd.h 2009-11-29 19:54:51 UTC (rev 3369) @@ -46,14 +46,14 @@ typedef struct tfb_dc_line { int x1, y1, x2, y2; - int r, g, b; + Color color; SCREEN destBuffer; } TFB_DrawCommand_Line; typedef struct tfb_dc_rect { RECT rect; - int r, g, b; + Color color; SCREEN destBuffer; } TFB_DrawCommand_Rect; @@ -70,7 +70,7 @@ { TFB_Image *image; int x, y; - int r, g, b; + Color color; SCREEN destBuffer; int scale; } TFB_DrawCommand_FilledImage; @@ -104,7 +104,7 @@ typedef struct tfb_dc_setpal { int index; - int r, g, b; + Color color; } TFB_DrawCommand_SetPalette; typedef struct tfb_dc_setmip Modified: trunk/sc2/src/libs/graphics/sdl/canvas.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/canvas.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/sdl/canvas.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -42,40 +42,42 @@ } void -TFB_DrawCanvas_Line (int x1, int y1, int x2, int y2, int r, int g, int b, TFB_Canvas target) +TFB_DrawCanvas_Line (int x1, int y1, int x2, int y2, Color color, + TFB_Canvas target) { - Uint32 color; + Uint32 sdlColor; PutPixelFn screen_plot; screen_plot = putpixel_for (target); - color = SDL_MapRGB (((NativeCanvas) target)->format, r, g, b); + sdlColor = SDL_MapRGB (((NativeCanvas) target)->format, + color.r, color.g, color.b); SDL_LockSurface ((NativeCanvas) target); - line (x1, y1, x2, y2, color, screen_plot, (NativeCanvas) target); + line (x1, y1, x2, y2, sdlColor, screen_plot, (NativeCanvas) target); SDL_UnlockSurface ((NativeCanvas) target); } void -TFB_DrawCanvas_Rect (RECT *rect, int r, int g, int b, TFB_Canvas target) +TFB_DrawCanvas_Rect (RECT *rect, Color color, TFB_Canvas target) { SDL_Surface *dst = target; SDL_PixelFormat *fmt = dst->format; - Uint32 color; + Uint32 sdlColor; SDL_Rect sr; sr.x = rect->corner.x; sr.y = rect->corner.y; sr.w = rect->extent.width; sr.h = rect->extent.height; - color = SDL_MapRGB (fmt, r, g, b); + sdlColor = SDL_MapRGB (fmt, color.r, color.g, color.b); if (fmt->Amask && (dst->flags & SDL_SRCCOLORKEY)) { // special case -- alpha surface with colorkey // colorkey rects are transparent - if ((color & ~fmt->Amask) == (fmt->colorkey & ~fmt->Amask)) - color &= ~fmt->Amask; // make transparent + if ((sdlColor & ~fmt->Amask) == (fmt->colorkey & ~fmt->Amask)) + sdlColor &= ~fmt->Amask; // make transparent } - SDL_FillRect (dst, &sr, color); + SDL_FillRect (dst, &sr, sdlColor); } void @@ -88,7 +90,8 @@ if (img == 0) { - log_add (log_Warning, "ERROR: TFB_DrawCanvas_Image passed null image ptr"); + log_add (log_Warning, + "ERROR: TFB_DrawCanvas_Image passed null image ptr"); return; } @@ -240,7 +243,8 @@ } void -TFB_DrawCanvas_FilledImage (TFB_Image *img, int x, int y, int scale, int r, int g, int b, TFB_Canvas target) +TFB_DrawCanvas_FilledImage (TFB_Image *img, int x, int y, int scale, + Color color, TFB_Canvas target) { SDL_Rect srcRect, targetRect, *pSrcRect; SDL_Surface *surf; @@ -249,7 +253,8 @@ if (img == 0) { - log_add (log_Warning, "ERROR: TFB_DrawCanvas_FilledImage passed null image ptr"); + log_add (log_Warning, + "ERROR: TFB_DrawCanvas_FilledImage passed null image ptr"); return; } @@ -306,9 +311,9 @@ for (i = 0; i < 256; i++) { - pal[i].r = r; - pal[i].g = g; - pal[i].b = b; + pal[i].r = color.r; + pal[i].g = color.g; + pal[i].b = color.b; } SDL_SetColors (surf, pal, 0, 256); // reflect the change in *actual* image palette @@ -338,19 +343,19 @@ } if (force_fill || - img->last_fill.r != r || - img->last_fill.g != g || - img->last_fill.b != b) + img->last_fill.r != color.r || + img->last_fill.g != color.g || + img->last_fill.b != color.b) { // image or fillcolor changed - regenerate - TFB_DrawCanvas_Fill (surf, surf->w, surf->h, - SDL_MapRGBA (newfill->format, r, g, b, 0), newfill); + TFB_DrawCanvas_Fill (surf, surf->w, surf->h, SDL_MapRGBA ( + newfill->format, color.r, color.g, color.b, 0), newfill); // important to keep alpha=0 in fillcolor // -- we process alpha ourselves // cache filled image if possible - img->last_fill.r = r; - img->last_fill.g = g; - img->last_fill.b = b; + img->last_fill.r = color.r; + img->last_fill.g = color.g; + img->last_fill.b = color.b; } img->FilledImg = newfill; @@ -687,7 +692,8 @@ } void -TFB_DrawCanvas_CopyTransparencyInfo (TFB_Canvas src_canvas, TFB_Canvas dst_canvas) +TFB_DrawCanvas_CopyTransparencyInfo (TFB_Canvas src_canvas, + TFB_Canvas dst_canvas) { SDL_Surface* src = (SDL_Surface*)src_canvas; @@ -699,14 +705,14 @@ } else { - int r, g, b; - if (TFB_DrawCanvas_GetTransparentColor (src_canvas, &r, &g, &b)) - TFB_DrawCanvas_SetTransparentColor (dst_canvas, r, g, b, FALSE); + Color color; + if (TFB_DrawCanvas_GetTransparentColor (src_canvas, &color)) + TFB_DrawCanvas_SetTransparentColor (dst_canvas, color, FALSE); } } BOOLEAN -TFB_DrawCanvas_GetTransparentColor (TFB_Canvas canvas, int *r, int *g, int *b) +TFB_DrawCanvas_GetTransparentColor (TFB_Canvas canvas, Color *color) { if (!TFB_DrawCanvas_IsPaletted (canvas) && (((SDL_Surface *)canvas)->flags & SDL_SRCCOLORKEY) ) @@ -714,24 +720,26 @@ Uint8 ur, ug, ub; int colorkey = ((SDL_Surface *)canvas)->format->colorkey; SDL_GetRGB (colorkey, ((SDL_Surface *)canvas)->format, &ur, &ug, &ub); - *r = ur; - *g = ug; - *b = ub; + color->r = ur; + color->g = ug; + color->b = ub; + color->a = 0xff; return TRUE; } return FALSE; } void -TFB_DrawCanvas_SetTransparentColor (TFB_Canvas canvas, int r, int g, int b, +TFB_DrawCanvas_SetTransparentColor (TFB_Canvas canvas, Color color, BOOLEAN rleaccel) { - Uint32 color; + Uint32 sdlColor; int flags = SDL_SRCCOLORKEY; if (rleaccel) flags |= SDL_RLEACCEL; - color = SDL_MapRGBA (((SDL_Surface *)canvas)->format, r, g, b, 0); - SDL_SetColorKey ((SDL_Surface *)canvas, flags, color); + sdlColor = SDL_MapRGBA (((SDL_Surface *)canvas)->format, + color.r, color.g, color.b, 0); + SDL_SetColorKey ((SDL_Surface *)canvas, flags, sdlColor); if (!TFB_DrawCanvas_IsPaletted (canvas)) { @@ -1591,7 +1599,7 @@ } void -TFB_DrawCanvas_GetPixel (TFB_Canvas canvas, int x, int y, int *r, int *g, int *b) +TFB_DrawCanvas_GetPixel (TFB_Canvas canvas, int x, int y, Color *color) { SDL_Surface* surf = (SDL_Surface *)canvas; Uint8 ur, ug, ub; @@ -1601,18 +1609,19 @@ getpixel = getpixel_for(surf); pixel = (*getpixel)(surf, x, y); SDL_GetRGB (pixel, surf->format, &ur, &ug, &ub); - *r = ur; - *g = ug; - *b = ub; + color->r = ur; + color->g = ug; + color->b = ub; } void -TFB_DrawCanvas_Rotate (TFB_Canvas src_canvas, TFB_Canvas dst_canvas, int angle, EXTENT size) +TFB_DrawCanvas_Rotate (TFB_Canvas src_canvas, TFB_Canvas dst_canvas, + int angle, EXTENT size) { SDL_Surface *src = (SDL_Surface *)src_canvas; SDL_Surface *dst = (SDL_Surface *)dst_canvas; int ret; - int r, g, b; + Color color; if (size.width > dst->w || size.height > dst->h) { @@ -1623,11 +1632,12 @@ return; } - if (TFB_DrawCanvas_GetTransparentColor (src, &r, &g, &b)) + if (TFB_DrawCanvas_GetTransparentColor (src, &color)) { - TFB_DrawCanvas_SetTransparentColor (dst, r, g, b, FALSE); + TFB_DrawCanvas_SetTransparentColor (dst, color, FALSE); /* fill destination with transparent color before rotating */ - SDL_FillRect(dst, NULL, SDL_MapRGBA (dst->format, r, g, b, 0)); + SDL_FillRect(dst, NULL, SDL_MapRGBA (dst->format, + color.r, color.g, color.b, 0)); } ret = rotateSurface (src, dst, angle, 0); Modified: trunk/sc2/src/libs/graphics/sdl/primitives.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/primitives.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/sdl/primitives.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -150,7 +150,8 @@ * Adapted from Paul Heckbert's implementation of Bresenham's algorithm, * 3 Sep 85; taken from Graphics Gems I */ -void line(int x1, int y1, int x2, int y2, Uint32 color, PutPixelFn plot, SDL_Surface *surface) +void line(int x1, int y1, int x2, int y2, Uint32 color, PutPixelFn plot, + SDL_Surface *surface) { int d, x, y, ax, ay, sx, sy, dx, dy; SDL_Rect r; Modified: trunk/sc2/src/libs/graphics/sdl/sdl_common.c =================================================================== --- trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/sdl/sdl_common.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -724,8 +724,7 @@ TFB_DrawCanvas_FilledImage (DC.data.filledimage.image, DC.data.filledimage.x, DC.data.filledimage.y, - DC.data.filledimage.scale, DC.data.filledimage.r, - DC.data.filledimage.g, DC.data.filledimage.b, + DC.data.filledimage.scale, DC.data.filledimage.color, SDL_Screens[DC.data.filledimage.destBuffer]); if (DC.data.filledimage.destBuffer == 0) @@ -778,7 +777,7 @@ } TFB_DrawCanvas_Line (DC.data.line.x1, DC.data.line.y1, DC.data.line.x2, DC.data.line.y2, - DC.data.line.r, DC.data.line.g, DC.data.line.b, + DC.data.line.color, SDL_Screens[DC.data.line.destBuffer]); break; } @@ -786,8 +785,7 @@ { if (DC.data.rect.destBuffer == 0) TFB_BBox_RegisterRect (&DC.data.rect.rect); - TFB_DrawCanvas_Rect (&DC.data.rect.rect, DC.data.rect.r, - DC.data.rect.g, DC.data.rect.b, + TFB_DrawCanvas_Rect (&DC.data.rect.rect, DC.data.rect.color, SDL_Screens[DC.data.rect.destBuffer]); break; Modified: trunk/sc2/src/libs/graphics/tfb_draw.c =================================================================== --- trunk/sc2/src/libs/graphics/tfb_draw.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/tfb_draw.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -24,8 +24,7 @@ static const HOT_SPOT NullHs = {0, 0}; void -TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, int r, int g, int b, - SCREEN dest) +TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, Color color, SCREEN dest) { TFB_DrawCommand DC; @@ -34,16 +33,14 @@ DC.data.line.y1 = y1; DC.data.line.x2 = x2; DC.data.line.y2 = y2; - DC.data.line.r = r; - DC.data.line.g = g; - DC.data.line.b = b; + DC.data.line.color = color; DC.data.line.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); } void -TFB_DrawScreen_Rect (RECT *rect, int r, int g, int b, SCREEN dest) +TFB_DrawScreen_Rect (RECT *rect, Color color, SCREEN dest) { RECT locRect; TFB_DrawCommand DC; @@ -58,9 +55,7 @@ DC.Type = TFB_DRAWCOMMANDTYPE_RECTANGLE; DC.data.rect.rect = *rect; - DC.data.rect.r = r; - DC.data.rect.g = g; - DC.data.rect.b = b; + DC.data.rect.color = color; DC.data.rect.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); @@ -85,7 +80,7 @@ void TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, int scale, - int r, int g, int b, SCREEN dest) + Color color, SCREEN dest) { TFB_DrawCommand DC; @@ -94,9 +89,7 @@ DC.data.filledimage.x = x; DC.data.filledimage.y = y; DC.data.filledimage.scale = (scale == GSCALE_IDENTITY) ? 0 : scale; - DC.data.filledimage.r = r; - DC.data.filledimage.g = g; - DC.data.filledimage.b = b; + DC.data.filledimage.color = color; DC.data.filledimage.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); @@ -240,20 +233,20 @@ } void -TFB_DrawImage_Line (int x1, int y1, int x2, int y2, int r, int g, int b, +TFB_DrawImage_Line (int x1, int y1, int x2, int y2, Color color, TFB_Image *dest) { LockMutex (dest->mutex); - TFB_DrawCanvas_Line (x1, y1, x2, y2, r, g, b, dest->NormalImg); + TFB_DrawCanvas_Line (x1, y1, x2, y2, color, dest->NormalImg); dest->dirty = TRUE; UnlockMutex (dest->mutex); } void -TFB_DrawImage_Rect (RECT *rect, int r, int g, int b, TFB_Image *image) +TFB_DrawImage_Rect (RECT *rect, Color color, TFB_Image *image) { LockMutex (image->mutex); - TFB_DrawCanvas_Rect (rect, r, g, b, image->NormalImg); + TFB_DrawCanvas_Rect (rect, color, image->NormalImg); image->dirty = TRUE; UnlockMutex (image->mutex); } @@ -270,10 +263,10 @@ void TFB_DrawImage_FilledImage (TFB_Image *img, int x, int y, int scale, - int r, int g, int b, TFB_Image *target) + Color color, TFB_Image *target) { LockMutex (target->mutex); - TFB_DrawCanvas_FilledImage (img, x, y, scale, r, g, b, target->NormalImg); + TFB_DrawCanvas_FilledImage (img, x, y, scale, color, target->NormalImg); target->dirty = TRUE; UnlockMutex (target->mutex); } Modified: trunk/sc2/src/libs/graphics/tfb_draw.h =================================================================== --- trunk/sc2/src/libs/graphics/tfb_draw.h 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/tfb_draw.h 2009-11-29 19:54:51 UTC (rev 3369) @@ -79,14 +79,14 @@ // Drawing commands -void TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, int r, int g, int b, +void TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, Color color, SCREEN dest); -void TFB_DrawScreen_Rect (RECT *rect, int r, int g, int b, SCREEN dest); +void TFB_DrawScreen_Rect (RECT *rect, Color color, SCREEN dest); void TFB_DrawScreen_Image (TFB_Image *img, int x, int y, int scale, TFB_ColorMap *cmap, SCREEN dest); void TFB_DrawScreen_Copy (RECT *r, SCREEN src, SCREEN dest); void TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, int scale, - int r, int g, int b, SCREEN dest); + Color color, SCREEN dest); void TFB_DrawScreen_FontChar (TFB_Char *, TFB_Image *backing, int x, int y, SCREEN dest); @@ -107,13 +107,13 @@ void TFB_DrawImage_Delete (TFB_Image *image); void TFB_DrawImage_FixScaling (TFB_Image *image, int target, int type); -void TFB_DrawImage_Line (int x1, int y1, int x2, int y2, int r, int g, int b, +void TFB_DrawImage_Line (int x1, int y1, int x2, int y2, Color color, TFB_Image *dest); -void TFB_DrawImage_Rect (RECT *rect, int r, int g, int b, TFB_Image *image); +void TFB_DrawImage_Rect (RECT *rect, Color color, TFB_Image *image); void TFB_DrawImage_Image (TFB_Image *img, int x, int y, int scale, TFB_ColorMap *cmap, TFB_Image *target); void TFB_DrawImage_FilledImage (TFB_Image *img, int x, int y, int scale, - int r, int g, int b, TFB_Image *target); + Color color, TFB_Image *target); void TFB_DrawImage_FontChar (TFB_Char *, TFB_Image *backing, int x, int y, TFB_Image *target); @@ -143,13 +143,13 @@ void TFB_DrawCanvas_Delete (TFB_Canvas canvas); -void TFB_DrawCanvas_Line (int x1, int y1, int x2, int y2, int r, int g, int b, +void TFB_DrawCanvas_Line (int x1, int y1, int x2, int y2, Color color, TFB_Canvas dest); -void TFB_DrawCanvas_Rect (RECT *rect, int r, int g, int b, TFB_Canvas image); +void TFB_DrawCanvas_Rect (RECT *rect, Color color, TFB_Canvas image); void TFB_DrawCanvas_Image (TFB_Image *img, int x, int y, int scale, TFB_ColorMap *cmap, TFB_Canvas target); void TFB_DrawCanvas_FilledImage (TFB_Image *img, int x, int y, int scale, - int r, int g, int b, TFB_Canvas target); + Color color, TFB_Canvas target); void TFB_DrawCanvas_FontChar (TFB_Char *, TFB_Image *backing, int x, int y, TFB_Canvas target); @@ -159,9 +159,9 @@ void TFB_DrawCanvas_SetTransparentIndex (TFB_Canvas canvas, int i, BOOLEAN rleaccel); BOOLEAN TFB_DrawCanvas_GetTransparentColor (TFB_Canvas canvas, - int *r, int *g, int *b); + Color *color); void TFB_DrawCanvas_SetTransparentColor (TFB_Canvas canvas, - int r, int g, int b, BOOLEAN rleaccel); + Color color, BOOLEAN rleaccel); void TFB_DrawCanvas_CopyTransparencyInfo (TFB_Canvas src, TFB_Canvas dst); void TFB_DrawCanvas_Initialize (void); void TFB_DrawCanvas_Lock (TFB_Canvas canvas); @@ -169,8 +169,7 @@ void TFB_DrawCanvas_GetScreenFormat (TFB_PixelFormat *fmt); int TFB_DrawCanvas_GetStride (TFB_Canvas canvas); void *TFB_DrawCanvas_GetLine (TFB_Canvas canvas, int line); -void TFB_DrawCanvas_GetPixel (TFB_Canvas canvas, int x, int y, - int *r, int *g, int *b); +void TFB_DrawCanvas_GetPixel (TFB_Canvas canvas, int x, int y, Color *color); TFB_Canvas TFB_GetScreenCanvas (SCREEN screen); Modified: trunk/sc2/src/libs/graphics/tfb_prim.c =================================================================== --- trunk/sc2/src/libs/graphics/tfb_prim.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/libs/graphics/tfb_prim.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -38,10 +38,9 @@ r.extent.width = r.extent.height = 1; if (_CurFramePtr->Type == SCREEN_DRAWABLE) - TFB_DrawScreen_Rect (&r, color.r, color.g, color.b, TFB_SCREEN_MAIN); + TFB_DrawScreen_Rect (&r, color, TFB_SCREEN_MAIN); else - TFB_DrawImage_Rect (&r, color.r, color.g, color.b, - _CurFramePtr->image); + TFB_DrawImage_Rect (&r, color, _CurFramePtr->image); } void @@ -87,18 +86,14 @@ + (GSCALE_IDENTITY >> 1)) / GSCALE_IDENTITY; rect.extent.height = (rect.extent.height * gscale + (GSCALE_IDENTITY >> 1)) / GSCALE_IDENTITY; - rect.corner.x += (r->extent.width - - rect.extent.width) >> 1; - rect.corner.y += (r->extent.height - - rect.extent.height) >> 1; + rect.corner.x += (r->extent.width - rect.extent.width) >> 1; + rect.corner.y += (r->extent.height - rect.extent.height) >> 1; } if (_CurFramePtr->Type == SCREEN_DRAWABLE) - TFB_DrawScreen_Rect (&rect, color.r, color.g, color.b, - TFB_SCREEN_MAIN); + TFB_DrawScreen_Rect (&rect, color, TFB_SCREEN_MAIN); else - TFB_DrawImage_Rect (&rect, color.r, color.g, color.b, - _CurFramePtr->image); + TFB_DrawImage_Rect (&rect, color, _CurFramePtr->image); } void @@ -112,11 +107,9 @@ y2=line->second.y - _CurFramePtr->HotSpot.y; if (_CurFramePtr->Type == SCREEN_DRAWABLE) - TFB_DrawScreen_Line (x1, y1, x2, y2, color.r, color.g, color.b, - TFB_SCREEN_MAIN); + TFB_DrawScreen_Line (x1, y1, x2, y2, color, TFB_SCREEN_MAIN); else - TFB_DrawImage_Line (x1, y1, x2, y2, color.r, color.g, color.b, - _CurFramePtr->image); + TFB_DrawImage_Line (x1, y1, x2, y2, color, _CurFramePtr->image); } void @@ -174,7 +167,6 @@ int x, y; FRAME SrcFramePtr; TFB_Image *img; - int r, g, b; int gscale; SrcFramePtr = stmp->frame; @@ -199,21 +191,16 @@ x = stmp->origin.x - _CurFramePtr->HotSpot.x; y = stmp->origin.y - _CurFramePtr->HotSpot.y; - r = color.r; - g = color.g; - b = color.b; - UnlockMutex (img->mutex); if (_CurFramePtr->Type == SCREEN_DRAWABLE) { - TFB_DrawScreen_FilledImage (img, x, y, gscale, r, g, b, - TFB_SCREEN_MAIN); + TFB_DrawScreen_FilledImage (img, x, y, gscale, color, TFB_SCREEN_MAIN); } else { - TFB_DrawImage_FilledImage (img, x, y, gscale, r, g, b, - _CurFramePtr->image); + TFB_DrawImage_FilledImage (img, x, y, gscale, color, + _CurFramePtr->image); } } @@ -227,13 +214,11 @@ if (_CurFramePtr->Type == SCREEN_DRAWABLE) { - TFB_DrawScreen_FontChar (fontChar, backing, x, y, - TFB_SCREEN_MAIN); + TFB_DrawScreen_FontChar (fontChar, backing, x, y, TFB_SCREEN_MAIN); } else { - TFB_DrawImage_FontChar (fontChar, backing, x, y, - _CurFramePtr->image); + TFB_DrawImage_FontChar (fontChar, backing, x, y, _CurFramePtr->image); } } Modified: trunk/sc2/src/uqm/oscill.c =================================================================== --- trunk/sc2/src/uqm/oscill.c 2009-11-29 19:11:51 UTC (rev 3368) +++ trunk/sc2/src/uqm/oscill.c 2009-11-29 19:54:51 UTC (rev 3369) @@ -94,18 +94,21 @@ TFB_DrawImage_Image (scope_bg, 0, 0, 0, NULL, scope_surf); if (GraphForegroundStream (scope_data, RADAR_WIDTH - 2, RADAR_HEIGHT - 2)) { - int i, r, g, b; + int i; + Color color; + TFB_DrawCanvas_GetPixel (scope_bg->NormalImg, scope_bg->extent.width / 2, scope_bg->extent.height / 2, - &r, &g, &b); + &color); for (i = 0; i < RADAR_WIDTH - 3; ++i) TFB_DrawImage_Line (i + 1, scope_data[i] + 1, i + 2, - scope_data[i + 1] + 1, r, g, b, scope_surf); + scope_data[i + 1] + 1, color, scope_surf); } TFB_DrawImage_Image (scope_surf, 0, 0, 0, NULL, scope_frame->image); s.frame = scope_frame; - s.origin.x = s.origin.y = 0; + s.origin.x = 0; + s.origin.y = 0; DrawStamp (&s); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-12-01 21:48:46
|
Revision: 3382 http://sc2.svn.sourceforge.net/sc2/?rev=3382&view=rev Author: avolkov Date: 2009-12-01 21:48:38 +0000 (Tue, 01 Dec 2009) Log Message: ----------- Cleanup: unused graphics calls removed Modified Paths: -------------- trunk/sc2/src/libs/graphics/gfx_common.c trunk/sc2/src/libs/graphics/gfx_common.h trunk/sc2/src/uqm/fmv.c Modified: trunk/sc2/src/libs/graphics/gfx_common.c =================================================================== --- trunk/sc2/src/libs/graphics/gfx_common.c 2009-12-01 20:52:44 UTC (rev 3381) +++ trunk/sc2/src/libs/graphics/gfx_common.c 2009-12-01 21:48:38 UTC (rev 3382) @@ -38,23 +38,7 @@ static int gscale = GSCALE_IDENTITY; static int gscale_mode = TFB_SCALE_NEAREST; -// Status: Ignored (only used in fmv.c) void -SetGraphicUseOtherExtra (int other) //Could this possibly be more cryptic?!? :) -{ - //log_add (log_Debug, "SetGraphicUseOtherExtra %d", other); - (void)other; /* lint */ -} - -// Status: Ignored (only used in solarsys.c) -void -SetGraphicGrabOther (int grab_other) -{ - //log_add (log_Debug, "SetGraphicGrabOther %d", grab_other); - (void)grab_other; /* lint */ -} - -void DrawFromExtraScreen (RECT *r) { TFB_DrawScreen_Copy(r, TFB_SCREEN_EXTRA, TFB_SCREEN_MAIN); Modified: trunk/sc2/src/libs/graphics/gfx_common.h =================================================================== --- trunk/sc2/src/libs/graphics/gfx_common.h 2009-12-01 20:52:44 UTC (rev 3381) +++ trunk/sc2/src/libs/graphics/gfx_common.h 2009-12-01 21:48:38 UTC (rev 3382) @@ -77,12 +77,10 @@ void LoadIntoExtraScreen (RECT *r); void DrawFromExtraScreen (RECT *r); -void SetGraphicGrabOther (int grab_other); int SetGraphicScale (int scale); int GetGraphicScale (void); int SetGraphicScaleMode (int mode /* enum SCALE */); int GetGraphicScaleMode (void); -void SetGraphicUseOtherExtra (int other); void SetTransitionSource (RECT *pRect); void ScreenTransition (int transition, RECT *pRect); Modified: trunk/sc2/src/uqm/fmv.c =================================================================== --- trunk/sc2/src/uqm/fmv.c 2009-12-01 20:52:44 UTC (rev 3381) +++ trunk/sc2/src/uqm/fmv.c 2009-12-01 21:48:38 UTC (rev 3382) @@ -38,7 +38,6 @@ BYTE clut_buf[1]; RECT old_r, r; - SetGraphicUseOtherExtra (1); LoadIntoExtraScreen (0); #if 0 /* This is cut out right now but should be part of the 3DO side */ @@ -66,7 +65,6 @@ r.extent.height = SCREEN_HEIGHT; SetContextClipRect (&r); DrawFromExtraScreen (0); - SetGraphicUseOtherExtra (0); SetContextClipRect (&old_r); if (hMusic) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <av...@us...> - 2009-12-08 16:56:05
|
Revision: 3403 http://sc2.svn.sourceforge.net/sc2/?rev=3403&view=rev Author: avolkov Date: 2009-12-08 16:55:56 +0000 (Tue, 08 Dec 2009) Log Message: ----------- Dead context clipping flag removed Modified Paths: -------------- trunk/sc2/src/libs/gfxlib.h trunk/sc2/src/libs/graphics/context.c trunk/sc2/src/libs/graphics/context.h trunk/sc2/src/libs/graphics/frame.c trunk/sc2/src/uqm/intro.c trunk/sc2/src/uqm/planets/lander.c trunk/sc2/src/uqm/planets/plangen.c trunk/sc2/src/uqm/planets/report.c Modified: trunk/sc2/src/libs/gfxlib.h =================================================================== --- trunk/sc2/src/libs/gfxlib.h 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/libs/gfxlib.h 2009-12-08 16:55:56 UTC (rev 3403) @@ -246,7 +246,6 @@ extern Color GetContextBackGroundColor (void); extern FRAME SetContextFGFrame (FRAME Frame); extern FRAME GetContextFGFrame (void); -extern BOOLEAN SetContextClipping (BOOLEAN ClipStatus); // Context cliprect defines the drawing bounds. Additionally, all // drawing positions (x,y) are relative to the cliprect corner. extern BOOLEAN SetContextClipRect (RECT *pRect); Modified: trunk/sc2/src/libs/graphics/context.c =================================================================== --- trunk/sc2/src/libs/graphics/context.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/libs/graphics/context.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -98,7 +98,6 @@ BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); SetContextBackGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00)); - SetContextClipping (TRUE); SetContext (OldContext); } @@ -201,27 +200,6 @@ } BOOLEAN -SetContextClipping (BOOLEAN ClipStatus) -{ - BOOLEAN oldClipStatus; - - if (!ContextActive ()) - return (TRUE); - - oldClipStatus = (_get_context_flags () & BATCH_CLIP_GRAPHICS) != 0; - if (ClipStatus) - { - SetContextFlags (BATCH_CLIP_GRAPHICS); - } - else - { - UnsetContextFlags (BATCH_CLIP_GRAPHICS); - } - - return (oldClipStatus); -} - -BOOLEAN SetContextClipRect (RECT *lpRect) { if (!ContextActive ()) Modified: trunk/sc2/src/libs/graphics/context.h =================================================================== --- trunk/sc2/src/libs/graphics/context.h 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/libs/graphics/context.h 2009-12-08 16:55:56 UTC (rev 3403) @@ -29,6 +29,8 @@ struct context_desc { UWORD Flags; + // Low nibble currently unused + // High nibble contains GRAPHICS_STATUS Color ForeGroundColor, BackGroundColor; FRAME ForeGroundFrame; Modified: trunk/sc2/src/libs/graphics/frame.c =================================================================== --- trunk/sc2/src/libs/graphics/frame.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/libs/graphics/frame.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -110,8 +110,6 @@ BatchFlags &= BATCH_SINGLE | BATCH_BUILD_PAGE | BATCH_XFORM; - BatchFlags |= _get_context_flags () & BATCH_CLIP_GRAPHICS; - BatchGraphics (); if (BatchFlags & BATCH_BUILD_PAGE) Modified: trunk/sc2/src/uqm/intro.c =================================================================== --- trunk/sc2/src/uqm/intro.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/uqm/intro.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -281,7 +281,6 @@ s.origin.y = 0; s.frame = SetAbsFrameIndex (pPIS->Frame, pPIS->MovieFrame); LockMutex (GraphicsLock); - SetContextClipping (TRUE); DrawStamp (&s); UnlockMutex (GraphicsLock); } @@ -496,7 +495,6 @@ t.baseline.y = y; if (!pPIS->Batched) LockMutex (GraphicsLock); - SetContextClipping (TRUE); DrawTextEffect (&t, pPIS->TextColor, pPIS->TextBackColor, pPIS->TextEffect); if (!pPIS->Batched) @@ -542,7 +540,6 @@ } LockMutex (GraphicsLock); - SetContextClipping (TRUE); for (i = 0; i < pPIS->LinesCount; ++i) DrawTextEffect (pPIS->TextLines + i, pPIS->TextFadeColor, pPIS->TextFadeColor, pPIS->TextEffect); @@ -565,7 +562,6 @@ Present_UnbatchGraphics (pPIS, TRUE); LockMutex (GraphicsLock); - SetContextClipping (TRUE); /* do transition */ SetTransitionSource (&pPIS->tfade_r); BatchGraphics (); @@ -659,7 +655,6 @@ LockMutex (GraphicsLock); old_mode = SetGraphicScaleMode (scale_mode); old_scale = SetGraphicScale (scale); - SetContextClipping (TRUE); DrawStamp (&s); SetGraphicScale (old_scale); SetGraphicScaleMode (old_mode); Modified: trunk/sc2/src/uqm/planets/lander.c =================================================================== --- trunk/sc2/src/uqm/planets/lander.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/uqm/planets/lander.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -1486,7 +1486,6 @@ r.extent.width = SURFACE_WIDTH; r.extent.height = SURFACE_HEIGHT; SetContextClipRect (&r); - SetContextClipping (TRUE); SetTransitionSource (&r); BatchGraphics (); Modified: trunk/sc2/src/uqm/planets/plangen.c =================================================================== --- trunk/sc2/src/uqm/planets/plangen.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/uqm/planets/plangen.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -134,7 +134,6 @@ OldHot = SetFrameHot (DstFrame, MAKE_HOT_SPOT (0, 0)); GetContextClipRect (&ClipRect); SetContextClipRect (NULL); - SetContextClipping (FALSE); pBatch = &BatchArray[0]; for (i = 0; i < NUM_BATCH_POINTS; ++i, ++pBatch) @@ -201,7 +200,6 @@ DrawBatch (BatchArray, i, 0); } - SetContextClipping (TRUE); SetContextClipRect (&ClipRect); SetFrameHot (DstFrame, OldHot); } Modified: trunk/sc2/src/uqm/planets/report.c =================================================================== --- trunk/sc2/src/uqm/planets/report.c 2009-12-08 16:37:52 UTC (rev 3402) +++ trunk/sc2/src/uqm/planets/report.c 2009-12-08 16:55:56 UTC (rev 3403) @@ -57,7 +57,6 @@ SetContextBackGroundColor (BLACK_COLOR); ClearDrawable (); - SetContextClipping (FALSE); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x07, 0x00), 0x57)); @@ -78,8 +77,6 @@ s.origin.y += r.extent.height + 1; } - SetContextClipping (TRUE); - UnbatchGraphics (); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |