{-# LANGUAGE RecordWildCards #-}
module Tone_map where
import Elem3D ( RGB(..), elevateRGBPoint )

{-# INLINE clamp #-}
-- |Función auxiliar, dado un valor máximo y una lista de RGBs, aplica la operación de clampeo con dicho valor sobre estos.
clamp :: Float -> [RGB] -> [RGB]
clamp :: Float -> [RGB] -> [RGB]
clamp Float
x = (RGB -> RGB) -> [RGB] -> [RGB]
forall a b. (a -> b) -> [a] -> [b]
map (\(RGB {Float
blue :: RGB -> Float
green :: RGB -> Float
red :: RGB -> Float
blue :: Float
green :: Float
red :: Float
..}) -> Float -> Float -> Float -> RGB
RGB (Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
x Float
red) (Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
x Float
green) (Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
x Float
blue))

{-# INLINE ecualization #-}
-- |Función auxiliar, dado un valor y una lista de RGBs, aplica la operación de ecualización con dicho valor sobre estos.
ecualization :: Float -> [RGB] -> [RGB]
ecualization :: Float -> [RGB] -> [RGB]
ecualization Float
x = (RGB -> RGB) -> [RGB] -> [RGB]
forall a b. (a -> b) -> [a] -> [b]
map (\(RGB {Float
blue :: Float
green :: Float
red :: Float
blue :: RGB -> Float
green :: RGB -> Float
red :: RGB -> Float
..}) -> Float -> Float -> Float -> RGB
RGB (Float
red Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
x) (Float
green Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
x) (Float
blue Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
x))

{-# INLINE ecualization' #-}
-- |Función auxiliar, dado un valor y una lista de RGBs, revierte la operación de ecualización con dicho valor sobre estos.
ecualization' :: Float -> [RGB] -> [RGB]
ecualization' :: Float -> [RGB] -> [RGB]
ecualization' Float
x = (RGB -> RGB) -> [RGB] -> [RGB]
forall a b. (a -> b) -> [a] -> [b]
map (\(RGB {Float
blue :: Float
green :: Float
red :: Float
blue :: RGB -> Float
green :: RGB -> Float
red :: RGB -> Float
..}) -> Float -> Float -> Float -> RGB
RGB (Float
red Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x) (Float
green Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x) (Float
blue Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x))

{-# INLINE elevateRGBPoints #-}
-- |Función auxiliar, dado un valor y una lista de RGBs, eleva estos a 1/valor.
elevateRGBPoints :: Float -> [RGB] -> [RGB]
elevateRGBPoints :: Float -> [RGB] -> [RGB]
elevateRGBPoints Float
x = (RGB -> RGB) -> [RGB] -> [RGB]
forall a b. (a -> b) -> [a] -> [b]
map (Float -> RGB -> RGB
elevateRGBPoint Float
x)

{-# INLINE gammaFunc #-}
-- |Función auxiliar, dado dos valores y una lista de RGBs, aplica la función gamma con dichos valores sobre estos.
gammaFunc :: Float -> Float -> [RGB] -> [RGB]
gammaFunc :: Float -> Float -> [RGB] -> [RGB]
gammaFunc Float
x Float
gamma = Float -> [RGB] -> [RGB]
ecualization' Float
1 ([RGB] -> [RGB]) -> ([RGB] -> [RGB]) -> [RGB] -> [RGB]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> [RGB] -> [RGB]
elevateRGBPoints Float
gamma ([RGB] -> [RGB]) -> ([RGB] -> [RGB]) -> [RGB] -> [RGB]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> [RGB] -> [RGB]
ecualization Float
x

{-# INLINE gammaFunc' #-}
-- |Función auxiliar, dado dos valores y una lista de RGBs, revierte la aplicación de la función gamma con dichos valores sobre estos.
gammaFunc' :: Float -> Float -> [RGB] -> [RGB]
gammaFunc' :: Float -> Float -> [RGB] -> [RGB]
gammaFunc' Float
x Float
gamma = Float -> [RGB] -> [RGB]
ecualization' Float
1 ([RGB] -> [RGB]) -> ([RGB] -> [RGB]) -> [RGB] -> [RGB]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> [RGB] -> [RGB]
elevateRGBPoints (Float
1 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
gamma) ([RGB] -> [RGB]) -> ([RGB] -> [RGB]) -> [RGB] -> [RGB]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> [RGB] -> [RGB]
ecualization Float
x