packages feed

jort-1.0.0: Bitmaps.hs


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