From 0c5620d42b921caf2a2a2e297db93743e2cbc61c Mon Sep 17 00:00:00 2001 From: mcmartin Date: Tue, 22 May 2007 03:45:29 +0000 Subject: [PATCH] Removed 256-cel limit on .ani files git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2758 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/ChangeLog | 1 + .../sc2code/libs/graphics/sdl/3do_getbody.c | 76 +++++++++++++------ 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index cc3bf893c..74ce76e32 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Removed the 256-frame limit on .ani files - Michael - Renamed PlaySpeeh/StopSpeech to work around name collisions on OSX - Alex - Ending the battle with a simultaneous death no longer triggers an diff --git a/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c b/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c index dd99d7c8a..aa701e9bb 100644 --- a/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c +++ b/sc2/src/sc2code/libs/graphics/sdl/3do_getbody.c @@ -376,12 +376,11 @@ Uint32 frame_mapRGBA (FRAME FramePtr,Uint8 r, Uint8 g, Uint8 b, Uint8 a) MEM_HANDLE _GetCelData (uio_Stream *fp, DWORD length) { - int cel_ct, n; + int cel_total, cel_index, n; DWORD opos; char CurrentLine[1024], filename[1024]; -#define MAX_CELS 256 - SDL_Surface *img[MAX_CELS]; - AniData ani[MAX_CELS]; + SDL_Surface **img; + AniData *ani; DRAWABLE Drawable; opos = uio_ftell (fp); @@ -402,15 +401,45 @@ _GetCelData (uio_Stream *fp, DWORD length) } } - cel_ct = 0; - while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp) && cel_ct < MAX_CELS) + cel_total = 0; + while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp)) + { + ++cel_total; + } + + img = HMalloc(sizeof (SDL_Surface *) * cel_total); + if (!img) + { + log_add (log_Warning, "Couldn't allocate space for '%s' images", _cur_resfile_name); + + /* This isn't a very good way to return failure, but + * it seems to be how it is normally done in this + * routine. */ + return (GetDrawableHandle (0)); + } + + ani = HMalloc (sizeof (AniData) * cel_total); + if (!ani) + { + HFree (img); + log_add (log_Warning, "Couldn't allocate space for '%s' anidata", _cur_resfile_name); + + /* This isn't a very good way to return failure, but + * it seems to be how it is normally done in this + * routine. */ + return (GetDrawableHandle (0)); + } + + cel_index = 0; + uio_fseek (fp, opos, SEEK_SET); + while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp) && cel_index < cel_total) { sscanf (CurrentLine, "%s %d %d %d %d", &filename[n], - &ani[cel_ct].transparent_color, &ani[cel_ct].colormap_index, - &ani[cel_ct].hotspot_x, &ani[cel_ct].hotspot_y); + &ani[cel_index].transparent_color, &ani[cel_index].colormap_index, + &ani[cel_index].hotspot_x, &ani[cel_index].hotspot_y); - img[cel_ct] = sdluio_loadImage (contentDir, filename); - if (img[cel_ct] == NULL) + img[cel_index] = sdluio_loadImage (contentDir, filename); + if (img[cel_index] == NULL) { const char *err; @@ -418,17 +447,17 @@ _GetCelData (uio_Stream *fp, DWORD length) log_add (log_Warning, "_GetCelData: Unable to load image!"); if (err != NULL) log_add (log_Warning, "SDL reports: %s", err); - SDL_FreeSurface (img[cel_ct]); + SDL_FreeSurface (img[cel_index]); } - else if (img[cel_ct]->w < 0 || img[cel_ct]->h < 0 || - img[cel_ct]->format->BitsPerPixel < 8) + else if (img[cel_index]->w < 0 || img[cel_index]->h < 0 || + img[cel_index]->format->BitsPerPixel < 8) { log_add (log_Warning, "_GetCelData: Bad file!"); - SDL_FreeSurface (img[cel_ct]); + SDL_FreeSurface (img[cel_index]); } else { - ++cel_ct; + ++cel_index; } if ((int)uio_ftell (fp) - (int)opos >= (int)length) @@ -436,14 +465,14 @@ _GetCelData (uio_Stream *fp, DWORD length) } Drawable = 0; - if (cel_ct && (Drawable = AllocDrawable (cel_ct))) + if (cel_index && (Drawable = AllocDrawable (cel_index))) { DRAWABLE_DESC *DrawablePtr; if ((DrawablePtr = LockDrawable (Drawable)) == 0) { - while (cel_ct--) - SDL_FreeSurface (img[cel_ct]); + while (cel_index--) + SDL_FreeSurface (img[cel_index]); mem_release ((MEM_HANDLE)Drawable); Drawable = 0; @@ -454,11 +483,11 @@ _GetCelData (uio_Stream *fp, DWORD length) DrawablePtr->hDrawable = GetDrawableHandle (Drawable); DrawablePtr->Flags = WANT_PIXMAP; - DrawablePtr->MaxIndex = cel_ct - 1; + DrawablePtr->MaxIndex = cel_index - 1; - FramePtr = &DrawablePtr->Frame[cel_ct]; - while (--FramePtr, cel_ct--) - process_image (FramePtr, img, ani, cel_ct); + FramePtr = &DrawablePtr->Frame[cel_index]; + while (--FramePtr, cel_index--) + process_image (FramePtr, img, ani, cel_index); UnlockDrawable (Drawable); } @@ -467,6 +496,9 @@ _GetCelData (uio_Stream *fp, DWORD length) if (Drawable == 0) log_add (log_Warning, "Couldn't get cel data for '%s'", _cur_resfile_name); + + HFree (img); + HFree (ani); return (GetDrawableHandle (Drawable)); }