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
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
Changes towards version 0.7:
|
Changes towards version 0.7:
|
||||||
|
- Removed the 256-frame limit on .ani files - Michael
|
||||||
- Renamed PlaySpeeh/StopSpeech to work around name collisions
|
- Renamed PlaySpeeh/StopSpeech to work around name collisions
|
||||||
on OSX - Alex
|
on OSX - Alex
|
||||||
- Ending the battle with a simultaneous death no longer triggers an
|
- Ending the battle with a simultaneous death no longer triggers an
|
||||||
|
|||||||
@@ -376,12 +376,11 @@ Uint32 frame_mapRGBA (FRAME FramePtr,Uint8 r, Uint8 g, Uint8 b, Uint8 a)
|
|||||||
MEM_HANDLE
|
MEM_HANDLE
|
||||||
_GetCelData (uio_Stream *fp, DWORD length)
|
_GetCelData (uio_Stream *fp, DWORD length)
|
||||||
{
|
{
|
||||||
int cel_ct, n;
|
int cel_total, cel_index, n;
|
||||||
DWORD opos;
|
DWORD opos;
|
||||||
char CurrentLine[1024], filename[1024];
|
char CurrentLine[1024], filename[1024];
|
||||||
#define MAX_CELS 256
|
SDL_Surface **img;
|
||||||
SDL_Surface *img[MAX_CELS];
|
AniData *ani;
|
||||||
AniData ani[MAX_CELS];
|
|
||||||
DRAWABLE Drawable;
|
DRAWABLE Drawable;
|
||||||
|
|
||||||
opos = uio_ftell (fp);
|
opos = uio_ftell (fp);
|
||||||
@@ -402,15 +401,45 @@ _GetCelData (uio_Stream *fp, DWORD length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cel_ct = 0;
|
cel_total = 0;
|
||||||
while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp) && cel_ct < MAX_CELS)
|
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],
|
sscanf (CurrentLine, "%s %d %d %d %d", &filename[n],
|
||||||
&ani[cel_ct].transparent_color, &ani[cel_ct].colormap_index,
|
&ani[cel_index].transparent_color, &ani[cel_index].colormap_index,
|
||||||
&ani[cel_ct].hotspot_x, &ani[cel_ct].hotspot_y);
|
&ani[cel_index].hotspot_x, &ani[cel_index].hotspot_y);
|
||||||
|
|
||||||
img[cel_ct] = sdluio_loadImage (contentDir, filename);
|
img[cel_index] = sdluio_loadImage (contentDir, filename);
|
||||||
if (img[cel_ct] == NULL)
|
if (img[cel_index] == NULL)
|
||||||
{
|
{
|
||||||
const char *err;
|
const char *err;
|
||||||
|
|
||||||
@@ -418,17 +447,17 @@ _GetCelData (uio_Stream *fp, DWORD length)
|
|||||||
log_add (log_Warning, "_GetCelData: Unable to load image!");
|
log_add (log_Warning, "_GetCelData: Unable to load image!");
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
log_add (log_Warning, "SDL reports: %s", err);
|
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 ||
|
else if (img[cel_index]->w < 0 || img[cel_index]->h < 0 ||
|
||||||
img[cel_ct]->format->BitsPerPixel < 8)
|
img[cel_index]->format->BitsPerPixel < 8)
|
||||||
{
|
{
|
||||||
log_add (log_Warning, "_GetCelData: Bad file!");
|
log_add (log_Warning, "_GetCelData: Bad file!");
|
||||||
SDL_FreeSurface (img[cel_ct]);
|
SDL_FreeSurface (img[cel_index]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++cel_ct;
|
++cel_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((int)uio_ftell (fp) - (int)opos >= (int)length)
|
if ((int)uio_ftell (fp) - (int)opos >= (int)length)
|
||||||
@@ -436,14 +465,14 @@ _GetCelData (uio_Stream *fp, DWORD length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Drawable = 0;
|
Drawable = 0;
|
||||||
if (cel_ct && (Drawable = AllocDrawable (cel_ct)))
|
if (cel_index && (Drawable = AllocDrawable (cel_index)))
|
||||||
{
|
{
|
||||||
DRAWABLE_DESC *DrawablePtr;
|
DRAWABLE_DESC *DrawablePtr;
|
||||||
|
|
||||||
if ((DrawablePtr = LockDrawable (Drawable)) == 0)
|
if ((DrawablePtr = LockDrawable (Drawable)) == 0)
|
||||||
{
|
{
|
||||||
while (cel_ct--)
|
while (cel_index--)
|
||||||
SDL_FreeSurface (img[cel_ct]);
|
SDL_FreeSurface (img[cel_index]);
|
||||||
|
|
||||||
mem_release ((MEM_HANDLE)Drawable);
|
mem_release ((MEM_HANDLE)Drawable);
|
||||||
Drawable = 0;
|
Drawable = 0;
|
||||||
@@ -454,11 +483,11 @@ _GetCelData (uio_Stream *fp, DWORD length)
|
|||||||
|
|
||||||
DrawablePtr->hDrawable = GetDrawableHandle (Drawable);
|
DrawablePtr->hDrawable = GetDrawableHandle (Drawable);
|
||||||
DrawablePtr->Flags = WANT_PIXMAP;
|
DrawablePtr->Flags = WANT_PIXMAP;
|
||||||
DrawablePtr->MaxIndex = cel_ct - 1;
|
DrawablePtr->MaxIndex = cel_index - 1;
|
||||||
|
|
||||||
FramePtr = &DrawablePtr->Frame[cel_ct];
|
FramePtr = &DrawablePtr->Frame[cel_index];
|
||||||
while (--FramePtr, cel_ct--)
|
while (--FramePtr, cel_index--)
|
||||||
process_image (FramePtr, img, ani, cel_ct);
|
process_image (FramePtr, img, ani, cel_index);
|
||||||
|
|
||||||
UnlockDrawable (Drawable);
|
UnlockDrawable (Drawable);
|
||||||
}
|
}
|
||||||
@@ -467,6 +496,9 @@ _GetCelData (uio_Stream *fp, DWORD length)
|
|||||||
if (Drawable == 0)
|
if (Drawable == 0)
|
||||||
log_add (log_Warning, "Couldn't get cel data for '%s'",
|
log_add (log_Warning, "Couldn't get cel data for '%s'",
|
||||||
_cur_resfile_name);
|
_cur_resfile_name);
|
||||||
|
|
||||||
|
HFree (img);
|
||||||
|
HFree (ani);
|
||||||
return (GetDrawableHandle (Drawable));
|
return (GetDrawableHandle (Drawable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user