{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -fplugin=Foreign.Storable.Generic.Plugin #-}
module Graphics.Gloss.Raster.Massiv.Internal (
ColorMassiv(..),
rgbMassiv,
rgbMassivI,
rgbMassiv8w,
rgbMassiv',
rgbMassivI',
makeColorMassiv,
makeColorMassivI,
makeRawColorMassiv,
makeRawColorMassivI,
rgbaOfColorMassiv
) where
import Data.Data
import Data.Word
import Foreign.Storable.Generic
import Generics.Deriving.Base
data ColorMassiv = RGBA !Float !Float !Float !Float
deriving (Int -> ColorMassiv -> ShowS
[ColorMassiv] -> ShowS
ColorMassiv -> String
(Int -> ColorMassiv -> ShowS)
-> (ColorMassiv -> String)
-> ([ColorMassiv] -> ShowS)
-> Show ColorMassiv
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ColorMassiv -> ShowS
showsPrec :: Int -> ColorMassiv -> ShowS
$cshow :: ColorMassiv -> String
show :: ColorMassiv -> String
$cshowList :: [ColorMassiv] -> ShowS
showList :: [ColorMassiv] -> ShowS
Show,ColorMassiv -> ColorMassiv -> Bool
(ColorMassiv -> ColorMassiv -> Bool)
-> (ColorMassiv -> ColorMassiv -> Bool) -> Eq ColorMassiv
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ColorMassiv -> ColorMassiv -> Bool
== :: ColorMassiv -> ColorMassiv -> Bool
$c/= :: ColorMassiv -> ColorMassiv -> Bool
/= :: ColorMassiv -> ColorMassiv -> Bool
Eq,Typeable ColorMassiv
Typeable ColorMassiv
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ColorMassiv -> c ColorMassiv)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ColorMassiv)
-> (ColorMassiv -> Constr)
-> (ColorMassiv -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ColorMassiv))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ColorMassiv))
-> ((forall b. Data b => b -> b) -> ColorMassiv -> ColorMassiv)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r)
-> (forall u. (forall d. Data d => d -> u) -> ColorMassiv -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> ColorMassiv -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv)
-> Data ColorMassiv
ColorMassiv -> Constr
ColorMassiv -> DataType
(forall b. Data b => b -> b) -> ColorMassiv -> ColorMassiv
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ColorMassiv -> u
forall u. (forall d. Data d => d -> u) -> ColorMassiv -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ColorMassiv
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ColorMassiv -> c ColorMassiv
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ColorMassiv)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ColorMassiv)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ColorMassiv -> c ColorMassiv
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ColorMassiv -> c ColorMassiv
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ColorMassiv
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ColorMassiv
$ctoConstr :: ColorMassiv -> Constr
toConstr :: ColorMassiv -> Constr
$cdataTypeOf :: ColorMassiv -> DataType
dataTypeOf :: ColorMassiv -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ColorMassiv)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ColorMassiv)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ColorMassiv)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ColorMassiv)
$cgmapT :: (forall b. Data b => b -> b) -> ColorMassiv -> ColorMassiv
gmapT :: (forall b. Data b => b -> b) -> ColorMassiv -> ColorMassiv
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ColorMassiv -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ColorMassiv -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ColorMassiv -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ColorMassiv -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ColorMassiv -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ColorMassiv -> m ColorMassiv
Data,(forall x. ColorMassiv -> Rep ColorMassiv x)
-> (forall x. Rep ColorMassiv x -> ColorMassiv)
-> Generic ColorMassiv
forall x. Rep ColorMassiv x -> ColorMassiv
forall x. ColorMassiv -> Rep ColorMassiv x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ColorMassiv -> Rep ColorMassiv x
from :: forall x. ColorMassiv -> Rep ColorMassiv x
$cto :: forall x. Rep ColorMassiv x -> ColorMassiv
to :: forall x. Rep ColorMassiv x -> ColorMassiv
Generic,Typeable)
instance Num ColorMassiv where
+ :: ColorMassiv -> ColorMassiv -> ColorMassiv
(+) (RGBA Float
r1 Float
g1 Float
b1 Float
_) (RGBA Float
r2 Float
g2 Float
b2 Float
_)
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float
r1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
r2) (Float
g1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
g2) (Float
b1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
b2) Float
1
{-# INLINE (+) #-}
(-) (RGBA Float
r1 Float
g1 Float
b1 Float
_) (RGBA Float
r2 Float
g2 Float
b2 Float
_)
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float
r1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
r2) (Float
g1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
g2) (Float
b1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
b2) Float
1
{-# INLINE (-) #-}
* :: ColorMassiv -> ColorMassiv -> ColorMassiv
(*) (RGBA Float
r1 Float
g1 Float
b1 Float
_) (RGBA Float
r2 Float
g2 Float
b2 Float
_)
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float
r1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
r2) (Float
g1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
g2) (Float
b1 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
b2) Float
1
{-# INLINE (*) #-}
abs :: ColorMassiv -> ColorMassiv
abs (RGBA Float
r1 Float
g1 Float
b1 Float
_)
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float -> Float
forall a. Num a => a -> a
abs Float
r1) (Float -> Float
forall a. Num a => a -> a
abs Float
g1) (Float -> Float
forall a. Num a => a -> a
abs Float
b1) Float
1
{-# INLINE abs #-}
signum :: ColorMassiv -> ColorMassiv
signum (RGBA Float
r1 Float
g1 Float
b1 Float
_)
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float -> Float
forall a. Num a => a -> a
signum Float
r1) (Float -> Float
forall a. Num a => a -> a
signum Float
g1) (Float -> Float
forall a. Num a => a -> a
signum Float
b1) Float
1
{-# INLINE signum #-}
fromInteger :: Integer -> ColorMassiv
fromInteger Integer
i
= let f :: Float
f = Integer -> Float
forall a. Num a => Integer -> a
fromInteger Integer
i
in Float -> Float -> Float -> Float -> ColorMassiv
RGBA Float
f Float
f Float
f Float
1
{-# INLINE fromInteger #-}
instance GStorable ColorMassiv
makeColorMassiv :: Float
-> Float
-> Float
-> Float
-> ColorMassiv
makeColorMassiv :: Float -> Float -> Float -> Float -> ColorMassiv
makeColorMassiv Float
r Float
g Float
b Float
a
= ColorMassiv -> ColorMassiv
clampColorMassiv
(ColorMassiv -> ColorMassiv) -> ColorMassiv -> ColorMassiv
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Float -> Float -> ColorMassiv
RGBA Float
r Float
g Float
b Float
a
{-# INLINE makeColorMassiv #-}
makeColorMassivI :: Int
-> Int
-> Int
-> Int
-> ColorMassiv
makeColorMassivI :: Int -> Int -> Int -> Int -> ColorMassiv
makeColorMassivI Int
r Int
g Int
b Int
a
= ColorMassiv -> ColorMassiv
clampColorMassiv
(ColorMassiv -> ColorMassiv) -> ColorMassiv -> ColorMassiv
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
r Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
g Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
b Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
{-# INLINE makeColorMassivI #-}
makeRawColorMassiv :: Float
-> Float
-> Float
-> Float
-> ColorMassiv
makeRawColorMassiv :: Float -> Float -> Float -> Float -> ColorMassiv
makeRawColorMassiv Float
r Float
g Float
b Float
a
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA Float
r Float
g Float
b Float
a
{-# INLINE makeRawColorMassiv #-}
makeRawColorMassivI :: Int
-> Int
-> Int
-> Int
-> ColorMassiv
makeRawColorMassivI :: Int -> Int -> Int -> Int -> ColorMassiv
makeRawColorMassivI Int
r Int
g Int
b Int
a
= Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
r Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
g Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
b Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
(Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
255)
{-# INLINE makeRawColorMassivI #-}
rgbaOfColorMassiv :: ColorMassiv
-> (Float,Float,Float,Float)
rgbaOfColorMassiv :: ColorMassiv -> (Float, Float, Float, Float)
rgbaOfColorMassiv (RGBA Float
r Float
g Float
b Float
a) = (Float
r,Float
g,Float
b,Float
a)
{-# INLINE rgbaOfColorMassiv #-}
clampColorMassiv :: ColorMassiv
-> ColorMassiv
clampColorMassiv :: ColorMassiv -> ColorMassiv
clampColorMassiv ColorMassiv
cc
= let (Float
r,Float
g,Float
b,Float
a) = ColorMassiv -> (Float, Float, Float, Float)
rgbaOfColorMassiv ColorMassiv
cc
clamp :: a -> a
clamp a
x = (a -> a -> a
forall a. Ord a => a -> a -> a
min (a -> a -> a
forall a. Ord a => a -> a -> a
max a
x a
0.0) a
1.0)
in Float -> Float -> Float -> Float -> ColorMassiv
RGBA (Float -> Float
forall {a}. (Ord a, Fractional a) => a -> a
clamp Float
r) (Float -> Float
forall {a}. (Ord a, Fractional a) => a -> a
clamp Float
g) (Float -> Float
forall {a}. (Ord a, Fractional a) => a -> a
clamp Float
b) (Float -> Float
forall {a}. (Ord a, Fractional a) => a -> a
clamp Float
a)
rgbMassiv :: Float
-> Float
-> Float
-> ColorMassiv
rgbMassiv :: Float -> Float -> Float -> ColorMassiv
rgbMassiv Float
r Float
g Float
b = Float -> Float -> Float -> Float -> ColorMassiv
makeColorMassiv Float
r Float
g Float
b Float
1.0
{-# INLINE rgbMassiv #-}
rgbMassivI :: Int
-> Int
-> Int
-> ColorMassiv
rgbMassivI :: Int -> Int -> Int -> ColorMassiv
rgbMassivI Int
r Int
g Int
b = Int -> Int -> Int -> Int -> ColorMassiv
makeColorMassivI Int
r Int
g Int
b Int
255
{-# INLINE rgbMassivI #-}
rgbMassiv8w :: Word8
-> Word8
-> Word8
-> ColorMassiv
rgbMassiv8w :: Word8 -> Word8 -> Word8 -> ColorMassiv
rgbMassiv8w Word8
r Word8
g Word8
b = Int -> Int -> Int -> Int -> ColorMassiv
makeRawColorMassivI (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
r) (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
g) (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
b) Int
255
{-# INLINE rgbMassiv8w #-}
rgbMassiv' :: Float
-> Float
-> Float
-> ColorMassiv
rgbMassiv' :: Float -> Float -> Float -> ColorMassiv
rgbMassiv' Float
r Float
g Float
b = Float -> Float -> Float -> Float -> ColorMassiv
makeRawColorMassiv Float
r Float
g Float
b Float
1.0
{-# INLINE rgbMassiv' #-}
rgbMassivI' :: Int
-> Int
-> Int
-> ColorMassiv
rgbMassivI' :: Int -> Int -> Int -> ColorMassiv
rgbMassivI' Int
r Int
g Int
b = Int -> Int -> Int -> Int -> ColorMassiv
makeRawColorMassivI Int
r Int
g Int
b Int
255
{-# INLINE rgbMassivI' #-}