/*
 *	clipscnm.h
 *
 *	シーン管理
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Sun Nov 08 21:45:34 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Mon Nov 09 21:43:23 JST 2015 Naoyuki Sawa
 *	- 当モジュールで使用するレジストリデータを作成するためのツールとして、'/clip/tool/MkScnInf.awk,MkScnInf.bat'を作成しました。
 *	  詳細は、上記ツールの実装を参照して下さい。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Tue Aug 02 21:11:08 JST 2016 Naoyuki Sawa
 *	- cliptaps.cに自然遷移通知を追加した事に伴い、当モジュール(clipscnm.c)の「連動処理の例」のサンプルコードに、'case TapEvt_Next:'を追加しました。
 *	  詳細は、cliptaps.c の同日のコメントを参照して下さい。
 *	  サンプルコードの変更のみであり、当モジュール(clipscnm.c)の処理には変更有りません。
 */
#ifndef __CLIP_SCNM_H__
#define __CLIP_SCNM_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	定数、構造体
 *****************************************************************************/
//レイヤ情報
typedef struct _ST_ScnMgrLyr {
	uint16_t			iScnNo_Now;				//現在のシーン		0=無し
	uint16_t			iScnNo_Old;				//前回のシーン		0=無し
} ST_ScnLyr;
/*---------------------------------------------------------------------------*/
//シーン管理
typedef struct _ST_ScnMgr {
	const struct _ST_ScnMgrInf*	pInf;					//初期化情報へのポインタ
	const void*			pScnKey;				//シーン情報の親キー
#ifndef __RENESAS__
	ST_ScnLyr			TBL_Lyr[0/*pInf->iLyrMax*/];		//シーンテーブル
#else //__RENESAS__
	ST_ScnLyr			TBL_Lyr[1/*pInf->iLyrMax*/];		//シーンテーブル	//Hewは要素数[0]の配列に対応していないので、要素数[1]として調整しました。
#endif//__RENESAS__
} ST_ScnMgr;
/*---------------------------------------------------------------------------*/
//初期化情報
typedef struct _ST_ScnMgrInf {
	uint8_t				nLyr;					//レイヤ数		1〜255
	const void* (*fnGetInf)(int iScnNo/*1〜*/);				//シーン情報取得	[0]=(このシーンの再生レイヤ番号+1),[1〜]=このシーンが停止するレイヤのビットマスク	◇実装例は下記を参照せよ。
	void (*fnScnSta)(int iLyrNo/*-1〜(nLyr-1)*/, int iScnNo/*1〜*/);	//シーン開始通知	'再生レイヤの無いシーン開始通知'の場合のみ(iLyrNo=-1)になる。詳細はScnMgr_SetScn()の実装を参照せよ。
	void (*fnScnCon)(int iLyrNo/* 0〜(nLyr-1)*/, int iScnNo/*1〜*/);	//シーン継続通知
	void (*fnScnEnd)(int iLyrNo/* 0〜(nLyr-1)*/, int iScnNo/*1〜*/);	//シーン停止通知
} ST_ScnMgrInf;
//◇「/clip/tool/MkScnInf.awk」で作成したレジストリデータを使用する場合の実装例:
//│static const void* fnGetInf(int iScnNo/*1〜*/) {
//│ const void* pScnInf = REG_get_blob_l(TBL_RegTbl, RegKey_ScnNo, iScnNo, RegKey_ScnInf, -1);
//│ //if(REG_get_blob_size(pScnInf) != (1/*(このシーンの再生レイヤ番号+1)*/+((stScnMgrInf.nLyr+7)>>3)/*このシーンが停止するレイヤのビットマスク*/)) { DIE(); } //多分データバグ
//│ //↓式変形↓
//│ if(REG_get_blob_size(pScnInf) != ((stScnMgrInf.nLyr+15)>>3)) { DIE(); } //多分データバグ
//│ return pScnInf;
//│}
/*****************************************************************************
 *	グローバル関数宣言
 *****************************************************************************/
ST_ScnMgr* ScnMgr_New(const ST_ScnMgrInf* pInf);
void ScnMgr_Init(ST_ScnMgr* pScnMgr, const ST_ScnMgrInf* pInf);
ST_ScnLyr* ScnMgr_GetLyr(ST_ScnMgr* pScnMgr, int iLyrNo/*0〜(nLyr-1)*/);
int ScnMgr_GetLyrNo(ST_ScnMgr* pScnMgr, int iScnNo/*1〜*/);
void ScnMgr_SetScn(ST_ScnMgr* pScnMgr, int iScnNo/*1〜*/);
void ScnMgr_DelLyr(ST_ScnMgr* pScnMgr, .../*iLyrMsk[31:0],iLyrMsk[63:32],…,iLyrMsk[iLyrMax:(iLyrMax&~31)]*/);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_SCNM_H__
