packages feed

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
            }
    }