/* << MSC V5.1 >> *************************************************************
**
**	GRP.LIB  for FMRｼﾘｰｽﾞ & PC98
**
**	CREATE : 1990.09.19
**	FINISH : 1990.09.19
**
**	< NOTES >
**	TABS = 4
**
**	< HISTORY >
**	1990.09.19 : CREATE
**	1991.01.15 : ｲﾒｰｼﾞ操作関数追加｡
**	1991.01.17 : FMR用とPC98用を同じｿｰｽにした。
**
**	All Rights Reserved, Copyright (C) Y.Hirata 1990-1991.
**
**	Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include "grp.h"

struct videoconfig far	_v_config ;

/**************************  ｸﾞﾗﾌｨｯｸ環境の初期設定  **************************/
void far GRP_init()
{
/*	ｶｰｿﾙ状態設定 : ｶｰｿﾙ非表示												*/
	_displaycursor( _GCURSOROFF ) ;
/*	ｸﾞﾗﾌｨｯｸ環境の取得														*/
	_getvideoconfig( &_v_config ) ;
/*	画面ﾓｰﾄﾞ設定 : ｶﾗｰ - ｸﾞﾗﾌｨｯｸ											*/
#ifdef FMR
	_setvideomode( _FMRESSCOLOR ) ;
#elif defined( PC98 )
	_setvideomode( _98RESS16COLOR ) ;
#endif
/*	書き込みﾍﾟｰｼﾞの設定 : page 0											*/
	_setactivepage( 0 ) ;
/*	表示ﾍﾟｰｼﾞ設定 : page 0													*/
	_setvisualpage( 0 ) ;
/*	ｸﾘｯﾌﾟ領域の設定 : XS,YS - XE,YE											*/
	_setviewport( VIEW_XS,VIEW_YS,VIEW_XE,VIEW_YE ) ;
/*	ﾃｷｽﾄ表示領域の設定 : 25行 80桁											*/
	_settextwindow( (short)(0),(short)(0),(short)(25),(short)(80) ) ;
}

/**************************  ｸﾞﾗﾌｨｯｸ環境の終了設定  **************************/
void far GRP_end()
{
#ifdef FMR
	union REGS	regs ;
#endif

/*	画面ﾓｰﾄﾞ設定 : ｶﾗｰ - ｸﾞﾗﾌｨｯｸ											*/
	_setvideomode( _DEFAULTMODE ) ;
/*	書き込みﾍﾟｰｼﾞの設定 : page 0											*/
	_setactivepage( 0 ) ;
/*	表示ﾍﾟｰｼﾞ設定 : page 0													*/
	_setvisualpage( 0 ) ;
/*	ｶｰｿﾙ状態設定 : ｶｰｿﾙ表示													*/
	_displaycursor( _GCURSORON ) ;

#ifdef FMR
	regs.h.ah = 0x01 ;
	regs.h.al = 0x00 ;
	int86( 0x91,&regs,&regs ) ;
#endif
}

/*****************************  ｲﾒｰｼﾞｻｲｽﾞ取得  *******************************/
long far GRP_imagesize( short x1,short y1,short x2,short y2 )
/*
**	x1,y1 : 左上座標
**	x2,y2 : 右下座標
*/
{
	return( _imagesize( x1,y1,x2,y2 ) ) ;
}

/*****************************  ｲﾒｰｼﾞﾃﾞｰﾀ取得  *******************************/
void far GRP_getBlock( short x1,short y1,short x2,short y2,char *image )
/*
**	x1,y1 : 左上座標
**	x2,y2 : 右下座標
**	image : ｲﾒｰｼﾞ格納領域先頭ｱﾄﾞﾚｽ
*/
{
	_getimage( x1,y1,x2,y2,image ) ;
}

/*****************************  ｲﾒｰｼﾞﾃﾞｰﾀ展開  *******************************/
void far GRP_putBlock( short x,short y,char *image,short action )
/*
**	x,y    : ｲﾒｰｼﾞ展開開始左上座標
**	image  : ｲﾒｰｼﾞ格納領域先頭ｱﾄﾞﾚｽ
**	action : ｲﾒｰｼﾞ展開ﾓｰﾄﾞ
*/
{
	_putimage( x,y,image,action ) ;
}

