{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
             FlexibleInstances, TypeSynonymInstances, EmptyDataDecls, 
             OverlappingInstances, IncoherentInstances #-}

module HROOT.Class.TAttLine.Implementation where


import HROOT.TypeCast

import HROOT.Class.TAttLine.RawType
import HROOT.Class.TAttLine.FFI
import HROOT.Class.TAttLine.Interface
import HROOT.Class.TAttLine.Cast

import HROOT.Class.Deletable.RawType
import HROOT.Class.Deletable.Cast
import HROOT.Class.Deletable.Interface

import Data.Word
-- import Foreign.C            
-- import Foreign.Ptr
import Foreign.ForeignPtr

import System.IO.Unsafe


instance ITAttLine TAttLine where
  getLineColor = xform0 c_tattline_getlinecolor
  getLineStyle = xform0 c_tattline_getlinestyle
  getLineWidth = xform0 c_tattline_getlinewidth
  resetAttLine = xform1 c_tattline_resetattline
  setLineAttributes = xform0 c_tattline_setlineattributes
  setLineColor = xform1 c_tattline_setlinecolor
  setLineStyle = xform1 c_tattline_setlinestyle
  setLineWidth = xform1 c_tattline_setlinewidth
instance IDeletable TAttLine where
  delete = xform0 c_tattline_delete

instance ITAttLine (Exist TAttLine) where
  getLineColor (ETAttLine x) = getLineColor x
  getLineStyle (ETAttLine x) = getLineStyle x
  getLineWidth (ETAttLine x) = getLineWidth x
  resetAttLine (ETAttLine x) = resetAttLine x
  setLineAttributes (ETAttLine x) = setLineAttributes x
  setLineColor (ETAttLine x) = setLineColor x
  setLineStyle (ETAttLine x) = setLineStyle x
  setLineWidth (ETAttLine x) = setLineWidth x
instance IDeletable (Exist TAttLine) where
  delete (ETAttLine x) = delete x


newTAttLine :: Int -> Int -> Int -> IO TAttLine
newTAttLine = xform2 c_tattline_newtattline

tAttLineDistancetoLine :: TAttLine -> Int -> Int -> Double -> Double -> Double -> Double -> IO Int
tAttLineDistancetoLine = xform6 c_tattline_tattlinedistancetoline

instance FPtr (Exist TAttLine) where
  type Raw (Exist TAttLine) = RawTAttLine
  get_fptr (ETAttLine obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETAttLine (cast_fptr_to_obj (fptr :: ForeignPtr RawTAttLine) :: TAttLine)