#include <clip.h>
#include <direct.h>	/* _chdir()用 */

#define APPNAME		"swfwin"

//#define FILENAME	"new1.swf"
//#define FILENAME	"test3.swf"
//#define FILENAME	"test5.swf"
//#define FILENAME	"font3.swf"
//#define FILENAME	"test1.swf"
//#define FILENAME	"test4.swf"
//#define FILENAME	"mc1_1p.swf"

int main(int argc, char* argv[]) {
	FILE* fp;
	const char* fname;
	char path[_MAX_PATH];
	char drive[_MAX_DRIVE];
	char dir[_MAX_DIR];
	static unsigned char data[1024 * 1024];
	const SWF_INFO* info;
	int frame = 0;

	DEBUG_INIT();

#ifdef FILENAME
	fname = FILENAME;
#else
	fname = argv[1];
#endif

	/* Win32版は、静的テキストのTGAを出力するようにしたので、swfと同じフォルダにTGAを出力するよう、カレントドライブを変えておく。
	 * こうしないと、swfをドラッグ&ドロップして実行したときにカレントドライブが「C:\Documents and Settings\%USERNAME%」フォルダで、そこにTGAを出力してしまう。
	 */
	_splitpath(fname, drive, dir, NULL, NULL);
	_makepath(path, drive, dir, NULL, NULL);
	if(path[0]) {
		_chdir(path);
	}

	fp = fopen(fname, "rb");
	if(!fp) {
		DIE();
	}
	fread(data, 1, sizeof data, fp);
	fclose(fp);

	swf_init(data);
	//{{どちらか選択
	//swf_set_text_drawing_method(0); /* using CodeTable */
	swf_set_text_drawing_method(1); /* using GlyphShapeTable */
	//}}どちらか選択
	info = swf_info();
	printf("FrameSize.Xmin %f\n", info->FrameSize.Xmin);
	printf("FrameSize.Xmax %f\n", info->FrameSize.Xmax);
	printf("FrameSize.Ymin %f\n", info->FrameSize.Ymin);
	printf("FrameSize.Ymax %f\n", info->FrameSize.Ymax);
	printf("FrameRate      %f\n", info->FrameRate);
	printf("FrameCount     %d\n", info->FrameCount);

	/* Win32ではswf_draw()がコンパイルできないので、
	 * 毎フレームの実行だけを行なって、異常終了しないことと、
	 * 終了時にメモリリークしないことだけを確認します。
	 */
	for(;;) {
		if(_kbhit()) {
			break;
		}
		swf_exec();
		info = swf_info();
		printf("HIT KEY to EXIT, loop = %d, total frame = %d\n", info->loop_count, frame);
		frame++;
	}

	swf_free();

	return 0;
}

/*****************************************************************************
 *	Win32ではもうclipren2.c全体をコンパイルできないので、
 *	必要な関数だけをコピーして含めることにします。
 *****************************************************************************/

//{{clipren2.cより
void texture_copy(TEXTURE* texture, SURFACE* surface, int x, int y) {
	const unsigned char* vbuff = surface->vbuff + surface->w * y + x;
	unsigned char* buf = texture->buf;
	int gap = surface->w - texture->header.w;
	int bpp = texture->header.bpp;	/* 1,2,4 */
	int w = texture->header.w;	/* 8N */
	int i = texture->header.h;
	if(!texture->header.mask) {
		w *= bpp;		/* 8N * {1,2,4} */
		do {
			int j = w;
			do {
				//int c = -1U >> 8;
				//↓VC++6.0警告抑制
				int c = 0xFFFFFF;
				do {
					c = (c << bpp) | *vbuff++;
				} while(c >= 0);
				*buf++ = c;
			} while(j -= 8);
			vbuff += gap;
		} while(i -= 1);
	} else {
		unsigned char* mask = texture->mask;
		int trans = 1 << bpp;
		do {
			int j = w;
			do {
				//int m = -1U >> 8;
				//↓VC++6.0警告抑制
				int m = 0xFFFFFF;
				do {
					//int c = -1U >> 8;
					//↓VC++6.0警告抑制
					int c = 0xFFFFFF;
					do {
						int s = *vbuff++;
						c <<= bpp;
						m <<= 1;
						if(s < trans) {
							c |= s;
							m |= 1;
						}
					} while(c >= 0);
					*buf++ = c;
				} while(m >= 0);
				*mask++ = m;
			} while(j -= 8);
			vbuff += gap;
		} while(i -= 1);
	}
}
//}}clipren2.cより
