// モニター画像をアイコンファイルにする
//
// grp_to_icon.imw3
//
// デスクトップ画像を取り込み任意の位置(32×32)の絵をアイコンファイルにします
// アイコンファイル形式はIMW3で使える形式です
//


// デスクトップ画像を取り込む
GetGrp
{
	wx = WIN_L ; wy = WIN_T ; // 現在のウィンドウ位置を記憶

	SetWinPos(SCR_W,0,0) ; // ウィンドウをスクリーン外へ退避

	x = ClientToScreenX(0) ; // ウィンドウから見たスクリーン座標を取得
	y = ClientToScreenY(0) ;
	CopyBMP(0,-x,-y,SCR_W,SCR_H,1,0,0,SCR_W,SCR_H,0) ; // デスクトップ画像を裏画面に取得

	SetWinPos(wx,wy,0) ; // ウィンドウを元の位置へ
}

DrawScreen
{
	// ウィンドウの位置に合わせて画像も移動する
	x = ClientToScreenX(0) ;
	y = ClientToScreenY(0) ;
	CopyBMP(1,x,y+24,WIN_W,WIN_H, 0,0,24,WIN_W,WIN_H,0) ;

	Box(0,px-1,py-1,px+32+1,py+32+1,-2,-1) ; // 対象エリア
	Box(0,0,24,WIN_W,WIN_H,3,-1) ;
}

PAINT
{
	// 初回だけ実行
	if(init == 1){
		call("GetGrp") ; init = 0 ;
	}
	call("DrawScreen") ;
}
// ウィンドウの移動
MOVE
{
	call("DrawScreen") ;
}

INIT
{
	// 対象エリア座標
	px = WIN_W / 2 - 16 ;
	py = WIN_H / 2 - 16 ;

	error = 0 ;
	init = 1 ;
}
CREATE
{
	SetWinSize(400,300) ;
	SetWinColor(16) ;
	SetCaption("モニター画像をアイコンへ") ;

	Data("hed",1,62) ;   // ヘッダデータ
	Data("pal",256,3) ;  // パレット色データ
	Data("icon",32,32) ; // アイコン画像データ
	Data("dat",1,2238) ; // ファイルデータ

	pal_start = 62 ;   // パレットコード開始位置
	ico_start = 1086 ; // アイコンデータ開始位置

	x = 2 ; y = 2 ; w = 32 ; h = 18 ;
	CreateControl(0,"画像更新","ID_re",x,y,w*2,h) ; x = x + w * 3 ;

	CreateControl(0,"←","ID_l",x,y,w,h) ; x = x + w ;
	CreateControl(0,"↑","ID_u",x,y,w,h) ; x = x + w ;
	CreateControl(0,"↓","ID_d",x,y,w,h) ; x = x + w ;
	CreateControl(0,"→","ID_r",x,y,w,h) ; x = x + w * 2 ;

	CreateControl(0,"アイコン保存","ID_save",x,y,w*3,h) ;

	// 裏画面確保(念のため必要サイズの2倍)
	SubScreen(1,SCR_W*2,SCR_H*2) ;
	SubScreen(2,64,64) ;
}

// 画像更新
ID_re{ call("GetGrp") ; }

// 矢印ボタン 対象枠を移動
ID_l{ px = px - 1 ; call("DrawScreen") ; }
ID_r{ px = px + 1 ; call("DrawScreen") ; }
ID_u{ py = py - 1 ; call("DrawScreen") ; }
ID_d{ py = py + 1 ; call("DrawScreen") ; }

// アイコン保存
ID_save
{
	call("MakeSaveData") ;
	if(error > 0){
		MessBox("色数が多すぎます","エラー",0,1) ;
		return ;
	}
	n = FileNameDlgW("名前を付けて保存","list",4) ;
	if(n < 1){ return ; }

	OpenFileWrite("FILE_NAME") ;
	n = 0 ;
	loop(2238){
		WriteFile(n,dat(0,n)) ;
		n = n + 1 ;
	}
	CloseFile ;
}

// r g b 色からパレット番号を探す、無ければ追加する
MakePalData
{
	error = 0 ;
	p = 0 ;
	loop(255){
		// 無い場合
		if(p >= pal_many){
			pal(p,0) = r ; pal(p,1) = g ; pal(p,2) = b ;
			data = p ;
			pal_many = pal_many + 1 ;
			return ;
		}
		// 同じ色の場合
		if(pal(p,0) == r){ if(pal(p,1) == g){ if(pal(p,2) == b){
			data = p ; return ;
		} } }
		p = p + 1 ;
	}
	error = 1 ; // 256色に収まらない
}

// アイコンファイルのデータを作成
MakeSaveData
{
	// 裏画面2へ書込み
	CopyBMP(0,px,py,32,32,2,0,0,32,32,0) ;

	DataInit("dat",0) ;  // 0で初期化

	// ヘッダ部データセット
	dat(0, 2) =  1 ; dat(0, 4) =   1 ; dat(0, 6) = 32 ; dat(0, 7) = 32 ;
	dat(0,12) =  8 ; dat(0,14) = 168 ; dat(0,15) =  8 ; dat(0,18) = 22 ;
	dat(0,22) = 40 ; dat(0,26) =  32 ; dat(0,30) = 64 ; dat(0,34) =  1 ;
	dat(0,36) =  8 ; dat(0,43) =   4 ; dat(0,55) =  1 ; dat(0,59) =  1 ;

	// アイコン・パレット データ作成
	DataInit("pal",255) ; // パレット白で初期化
	pal(255,0) = 0 ; pal(255,1) = 0 ; pal(255,2) = 0 ; // 透明色パレット

	x = 0 ; y = 0 ;
	pal_many = 0 ;
	loop(32){
		loop(32){
			r = GetPixelR(2,x,y) ;
			g = GetPixelG(2,x,y) ;
			b = GetPixelB(2,x,y) ;
			call("MakePalData") ; // 色からパレット番号を探す
			if(error > 0){ return ; }
			icon(x,y) = data ; // パレット番号をセット
			x = x + 1 ;
		}
		x = 0 ; y = y + 1 ;
	}
	// パレットデータセット
	n = 0 ; pos = 62 ;
	loop(256){
		dat(0,pos) = pal(n,2) ;
		dat(0,pos+1) = pal(n,1) ;
		dat(0,pos+2) = pal(n,0) ;
		pos = pos + 4 ; n = n + 1 ;
	}
	// アイコンデータセット
	y = 31 ;
	loop(32){
		x = 0 ;
		loop(32){
			dat(0,pos) = icon(x,y) ;
			pos = pos + 1 ; x = x + 1 ;
		}
		y = y - 1 ;
	}
}