home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
animutil
/
pvquan
/
flilib
/
compfram.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-30
|
3KB
|
112 lines
#ifdef __TURBOC__
#include <mem.h>
#endif
#include "aatypes.h"
#include "aaerr.h"
#include "aascreen.h"
#include "aafli.h"
#include "aaflisav.h"
#include "aafii.h"
#include "str_low.h"
#define FLI_EMPTY_DCOMP 8 /* Size returned by fii functions
to indicate no change */
static unsigned full_cmap(Cbuf *cbuf, Cmap *cmap)
{
*cbuf++ = 1;
*cbuf++ = 0;
*cbuf++ = 0;
*cbuf++ = 0;
memcpy(cbuf, cmap, AA_COLORS*3);
return AA_COLORS*3 + 4;
}
static void chunk_buf(UBYTE *p, struct fli_chunk *c)
{
#ifdef __TURBOC__
memcpy(p, c, CHUNK_SIZE);
#else
p = lbuf(p, c->size);
p = wbuf(p, c->type);
#endif
}
static UBYTE *frame_buf(UBYTE *p, struct fli_frame *f)
{
#ifdef __TURBOC__
memcpy(p, f, FRAME_SIZE);
return p + FRAME_SIZE;
#else
p = lbuf(p, f->size);
p = wbuf(p, f->type);
p = wbuf(p, f->chunks);
memset(p, 0, 8);
return p + 8;
#endif
}
unsigned fli_comp_frame(
UBYTE *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 colour_map[AA_COLORS*3+4];
Cbuf *screen_map, *c;
struct fli_frame frame;
struct fli_chunk colour_chunk, screen_chunk;
unsigned buf_len;
if ((screen_map = (Cbuf *)malloc(64000U)) == NULL) return AA_ERR_NOMEM;
memset(&frame, 0, FRAME_SIZE);
frame.type = FLIF_MAGIC;
frame.size = FRAME_SIZE;
/* 1st make the color map chunk */
if (type == FLI_BRUN) buf_len = full_cmap(colour_map, this_cmap);
else buf_len = fii_fccomp(last_cmap, this_cmap, colour_map, AA_COLORS);
colour_chunk.type = FLI_COLOR;
colour_chunk.size = buf_len + CHUNK_SIZE;
if (colour_chunk.size != FLI_EMPTY_DCOMP) {
frame.chunks = 1;
frame.size += colour_chunk.size;
}
switch (type) {
case FLI_LC:
buf_len = fii_lccomp(last_screen, this_screen, screen_map, 320, 200);
break;
case FLI_BRUN:
buf_len = fii_brun(this_screen, screen_map, 320, 200);
break;
}
if (buf_len == 0) {
screen_chunk.size = 64000L+CHUNK_SIZE;
screen_chunk.type = FLI_COPY;
memcpy(screen_map, this_screen, 64000U);
} else {
screen_chunk.type = type;
screen_chunk.size = buf_len + CHUNK_SIZE;
}
if (screen_chunk.size != FLI_EMPTY_DCOMP) {
frame.chunks++;
frame.size += screen_chunk.size;
}
c = frame_buf(comp_buf, &frame);
if (colour_chunk.size != FLI_EMPTY_DCOMP) {
chunk_buf(c, &colour_chunk);
memcpy(c + CHUNK_SIZE, colour_map, (unsigned)colour_chunk.size - CHUNK_SIZE);
c += (unsigned)colour_chunk.size;
}
if (screen_chunk.size != FLI_EMPTY_DCOMP) {
chunk_buf(c, &screen_chunk);
memcpy(c + CHUNK_SIZE, screen_map, (unsigned)screen_chunk.size - CHUNK_SIZE);
c += (unsigned)screen_chunk.size;
}
free(screen_map);
return (unsigned)frame.size;
}