module Graphics.LambdaCube.Loader.StbImage (loadImage) where import System.Exit import System.Log.Logger import Foreign.Marshal.Array import qualified Codec.Image.STB as STB import qualified Data.ByteString as SB import Data.ByteString.Lazy import Graphics.LambdaCube.PixelFormat import Graphics.LambdaCube.Image loadImage :: ImageLoader loadImage name buf = STB.decodeImage (SB.pack $ unpack buf) >>= \result -> case result of { Left err -> do debugM "StbImage loader" err return Nothing ; Right img -> STB.withImage img $ \p (x,y) c -> do let pf = case c of { 1 -> PF_L8 ; 2 -> PF_BYTE_LA ; 3 -> PF_R8G8B8 ; 4 -> PF_R8G8B8A8 } debugM "StbImage loader" $ "\"" ++ name ++ "\" loaded" debugM "StbImage loader" $ "resolution = " ++ show x ++ " x " ++ show y ++ ", " ++ show c ++ " bytes per pixel" imgdata <- mallocArray (x * y * c) copyArray imgdata p (x * y * c) return $ Just Image { imName = name , imHeight = y , imWidth = x , imDepth = 1 , imSize = x * y * c , imNumMipmaps = 0 -- TODO -- uint flags; , imFormat = pf , imData = imgdata } }