import System;
import System.IO;
import System.Text;

//縞の間隔
var interval = 8;

//引数の処理
var width : int, height : int;
var args : String[] = Environment.GetCommandLineArgs();
try {
	if(args.length != 4)
		throw(new Exception());
	width = Int32.Parse(args[2]);
	height = Int32.Parse(args[3]);
	if(width <= 0 || height <= 0)
		throw(new Exception());
}
catch(e) {
	System.Console.Error.WriteLine("usage : stripe bmp width height.");
	Environment.Exit(1);
}

//パラメータの決定
var Bpr : int = (int((width * 3 - 1) / 96) + 1) * 4;	//1行あたりのバイト数
var imagesize : int = Bpr * height;				//イメージサイズ
var filesize : int = 0x3E + imagesize;			//ファイルサイズ

//作成するファイルをオープン
var ofs : FileStream;
try {
	ofs = new FileStream(args[1], FileMode.Create);
}
catch(e) {		//ファイルがオープンできない
	System.Console.Error.WriteLine("error : can't open file.");
	Environment.Exit(1);
}

var bw : BinaryWriter = new BinaryWriter(ofs);

//ヘッダ部を書く
bw.Write(short(0x4D42));	//マジックナンバー
bw.Write(filesize);			//ファイルサイズ
bw.Write(short(0));			//bfReserved1
bw.Write(short(0));			//bfReserved2
bw.Write(int(0x3E));		//ヘッダ部サイズ
bw.Write(int(0x28));		//infoheaderサイズ
bw.Write(width);			//幅
bw.Write(height);			//高さ
bw.Write(short(1));			//biPlanes
bw.Write(short(1));			//BitCount
bw.Write(int(0));			//biCompression
bw.Write(imagesize);		//biSizeImage
bw.Write(int(0));			//biXPelsPerMeter
bw.Write(int(0));			//biYPelsPerMeter
bw.Write(int(0));			//biClrUsed
bw.Write(int(0));			//biClrImportant
//パレットを書く
bw.Write(int(0));			//黒
bw.Write(int(0xffffff));	//白
//画像を書く
var b : int;				//32ビットごとに書く
for(var r = 0; r < height; r++) {
	b = 0;
	for(var c = 0; c < width; c++) {
		var itmp = (width * interval + r - c) % interval;
		if(itmp != 0 && itmp != 1)
			b |= 1 << (int(c % 32 / 8) * 8 + (7 - c % 8));
		if(c % 32 == 31) {		//32ビット分埋まったら書く
			bw.Write(b);
			b = 0;
		}
	}
	if(c % 32 > 0)				//32ビット境界までの余った分を書く
		bw.Write(b);
}

ofs.Close();
