/*
*	Yamana's Otomeza Plug-in Tool
*		集中線
*	
*	1995.08.20	
*	1995.08.27	高速化
*	
*/
#include	"otome_pi.h"
#include	"costbl.h"
#include	"my_hatch.h"

const char longname[]  = "DRAW  : 集中線";
int			cnfg_max = 4;
PI_CNFG		cnfg[] =
			{	/* 1234567890123456 ,min,max,def,set */
				{ "線の間隔"		, 0,  21,  4,  4 },
				{ "線の太さ"		, 0,  21,  4,  4 },
				{ "集中の方向"		, 0,   2,  0,  0 },
				{ "濃度"			, 0,  11,  0,  0 }
			};

#define	USE_ENV		PI_SET_ENV
#define	USE_TYPE	PI_DRAW_ELLF

#include	"otome_pi.c"

/********************************/

#define	set_hatch()	\
		if( pat-pstep>= minpat )	pat -= pstep ;\
							else	pat =  minpat;\
		EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
						HATCH_X, HATCH_Y, hatchData[pat] );

/* 外周円弧と内周円弧を計算し描画する */
/* 扇形を描くより、計算量は増えるが断然速い。*/
/* 同じ円弧を再計算している点に高速化の余地あり。*/
#define	draw_line()	\
		for( j=0; j<256; j+=(size+m) )\
		{	p = para+2;\
			for( i=size; i>=0 ; i--,p+=4 )\
			{	WORD( p   ) = daen->x + (l * cos256( i+j )    >>8 );\
				WORD( p+2 ) = daen->y + (l * sin256( i+j )*rry>>16);\
			}\
			for( i=0; i<=size ; i++,p+=4 )\
			{	WORD( p   ) = daen->x + ((l-lstep)*cos256( i+j )    >>8 );\
				WORD( p+2 ) = daen->y + ((l-lstep)*sin256( i+j )*rry>>16);\
			}\
			EGB_polygon( EgbPtr, para );\
		}

int consentrate( daen, m, size,mode,pat )
ELLIPSE	*daen;
int 	m,size,mode,pat ;
{
	int 	r,rry;
	int 	i,j;
	int 	l, lstep, pstep;
	int 	hpat,minpat;
	
	char	*para,*p;
	
	if( daen->ry==0 || daen->rx==0 )	return ERROR;
	
	if( (para = (char*)PI_MALLOC( 2+(size+1)*4*2 ))==NULL )
		return PI_ERROR_NO_MEMORY;
	
	hpat = HATCH_MAX - pat ;
	if( !hpat )	return PI_ERROR_ETC;
	
	r   = daen->rx;
	rry = daen->ry*256 / daen->rx;
	
	if( r > hpat )
	{	lstep = r/hpat;
		pstep = 1;
	}else
	{	lstep = 2;				/* 濃い色に偏りがちなので */
		pstep = hpat / r * 2 ;	/* なるべく小さくなるよう精度を落とす */
	}
	minpat	= pat;
	pat 	= HATCH_MAX + pstep;
	WORD( para ) = (size+1)*2;
	if( size==0 )	m=256;
	
	if( mode==0 )	/* ↓中心部分が描画されないのを防ぐため */
	{	for( l=(r/lstep*lstep); l>=lstep; l-=lstep )
		{	set_hatch();
			draw_line();
		}
	}else if( mode==1 )	/* ↓外周部分が描画されないのを防ぐ */
	{	for( l=lstep; l<=(r+lstep); l+=lstep )
		{	set_hatch();
			draw_line();
		}
	}else
	{	EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
						HATCH_X, HATCH_Y, hatchData[minpat] );
		l = lstep = r+lstep;	/* 外周部対策 */
		draw_line();
	}
	
	PI_FREE( para );
	return NOERR;
}


/********************************/

int APL_exec()
{
	int 	line,size,mode,pat;
	
	line = cnfg[0].val * 2;
	size = cnfg[1].val * 2+1;
	mode = cnfg[2].val;
	pat  = cnfg[3].val*4;
	
	EGB_writePage	( EgbPtr, PI_PAGE );
	EGB_paintMode	( EgbPtr, EGB_PAINT_HATCHFF );
	EGB_color		( EgbPtr, EGB_PAINTCOL, PI_FORECOL );
	
	return consentrate( (ELLIPSE *)g_para, line, size, mode, pat );
	
}

