module Hylogen.WithHylide.Util where

import Hylogen
import Hylogen.Expr

-- | Given an alpha value, sets it for the alpha channel for a given color
--
-- @
-- setAlpha alpha color -- == n newColor
-- @
setAlpha :: Vec1 -> Vec4 -> Vec4
setAlpha alpha v = vec4 (xyz_ v, alpha)

-- | Linear to exponential map
--
-- @
-- linexp (a, b, c, d) a           -- == c
-- linexp (a, b, c, d) b           -- == d
-- linexp (a, b, c, d) ((a + b)\/2) -- == c * sqrt(d/c)
-- @
linexp :: (Floating a) => (a, a, a, a) -> a -> a
linexp (a, b, c, d) x = c * ((d / c) ** ((x - a) / (b - a)))

-- | Linear to linear map
--
-- @
-- linexp (a, b, c, d) a           -- == c
-- linexp (a, b, c, d) b           -- == d
-- linexp (a, b, c, d) ((a + b)\/2) -- == ((c + d)/2)
-- @
linlin :: (Floating a) => (a, a, a, a) -> a -> a
linlin (a, b, c, d) x = c + (d - c) * ((x - a) / (b - a))

hsv2rgb :: Vec4 -> Vec4
hsv2rgb v = vec4(op1pre "hsv2rgb" (xyz_ v) :: Vec3, w_ v :: Vec1)

rgb2hsv :: Vec4 -> Vec4
rgb2hsv v = vec4 (op1pre "rgb2hsv" (xyz_ v) :: Vec3, w_ v :: Vec1)