lambdacube-engine-0.1.1: Graphics/LambdaCube/Loader/StbImage.hs
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
}
}