/****************************************************************************/
/*																			*/
/*		｢乙女座｣用プラグインツールサンプル									*/
/*																			*/
/*		消しゴムツール														*/
/*		背景色で消去します。												*/
/*																			*/
/*		※これは、描画系ツールでイメージをEGB関数を使用する例です。			*/
/*		  また、環境設定値の使用例でもあります。							*/
/*		※まぁ、大したソースではないので、流用したければ御事由にお使い		*/
/*		  下さい｡															*/
/****************************************************************************/

/*--------------------------------------------------------------------------*/
/*		乙女座用画像描画系ツールの作成方法									*/
/*																			*/
/*	○大まかな流れ															*/
/*	  乙女座本体からイメージのアドレスを貰い、指定した範囲に描画を行い		*/
/*	  ます。イメージを直接操作していますので、アドレスを破壊したら、		*/
/*	  乙女座も暴走します。													*/
/*																			*/
/*	○注意事項																*/
/*	  tpspin.hをincludeして下さい｡											*/
/*	  マロックは(char *)pi_data->func1を使用して下さい｡						*/
/*	  フリーは(void *)pi_data->func2を使用して下さい｡						*/
/*	  エラーはヘッダーにあるPI_ERROR_XXXXXをセットして返して下さい｡			*/
/*	  ワーク等に使うローカルﾊﾞｯﾌｧのﾎﾟｲﾝﾀｰはﾌﾟﾗｸﾞｲﾝﾂｰﾙ内で宣言して下さい｡	*/
/*	  また、使い終わったら必ず開放して下さい｡								*/
/*																			*/
/*	○本体に返すパラメーター												*/
/*	　ret_fr:描画範囲を返す													*/
/*																			*/
/*--------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <wgb.h>
#include <egb.h>
#include <mos.h>
#include "tpspin.h"


#define PI_MALLOC( size )	((char*)pi_data->func1(size))
#define PI_FREE( buf )		(pi_data->func2(buf))
#define FNAME				(pi_data->fname)
#define PI_FORE_COLOR		(pi_data->fore_color)
#define PI_BACK_COLOR		(pi_data->back_color)

/****************************************************************************/
int		pinHead(int, void *, void *, void *, void *);
int		APL_exec();
void	main();
/****************************************************************************/

const char longname[] = "消しゴム for OTOMEZA";
const char shortname[] = "OT";				//	必ず"OT"を指定して下さい｡
int			cnfg_max = 2;
PI_CNFG		cnfg[2] = {
				{"■ <-> ●", 0, 1, 0, 0 },
				{"サイズ", 1, 32, 32, 32 }
			};
PI_TYPE		*pi_type;
PI_DATA		*pi_data;
PI_IMAGE	*pi_imge;
PI_PARA		*pi_para;
FRAME		*ret_fr;						/* 画像転送範囲			*/
char		*guiEgbptr;
char		*g_para;

int pinHead(int service, void *arg1, void *arg2, void *arg3, void *arg4)
{
	int		ret;
	
	ret = 0;
	switch (service) {
	case 0:											/* 正式名称			*/
		strcpy((char *)arg1, longname);
		break;
	case 1:											/* 省略名称			*/
		strcpy((char *)arg1, shortname);
		break;
	case 2:											/* 初期化			*/
		pi_type = (PI_TYPE *)arg1;
		strcpy((* pi_type).name, longname);			/* モジュール名		*/
		(* pi_type).type = PI_DRAW_DOT;				/* Type				*/
		(* pi_type).env1 = PI_SET_ENV;				/* 環境設定フラグ	*/
		(* pi_type).env2 = PI_USER_PEN;				/* リザーブフラグ	*/
		break;
	case 3:											/* 実行				*/
		/*--------------------------------------------------------------*/
		/* 必要なパラメタをコピーしておく								*/
		/*--------------------------------------------------------------*/
		pi_data = (PI_DATA *)arg1;
		pi_imge = (PI_IMAGE *)arg2;
		pi_para = (PI_PARA *)arg3;
		ret_fr  = (FRAME *)arg4;
		if( (* pi_para).type != PI_DRAW_DOT )	//  形式の確認
			break;
		g_para  = (* pi_para).gpara;
	//	fr.lupx = WORD(g_para + 0);				// 描画座標の退避
	//	fr.lupy = WORD(g_para + 2);
	//	fr.rdwx = WORD(g_para + 4);
	//	fr.rdwy = WORD(g_para + 6);
		guiEgbptr = pi_imge->egbWork;			//	EGBワーク
		/*--------------------------------------------------------------*/
		/* 実行部の呼び出し(パラメタ形式は自由)							*/
		/*--------------------------------------------------------------*/
		ret = APL_exec();
		if( ret < 0 ){
			return( -1 );
		}
		break;
	case 4:											/* 終了				*/
		break ;
	case 5:											/* データ			*/
		*((int *)arg1) = cnfg_max;					//  データ数
		*((int *)arg2) = (int)cnfg;					//  データアドレス
		break;
	}
	return ret;
}

/****************************************************************************/
/*	ケシゴムツール															*/
/****************************************************************************/

int APL_exec()
{
	int		x,y;
	int		type;
	int		size;
	FRAME	fr;
	
	x = WORD(g_para + 2);
	y = WORD(g_para + 4);
	type = cnfg[0].val;
	size = cnfg[1].val;
	
	EGB_paintMode(guiEgbptr,0x20);
	EGB_color(guiEgbptr,2,PI_BACK_COLOR);
	if( type == 0 ) {
		fr.lupx = x-size/2;
		fr.lupy = y-size/2;
		fr.rdwx = x+size/2;
		fr.rdwy = y+size/2;
		EGB_rectangle(guiEgbptr,(char *)&fr);
		*ret_fr = fr;
	} else {
		fr.lupx = x;
		fr.lupy = y;
		fr.rdwx = size/2;
		fr.rdwy = size/2;
		EGB_ellipse(guiEgbptr,(char *)&fr);
		ret_fr->lupx = x-size/2-1;
		ret_fr->lupy = y-size/2-1;
		ret_fr->rdwx = x+size/2+1;
		ret_fr->rdwy = y+size/2+1;
	}

	return 0;
}

void main(){}
