#include "smple00.h"

g_softnessFilter( BASICPARA *para, int rate )
{
	unsigned char a[10][4] ;
	int i, x, y, k1, k2, total ;

	int cMax, x1, y1, x2, y2 ;	/* 引数を記憶する変数 */
	int (*read1)() ;
	int (*write)() ;

	/* 引数を記憶 */
	cMax = para->colorMax ;		/* RGBデータの最大値 */
	x1 = para->lupx ;			/* 領域の対角座標 */
	y1 = para->lupy ;
	x2 = para->rdwx ;
	y2 = para->rdwy ;
	read1 = para->read1 ;		/* ｱﾝﾄﾞｩﾊﾞｯﾌｧ読込関数 */
	write = para->write ;		/* ﾒｲﾝﾊﾞｯﾌｧ書込関数 */

	k1 = rate >> 3 ;		/* オペレータの係数の設定 */
	k2 = 256 - k1*8 ;

	for( y = y1 ; y <= y2 ; y++ )
	{
		for( x=x1 ; x <= x2 ; x++ )
		{
			read1( x-1, y-1, a[0] ) ;	/* ｱﾝﾄﾞｩﾊﾞｯﾌｧ */
			read1( x,   y-1, a[1] ) ;	/* 3×3ドット */
			read1( x+1, y-1, a[2] ) ;	/* データ読込 */
			read1( x-1, y,   a[3] ) ;
			read1( x,   y,   a[4] ) ;
			read1( x+1, y,   a[5] ) ;
			read1( x-1, y+1, a[6] ) ;
			read1( x,   y+1, a[7] ) ;
			read1( x+1, y+1, a[8] ) ;

			for( i=0 ; i<3 ; i++ )	/* RGBを3回にわけて計算 */
			{
				/* たたみ込みの計算 */
				total = k1*( (int)(a[0][i]) + a[1][i] + a[2][i] +
							       a[3][i]            + a[5][i] +
							       a[6][i]  + a[7][i] + a[8][i]
						   ) + k2*( (int)(a[4][i]) ) ;
				total = (total + 128) >> 8 ;	/* 四捨五入 */
				if( total < 0 )total = 0 ;		/* ﾘﾐｯﾀｰ */
				if( total > cMax )total = cMax ;
				a[9][i] = total ;	/* a[9]にﾃﾞｰﾀを書込 */
			}
			write( x, y, a[9] ) ;	/* ﾒｲﾝﾊﾞｯﾌｧに書込 */
		}
	}
	return 0 ;
}
