AllocDIBの仕様

同じく超俺メモ。
NScripterがDLLに対して開放している関数の中に、AllocDIBなるものがある。
これを使えば、DLLの中で、スプライト等を介さずに直接nsaファイルの中の画像を引っ張り出せる。
なお、事前にNScripter側でaddnsadirを実行していれば、DLLの中からの探索でもそれは有効である。
※これを使って、nsaファイルの中のファイルを好きなファイル名で外部に出力するDLLが組めるなあ、と言うところで寝る。

void nsa2out(char *from_filename, char *to_filename){
	DIBDATA dib;

	/* ファイルの取得 */
	AllocDIB(&dib, from_filename);

	/* ヘッダー作成 */
	unsigned char header[54] = {
		66,77,54,16,14,0,0,0,0,0,54,0,0,0,	/*_BITMAPFILEHEADER_*/
		40,0,0,0,128,2,0,0,224,1,0,0,1,0,24,0,0,0,0,0,	/*_BMPINFOHEADER_前半_*/
		0,16,14,0,19,11,0,0,19,11,0,0,0,0,0,0,0,0,0,0	/*_BMPINFOHEADER_後半_*/
	};

	/* サイズ設定 */
	header[18] = dib->width % 256;
	header[19] = int ( dib->width / 256 );
	header[22] = dib->height % 256;
	header[23] = int ( dib->height / 256 );

	/* 出力 */
	int line = dib->width * 3;
	while ( 0 < line % 3 ) { line ++; }
	FILE *fp;
	fp = fopen(to_filename, "wb");
	fwrite(header, sizeof(header[0]), 54, fp);
	fwrite(dib->bits, sizeof(unsigned char), line * dib->height, fp);
	fclose(fp);
}