/*
*	Yamana's Otomeza Taiou Tool
*		ジグザグ
*	
*	1995.08.06
*	
*/
#include	"otome_pi.h"

const char longname[] = "DRAW  : ジグザグ四角";
int			cnfg_max = 1;
PI_CNFG		cnfg[] =
			{	/* 1234567890123456 ,min,max,def,set */
				{ "ジグザグ大きさ"	,  2, 16,  8,  8 },
			};

#define	USE_ENV 	PI_SET_ENV
#define	USE_TYPE	PI_DRAW_BOXF

#include	"otome_pi.c"


/********************************/

int ZigZagBox( fr,wd )
FRAME	*fr;
int 	wd;
{
	int 	i;
	int 	lx,ly;
	char	*mem,*h0,*h1,*v0,*v1;
	int 	ph,pv;
	
	lx = ( fr->rdwx - fr->lupx + 1 )/ (wd*2) ;	/* 周期の数 */
	ly = ( fr->rdwy - fr->lupy + 1 )/ (wd*2) ;
	
	if( lx<2 || ly<2 )	return NOERR;
	
	ph = lx*2;		/* 点の数 */
	pv = ly*2;
	if( (mem = PI_MALLOC( (ph+pv+1)*4*2 ))==NULL )
		return ERROR;
	
	h0 = mem ;					/* ┌── ┐ */
	h1 = h0 + ph*4+2;			/*        │ */
	v0 = h1 + ph*4+2;			/* │        */
	v1 = v0 + pv*4+2;			/* └ ──┘ */
	
	WORD( h0 ) = WORD( h1 ) = ph;
	WORD( v0 ) = WORD( v1 ) = pv;
	
	for( i=0; i<ph ;i++ )
	{
		WORD( h0+2+i*4 ) = fr->lupx + wd*i ;
		WORD( h0+4+i*4 ) = fr->lupy + wd - (i & 1)*wd ;
		
		WORD( h1+2+i*4 ) = fr->lupx + wd*(i+1) ;
		WORD( h1+4+i*4 ) = fr->lupy + wd*ly*2 - (i & 1)*wd ;
	}
	for( i=0; i<pv ;i++ )
	{
		WORD( v0+2+i*4 ) = fr->lupx + (i & 1)*wd ;
		WORD( v0+4+i*4 ) = fr->lupy + wd*(i+1) ;
		
		WORD( v1+2+i*4 ) = fr->lupx + wd*lx*2 - wd + (i & 1)*wd ;
		WORD( v1+4+i*4 ) = fr->lupy + wd*i ;
	}
	
	EGB_connect( EgbPtr, h0 );
	EGB_connect( EgbPtr, h1 );
	EGB_connect( EgbPtr, v0 );
	EGB_connect( EgbPtr, v1 );
	
	PI_FREE( mem );
	return NOERR;
}

/********************************/
#if 0

int get_fr( fr, wd )
FRAME	*fr;
int 	wd;
{
	char	*MosPtr;
	int 	ch,mx,my,ox,oy;
	int 	ex,ey;
	int 	cancel = 0;
	
	if( (MosPtr = PI_MALLOC( MosWorkSize ))==NULL )
		return PI_ERROR_NO_MEMORY;
	
	MOS_rdpos( &ch, &mx, &my );
	MOS_start( MosPtr,  MosWorkSize );
	MOS_setpos( mx,my );
	
	EGB_writePage( EgbPtr, EGB_getWritePage(0,0) );
	EGB_writeMode( EgbPtr, EGB_XOR );
	EGB_paintMode( EgbPtr, 0x02 );
	EGB_color	 ( EgbPtr, EGB_FORECOL, -1 );
	
	fr->lupx = fr->rdwx = mx;
	fr->lupy = fr->rdwy = my;
	EGB_rectangle( EgbPtr, fr );
	
	do
	{	MOS_rdpos( &ch, &mx, &my );
	}while( ch & MOS_LEFT );
	
	ex = fr->lupx;
	ey = fr->lupy;
	while( 1 )
	{
		do
		{	ox=mx,oy=my;
			MOS_rdpos( &ch, &mx, &my );
			
		}while( ch==0 && ox==mx && oy==my );
		
		if( ch & 3 )	break;
		if( abs(mx - ex)<wd || abs(my - ey)<wd )
			continue;
		
		EGB_rectangle( EgbPtr, fr );
		
		ex = fr->lupx + (mx - fr->lupx)/wd*wd ;
		ey = fr->lupy + (my - fr->lupy)/wd*wd ;
		
		fr->rdwx = ex;
		fr->rdwy = ey;
		EGB_rectangle( EgbPtr, fr );
		
	}
	EGB_rectangle( EgbPtr, fr );
	
	if( ch & MOS_RIGHT )	cancel = 1;
	do
	{	MOS_rdpos( &ch, &mx, &my );
	}while( ch & 3 );
	
	MOS_end();
	PI_FREE( MosPtr );
	
	return cancel;
}
#endif


int APL_exec()
{
	int 	width,tmp;
	
	width= cnfg[0].val;		/* ジグザグの幅 */
	
/*
	if( get_fr( &fr, width ) )
		return NOERR;
	if( fr.lupx > fr.rdwx )	tmp=fr.lupx, fr.lupx=fr.rdwx, fr.rdwx=tmp;
	if( fr.lupy > fr.rdwy )	tmp=fr.lupy, fr.lupy=fr.rdwy, fr.rdwy=tmp;
*/
	EGB_writePage( EgbPtr, pi_imge->page );
	EGB_writeMode( EgbPtr, EGB_PSET );
	EGB_paintMode( EgbPtr, 0x02 );
	EGB_color	 ( EgbPtr, EGB_FORECOL, pi_data->fore_color);
	
	if( ZigZagBox( (FRAME*)pi_para->gpara, width ) )
		return ERROR;
	
	memcpy( ret_fr, pi_para->gpara, sizeof(FRAME) );
	
	return NOERR;
}