/******************************  ﾊﾟﾚｯﾄ色設定  ********************************/
void far GRP_palette( short color, long pixel )
/*
**	color : 色番号
**	pixel : RGBを各1ﾊﾞｲﾄで指定(FMR:上位4ﾋﾞｯﾄ,PC98:下位4ﾋﾞｯﾄ,のみ有効)
*/
{
	_remappalette( color,pixel ) ;
}

/**************************  論理座標上の色取得  *****************************/
short far GRP_getpixel( short x, short y )
/*
**	x,y : 座標
*/
{
	return( _getpixel( x,y ) ) ;
}

/***************************  書き込みﾍﾟｰｼﾞの設定  ***************************/
void far GRP_writePage( short page )
{
	_setactivepage( page ) ;
}

/*****************************  表示ﾍﾟｰｼﾞの設定  *****************************/
void far GRP_displayPage( short page )
{
	_setvisualpage( page ) ;
}

/*******************************  背景色設定  ********************************/
void far GRP_bkcolor( long pixel )
/*
**	pixel : 背景色をRGB各1ﾊﾞｲﾄで指定(FMR:上位4ﾋﾞｯﾄ,PC98:下位4ﾋﾞｯﾄ,のみ有効)
*/
{
	_setbkcolor( pixel ) ;
}

/*******************************  背景色取得  ********************************/
long far GRP_getbkcolor( void )
/*
**	戻り値 : 背景色のﾋﾟｸｾﾙ値(RGB各1ﾊﾞｲﾄ)で戻る
**			(FMR:上位4ﾋﾞｯﾄ,PC98:下位4ﾋﾞｯﾄ,のみ有効)
*/
{
	return( _getbkcolor() ) ;
}

/*******************************  描画色設定  ********************************/
void far GRP_color( short colorno )
/*
**	colorno : 色番号
*/
{
	_setcolor( colorno ) ;
}

/*******************************  描画色取得  ********************************/
short far GRP_getcolor( void )
/*
**	戻り値 : 現在の描画色番号
*/
{
	return( _getcolor() ) ;
}

/*******************************  ﾌｨﾙﾏｽｸ設定  ********************************/
void far GRP_setfillmask( unsigned char *mask )
{
	_setfillmask( mask ) ;
}

/*******************************  線形状設定  ********************************/
void far GRP_linestyle( unsigned short style )
/*
**	style : 線形状(実線:0xFFFF,点線:0x5555/0xAAAA,破線:0xEEEE/0x7777)
*/
{
	_setlinestyle( style ) ;
}

/******************************  ｶﾚﾝﾄ位置設定  *******************************/
void far GRP_setposion( short x, short y )
/*
**	x,y : 描画開始位置
*/
{
	_moveto( x,y ) ;
}

/***************************  論理座標原点の設定  ****************************/
void far GRP_setlogorg( short x, short y )
/*
**	x,y : 論理座標原点とする物理座標
*/
{
	_setlogorg( x,y ) ;
}

/****************************  ｸﾘｯﾌﾟ領域の設定  *****************************/
void far GRP_viewport( short x1, short y1, short x2, short y2 )
/*
**	x1,y1 : ｸﾘｯﾌﾟ領域の左上座標(物理座標)
**	x2,y2 : ｸﾘｯﾌﾟ領域の右下座標(物理座標)
**
**	☆ 本関数実行後、論理座標原点は (x1,y1) に設定される。
*/
{
	_setviewport( x1,y1,x2,y2 ) ;
}

