home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
animutil
/
flilib
/
flisrc
/
compfram.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-17
|
2KB
|
76 lines
#include "aai86.h"
#include "aaflisav.h"
#include "aafii.h"
#define FLI_EMPTY_DCOMP 8 /* Size returned by fii functions
to indicate no change */
static Cbuf *
full_cmap(Cbuf *cbuf, Cmap *cmap)
{
*cbuf++ = 1;
*cbuf++ = 0;
*cbuf++ = 0;
*cbuf++ = 0;
i86_bcopy(cmap, cbuf, AA_COLORS*3);
return(i86_norm_ptr(cbuf+AA_COLORS*3));
}
long fli_comp_frame(
Cbuf *comp_buf, /* Buffer - should be FLI_CBUF_SIZE or bigger */
Pixel *last_screen, Cmap *last_cmap, /* Data from previous frame */
Pixel *this_screen, Cmap *this_cmap, /* Data for this frame */
int type) /* FLI_BRUN? FLI_LCCOMP? */
{
Cbuf *c;
struct fli_frame *frame;
struct fli_chunk *chunk;
frame = (struct fli_frame *)comp_buf;
i86_wzero(frame, sizeof(*frame)/sizeof(SHORT) );
chunk = (struct fli_chunk *)(frame+1);
/* 1st make the color map chunk */
if (type == FLI_BRUN)
c = full_cmap((char *)(chunk+1), this_cmap);
else
c = fii_fccomp(last_cmap, this_cmap, (USHORT *)(chunk+1), AA_COLORS);
chunk->type = FLI_COLOR;
chunk->size = i86_ptr_to_long(c) - i86_ptr_to_long(chunk);
if (chunk->size == FLI_EMPTY_DCOMP)
c = (char *)chunk;
else
frame->chunks = 1;
chunk = (struct fli_chunk *)c;
switch (type)
{
case FLI_LC:
c = fii_lccomp(last_screen, this_screen, (USHORT *)(chunk+1), 320, 200);
break;
case FLI_BRUN:
c = fii_brun(this_screen, this_screen, (USHORT *)(chunk+1), 320,200);
break;
}
if (c == NULL)
{
chunk->size = 64000L+sizeof(chunk);
chunk->type = FLI_COPY;
c = i86_norm_ptr((char *)(chunk+1)+64000L);
i86_wcopy(this_screen, chunk+1, 32000);
}
else
{
chunk->type = type;
chunk->size = i86_ptr_to_long(c) - i86_ptr_to_long(chunk);
}
if (chunk->size == FLI_EMPTY_DCOMP)
c = (char *)chunk;
else
frame->chunks++;
frame->type = FLIF_MAGIC;
frame->size = i86_ptr_to_long(c) - i86_ptr_to_long(comp_buf);
return(frame->size);
}