{-# 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