/****************************************************************************/
/*																			*/
/*		｢乙女座｣用プラグインツールサンプル									*/
/*																			*/
/*		指定した範囲を暈します。(16,256ではうまくいかないと思う｡)			*/
/*																			*/
/*		※これは、エフェクト系ツールでイメージをEGB関数を使用する例です。	*/
/*		※まぁ、大したソースではないので、流用したければ御事由にお使い		*/
/*		  下さい｡															*/
/****************************************************************************/

/*--------------------------------------------------------------------------*/
/*		乙女座用画像エフェクターの作成方法									*/
/*																			*/
/*	○大まかな流れ															*/
/*	  乙女座本体からイメージのアドレスを貰い、指定した範囲にエフェクトを	*/
/*	  行います。イメージを直接操作していますので、アドレスを破壊したら、	*/
/*	  乙女座も暴走します。													*/
/*																			*/
/*	○注意事項																*/
/*	  tpspin.hをincludeして下さい｡											*/
/*	  マロックは(char *)pi_data->func1を使用して下さい｡						*/
/*	  フリーは(void *)pi_data->func2を使用して下さい｡						*/
/*	  エラーはヘッダーにあるPI_ERROR_XXXXXをセットして返して下さい｡			*/
/*	  ワーク等に使うローカルﾊﾞｯﾌｧのﾎﾟｲﾝﾀｰはﾌﾟﾗｸﾞｲﾝﾂｰﾙ内で宣言して下さい｡	*/
/*	  また、使い終わったら必ず開放して下さい｡								*/
/*																			*/
/*	○本体に返すパラメーター												*/
/*	　特になし																*/
/*																			*/
/*--------------------------------------------------------------------------*/
#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)

/****************************************************************************/
int		pinHead(int, void *, void *, void *, void *);
int		APL_exec();
void	main();
/****************************************************************************/

const char longname[] = "ぼかし for OTOMEZA";
const char shortname[] = "OT";
PI_TYPE		*pi_type;
PI_DATA		*pi_data;
PI_IMAGE	*pi_imge;
PI_PARA		*pi_para;
FRAME		*ret_fr;						/* 画像転送範囲			*/
char		*guiEgbptr;

int pinHead(int service, void *arg1, void *arg2, void *arg3, void *arg4)
{
	char	*g_para;
	int		ret = 0;
	FRAME	fr;
	
	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_EFFC_ALORSL;			/* Type				*/
		(* pi_type).env1 = 0;						/* 環境設定フラグ	*/
		(* pi_type).env2 = 0;						/* リザーブフラグ	*/
		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_EFFC_ALORSL )	//  形式の確認
			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(&fr);
		if( ret < 0 ){
			return( -1 );
		}
		break;
	case 4:											/* 終了				*/
		break ;
	case 5:											/* データ			*/
		break;
	}
	return ret;
}

/****************************************************************************/
/*																			*/
/****************************************************************************/

int APL_exec(FRAME *fr)
{
	char para[64];
	int	n=0,size,a=100,b=100,c,d;
	char *work;

	//	ページのセット
	EGB_writePage(guiEgbptr,pi_imge->page);
	WORD(para+ 0) = 4;
	WORD(para+ 2) = fr->lupx;
	WORD(para+ 4) = fr->lupy;
	WORD(para+ 6) = fr->rdwx;
	WORD(para+ 8) = fr->lupy;
	WORD(para+10) = fr->rdwx;
	WORD(para+12) = fr->rdwy;
	WORD(para+14) = fr->lupx;
	WORD(para+16) = fr->rdwy;
	if( EGB_region(guiEgbptr,&n,&size,&a,&b,&c,&d,para) == 0 ) {
		work = PI_MALLOC( size );
		if( work != NULL ) {
			EGB_resolve(guiEgbptr,work);
			PI_FREE( work );
		}
	}
	return 0;
}

void main(){}
