Skip to content

Commit

Permalink
Add missing files
Browse files Browse the repository at this point in the history
  • Loading branch information
lehins committed Jan 12, 2020
1 parent af77327 commit 09eff48
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 8 deletions.
30 changes: 30 additions & 0 deletions Color/tests/Graphics/Color/Model/YCbCrSpec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Graphics.Color.Model.YCbCrSpec (spec) where

import Graphics.Color.Model
import Graphics.Color.Model.Common
import Graphics.Color.Model.RGBSpec ()
import qualified Codec.Picture.Types as JuicyPixels

instance (Elevator e, Random e) => Arbitrary (Color YCbCr e) where
arbitrary =
ColorYCbCr <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator

spec :: Spec
spec =
describe "YCbCr" $ do
colorModelSpec @YCbCr @Word "YCbCr"
-- prop "rgb2ycbcr . ycbcr2rgb" $ \(rgb :: Color RGB Double) ->
-- rgb `epsilonEqColor` ycbcr2rgb (rgb2ycbcr rgb)
-- describe "Match JuicyPixels" $ do
-- prop "rgb2ycbcr" $ \(rgb@(ColorRGB r g b) :: Color RGB Word8) ->
-- case JuicyPixels.convertPixel (JuicyPixels.PixelRGB8 r g b) of
-- JuicyPixels.PixelYCbCr8 y cb cr ->
-- toWord8 <$> rgb2ycbcr (toFloat <$> rgb) `approxIntegralColorExpect1` ColorYCbCr y cb cr
-- prop "ycbcr2rgb" $ \(ycbcr@(ColorYCbCr y cb cr) :: Color YCbCr Word8) ->
-- case JuicyPixels.convertPixel (JuicyPixels.PixelYCbCr8 y cb cr) of
-- JuicyPixels.PixelRGB8 r g b ->
-- toWord8 <$> ycbcr2rgb (toFloat <$> ycbcr) `approxIntegralColorExpect1` ColorRGB r g b
29 changes: 21 additions & 8 deletions Color/tests/Graphics/Color/Space/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ module Graphics.Color.Space.Common
, module Graphics.Color.Model.Common
, colorSpaceSpec
, colorSpaceLenientSpec
, colorSpaceCommonSpec
, prop_toFromColorXYZ
, prop_LuminanceColorXYZ
, prop_toFromLenientColorXYZ
, prop_toFromBaseSpace
) where
Expand Down Expand Up @@ -40,13 +42,25 @@ prop_toFromLenientColorXYZ ::
prop_toFromLenientColorXYZ epsilon c =
epsilonEqColorTol epsilon c (fromColorXYZ (toColorXYZ c :: Color (XYZ i) Double))

prop_LuminanceColorXYZ :: forall cs i e . ColorSpace cs i e => Color cs e -> Property
prop_LuminanceColorXYZ c =
(luminance c :: Color (Y i) Float) `epsilonEqColor`
luminance (toColorXYZ c :: Color (XYZ i) Float)

prop_toFromBaseSpace ::
forall cs i e. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e)
=> Color cs e
-> Property
prop_toFromBaseSpace c = c `epsilonEqColor` fromBaseSpace (toBaseSpace c)

prop_toFromBaseSpaceLenient ::
forall cs i e. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e)
=> e
-> Color cs e
-> Property
prop_toFromBaseSpaceLenient epsilon c = epsilonEqColorTol epsilon c $ fromBaseSpace (toBaseSpace c)


prop_toFromBaseModel ::
forall cs i e. ColorSpace cs i e
=> Color cs e
Expand All @@ -55,23 +69,21 @@ prop_toFromBaseModel c = c === fromBaseModel (toBaseModel c)

colorSpaceCommonSpec ::
forall cs i e.
(Arbitrary (Color cs e), ColorSpace (BaseSpace cs) i e, ColorSpace cs i e, RealFloat e)
(Arbitrary (Color cs e), ColorSpace cs i e)
=> Spec -> Spec
colorSpaceCommonSpec extra = do
colorSpaceCommonSpec extra =
describe "ColorSpace" $ do
prop "luminance . toColorXYZ" $ \(c :: Color cs e) ->
(luminance c :: Color (Y i) Float) `epsilonEqColor`
luminance (toColorXYZ c :: Color (XYZ i) Float)
prop "luminance . toColorXYZ" $ prop_LuminanceColorXYZ @cs @i @e
prop "toFromBaseModel" $ prop_toFromBaseModel @cs @i @e
prop "toFromBaseSpace" $ prop_toFromBaseSpace @cs @i @e
extra

