;フルカラーモード専用
#module
#deffunc bmpsave2 str,int
mref filename,32
mref bit,1
mref vram,66
rast=winx*bit+31/32*4 ;1走査線のバイト数
bdsize=rast*winy ;ピクセルデータサイズ
if bit<=8 : rq=1<<bit : else : rq=0 ;RGBQUAD構造体の数
bdstart=rq*4+54
filesize=bdsize+(rq*4)+54 ;ファイルサイズ
sdim date,filesize ;実際のファイル内容
;BITMAPFILEHEADER構造体
wpoke date,0,0x4D42 ;"BM"という文字列
memcpy date,filesize,4,2 ;ファイルサイズ
;予約が4バイト
memcpy date,bdstart,4,10 ;ピクセルデータの開始位置までのバイト数
;BITMAPINFOHEADER構造体
value=40 : memcpy date,value,4,14 ;BITMAPINFOHEADER構造体サイズ
value=winx : memcpy date,value,4,18 ;ビットマップの幅
value=winy : memcpy date,value,4,22 ;ビットマップの高さ
wpoke date,26,1 ;カラープレーン
wpoke date,28,bit ;1ピクセルあたりのビット数
;残りは0でOK
;ピクセルデータ
if rq { ;8ビット以下
dim rgbquad,256 ;RGBQUAD構造体配列
bytetimes=8/bit ;1バイトに書き込む回数
colnum=0 ;カラーテーブルに登録された色数
repeat winy
cnt3=cnt
bytecnt=0 ;1バイトに書き込んだ回数
bytedate=0 ;1バイトの値
writepoint=rast*cnt+bdstart ;書き込む場所
repeat winx
cnt2=cnt
memcpy col,vram,3,0,cnt3*rast+cnt*3 ;RGB値をコピー
repeat colnum+1
ct=cnt ;色の番号
if cnt=colnum { ;同じ色が見つからなかった場合
if colnum!=(1<<bit) {
rgbquad.colnum=col ;色を登録
colnum++
}
break
}
if col=rgbquad.cnt : break ;同じ色があった場合
loop
bytedate=ct<<(bytetimes-bytecnt-1*bit)|bytedate ;色番号をbitビット書き込む
bytecnt++
if bytecnt=bytetimes { ;1バイト分たまったら
poke date,writepoint,bytedate ;書き込む
bytedate=0 ;1バイトの値を初期化
bytecnt=0 ;1バイトに書き込んだ回数を初期化
writepoint++ ;書き込みアドレスを1バイト進める
}
loop
if bytecnt { ;1バイトたまらないまま1走査線終了してしまったとき
poke date,writepoint,bytedate ;中途半端でも書き込む
}
loop
memcpy date,rgbquad,rq*4,54 ;カラーテーブル書き込み
} else { ;フルカラー
memcpy date,vram,bdsize,54 ;VRAM直コピー
}
;保存
bsave filename,date
return
#global
|