module SFML.Graphics.Sprite
(
module SFML.Utils
, createSprite
, copy
, destroy
, setPosition
, setRotation
, setScale
, setOrigin
, getPosition
, getRotation
, getScale
, getOrigin
, move
, rotate
, scale
, getTransform
, getInverseTransform
, setColor
, getColor
, setTexture
, setTextureRect
, getTexture
, getTextureRect
, getLocalBounds
, getGlobalBounds
)
where
import SFML.Graphics.BlendMode
import SFML.Graphics.SFBounded
import SFML.Graphics.Color
import SFML.Graphics.Rect
import SFML.Graphics.SFTexturable
import SFML.Graphics.Transform
import SFML.Graphics.SFTransformable
import SFML.Graphics.Types
import SFML.SFCopyable
import SFML.SFException
import SFML.SFResource
import SFML.System.Vector2
import SFML.Utils
import Control.Monad ((>=>))
import Foreign.C.Types
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Utils (with)
import Foreign.Ptr
import Foreign.Storable (peek)
checkNull :: Sprite -> Maybe Sprite
checkNull sprite@(Sprite ptr) = if ptr == nullPtr then Nothing else Just sprite
checkNullTexture :: Texture -> Maybe Texture
checkNullTexture tex@(Texture ptr) = if ptr == nullPtr then Nothing else Just tex
createSprite :: IO (Either SFException Sprite)
createSprite =
let err = SFException "Failed creating sprite"
in fmap (tagErr err . checkNull) sfSprite_create
foreign import ccall unsafe "sfSprite_create"
sfSprite_create :: IO Sprite
instance SFCopyable Sprite where
copy = sfSprite_copy
foreign import ccall unsafe "sfSprite_copy"
sfSprite_copy :: Sprite -> IO Sprite
instance SFResource Sprite where
destroy = sfSprite_destroy
foreign import ccall unsafe "sfSprite_destroy"
sfSprite_destroy :: Sprite -> IO ()
instance SFTransformable Sprite where
setPosition sprite pos = with pos $ sfSprite_setPosition_helper sprite
setRotation s r = sfSprite_setRotation s (realToFrac r)
setScale sprite s = with s $ sfSprite_setScale_helper sprite
setOrigin sprite o = with o $ sfSprite_setOrigin_helper sprite
getPosition sprite = alloca $ \ptr -> sfSprite_getPosition_helper sprite ptr >> peek ptr
getRotation = sfSprite_getRotation >=> return . realToFrac
getScale sprite = alloca $ \ptr -> sfSprite_getScale_helper sprite ptr >> peek ptr
getOrigin sprite = alloca $ \ptr -> sfSprite_getOrigin_helper sprite ptr >> peek ptr
move sprite off = with off $ sfSprite_move_helper sprite
rotate s a = sfSprite_rotate s (realToFrac a)
scale sprite s = with s $ sfSprite_scale_helper sprite
getTransform sprite = alloca $ \ptr -> sfSprite_getTransform_helper sprite ptr >> peek ptr
getInverseTransform sprite = alloca $ \ptr -> sfSprite_getInverseTransform_helper sprite ptr >> peek ptr
foreign import ccall unsafe "sfSprite_setPosition_helper"
sfSprite_setPosition_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_setRotation"
sfSprite_setRotation :: Sprite -> CFloat -> IO ()
foreign import ccall unsafe "sfSprite_setScale_helper"
sfSprite_setScale_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_setOrigin_helper"
sfSprite_setOrigin_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_getPosition_helper"
sfSprite_getPosition_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_getRotation"
sfSprite_getRotation :: Sprite -> IO CFloat
foreign import ccall unsafe "sfSprite_getScale_helper"
sfSprite_getScale_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_getOrigin_helper"
sfSprite_getOrigin_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_move_helper"
sfSprite_move_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_rotate"
sfSprite_rotate :: Sprite -> CFloat -> IO ()
foreign import ccall unsafe "sfSprite_scale_helper"
sfSprite_scale_helper :: Sprite -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfSprite_getTransform_helper"
sfSprite_getTransform_helper :: Sprite -> Ptr Transform -> IO ()
foreign import ccall unsafe "sfSprite_getInverseTransform_helper"
sfSprite_getInverseTransform_helper :: Sprite -> Ptr Transform -> IO ()
setColor :: Sprite -> Color -> IO ()
setColor sprite color = with color $ sfSprite_setColor_helper sprite
foreign import ccall unsafe "sfSprite_setColor_helper"
sfSprite_setColor_helper :: Sprite -> Ptr Color -> IO ()
getColor :: Sprite -> IO Color
getColor sprite = alloca $ \ptr -> sfSprite_getColor_helper sprite ptr >> peek ptr
foreign import ccall unsafe "sfSprite_getColor_helper"
sfSprite_getColor_helper :: Sprite -> Ptr Color -> IO ()
instance SFTexturable Sprite where
setTexture sprite tex reset = sfSprite_setTexture sprite tex (fromIntegral . fromEnum $ reset)
setTextureRect sprite rect = with rect $ sfSprite_setTextureRect_helper sprite
getTexture = fmap checkNullTexture . sfSprite_getTexture
getTextureRect sprite = alloca $ \ptr -> sfSprite_getTextureRect_helper sprite ptr >> peek ptr
foreign import ccall unsafe "sfSprite_setTexture"
sfSprite_setTexture :: Sprite -> Texture -> CInt -> IO ()
foreign import ccall unsafe "sfSprite_setTextureRect_helper"
sfSprite_setTextureRect_helper :: Sprite -> Ptr IntRect -> IO ()
foreign import ccall unsafe "sfSprite_getTexture"
sfSprite_getTexture :: Sprite -> IO Texture
foreign import ccall unsafe "sfSprite_getTextureRect_helper"
sfSprite_getTextureRect_helper :: Sprite -> Ptr IntRect -> IO ()
instance SFBounded Sprite where
getLocalBounds sprite = alloca $ \ptr -> sfSprite_getLocalBounds_helper sprite ptr >> peek ptr
getGlobalBounds sprite = alloca $ \ptr -> sfSprite_getGlobalBounds_helper sprite ptr >> peek ptr
foreign import ccall unsafe "sfSprite_getLocalBounds_helper"
sfSprite_getLocalBounds_helper :: Sprite -> Ptr FloatRect -> IO ()
foreign import ccall unsafe "sfSprite_getGlobalBounds_helper"
sfSprite_getGlobalBounds_helper :: Sprite -> Ptr FloatRect -> IO ()