
#include "aai86.h"
#include "aaflisav.h"
#include "aafii.h"


static char *
fii_brun_comp_line(s1, cbuf, count)
Pixel *s1, *cbuf;
int count;
{
int wcount;
register char *c;
register int bcount;
int op_count;
char *start_dif;
int dif_count;
int same_count;

c = cbuf+1;
op_count = 0;
start_dif = s1;
dif_count = 0;
for (;;)
	{
	if (count < 3)
		{
		dif_count += count;
		while (dif_count > 0)
			{
			bcount = (dif_count < FLI_MAX_RUN ? dif_count : FLI_MAX_RUN );
			*c++ = -bcount;
			dif_count -= bcount;
			while (--bcount >= 0)
				*c++ = *start_dif++;
			op_count++;
			}
		*cbuf = op_count;
		return(i86_norm_ptr(c));
		}
	else
		{
		bcount = (count < FLI_MAX_RUN ? count : FLI_MAX_RUN );
		if ((wcount = i86_bsame(s1, bcount)) >= 3)
			{
			while (dif_count > 0)
				{
				bcount = (dif_count < FLI_MAX_RUN ? dif_count : FLI_MAX_RUN );
				*c++ = -bcount;
				dif_count -= bcount;
				while (--bcount >= 0)
					*c++ = *start_dif++;
				op_count++;
				}
			*c++ = wcount;
			*c++ = *s1;
			op_count++;
			s1 += wcount;
			count -= wcount;
			start_dif = s1;
			}
		else
			{
			dif_count++;
			s1++;
			count -= 1;
			}
		}
	}
}


Cbuf *fii_brun(Pixel *s1,Pixel *s2,USHORT *cbuf,int width,int height)
{
register char *c;
char *oc;
long total = 0;

/* store offset of 1st real line and set up for main line-at-a-time loop */
c = (char *)(cbuf);
while (--height >= 0)
	{
	oc = c;
	c = fii_brun_comp_line(s1,c,width);
	total += i86_ptr_to_long(c) - i86_ptr_to_long(oc);
	if (total >= 60000L)
		return(NULL);
	s1 += width;
	}
return(i86_enorm_ptr(c));
}

