;-------------------------------------- ; ; 作:せつき ; HP:http://www.setsuki.com/ ; ;-------------------------------------- ;====================================== ; ビットマップ表示モジュール ;-------------------------------------- ; ; bmp_load str ; str = 取得するファイル名 ; ; ※ stat にはアイコンの色bitを返します。 ;   アイコン取得が失敗した時は -1 を返します。 ; ; ※ 表示場所は、pos で調整できます。 ; ; ※ 読み込み速度は、めちゃめちゃ遅いです。 ; ;====================================== ; ; 対応形式 ; 無圧縮、ランレングス圧縮、 ; ビットフィールド 等 ; ; 未対応形式 ; BI_JPEG、BI_PNG 圧縮、透明度付きBMP ; BITMAPV4HEADER、BITMAPV5HEADER 等 ; ;====================================== ; ; ビットフィールドについては、 ; ルーチェ様のHPのソースを ; HSP用に変換して使わせて頂きました。 ; ; ルーチェ's Homepage ; http://www.ruche-home.net/ ; ;====================================== #module #deffunc bit2bit val,int,int,int ;************************************** ; ビットフィールド用2バイト取得 ;************************************** mref D,16 mref p1,1 mref p2,2 mref p3,3 D=0 : S=p1 : Y=p3 : X=p2 repeat Y - X + 1 if Y <= X : break Y = Y - X D = D | (S << Y) loop if (Y > 0) { D = D | (S >> (X - Y)) } return ;************************************** #global #module #deffunc bmp_load str ;************************************** ; ビットマップローダー ;************************************** mref file,32 ;ファイル名 mref s,64 ;システム変数stat mref bmscr,67 ;現在のウインドゥ情報 (BMSCR構造体) x=bmscr.27 ;表示位置x y=bmscr.28 ;表示位置y ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ビットマップの読み込み exist file : flen=strsize : if flen=-1 : s=-1 : return bload file,buf,50 wpeek c,buf,14 : p=c+14 ;;;OS/2 Bitmap if c=12 { wpeek wid,buf,18 wpeek heit,buf,20 wpeek pbit,buf,24 : i=1 ;;;Windows Bitmap } else { wpeek wid ,buf,18 : wpeek c,buf,20 : wid +=c<<16 wpeek heit,buf,22 : wpeek c,buf,24 : heit+=c<<16 wpeek pbit,buf,28 : i=2 ;圧縮形式の取得 wpeek c,buf,30 : wpeek e,buf,32 : c+=e<<16 : compression=c if c>3 : dialog "この圧縮形式には対応していません",1,""+c : s=-1 : return } ;;;パレット取得 sdim buf,flen : bload file,buf,flen : s=pbit if pbit<=8 { c=1<0 : goto *rle_comp } ;;;横幅の取得 wid2=wid*pbit+31/32*4 : x+=wid ;;;高さの取得(トップダウンBMP対応) if heit<0 : heit=-heit : i=-1 : y-=1 : else : i=1 : y+=heit+1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;非圧縮画像の読み込み repeat heit*wid if p>=flen : break if cnt\wid=0 { x-=wid : y-=i : p=cnt/wid*wid2+off : flag=-1 } if(pbit>8){ if compression=3 { memcpy a,buf,pbit/8,0,p : p+=pbit/8 bit2bit r,(a&bf.0)>>bf_E.0, bf_B.0, 8 bit2bit g,(a&bf.1)>>bf_E.1, bf_B.1, 8 bit2bit b,(a&bf.2)>>bf_E.2, bf_B.2, 8 } else { if(pbit<=16){ wpeek a,buf,p : p+=2 poke b,0,a<<3:a=a>>2 poke g,0,a :a=a>>5 poke r,0,a :a=a>>6 } else { peek b,buf,p : p++ peek g,buf,p : p++ peek r,buf,p : p++ if pbit>24 : p++ } } } else { if flag<0 : peek c,buf,p : p++ : flag=8-pbit e=c>>flag\(1<0 : p-- : continue peek c,buf,cnt+off if (cnt\2=0) : e=c : continue ;画像の終わり if(e=0)&(c=1) : break ;各行の終わり if(e=0)&(c=0) : x=wid2 : y-=i : continue ;Delta if(e=0)&(c=2) { peek c,buf,cnt+off+1 : x+=c peek e,buf,cnt+off+2 : y-=e p=2 : continue } ;絶対モード if(e=0)&(c>2) { p=cnt+1+off repeat c peek e,buf,cnt+p if pbit=4 { if cnt\2=1 : e=e&0xF : else : e=e>>4&0xF : p-- } color rpal.e, gpal.e, bpal.e : pset x,y : x++ loop if pbit=8 : p=c+1/2*2 : else : p=c+3/4*2 continue } ;エンコードデータ if pbit=4 : a=c>>4&0xF : b=c&0xF repeat e if pbit=4 : if cnt\2=0 : c=a : else : c=b color rpal.c, gpal.c, bpal.c : pset x,y : x++ loop loop return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #global ; サンプル dialog "bmp",16,"" : if stat!1 : end pos 50,50 : bmp_load refstr : if stat=-1 : end title ""+stat+" bit" stop