/****************************************************************************/
/*																			*/
/*		｢乙女座｣用プラグインツールサンプル									*/
/*																			*/
/*		描画色で格子を描きます。幅、高さは任意に指定できます。				*/
/*																			*/
/*		※これは、描画系ツールでイメージを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";
int			cnfg_max = 3;
PI_CNFG		cnfg[3] = {
				{"原点 <-> 開始", 0, 1, 0, 0 },
				{"横幅", 2, 500, 10, 10 },
				{"縦幅", 2, 500, 10, 10 }
			};
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)
{
	FRAME	fr;
	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_BOXF;			/* Type				*/
		(* pi_type).env1 = PI_SET_ENV;				/* 環境設定フラグ	*/
		(* 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_DRAW_BOXF )	//  形式の確認
			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:											/* データ			*/
		*((int *)arg1) = cnfg_max;					//  データ数
		*((int *)arg2) = (int)cnfg;					//  データアドレス
		break;
	}
	return ret;
}

/****************************************************************************/
/*	描画本体																*/
/****************************************************************************/

int APL_exec(FRAME *fr)
{
	int	i,j,w,h,m;
	int x,y;
	struct {
		short n;
		POINT pt[2];
	} par;
	
	EGB_writePage(guiEgbptr,pi_imge->page);
	EGB_color(guiEgbptr,0,PI_FORE_COLOR);
	EGB_paintMode(guiEgbptr,0x02);

	m = cnfg[0].val;
	w = cnfg[1].val;
	h = cnfg[2].val;

	if( m == 1 ) {
		//	描画指定位置(左上)からグリッドラインを描く
		x = abs(fr->rdwx-fr->lupx)+1;
		y = abs(fr->rdwy-fr->lupy)+1;
		par.n = 2;
		par.pt[0].x = 0;
		par.pt[1].x = pi_imge->size.x-1;
		for(j=0;j<(y+(h-1)/h);j++) {
			par.pt[0].y = par.pt[1].y = fr->lupy + j*h;
			EGB_connect(guiEgbptr,(char *)&par);
		}
		par.pt[0].y = 0;
		par.pt[1].y = pi_imge->size.y-1;
		for(i=0;i<(x+(w-1)/w);i++) {
			par.pt[0].x = par.pt[1].x = fr->lupx + i*w;
			EGB_connect(guiEgbptr,(char *)&par);
		}
	} else {
		//	原点からグリッドラインを描く
		x = pi_imge->size.x;
		y = pi_imge->size.y;
		par.n = 2;
		par.pt[0].x = 0;
		par.pt[1].x = pi_imge->size.x-1;
		for(j=0;j<(y+(h-1)/h);j++) {
			par.pt[0].y = par.pt[1].y = j*h;
			EGB_connect(guiEgbptr,(char *)&par);
		}
		par.pt[0].y = 0;
		par.pt[1].y = pi_imge->size.y-1;
		for(i=0;i<(x+(w-1)/w);i++) {
			par.pt[0].x = par.pt[1].x = i*w;
			EGB_connect(guiEgbptr,(char *)&par);
		}
	}

	ret_fr = fr;

	return 0;
}

void main(){}
