module Graphics.Image.Interface.Repa.Unboxed (
RSU(..), RPU(..), Image(..)
) where
import Prelude as P
import qualified Data.Array.Repa as R
import qualified Data.Array.Repa.Eval as R
import Graphics.Image.Interface as I
import Graphics.Image.Interface.Repa.Generic
import qualified Graphics.Image.Interface.Vector.Unboxed as IVU
data RSU = RSU
data RPU = RPU
instance Show RSU where
show RSU = "RepaSequentialUnboxed"
instance Show RPU where
show RPU = "RepaParallelUnboxed"
type instance Repr (RS IVU.U) = R.U
type instance Repr (RP IVU.U) = R.U
instance SuperClass RSU cs e => BaseArray RSU cs e where
type SuperClass RSU cs e =
(ColorSpace cs e, Num (Pixel cs e),
IVU.Unbox e, IVU.Unbox (Components cs e),
R.Elt e, R.Elt (Pixel cs e))
data Image RSU cs e = SUImage !(Image (RS IVU.U) cs e)
dims (SUImage img) = dims img
instance (BaseArray RSU cs e) => Array RSU cs e where
type Manifest RSU = IVU.VU
makeImage !sz f = SUImage (makeImage sz f)
makeImageWindowed !sz !w f = SUImage . makeImageWindowed sz w f
singleton = SUImage . singleton
index00 (SUImage img) = index00 img
map f (SUImage img) = SUImage (I.map f img)
imap f (SUImage img) = SUImage (I.imap f img)
zipWith f (SUImage img1) (SUImage img2) = SUImage (I.zipWith f img1 img2)
izipWith f (SUImage img1) (SUImage img2) = SUImage (I.izipWith f img1 img2)
traverse (SUImage img) f g = SUImage (I.traverse img f g)
traverse2 (SUImage img1) (SUImage img2) f g = SUImage (I.traverse2 img1 img2 f g)
transpose (SUImage img) = SUImage (I.transpose img)
backpermute !sz g (SUImage img) = SUImage (backpermute sz g img)
fromLists = SUImage . fromLists
fold f !px0 (SUImage img) = fold f px0 img
foldIx f !px0 (SUImage img) = foldIx f px0 img
eq (SUImage img1) (SUImage img2) = img1 == img2
compute (SUImage img) = SUImage (compute img)
(|*|) (SUImage img1) (SUImage img2) = SUImage (img1 |*| img2)
toManifest (SUImage (SScalar px)) = singleton px
toManifest (SUImage (STImage arr)) =
IVU.fromUnboxedVector (sh2ix (R.extent arr)) (R.toUnboxed arr)
toManifest !img = toManifest (compute img)
instance SuperClass RPU cs e => BaseArray RPU cs e where
type SuperClass RPU cs e =
(ColorSpace cs e, Num (Pixel cs e),
IVU.Unbox e, IVU.Unbox (Components cs e),
R.Elt e, R.Elt (Pixel cs e))
data Image RPU cs e = PUImage !(Image (RP IVU.U) cs e)
dims (PUImage img) = dims img
instance (BaseArray RPU cs e) => Array RPU cs e where
type Manifest RPU = IVU.VU
makeImage !sz f = PUImage (makeImage sz f)
makeImageWindowed !sz !w f = PUImage . makeImageWindowed sz w f
singleton = PUImage . singleton
index00 (PUImage img) = index00 img
map f (PUImage img) = PUImage (I.map f img)
imap f (PUImage img) = PUImage (I.imap f img)
zipWith f (PUImage img1) (PUImage img2) = PUImage (I.zipWith f img1 img2)
izipWith f (PUImage img1) (PUImage img2) = PUImage (I.izipWith f img1 img2)
traverse (PUImage img) f g = PUImage (I.traverse img f g)
traverse2 (PUImage img1) (PUImage img2) f g = PUImage (I.traverse2 img1 img2 f g)
transpose (PUImage img) = PUImage (I.transpose img)
backpermute !sz g (PUImage img) = PUImage (backpermute sz g img)
fromLists = PUImage . fromLists
fold f !px0 (PUImage img) = I.fold f px0 img
foldIx f !px0 (PUImage img) = I.foldIx f px0 img
eq (PUImage img1) (PUImage img2) = img1 == img2
compute (PUImage img) = PUImage (compute img)
(|*|) (PUImage img1) (PUImage img2) = PUImage (img1 |*| img2)
toManifest (PUImage (PScalar px)) = singleton px
toManifest (PUImage (PTImage arr)) =
IVU.fromUnboxedVector (sh2ix (R.extent arr)) (R.toUnboxed arr)
toManifest !img = toManifest (compute img)
instance Exchangable RPU RSU where
exchange _ (PUImage img) = SUImage (toRS img)
instance Exchangable RSU RPU where
exchange _ (SUImage img) = PUImage (toRP img)
instance Exchangable IVU.VU RSU where
exchange _ img@(dims -> (1, 1)) = singleton (index00 img)
exchange _ img =
SUImage . STImage . R.fromUnboxed (ix2sh $ dims img) . IVU.toUnboxedVector $ img
instance Exchangable IVU.VU RPU where
exchange _ img@(dims -> (1, 1)) = singleton (index00 img)
exchange _ img =
PUImage . PTImage . R.fromUnboxed (ix2sh $ dims img) . IVU.toUnboxedVector $ img
instance Exchangable RSU IVU.VU where
exchange _ = toManifest
instance Exchangable RPU IVU.VU where
exchange _ = toManifest