{-# LANGUAGE RankNTypes #-}

-- | Hyprometric color ramps, for making pretty images from scalar data.
module  Data.Array.Repa.Algorithms.ColorRamp
        (rampColorHotToCold)
where


-- | Standard Hot to Cold hypsometric color ramp.
--      Color sequence is red, yellow, green, cyan, blue.
rampColorHotToCold
        :: forall a
        .  (Ord a, Floating a)
        => a    -- ^ Minimum value of range.
        -> a    -- ^ Maximum value of range.
        -> a    -- ^ Data value.
        -> (a, a, a)

{-# INLINE rampColorHotToCold #-}
rampColorHotToCold vmin vmax vNotNorm
 = let
        v       | vNotNorm < vmin       = vmin
                | vNotNorm > vmax       = vmax
                | otherwise             = vNotNorm

        dv      = vmax - vmin

        result  | v < vmin + 0.25 * dv
                = ( 0
                  , 4 * (v - vmin) / dv
                  , 1.0)

                | v < vmin + 0.5 * dv
                = ( 0
                  , 1.0
                  , 1 + 4 * (vmin + 0.25 * dv - v) / dv)

                | v < vmin + 0.75 * dv
                = ( 4 * (v - vmin - 0.5 * dv) / dv
                  , 1.0
                  , 0.0)

                | otherwise
                = ( 1.0
                  , 1 + 4 * (vmin + 0.75 * dv - v) / dv
                  , 0)

  in    result