{-# LINE 1 "src/Hopfield/Images/ConvertImage.hsc" #-}
{-# LANGUAGE CPP, ForeignFunctionInterface #-}
{-# LINE 2 "src/Hopfield/Images/ConvertImage.hsc" #-}

module Hopfield.Images.ConvertImage (
  loadPicture
, CBinaryPattern (..)
) where

import Data.Word
import Foreign.C
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Array


{-# LINE 15 "src/Hopfield/Images/ConvertImage.hsc" #-}

-- From: http://www.haskell.org/haskellwiki/FFI_cook_book

{-# LINE 18 "src/Hopfield/Images/ConvertImage.hsc" #-}

data CBinaryPattern = CBinaryPattern {
    cPatternSize :: Word32
  , cPattern :: [Word32]
} deriving (Eq, Show)


foreign import ccall "convertImage.h load_picture" load_picture :: CString -> CInt -> CInt -> Ptr CBinaryPattern

instance Storable CBinaryPattern where
  alignment _ = 8
{-# LINE 29 "src/Hopfield/Images/ConvertImage.hsc" #-}
  sizeOf _ = (16)
{-# LINE 30 "src/Hopfield/Images/ConvertImage.hsc" #-}
  peek ptr = do s <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 31 "src/Hopfield/Images/ConvertImage.hsc" #-}
                pattern_ptr <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 32 "src/Hopfield/Images/ConvertImage.hsc" #-}
                pattern_01s <- peekArray (fromIntegral s) pattern_ptr
                return $ CBinaryPattern s pattern_01s
  poke _ptr (CBinaryPattern _s _p) = error "Storable CBinaryPattern: poke not implemented"


loadPicture :: String -> Int -> Int-> IO CBinaryPattern
loadPicture path w h = do
  cpath <- newCString path
  peek (load_picture cpath (fromIntegral w) (fromIntegral h))