This is Animation.m in view mode; [Download] [Up]
/*
* Adaption of Mark Podlipec's xanim software to Movie.app
* (c) 1995 Andreas Windemuth
*/
#define VERBOSE 0
/*
* xanim.c
*
* Copyright (C) 1990,1991,1992,1993,1994 by Mark Podlipec.
* All rights reserved.
*
* This software may be freely copied, modified and redistributed without
* fee for non-commerical purposes provided that this copyright notice is
* preserved intact on all copies and modified copies.
*
* There is no warranty or other guarantee of fitness of this software.
* It is provided solely "as is". The author(s) disclaim(s) all
* responsibility and liability with respect to this software's usage
* or its effect upon hardware or computer systems.
*
*/
#define DA_REV 2.68
#define DA_MINOR_REV 5
#define SCALING 0
#include <libc.h>
#import "Animation.h"
@implementation Animation
- initFrom:(const char *)filename
{
BOOL result;
xa_init();
xa_verbose = FALSE;
xa_debug = 0;
xa_file_flag = TRUE;
first_file = 0;
cur_file = Get_Anim_Hdr(cur_file, filename);
cur_file->anim_type = Determine_Anim_Type(filename);
cur_file->anim_flags = 0;
switch(cur_file->anim_type)
{
case IFF_ANIM:
if (xa_verbose) fprintf(stderr,"Reading IFF File %s\n",filename);
result = IFF_Read_File(filename,cur_file);
break;
case GIF_ANIM:
if (xa_verbose) fprintf(stderr,"Reading GIF File %s\n",filename);
result = GIF_Read_Anim(filename,cur_file);
break;
case TXT_ANIM:
if (xa_verbose) fprintf(stderr,"Reading TXT File %s\n",filename);
result = TXT_Read_File(filename,cur_file);
break;
case FLI_ANIM:
if (xa_verbose) fprintf(stderr,"Reading FLI File %s\n",filename);
result = Fli_Read_File(filename,cur_file);
break;
case DL_ANIM:
if (xa_verbose) fprintf(stderr,"Reading DL File %s\n",filename);
result = DL_Read_File(filename,cur_file);
break;
case PFX_ANIM:
if (xa_verbose) fprintf(stderr,"Reading PFX File %s\n",filename);
result = PFX_Read_File(filename,cur_file);
break;
#if SETFILE
case SET_ANIM:
if (xa_verbose) fprintf(stderr,"Reading SET File %s\n",filename);
result = SET_Read_File(filename,cur_file);
break;
#endif
case RLE_ANIM:
if (xa_verbose) fprintf(stderr,"Reading RLE File %s\n",filename);
result = RLE_Read_File(filename,cur_file);
break;
case AVI_ANIM:
if (xa_verbose) fprintf(stderr,"Reading AVI File %s\n",filename);
result = AVI_Read_File(filename,cur_file);
break;
case QT_ANIM:
if (xa_verbose) fprintf(stderr,"Reading QT File %s\n",filename);
result = QT_Read_File(filename,cur_file);
break;
case NOFILE_ANIM:
fprintf(stderr,"File %s not found\n",filename);
result = FALSE;
break;
default:
fprintf(stderr,"Unknown or unsupported animation type: %s\n",
filename);
result = FALSE;
break;
}
if (result == FALSE) cur_file = Return_Anim_Hdr(cur_file);
else
{
#if SCALING
ULONG tmpx,tmpy;
#endif
/* Setup up anim header. */
cur_file->loop_num = DEFAULT_LOOPEACH_FLAG;
cur_file->pause_lst = 0;
xa_imagex = cur_file->imagex;
xa_imagey = cur_file->imagey;
if (xa_imagex > xa_max_imagex) xa_max_imagex = xa_imagex;
if (xa_imagey > xa_max_imagey) xa_max_imagey = xa_imagey;
#if SCALING
/* Handle Buffer Scaling Here */
if ( (xa_buff_x != 0) && (xa_buff_y != 0) )
{tmpx = xa_buff_x; tmpy = xa_buff_y;}
else if (xa_buff_x != 0) /* if just x, then adjust y */
{tmpx = xa_buff_x; tmpy = (xa_imagey * xa_buff_x) / xa_imagex;}
else if (xa_buff_y != 0) /* if just y, then adjust x */
{tmpy = xa_buff_y; tmpx = (xa_imagex * xa_buff_y) / xa_imagey;}
else
{
/* handle any scaling */
tmpx = (ULONG)((float)(xa_imagex) * xa_bscalex);
if (tmpx == 0) tmpx = xa_imagex;
tmpy = (ULONG)((float)(xa_imagey) * xa_bscaley);
if (tmpy == 0) tmpy = xa_imagey;
}
cur_file->buffx = tmpx;
cur_file->buffy = tmpy;
/* Handle Display Scaling Here */
if ( (xa_disp_x != 0) && (xa_disp_y != 0) )
{tmpx = xa_disp_x; tmpy = xa_disp_y;}
else if (xa_disp_x != 0) /* if just x, then adjust y */
{tmpx = xa_disp_x; tmpy = (xa_imagey * xa_disp_x) / xa_imagex;}
else if (xa_disp_y != 0) /* if just y, then adjust x */
{tmpy = xa_disp_y; tmpx = (xa_imagex * xa_disp_y) / xa_imagey;}
else
{
/* handle any scaling */
tmpx = (ULONG)((float)(xa_imagex) * xa_scalex);
if (tmpx == 0) tmpx = xa_imagex;
tmpy = (ULONG)((float)(xa_imagey) * xa_scaley);
if (tmpy == 0) tmpy = xa_imagey;
}
/* handle any IFF laced images */
if ( (xa_allow_lace==TRUE) && (cur_file->anim_flags & ANIM_LACE))
tmpy >>= 1;
else cur_file->anim_flags &= ~ANIM_LACE;
cur_file->dispx = tmpx;
cur_file->dispy = tmpy;
if (tmpx > xa_max_disp_x) xa_max_disp_x = tmpx;
if (tmpy > xa_max_disp_y) xa_max_disp_y = tmpy;
if ((cmap_dither_type == CMAP_DITHER_FLOYD) && (xa_buffer_flag==FALSE))
cur_file->anim_flags |= ANIM_3RD_BUF;
xa_merged_anim_flags |= cur_file->anim_flags;
/* NOTE: removed fade, remember to readd eventually */
if (xa_time_flag == TRUE)
{
LONG time_int;
xa_time_end = XA_Time_Read();
time_int = xa_time_end - xa_time_start;
fprintf(stderr,"time = %ld\n",time_int);
xa_time_start = XA_Time_Read();
}
#endif
} /* valid animation file */
if (first_file == 0) return nil;
if (first_file->anim_flags&ANIM_USE_FILE) xa_anim_flags |= ANIM_USE_FILE;
if (xa_anim_flags & ANIM_USE_FILE)
{
if (xa_fd>=0) { close(xa_fd); xa_fd = -1; }
if (xa_codec_buf) { FREE(xa_codec_buf,0x99); xa_codec_buf=0;}
if ( (xa_fd=open(cur_file->fname,O_RDONLY,NULL)) == 0)
{
fprintf(stderr,"can't open file %s for reading\n",cur_file->fname);
TheEnd();
}
xa_codec_buf = (char *)malloc( cur_file->max_fsize );
if (xa_codec_buf==0) TheEnd1("malloc codec_buf err");
if (VERBOSE) debug("File %s opened on %d, %d bytes allocated\n",
cur_file->fname, xa_fd, cur_file->max_fsize);
}
cur_file = first_file;
bitmap = [[NXBitmapImageRep alloc] initData:NULL
pixelsWide:xa_max_imagex
pixelsHigh:xa_max_imagey
bitsPerSample:8
samplesPerPixel:3 // (cSpace == RGB_COLOR) ? 3 : 1
hasAlpha:NO
isPlanar:NO
colorSpace:NX_RGBColorSpace
bytesPerRow:0
bitsPerPixel:32
];
if (!bitmap) {
warning("Could not create bitmap\n");
return nil;
}
if (VERBOSE) debug("Created Image %d %d %d\n", xa_max_imagex, xa_max_imagey, 24);
return self;
}
- free;
{
[bitmap free];
return self;
}
- (NXBitmapImageRep *)update
{
XA_ACTION *act;
ACT_DLTA_HDR *d;
ULONG xs, ys, xe, ye;
if ( (act = cur_file->frame_lst[cur_frame].act) != 0) {
if (VERBOSE) debug("Action %d, type %ld chdr %x map %x\n", cur_frame,
act->type, act->chdr, act->chdr->map);
if (act->type!=ACT_DELTA) {
warning("Action type %d not supported\n", act->type);
return nil;
}
} else {
warning("No Action in frame\n");
return nil;
}
d = (ACT_DLTA_HDR *)act->data;
if (!d) {
warning("No Delta in action\n");
return nil;
}
if (VERBOSE) debug(
"Delta %ld %ld %ld %ld flags=%lx special=%lx extra=%lx fpos=%ld fsize=%ld\n",
d->xpos, d->ypos, d->xsize, d->ysize, d->flags, d->special, d->extra, d->fpos, d->fsize
);
if ((xa_fd >= 0) && (!(d->flags & DLTA_DATA)) ) {
XA_Read_Delta(xa_codec_buf, xa_fd, d->fpos, d->fsize);
if (VERBOSE) debug("% bytes read at %d from %d\n", d->fsize, d->fpos, xa_fd);
d->delta([bitmap data], xa_codec_buf, d->fsize, act->chdr, act->chdr->map, 1,
d->xsize,d->ysize,24, &xs,&ys,&xe,&ye,d->special,d->extra);
d->delta([bitmap data], xa_codec_buf, d->fsize,
act->chdr, act->chdr->map, 1, d->xsize,d->ysize,24,
&xs,&ys,&xe,&ye,d->special,d->extra);
} else {
d->delta([bitmap data], d->data, d->fsize, act->chdr, act->chdr->map, 1,
d->xsize,d->ysize,24, &xs,&ys,&xe,&ye,d->special,d->extra);
}
if (VERBOSE) debug("Delta area: %ld %ld %ld %ld\n", xs, ys, xe, ye);
return bitmap;
}
- getMaxSize:(NXSize *)size
{
size->width = xa_max_imagex;
size->height = xa_max_imagey;
return self;
}
- (NXBitmapImageRep *)next
{
Step_Frame_Next();
return [self update];
}
- (BOOL)isLast
{
return (cur_frame==cur_file->last_frame);
}
- (NXBitmapImageRep *)bitmap;
{
return bitmap;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.