BMP秀圖
\ BMP轉換
fload FileIO.f
\ BMP 檔頭結構
: BMP.fType+ ( adr -- adr+ ) 0 + ; \ 固定為 s" BM"
: BMP.fSize+ ( adr -- adr+ ) 2 + ; \ 檔案長度
: BMP.fReserved1+ ( adr -- adr+ ) 6 + ; \ 固定為 0x0000
: BMP.fReserved2+ ( adr -- adr+ ) 8 + ; \ 固定為 0x0000
: BMP.fOffBits+ ( adr -- adr+ ) 10 + ; \ 儲存檔案中實際圖像資料到檔頭的距離
: BMP.Size+ ( adr -- adr+ ) 14 + ; \ 圖像基本資料結構的大小
: BMP.Width+ ( adr -- adr+ ) 18 + ; \ 圖像的寬度
: BMP.Height+ ( adr -- adr+ ) 22 + ; \ 圖像的高度
: BMP.Planes+ ( adr -- adr+ ) 26 + ;
: BMP.BitCount+ ( adr -- adr+ ) 28 + ; \ 像素的色彩數目
: BMP.Compression+ ( adr -- adr+ ) 30 + ;
: BMP.SizeImage+ ( adr -- adr+ ) 34 + ;
: BMP.X_PelsPerMeter+ ( adr -- adr+ ) 38 + ;
: BMP.Y_PelsPerMeter+ ( adr -- adr+ ) 42 + ;
: BMP.ClrUsed+ ( adr -- adr+ ) 46 + ;
: BMP.ClrImportant+ ( adr -- adr+ ) 50 + ;
0 value BMP.buf
0 value BMP \ BMP檔案檔頭
0 value BMP.fSize
0 value BMP.ScanLineWidth
: 解讀_BMP的檔頭 ( ard --- )
cls
>r
r@ BMP.fType+ W@ cr dup emit 256 / emit
r@ BMP.fSize+ @ cr ." 檔案總長為 " . ." bytes !"
r@ BMP.fOffBits+ W@ cr ." 儲存檔案中實際圖像資料到檔頭的距離為 " . ." bytes !"
r@ BMP.Size+ @ cr ." 圖像基本資料結構總長為 " . ." bytes !"
r@ BMP.Planes+ W@ cr ." 顯像色平面數目為 " .
r@ BMP.BitCount+ W@ cr ." 像素的色彩數目為 " .
r@ BMP.Compression+ @ cr ." 檔案壓縮方式代碼為 " .
r@ BMP.Width+ @ dup cr ." 圖像的寬度為 " . ." dots !"
r@ BMP.Height+ @ dup cr ." 圖像的高度為 " . ." dots !"
3 * * cr ." 圖像的實際大小為 " . ." bytes !"
r@ BMP.SizeImage+ @ cr ." 圖像的存放大小為 " . ." bytes !"
r@ BMP.X_PelsPerMeter+ @ cr ." 圖像的水平密度為 " dup . ." dot/公尺 或 " 254 * 10000 / . ." dot/inch !"
r@ BMP.Y_PelsPerMeter+ @ cr ." 圖像的垂直密度為 " dup . ." dot/公尺 或 " 254 * 10000 / . ." dot/inch !"
r@ BMP.ClrUsed+ @ cr ." 實際使用顏色數目為 " .
r@ BMP.ClrImportant+ @ cr ." 重要顯示顏色數目為 " .
r>drop
;
\
0 value WindowSize_W
0 value WindowSize_H
400 value WindowPosition_X
300 value WindowPosition_Y
ColorObject TheNextColor \ 使用 顏色物件
:Object 秀圖 <Super Window \ 宣告 秀圖
: 顏色變更 ( R G B --- )
rgb NewColor: TheNextColor
TheNextColor ?ColorCheck
LineColor: dc
;
: 畫點 ( x y --- )
TheNextColor SetPixel: dc
;
:M StartSize: ( -- w h ) \ 此物件的大小
WindowSize_W WindowSize_H
;M
:M StartPos: ( -- x y ) \ 物件在 桌面的位置
WindowPosition_X WindowPosition_Y
;M
:M WindowTitle: ( -- Zstring ) \ 此物件的標題
z" 秀圖"
;M
:M On_Paint: { \ temp$ -- } \ all window refreshing is done by On_Paint:
WindowSize_H 0 do
WindowSize_W 0 do
BMP.fSize j 1 + BMP.ScanLineWidth * - i 3 * + bmp.buf + >r
r@ 2 + c@
r@ 1 + c@
r> 0 + c@
顏色變更
i j 畫點
loop
loop
;M
:M On_Init: ( -- ) \ things to do at the start of window creation
On_Init: super \ do anything superclass needs
;M
;Object
: BMP秀圖 ( --- )
cls
來源檔案選單 r/w 開檔 to BMP
BMP 檔案大小? drop to BMP.fSize
BMP.fSize allocate drop to BMP.buf
BMP.buf BMP.fSize BMP 讀檔 drop
BMP 關檔
BMP.buf 解讀_BMP的檔頭
bmp.buf BMP.fSize+ @ to BMP.fSize
bmp.buf BMP.Width+ @ to WindowSize_W
bmp.buf BMP.Height+ @ to WindowSize_H
bmp.buf BMP.SizeImage+ @ bmp.buf BMP.Height+ @ / to BMP.ScanLineWidth
start: 秀圖
;
BMP秀圖