/*****************************  ｸﾞﾗﾌｨｯｸ画面ｸﾘｱ  ******************************/
void far GRP_clearScreen( short sw )
/*
**	sw : 画面ｸﾘｱ制御
*/
{
	switch ( sw ) {
		case CLEARGRAPH :		/*  ｸﾞﾗﾌｨｯｸ画面だけを背景色で塗り潰す	*/
			_clearscreen( _GCLEARGRAPH ) ;
			break ;
		case CLEARTEXT :		/*  ﾃｷｽﾄ画面だけを背景色で塗り潰す		*/
			_clearscreen( _GCLEARTEXT ) ;
			break ;
		case CLEARSCREEN :		/*  ｸﾞﾗﾌｨｯｸとﾃｷｽﾄ画面を背景色で塗り潰す	*/
		default :
			_clearscreen( _GCLEARSCREEN ) ;
	}
}

/*********************************  線描画  **********************************/
void far GRP_line( short x1, short y1, short x2, short y2 )
/*
**	x1,y1 : 線描画開始位置
**	x2,y2 : 線描画終了位置
*/
{
	_moveto( x1,y1 ) ;
	_lineto( x2,y2 ) ;
}

/*********************************  点描画  **********************************/
void far GRP_pset( short x, short y )
/*
**	x,y : 点描画位置
*/
{
	_moveto( x,y ) ;
	_lineto( x,y ) ;
}

/********************************  矩形描画  *********************************/
void far GRP_rectangle( short x1, short y1, short x2, short y2, short control )
/*
**	x1,y1   : 矩形の左上座標
**	x2,y2   : 矩形の右下座標
**	control : 真ならば、矩形内を塗り潰す｡ 偽ならば、境界線のみ描画｡
*/
{
	if ( control )											/*  塗り潰し	*/
		_rectangle( _GFILLINTERIOR,x1,y1,x2,y2 ) ;
	else													/*  境界線だけ	*/
		_rectangle( _GBORDER,x1,y1,x2,y2 ) ;
}

/*********************************  弧描画  **********************************/
void far GRP_arc( short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4 )
/*
**	x1,y1   : 弧が内接する長方形の左上座標
**	x2,y2   : 弧が内接する長方形の右下座標
**	x3,y3   : 開始ﾍﾞｸﾄﾙ(ﾍﾞｸﾄﾙの基点は、外接する長方形の中心です)
**	x4,y4   : 終了ﾍﾞｸﾄﾙ(ﾍﾞｸﾄﾙの基点は、外接する長方形の中心です)
**
**	☆ 弧は、開始ﾍﾞｸﾄﾙを描画開始点として、終了ﾍﾞｸﾄﾙまでを反時計まわりに描画
**	   します。
*/
{
	_arc( x1,y1,x2,y2,x3,y3,x4,y4 ) ;
}

/*********************************  円描画  **********************************/
void far GRP_circle( short x, short y, short r, short control )
/*
**	x,y     : 円の中心座標
**	r       : 円の半径
**	control : 真ならば、円内を塗り潰す｡ 偽ならば、境界線のみ描画｡
*/
{
	_moveto( x,y ) ;
	if ( control )											/*  塗り潰し	*/
		_ellipse( _GFILLINTERIOR,x-r,y-r,x+r,y+r ) ;
	else													/*  境界線だけ	*/
		_ellipse( _GBORDER,x-r,y-r,x+r,y+r ) ;
}

/********************************  楕円描画  *********************************/
void far GRP_ellipse( short x, short y, short rx, short ry, short control )
/*
**	x,y     : 楕円の中心座標
**	rx,ry   : 楕円のX軸方向,Y軸方向のそれぞれの半径
**	control : 真ならば、楕円内を塗り潰す｡ 偽ならば、境界線のみ描画｡
*/
{
	_moveto( x,y ) ;
	if ( control )											/*  塗り潰し	*/
		_ellipse( _GFILLINTERIOR,x-rx,y-ry,x+rx,y+ry ) ;
	else													/*  境界線だけ	*/
		_ellipse( _GBORDER,x-rx,y-ry,x+rx,y+ry ) ;
}

