/*<Header>==============================================================
*
*	CLIP MANAGER / "EIN_CLP2.C"
*
*		[ EIN(tm) project : ウィンドゥクリップ操作補助関数群 ]
*
*	COPYRIGHT  Nam & OZZY  1994, All rights reserved.
*
*-----------------------------------------------------------------------
*	V1.0L01α	94.07.08/Nam	プロトタイプ(OZZYさんの関数を利用)
*</Header>==============================================================*/
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<snd.h>
#include	<winb.h>
#include	<te.h>
#include	<fntb.h>
#include	<gui.h>
#include	<egb.h>
#include	<msdos.cf>
#include	<loader.h>
#include	<math.h>
#include	<io.h>
#include	<guidbg.h>

#define	EIN_CLIP
#include	"..\eintm.h"

#ifndef NOERR
#define	NOERR	(0)
#endif
#ifndef ERROR
#define	ERROR	(1)
#endif

/* クリップデータ構造体 */
typedef struct {
	WINCLIP		*clip;
	WINCLIP		*visible;
	POINT		svPos;
}	EIN_CLIPWORK;						/* クリップデータ構造体 */

/*<Func>================================================================
*	int		EIN_clipFrame( int objId, FRAME *pfr, POINT *ppt, char *work )
*
*	【概  要】	与えられたフレームのクリップを生成する。
*
*	【機  能】	座標を原点に戻し、与えられたフレームのクリップを、
*				現在のクリップと AND をとるように生成する。
*
*	【入  力】
*				objId		:	クリップ元のオブジェクトID
*				*pfr		:	今回クリップするフレームのポインタ(絶対座標)
*								NULL objIdのサイズに設定
*				*ppt		:	設定する原点のポインタ(絶対座標)
*								NULL で ( 0, 0 )に設定
*				*work		:	クリップ退避用ワーク
*
*	【出  力】	なし
*
*	【関数値】	== NOERR	正常終了
*
*	【注  意】	
*
*	【使用例】
*				char		clp[EINCLIPSIZE];
*
*				MMI_SendMessage( ID_BASE, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
*				EIN_clipFrame( ID_BASE, NULL, NULL, clp );
*				MMI_SendMessage( ID_BASE, MM_SHOW, 0 ) ;
*				MMI_SendMessage( ID_BASE, MM_WAKE, 0 ) ;
*				EIN_endClipFrame( clp );
*
*-----------------------------------------------------------------------
*	V11L10	1994.07.08/Nam	(OZZYさんの関数より)
*</Func>==============================================================*/
int		EIN_clipFrame( int objId, FRAME *pfr, POINT *ppt, EIN_CLIPWORK *p )
{
	WINCLIP	*pwclp ;
	WINCTRL	*pctrl ;
	POINT	pos ;
	FRAME	fr ;

	/* お約束のErrorTrap */
	if ( p == NULL ){
		return ERROR;
	}
	/*	座標系の一時変更	*/
	if( ppt == NULL ){
		pos.x = 0 ;
		pos.y = 0 ;
	} else {
		pos = *ppt ;
	}

	MG_PushOrigin( &pos, &p->svPos );

	if( pfr == NULL ){
		EIN_getObjectFrame( objId, &fr ) ;
		pwclp = WIN_getClipMemory( &fr, NULL ) ;
	} else {
		pwclp = WIN_getClipMemory( pfr, NULL ) ;
	}
	pwclp = WIN_clipWindow( objId, pwclp, FALSE ) ;

	/*	現在のクリップとの and をとる.	*/
	MMI_GetControl( &pctrl ) ;
	pwclp = WIN_andClip( pwclp, pctrl->clip ) ;
	/*	表示枠を設定する.	*/
	WIN_pushVisible( WIN_copyClip( pwclp ), &p->visible ) ;
	WIN_pushClip( pwclp, &p->clip ) ;

	return NOERR ;
}

/*<Func>================================================================
*	int		EIN_endClipFrame( char *work )
*
*	【概  要】	クリップ枠の復元処理。
*
*	【機  能】	EIN_clipFrame で退避したクリップ枠の復元。
*
*	【入  力】	なし
*
*	【出  力】	なし
*
*	【関数値】	== NOERR	正常終了
*
*	【注  意】	
*
*	【参  照】	
*
*-----------------------------------------------------------------------
*	V11L10	1994.07.08/Nam	(OZZYさんの関数より)
*</Func>==============================================================*/
int		EIN_endClipFrame( EIN_CLIPWORK *p )
{
	/* お約束のErrorTrap */
	if ( p == NULL ){
		return ERROR;
	}
	/*	表示枠を復帰する.	*/
	WIN_popClip( p->clip ) ;
	WIN_popVisible( p->visible );
	/* 座標系の復帰 */
	MG_PopOrigin( &p->svPos );

	return NOERR ;
}

/*<Func>================================================================
*	int		EIN_getObjectFrame( int objId, FRAME *fr )
*
*	【概  要】	オブジェクトの大きさを求める。
*
*	【機  能】	MM_GETHYPERを用いずに id で示されるオブジェクトの大きさを
*				返す。
*
*	【入  力】
*				objId	:	判定する部品Id
*				*fr		:	部品の大きさを返すポインタ
*
*	【出  力】
*				*fr		:	部品の大きさを返す
*
*	【関数値】	== NOERR	正常終了
*
*	【注  意】	
*
*	【参  照】	
*
*-----------------------------------------------------------------------
*	V11L10	1994.07.08/Nam	(OZZYさんの関数より)
*</Func>==============================================================*/
int		EIN_getObjectFrame( int objId, FRAME *fr )
{
	*fr = ( ( HYPER *)( TL_getObjectPtr( objId )->data ) )->fr ;
	return NOERR ;
}

/*<Func>================================================================
*	int		EIN_clipWake( int objId )
*
*	【概  要】	ウィンドウクリップを考慮してにWAKEする
*
*	【機  能】	ウィンドウ枠を全画面解除してMM_SHOW, MM_WAKEしてクリップ復帰
*
*	【入  力】
*
*	【出  力】	なし
*
*	【関数値】	== NOERR	正常終了
*				!= NOERR	objId異常
*
*	【注  意】	
*
*	【参  照】	
*
*-----------------------------------------------------------------------
*	V11L10	1994.07.08/Nam	(うまく動かない(T-T))
*</Func>==============================================================*/
int		EIN_clipWake( int objId )
{
	WINCLIP		*pwclps;
	EIN_CLIPWORK	p;		/* クリップデータ構造体 */

	/* お約束のErrorTrap */
	if ( objId < 1 ){
		return ERROR;
	}
	EIN_clipFrame( objId, NULL, NULL, &p );
	WIN_beginUpDateObj( objId, &pwclps ) ;
	MMI_SendMessage( objId, MM_SHOW, 0 );
	MMI_SendMessage( objId, MM_WAKE, 0 );
	WIN_endUpDateObj( pwclps ) ;
	EIN_endClipFrame( &p );

	return NOERR ;
}

