home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
animutil
/
flilib
/
flisrc
/
fccomp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-17
|
2KB
|
87 lines
/* fii_fccomp.c - code used to delta compress colors. */
#include "aai86.h"
#include "aaflisav.h"
#include "aafii.h"
/* fii_fccomp - compress an rgb triples color map just doing 'skip' compression */
Cbuf *fii_fccomp(Cmap *s1, Cmap *s2, USHORT *cbuf, int count)
{
USHORT wcount, i;
Cbuf *c;
USHORT op_count;
USHORT dif_count;
USHORT same_count;
USHORT next_match;
USHORT bcount;
Cmap *s2x;
USHORT c3;
c = (Cbuf *)(cbuf+1);
op_count = 0;
count *= 3;
wcount = i86_wcompare(s1, s2, count>>1);
wcount <<= 1;
if (wcount == count)
return(c); /* stupid way to say got nothing... */
for (;;)
{
/* first find out how many words to skip... */
c3 = (i86_bcompare(s1, s2, count)/3);
wcount = c3*3;
if ((count -= wcount) == 0)
goto OUT; /* same until the end... */
*c++ = c3;
s1 += wcount;
s2 += wcount;
op_count++;
/* figure out how long until the next worthwhile "skip" */
dif_count = 0;
bcount = count;
for (;;)
{
wcount = i86_bcontrast(s1,s2,bcount)/3;
dif_count += wcount;
wcount *= 3;
s1 += wcount;
s2 += wcount;
bcount -= wcount;
if (bcount >= 3)
{
if ((wcount = i86_bcompare(s1,s2,3)) == 3)
{
break;
}
else
{
dif_count += 1;
s1 += 3;
s2 += 3;
bcount -= 3;
}
}
else
{
break;
}
}
*c++ = dif_count;
dif_count *= 3;
s2 -= dif_count;
count -= dif_count;
for (;;)
{
if (dif_count == 0)
break;
dif_count -= 1;
*c++ = *s2++;
}
if (count <= 0)
break;
}
OUT:
*cbuf = op_count;
return(i86_enorm_ptr(c));
}