module Qth.ClassTypes.Core.Line (
ILine(..), Line, LineF
,withCLine, withCLineF, withLineResult, withLineFResult
)
where
import Foreign.C
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Alloc
import Qtc.Classes.Types
import Qth.Core.Base
data ILine a = (Num a, Ord a) => ILine !a !a !a !a
type Line = ILine Int
type LineF = ILine Double
withCLine :: Line -> (CInt -> CInt -> CInt -> CInt -> IO a) -> IO a
withCLine (ILine x1 y1 x2 y2) f
= f (toCInt x1) (toCInt y1) (toCInt x2) (toCInt y2)
withLineResult :: (Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()) -> IO Line
withLineResult f
= alloca $ \cx1 ->
alloca $ \cy1 ->
alloca $ \cx2 ->
alloca $ \cy2 ->
do f cx1 cy1 cx2 cy2
x1 <- peek cx1
y1 <- peek cy1
x2 <- peek cx2
y2 <- peek cy2
return (fromCLine x1 y1 x2 y2)
fromCLine :: CInt -> CInt -> CInt -> CInt -> Line
fromCLine x1 y1 x2 y2
= ILine (fromCInt x1) (fromCInt y1) (fromCInt x2) (fromCInt y2)
withCLineF :: LineF -> (CDouble -> CDouble -> CDouble -> CDouble -> IO a) -> IO a
withCLineF (ILine x1 y1 x2 y2) f
= f (toCDouble x1) (toCDouble y1) (toCDouble x2) (toCDouble y2)
withLineFResult :: (Ptr CDouble -> Ptr CDouble -> Ptr CDouble -> Ptr CDouble -> IO ()) -> IO LineF
withLineFResult f
= alloca $ \cx1 ->
alloca $ \cy1 ->
alloca $ \cx2 ->
alloca $ \cy2 ->
do f cx1 cy1 cx2 cy2
x1 <- peek cx1
y1 <- peek cy1
x2 <- peek cx2
y2 <- peek cy2
return (fromCLineF x1 y1 x2 y2)
fromCLineF :: CDouble -> CDouble -> CDouble -> CDouble -> LineF
fromCLineF x1 y1 x2 y2
= ILine (fromCDouble x1) (fromCDouble y1) (fromCDouble x2) (fromCDouble y2)