colorSpaceSpec ::
forall cs i e.
(Arbitrary (Color cs e), ColorSpace (BaseSpace cs) i e, ColorSpace cs i e, RealFloat e)
=> Spec
colorSpaceSpec =
colorSpaceCommonSpec @cs @i @e $
colorSpaceCommonSpec @cs @i @e $ do
prop "toFromBaseSpace" $ prop_toFromBaseSpace @cs @i @e
prop "toFromColorXYZ" $ prop_toFromColorXYZ @cs @i @e

colorSpaceLenientSpec ::
Expand All @@ -81,5 +93,6 @@ colorSpaceLenientSpec ::
-> Spec
colorSpaceLenientSpec tol =
let tolStr = "(lenient=" ++ show tol ++ ")"
in colorSpaceCommonSpec @cs @i @e $
in colorSpaceCommonSpec @cs @i @e $ do
prop ("toFromBaseSpace " ++ tolStr) $ prop_toFromBaseSpaceLenient @cs @i @e tol
prop ("toFromColorXYZ " ++ tolStr) $ prop_toFromLenientColorXYZ @cs @i @e tol
52 changes: 52 additions & 0 deletions Color/tests/Graphics/Color/Space/RGB/Alternative/YCbCrSpec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Graphics.Color.Space.RGB.Alternative.YCbCrSpec (spec) where

import qualified Codec.Picture.Types as JuicyPixels
import Graphics.Color.Space.Common
import Graphics.Color.Space.RGB.SRGB
import qualified Graphics.Color.Space.RGB.Derived.SRGB as Derived
import Graphics.Color.Space.RGB.Alternative.YCbCr

instance (Elevator e, Random e) => Arbitrary (Color SRGB e) where
arbitrary =
ColorRGB <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator

instance (Illuminant i, Elevator e, Random e) => Arbitrary (Color (Derived.SRGB i) e) where
arbitrary =
ColorRGB <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator


instance (Elevator e, Random e) => Arbitrary (Color (YCbCr cs) e) where
arbitrary =
ColorYCbCr <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator

spec :: Spec
spec =
describe "YCbCr" $ do
describe "sRGB" $ do
colorModelSpec @(YCbCr SRGB) @Word "YCbCr"
colorSpaceCommonSpec @(YCbCr SRGB) @_ @Double $ pure ()
describe "Derived-sRGB" $ do
colorModelSpec @(YCbCr (Derived.SRGB D65)) @Word "YCbCr"
colorSpaceCommonSpec @(YCbCr (Derived.SRGB D65)) @_ @Double $ pure ()
prop "toColorYCbCr . toColorYCbCr" $ \(rgb :: Color (Derived.SRGB D65) Double) ->
rgb `epsilonEqColor`
fromColorYCbCr (toColorYCbCr rgb :: Color (YCbCr (Derived.SRGB D65)) Double)
prop "toColorYCbCr == srgb2ycbcr" $ \(rgb :: Color SRGB Double) ->
srgb2ycbcr rgb `epsilonEqColor`
(toColorYCbCr rgb :: Color (YCbCr SRGB) Double)
prop "fromColorYCbCr == ycbcr2srgb" $ \(ycbcr :: Color (YCbCr SRGB) Double) ->
ycbcr2srgb ycbcr `epsilonEqColor` (fromColorYCbCr ycbcr :: Color SRGB Double)
describe "Match JuicyPixels" $ do
prop "rgb2ycbcr" $ \(rgb@(ColorRGB r g b) :: Color SRGB Word8) ->
case JuicyPixels.convertPixel (JuicyPixels.PixelRGB8 r g b) of
JuicyPixels.PixelYCbCr8 y cb cr ->
(fromBaseSpace rgb :: Color (YCbCr SRGB) Word8)
`approxIntegralColorExpect1` ColorYCbCr y cb cr
prop "ycbcr2rgb" $ \(ycbcr@(ColorYCbCr y cb cr) :: Color (YCbCr SRGB) Word8) ->
case JuicyPixels.convertPixel (JuicyPixels.PixelYCbCr8 y cb cr) of
JuicyPixels.PixelRGB8 r g b ->
(toBaseSpace ycbcr) `approxIntegralColorExpect1` ColorRGB r g b

0 comments on commit 09eff48

Please sign in to comment.