/********************************  扇形描画  *********************************/
void far GRP_pie( short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short control )
/*
**	x1,y1   : 楕円が内接する長方形の左上座標
**	x2,y2   : 楕円が内接する長方形の右下座標
**	x3,y3   : 開始ﾍﾞｸﾄﾙ(ﾍﾞｸﾄﾙの基点は、外接する長方形の中心です)
**	x4,y4   : 終了ﾍﾞｸﾄﾙ(ﾍﾞｸﾄﾙの基点は、外接する長方形の中心です)
**	control : 真ならば、扇形内を塗り潰す｡ 偽ならば、境界線のみ描画｡
**
**	☆ 弧は、開始ﾍﾞｸﾄﾙを描画開始点として、終了ﾍﾞｸﾄﾙまでを反時計まわりに描画
**	   します。また、指定された長方形に内接する楕円の一部となります。
**	   扇形は、楕円の弧の両端と中心を結んだものとなります。また、楕円と長方
**	   形の中心は同じです。
*/
{
	if ( control )											/*  塗り潰し	*/
		_pie( _GFILLINTERIOR,x1,y1,x2,y2,x3,y3,x4,y4 ) ;
	else													/*  境界線だけ	*/
		_pie( _GBORDER,x1,y1,x2,y2,x3,y3,x4,y4 ) ;
}

/********************************  塗り潰し  *********************************/
void far GRP_paint( short x, short y, short color )
/*
**	x,y   : 塗り潰し開始座標
**	color : 境界線の色番号
**
**	☆ 開始座標から、境界線の色番号までの領域を描画色で塗り潰します。
*/
{
	_floodfill( x,y,color ) ;
}

/****************************  ﾃｷｽﾄ表示位置取得  *****************************/
void far GRP_gettextposition( short *row, short *column )
/*
**	row,column : ﾃｷｽﾄ表示位置を行/桁(1〜)で取得します｡
*/
{
	struct rccoord 	_t_position ;

	_t_position = _gettextposition() ;
	*row    = _t_position.row + 1 ;								/*  行位置	*/
	*column = _t_position.col + 1 ;								/*  桁位置	*/
}

/****************************  ﾃｷｽﾄ表示位置設定  *****************************/
void far GRP_locate( short row, short column )
/*
**	row,column : ﾃｷｽﾄ表示位置を行/桁(1〜)で指定します｡
*/
{
	short	xe, ye ;

	xe = (VIEW_XE+1) / XDOTS ;
	ye = (VIEW_YE+1) / YDOTS ;
	if ( row < 1 ) row = 1 ;
	if ( row > ye ) row = ye ;
	if ( column < 1 ) column = 1 ;
	if ( column > xe ) column = xe ;
	row -- ;
	column -- ;
	_settextposition( row,column ) ;
}

/*****************************  ﾃｷｽﾄ表示色設定  ******************************/
void far GRP_textcolor( short color )
/*
**	color : ﾃｷｽﾄの色番号
*/
{
	_settextcolor( color ) ;
}

/********************************  ﾃｷｽﾄ表示  *********************************/
void far GRP_outtext( char far *text )
{
	_outtext( text ) ;
}

/********************************  ｶｰｿﾙ制御  *********************************/
void far GRP_cursor( short toggle )
/*
**	toggle : 真ならば、ｶｰｿﾙを表示し、偽ならば、非表示とします。
*/
{
	if ( toggle )
		_displaycursor( _GCURSORON ) ;
	else
		_displaycursor( _GCURSOROFF ) ;
}

#ifdef FMR
/***********************  BEEP音を出す(ｶｳﾝﾀ数,指定時間)  *********************/
unsigned GRP_beep( unsigned short time,unsigned short count )
/*  time  - 時間   : 10ms 単位												*/
/*  count - ｶｳﾝﾀ数 : 基本周波数(19200Hz) / 周波数(Hz)						*/
{
	union	REGS	regs ;

	regs.h.ah = 0x03 ;
	regs.x.bx = time ;
	regs.x.dx = count ;

	int86( 0x9E,&regs,&regs ) ;

	return( regs.h.ah ) ;
}
#endif

