Color-0.4.0: bench/YCbCr.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Criterion.Main
import Control.DeepSeq
import qualified Graphics.Color.Model as CM
import Graphics.Color.Space
import Graphics.Color.Space.RGB.ITU.Rec601
import Graphics.Color.Space.RGB.ITU.Rec709
import Data.Coerce
main :: IO ()
main = do
defaultMain
[ bgroup
"toYCbCr"
[ toYCbCrBench (CM.ColorRGB 0.1 0.2 0.3 :: Color CM.RGB Float) "Float"
, toYCbCrBench (CM.ColorRGB 0.1 0.2 0.3 :: Color CM.RGB Double) "Double"
]
, bgroup
"fromYCbCr"
[ fromYCbCrBench (CM.ColorYCbCr 0.1 0.2 0.3 :: Color CM.YCbCr Float) "Float"
, fromYCbCrBench (CM.ColorYCbCr 0.1 0.2 0.3 :: Color CM.YCbCr Double) "Double"
]
]
toYCbCrBench ::
forall e. (Elevator e, NFData e)
=> Color CM.RGB e
-> String
-> Benchmark
toYCbCrBench rgb tyName =
bgroup
tyName
[ bgroup
"Standard"
[ bench "SRGB" $
nf (fromBaseSpace :: Color (SRGB 'NonLinear) e -> Color (Y'CbCr SRGB) e) (mkColorRGB rgb)
, bench "Rec601" $
nf
(fromBaseSpace :: Color (BT601_625 'NonLinear) e -> Color (Y'CbCr BT601_625) e)
(mkColorRGB rgb)
, bench "Rec709" $
nf (fromBaseSpace :: Color (BT709 'NonLinear) e -> Color (Y'CbCr BT709) e) (mkColorRGB rgb)
]
]
fromYCbCrBench ::
forall e. (Elevator e, NFData e)
=> Color CM.YCbCr e
-> String
-> Benchmark
fromYCbCrBench ycbcr tyName =
bgroup
tyName
[ bgroup
"Standard"
[ bench "SRGB" $
nf (toBaseSpace :: Color (Y'CbCr SRGB) e -> Color (SRGB 'NonLinear) e) (coerce ycbcr)
, bench "Rec601" $
nf
(toBaseSpace :: Color (Y'CbCr BT601_625) e -> Color (BT601_625 'NonLinear) e)
(coerce ycbcr)
, bench "Rec709" $
nf (toBaseSpace :: Color (Y'CbCr BT709) e -> Color (BT709 'NonLinear) e) (coerce ycbcr)
]
]