/*	
 *	clipswf.h
 *
 *	Flash SWF Player
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2009 Naoyuki Sawa
 *
 *	* Mon Jun 08 00:15:20 JST 2009 Naoyuki Sawa
 *	- 1st リリース。
 *	- 現在は、SWF4(Flash Lite)の、一部の機能だけに対応しています。
 *	  対応している機能については、ソースコードを参照してください。
 */
#ifndef __CLIP_SWF_H__
#define __CLIP_SWF_H__

/*****************************************************************************
 *	グローバル関数
 *****************************************************************************/

/* swf_info()が、SWF情報を返す構造体 */
typedef struct _SWF_INFO {
	/*--- 最初のswf_init()呼び出し以降は、変化しない値 ---*/
	/* SWF File Header */
	struct /* SWF_RECT */ {
		float Xmin;		/* (常に0)               */
		float Xmax;		/* フレームの幅  [pixel] */
		float Ymin;		/* (常に0)               */
		float Ymax;		/* フレームの高さ[pixel] */
	} FrameSize;
	float FrameRate;		/* フレームレート */
	int FrameCount;			/* メインのタイムラインのフレーム数 */
	/*--- swf_exec()を呼ぶ度に、変化する可能性のある値 ---*/
	/* SetBackgroundColor */
	struct /* SWF_RGB */ {
		unsigned char Red;	/* 背景色の赤成分 */
		unsigned char Green;	/* 背景色の緑成分 */
		unsigned char Blue;	/* 背景色の青成分 */
	} BackgroundColor;
	/* * Thu Jun 04 00:27:32 JST 2009 Naoyuki Sawa
	 * - SWF_INFO.loop_countフィールドは、メインのタイムラインが「Endに達した回数」であることに注意してください。
	 *   2009/06/04現在の実装は、GotoFrameやGotoLabelのアクションスクリプトに未対応ですが、
	 *   将来的に、GotoFrameやGotoLabelに対応した際にも、これらのアクションスクリプトを使ってループした場合には、
	 *   swf_exec()の戻り値が増えない仕様とする予定です。
	 */
	int loop_count;			/* メインのタイムラインがEndに達して、自動ループした回数 */
} SWF_INFO;

/* SWFの再生を準備します。
 * [in]
 *	data		SWFデータの先頭アドレス。
 * [note]
 *	* 不要になったら、swf_free()を呼び出して、リソースを開放してください。
 *	* swf_init()の内部で、最初にswf_free()を呼び出しているので、
 *	  swf_free()を呼び出さずに、連続してswf_init()を呼び出しても安全です。
 * [使用例]
 *	void app_main() {
 *		const SWF_INFO* info;
 *		// フラッシュメモリ上で連続した、SWFデータの先頭アドレスを取得します。
 *		const void* data = file_defrag("sample.swf", NULL);
 *		// SWFの再生を準備します。
 *		swf_init(data);
 *		// SWF情報を取得します。
 *		info = swf_info();
 *		// 再生ループのフレームレートを設定します。
 *		pceAppSetProcPeriod(1000 / info->FrameRate);
 *		// 再生ループ。
 *		for(;;) {
 *			schedule();
 *			// SWFを、1フレーム実行します。
 *			swf_exec();
 *			// SWF情報を取得します。
 *			info = swf_info();
 *			// メインのタイムラインが、3回ループしたら終了します。
 *			if(info->loop_count >= 3) {
 *				break;
 *			}
 *			// 背景を塗り潰します。
 *			c = ((((info->BackgroundColor.Red   * 30) +
 *			       (info->BackgroundColor.Green * 59) +
 *			       (info->BackgroundColor.Blue  * 11)) / 100) >> 6) ^ 3;
 *			surface_clear(&surface, c);
 *			// SWFの、現在のフレームを描画します。
 *			swf_draw(&render);
 *		}
 *		// SWFの再生を終了し、リソースを開放します。
 *		swf_free();
 *	}
 */
void swf_init(const void* data);

/* SWFの再生を終了し、リソースを開放します。
 * [note]
 *	* swf_init()が呼び出されていなければ、何もしません。
 *	  swf_free()は、常に、安全に呼び出すことができます。
 */
void swf_free();

/* SWF情報を取得します。
 * [out]
 *	戻り値		SWF情報の構造体のアドレス。
 *			モジュール内のメモリを直接参照しており、書き換えは不可です。
 */
const SWF_INFO* swf_info();

/* SWFを、1フレーム実行します。
 */
void swf_exec();

#ifdef PIECE
/* SWFの、現在のフレームを描画します。
 * [in]
 *	render		レンダラーへのポインタ。
 * [note]
 *	* 本関数は、最初に背景を塗り潰しません。
 *	  アプリケーションが背景等を描画した上に、SWFを描画することを想定しているためです。
 *	- 背景を塗り潰すことが必要ならば、アプリケーションがswf_info()で背景色を取得し、
 *	  swf_draw()を呼び出す前に、アプリケーションの処理で、背景を塗り潰してください。
 */
void swf_draw(RENDER* render);
#endif /*PIECE*/

#endif /*__CLIP_SWF_H__*/

