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