#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); }