/*****************************************************************************/
/* カットイメージデータ書き出し */
/*****************************************************************************/

#include <stdio.h>
#include "defines.h"
#include "aig.h"
#include "aiggraph.h"

/*****************************************************************************/

int cut_write(FILE *fp,unchar *buff,int wx,int wy)
/* 白黒画像データをカットファイルに変換する */
{
int x,y,i,size,b,j,cutx,cutax;
unchar c,cc;
unchar cflags[1024/8]; /* 圧縮フラグ */
unchar  bline[1024/8]; /* １行前のラインのデータ */
unchar   line[1024/8]; /* 現在ラインのデータ */
unchar   data[1024/8]; /* 0x00以外のデータ */
/* 最大サイズで確保：８ドット１バイトになるので１／８で良い */

	/* サイズ計算 */
	cutx=(wx+7)/8;	  /* 圧縮前１ラインデータサイズ */
	cutax=(cutx+7)/8; /* 圧縮フラグサイズ */
	
	/* 最初の行の１つ前の行＝全部０のライン */
	for (x=0;x<cutx;x++) bline[x]=0;
	
	for (y=0;y<wy;y++) {
		/* 1line wx dot -> wx/8 bytes 圧縮 : Green plane */
		buff=g_line_pres8(buff,wx,PGREEN,line);
		
		/* １つ前の行と全く同じかどうかを判定 */
		/* ただし、最初のラインの時はしない */
		if (y>0 && memcmp(line,bline,cutx)==0) { /* 全く同じとき */
			fputc(0x01,fp); /* １行上と全く同じの印 */
			continue; /* 次の行へ */
		}
		
		/* １つ前の行とXOR */
		for (x=0;x<cutx;x++) {
			c=line[x];
			line[x]^=bline[x];
			bline[x]=c; /* 前の行のデータ <- 今の行のデータ */
		}
		
		/* 圧縮フラグ作成 ＆ 書き込みデータサイズ算出 ＆ 実書き出しデータ集合 */
		size=i=0;
		for (x=0;x<cutx;x+=8) {
			b=BIT7;
			cc=0;
			for (j=0;j<8 && x+j<cutx;j++) {
				c=line[x+j];
				if (c) {
					cc|=b;		/* 圧縮フラグＯＮ */
					data[size++]=c; /* 00以外のデータ集合 */
				}
				b>>=1;
			}
			cflags[i++]=cc;
		}
		
		/* データ書き出し */
		fputc(size+1+cutax,fp); /* 1ﾗｲﾝ総ﾃﾞｰﾀﾊﾞｲﾄ数＝ﾒｲﾝﾃﾞｰﾀ+ｻｲｽﾞを表わす1ﾊﾞｲﾄ+圧縮ﾌﾗｸﾞ */
		fwrite(cflags,i,1,fp);	/* 圧縮フラグ */
		fwrite(data,size,1,fp); /* メインデータ：00以外 */
	}
	return(ferror(fp));
}

/*****************************************************************************/
