module Bitmaps (Bitmap, module Data.Array, loadBitmap ) where import Basics import Data.Array import Graphics.UI.Gtk hiding (Color, Bitmap) import Data.Array(Array, listArray) import Data.Array.Base ( unsafeRead ) import Data.Array.MArray(newArray_, writeArray, unsafeFreeze) import Data.Array.IO import Data.Word type Bitmap = Array (Int, Int) Color pixbufGetPixelData :: Pixbuf -> IO (Array (Int, Int) (Word8, Word8, Word8)) pixbufGetPixelData pb = do rowstride <- pixbufGetRowstride pb w <- pixbufGetWidth pb h <- pixbufGetHeight pb chan <- pixbufGetNChannels pb -- putStr "rowstride = " -- print rowstride -- putStr "width = " -- print w -- putStr "height = " -- print h pixelData <- pixbufGetPixels pb :: IO (PixbufData Int Word8) -- putStrLn "got pointer to pixels" pixels <- newArray_ ((0,0),(w,h)) let pixels_type :: IOArray (Int,Int) (Word8, Word8, Word8) pixels_type = pixels fetchPixel x y = do r <- unsafeRead pixelData (x*chan+y*rowstride+0) g <- unsafeRead pixelData (x*chan+y*rowstride+1) b <- unsafeRead pixelData (x*chan+y*rowstride+2) writeArray pixels (x,y) $! (fromIntegral r, fromIntegral g, fromIntegral b) sequence_ [fetchPixel x y | x <- [0..w], y <- [0..h]] unsafeFreeze pixels loadBitmap fname = do putStrLn ("loading bitmap: " ++ fname) pb <- pixbufNewFromFile fname putStrLn "bitmap loaded; xlation..." pixels <- pixbufGetPixelData pb let result = fmap pixelToColor pixels return result where pixelToColor (r,g,b) = Color (f r/255) (f g/255) (f b/255) f = fromIntegral main = do initGUI bm <- loadBitmap "../rtrt/ciel.tif" print bm