// 4文字までの文字をアイコンファイルにする
//
// char_to_icon.imw3
//
// 指定した文字列をアイコンファイルにします
// アイコンファイル形式はIMW3で使える形式です
//

DrawScreen
{
	Print(0,8,8,0,6,12,0,"4文字まで指定") ;
	Print(0,8,22,0,6,12,0,"(全角文字のみ)") ;
	Print(0,120,8,0,6,12,0,"背景色") ;
	Print(0,190,8,0,6,12,0,"文字色") ;

	Box(0,104,52,250,160,15,15) ;

	x = 164 ; y = 90 ;
	Box(0,x,y,x+31,y+31,BackCol,BackCol) ;

	// 背景色、文字色で裏画面へ書込み
	FullPaint(1,BackCol) ;
	if(BackCol == 15){ SetPal(10,1,1,1) ; FullPaint(1,10) ; } // 透明の場合

	len = GetEditLength("ID_edit") ;
	if(len == 0){ return ; }

	// 2文字以下の場合
	if(len <= 2){
		w = 16 / len ; h = 32 ;
		Print(0,x,y,0,w,h,CharCol,"ID_edit") ;
		Print(1,0,0,0,w,h,CharCol,"ID_edit") ; // 裏画面へ
		return ;
	}
	// 3〜4文字の場合
	if(len <= 4){
		w = 8 ; h = 16 ;
		AllClearEdit("ID_sub") ;
		GetEditText("ID_edit",0,2,"ID_sub") ;
		Print(0,x,y,0,w,h,CharCol,"ID_sub") ;
		Print(1,0,0,0,w,h,CharCol,"ID_sub") ;

		AllClearEdit("ID_sub") ;
		GetEditText("ID_edit",2,4,"ID_sub") ;
		Print(0,x,y+h,0,w,h,CharCol,"ID_sub") ;
		Print(1,0,h,0,w,h,CharCol,"ID_sub") ; // 裏画面へ
	}

}

PAINT
{
	call("DrawScreen") ;
}

INIT
{
	SetControlFont("ID_edit","MS ゴシック",8,16,0) ; // エディットの文字サイズ

	SetListText("ID_BackCol","黒") ;
	SetListText("ID_BackCol","青") ;
	SetListText("ID_BackCol","赤") ;
	SetListText("ID_BackCol","桃") ;
	SetListText("ID_BackCol","緑") ;
	SetListText("ID_BackCol","水色") ;
	SetListText("ID_BackCol","黄") ;
	SetListText("ID_BackCol","白") ;
	SetListText("ID_BackCol","透明") ;
	SetListPos("ID_BackCol",7) ;
	BackCol = 7 ;

	SetListText("ID_CharCol","黒") ;
	SetListText("ID_CharCol","青") ;
	SetListText("ID_CharCol","赤") ;
	SetListText("ID_CharCol","桃") ;
	SetListText("ID_CharCol","緑") ;
	SetListText("ID_CharCol","水色") ;
	SetListText("ID_CharCol","黄") ;
	SetListText("ID_CharCol","白") ;
	SetListPos("ID_CharCol",0) ;
	CharCol = 0 ;

	error = 0 ;
}

CREATE
{
	SetWinSize(280,190) ;
	SetWinColor(16) ;
	SetCaption("もじからあいこん") ;

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

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

	SubScreen(1,64,64) ;

	x = 10 ; y = 38 ;
	CreateControl(101,"四字熟語","ID_edit",x,y,80,20) ; y = y + 24 ;
	CreateControl(101,"","ID_sub",0,0,0,0) ;
	CreateControl(0,"セット","ID_Set",x,y,80,20) ; y = y + 34 ;

	CreateControl(0,"アイコン保存","ID_Go",x,y,80,40) ;

	x = 120 ; y = 26 ;
	CreateControl(33,"","ID_BackCol",x,y,50,100) ; x = x + 70 ;
	CreateControl(33,"","ID_CharCol",x,y,50,100) ; x = x + 100 ;
}

// セット
ID_Set
{
	call("DrawScreen") ;
}

// 背景色
ID_BackCol
{
	BackCol = GetListPos("ID_BackCol") ;
	if(BackCol == 8){ BackCol = 15 ; }
	call("DrawScreen") ;
}

// 文字色
ID_CharCol
{
	CharCol = GetListPos("ID_CharCol") ;
	call("DrawScreen") ;
}

// アイコン保存
ID_Go
{
	call("MakeSaveData") ;
	if(error > 0){ 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
{
	if(r == 1){ data = 255 ; return ; } // 背景色透明の場合

	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 ;
}

// アイコンファイルのデータを作成
MakeSaveData
{
	n = GetEditLength("ID_edit") ;
	if(n == 0){ error = 1 ; return ; }

	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(1,x,y) ;
			g = GetPixelG(1,x,y) ;
			b = GetPixelB(1,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 ;
	}
	// 透明セットデータセット
	n = ico_start ; p = n + 1024 ;
	loop(128){
		k = 0 ;
		loop(8){
			if(dat(0,n) == 255){
				if(k == 0){ dat(0,p) = dat(0,p) + 128 ; }
				if(k == 1){ dat(0,p) = dat(0,p) + 64 ; }
				if(k == 2){ dat(0,p) = dat(0,p) + 32 ; }
				if(k == 3){ dat(0,p) = dat(0,p) + 16 ; }
				if(k == 4){ dat(0,p) = dat(0,p) + 8 ; }
				if(k == 5){ dat(0,p) = dat(0,p) + 4 ; }
				if(k == 6){ dat(0,p) = dat(0,p) + 2 ; }
				if(k == 7){ dat(0,p) = dat(0,p) + 1 ; }
			}
			n = n + 1 ; k = k + 1 ;
		}
		p = p + 1 ;
	}
}