packages feed

reanimate-0.1.9.0: examples/colormaps.hs

#!/usr/bin/env stack
-- stack runghc --package reanimate
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import           Codec.Picture
import qualified Data.Colour.CIE            as CIE
import           Data.Colour.CIE.Illuminant (d65)
import           Data.Colour.RGBSpace
import           Data.Colour.SRGB
import           Data.Word
import           Graphics.SvgTree           (Tree)
import           Reanimate

-- Cycle the animation if we want to upload it to youtube.
youtube :: Animation -> Animation
-- youtube = repeatAnimation 6
youtube = id

main :: IO ()
main = reanimate $ youtube $ pauseAtEnd 2 $ playThenReverseA $ pauseAtEnd 2 $ mkAnimation 5 $ \t ->
    let s           = curveS 2 t
        offsetWidth = screenWidth * 0.5
        nubWidth    = 0.2
        textYOffset = 0.2
    in mkGroup
      [ mkBackground "black"
      , translate 0 (screenHeight/2*0.85) $ withFillColor "white" $ mkGroup
        [ translate (offsetWidth*s - offsetWidth/2) 0 $
          withFillColor "white" $ mkCircle nubWidth
        , withStrokeColor "white" $ withStrokeWidth 0.05 $
          mkLine (-(offsetWidth-nubWidth)/2, 0)
                 ((offsetWidth-nubWidth)/2, 0)
        , translate (-offsetWidth/2-1.0) textYOffset $
          scale 0.5 $ centerX $ latex "Color"
        , translate (offsetWidth/2+1.5) textYOffset $
          scale 0.5 $ centerX $ latex "Greyscale"
        ]
      , translate (-columnX) (rowInit-rowStep*0) $ mkOutline "viridis" (dimmer s . viridis)
      , translate (-columnX) (rowInit-rowStep*1) $ mkOutline "inferno" (dimmer s . inferno)
      , translate (-columnX) (rowInit-rowStep*2) $ mkOutline "cividis" (dimmer s . cividis)
      , translate (-columnX) (rowInit-rowStep*3) $ mkOutline "jet" (dimmer s . jet)
      , translate (-columnX) (rowInit-rowStep*4) $ mkOutline "turbo" (dimmer s . turbo)

      , translate (columnX) (rowInit-rowStep*0) $ mkOutline "magma" (dimmer s . magma)
      , translate (columnX) (rowInit-rowStep*1) $ mkOutline "plasma" (dimmer s . plasma)
      , translate (columnX) (rowInit-rowStep*2) $ mkOutline "sinebow" (dimmer s . sinebow)
      , translate (columnX) (rowInit-rowStep*3) $ mkOutline "hsv" (dimmer s . hsv)
      , translate (columnX) (rowInit-rowStep*4) $ mkOutline "parula" (dimmer s . parula)
      ]
  where
    rowInit = 2.2
    rowStep = 1.2
    columnX = screenWidth/4

    mkOutline label f =
      mkGroup
      [ center $ withFillColor "grey" $ mkRect (scaleWidth+0.05) (scaleHeight+0.05)
      , scaleToSize scaleWidth scaleHeight $ mkColorMap f
      , translate (-scaleWidth/2) (0.5) $ centerY $ withFillColor "white" $
        scale 0.5 $ latex label
      ]
    scaleWidth = screenWidth/8*3
    scaleHeight = screenHeight/20

mkColorMap :: (Double -> PixelRGB8) -> Tree
mkColorMap f = center $ embedImage img
  where
    width = 1000
    height = 1
    img = generateImage pixelRenderer width height
    pixelRenderer x _y = f (fromIntegral x / fromIntegral width)

dimmer :: Double -> PixelRGB8 -> PixelRGB8
dimmer switch (PixelRGB8 r g b) =
    PixelRGB8 r' g' b'
  where
    (lStar, aStar, bStar) = CIE.cieLABView d65 (sRGBBounded r g b :: Colour Double)
    RGB r' g' b' = toSRGBBounded $ CIE.cieLAB d65 lStar (aStar*c) (bStar*c) :: RGB Word8
    c = 1-switch