content: {-# LANGUAGE OverloadedStrings #-}
  {-|
    A colormap takes a number between 0 and 1 (inclusive) and spits out a color.
    The colors do not have an alpha component but one can be added with
    `Codec.Picture.Types.promotePixel`.
  -}
  module Reanimate.ColorMap
    ( turbo
    , viridis
    , magma
    , inferno
    , plasma
    , sinebow
    , parula
    , cividis
    , jet
    , hsv
    , hsvMatlab
    , greyscale
    ) where
  
  import           Codec.Picture            (Pixel8, PixelRGB8 (..))
  import           Data.Bits                (Bits (shiftL))
  import           Data.Char                (digitToInt)
  import           Data.Colour.RGBSpace     (RGB (RGB))
  import qualified Data.Colour.RGBSpace.HSV as HSV
  import           Data.Text                (Text)
  import qualified Data.Text                as T
  import           Data.Vector              (Vector)
  import qualified Data.Vector              as V
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “turbo” color scheme by Anton Mikhailov.
  --
  --   <<docs/gifs/doc_turbo.gif>>
  turbo :: Double -> PixelRGB8
  turbo t = PixelRGB8 red green blue
    where
      red   = trunc (round (34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))
      green = trunc (round (23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))
      blue  = trunc (round (27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))
      trunc :: Integer -> Pixel8
      trunc = fromIntegral . min 255 . max 0
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “viridis” perceptually-uniform color scheme designed by van der Walt,
  --   Smith and Firing for matplotlib, represented as an RGB string.
  --
  --   <<docs/gifs/doc_viridis.gif>>
  viridis :: Double -> PixelRGB8
  viridis = ramp (colors
    "44015444025645045745055946075a46085c460a5d460b5e470d60470e614710634711644713\
    \6548146748166848176948186a481a6c481b6d481c6e481d6f481f7048207148217348237448\
    \2475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f\
    \463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142\
    \874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b\
    \518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d\
    \355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b\
    \8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a\
    \778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e\
    \25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f\
    \8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e\
    \9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a685\
    \22a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db2\
    \7d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340\
    \bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c765\
    \5ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d0\
    \5477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195\
    \d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2b\
    \b8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e2\
    \19dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8\
    \e621fbe723fde725")
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “magma” perceptually-uniform color scheme designed by van der Walt and
  --   Smith for matplotlib, represented as an RGB string.
  --
  --   <<docs/gifs/doc_magma.gif>>
  magma :: Double -> PixelRGB8
  magma = ramp (colors
    "00000401000501010601010802010902020b02020d03030f0303120404140504160605180605\
    \1a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d3414\
    \0e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e221150241253\
    \25125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f\
    \6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f\
    \127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980\
    \641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621\
    \817822817922827b23827c23827e24828025828125818326818426818627818827818928818b\
    \29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7f\
    \a02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb336\
    \7ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c8\
    \3e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476a\
    \dc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb57\
    \60ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf6\
    \6c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835f\
    \fb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b\
    \6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afe\
    \b47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8d\
    \fecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2\
    \a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fc\
    \f9bbfcfbbdfcfdbf")
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “inferno” perceptually-uniform color scheme designed by van der Walt
  --   and Smith for matplotlib, represented as an RGB string.
  --
  --   <<docs/gifs/doc_inferno.gif>>
  inferno :: Double -> PixelRGB8
  inferno = ramp (colors
    "00000401000501010601010802010a02020c02020e0302100403120403140504170604190705\
    \1b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b3716\
    \0b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b55\
    \2b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a\
    \67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d55\
    \0f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e\
    \6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e\
    \6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f246990256892\
    \25689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60\
    \a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b935\
    \56ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb\
    \4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3c\
    \db503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee860\
    \2de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2\
    \741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890c\
    \f98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca1\
    \08fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfb\
    \ba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13d\
    \f7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea\
    \69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9\
    \fc9dfafda1fcffa4")
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “plasma” perceptually-uniform color scheme designed by van der Walt and
  --   Smith for matplotlib, represented as an RGB string.
  --
  --   <<docs/gifs/doc_plasma.gif>>
  plasma :: Double -> PixelRGB8
  plasma = ramp (colors
    "0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05\
    \932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41\
    \049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a4\
    \5601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900\
    \a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d\
    \03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca4\
    \8f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a\
    \9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b0\
    \2991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786\
    \be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca45\
    \7acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5\
    \546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263\
    \e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e971\
    \58e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1\
    \814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143\
    \f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca3\
    \38fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efe\
    \b72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26\
    \fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df\
    \25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1\
    \f525f0f724f0f921")
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “sinebow” color scheme by Jim Bumgardner and Charlie Loyd.
  --
  --   <<docs/gifs/doc_sinebow.gif>>
  sinebow :: Double -> PixelRGB8
  sinebow t = PixelRGB8 r g b
    where
      pi_1_3 = pi / 3
      pi_2_3 = pi * 2 / 3
      x = (0.5 - t) * pi
      r = round $ 255 * sin x**2
      g = round $ 255 * sin (x+pi_1_3)**2
      b = round $ 255 * sin (x+pi_2_3)**2
  
  -- | Given a number t in the range [0,1], returns the corresponding color from
  --   the “cividis” color vision deficiency-optimized color scheme designed by
  --   Nuñez, Anderton, and Renslow, represented as an RGB string.
  --
  --   <<docs/gifs/doc_cividis.gif>>
  cividis :: Double -> PixelRGB8
  cividis t = PixelRGB8 red green blue
    where
      red   = trunc $ round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57)))))
      green = trunc $ round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37)))))
      blue  = trunc $ round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67)))))
      trunc :: Integer -> Pixel8
      trunc = fromIntegral . min 255 . max 0
  
  -- | Jet colormap. Used to be the default in matlab. Obsolete.
  --
  --   <<docs/gifs/doc_jet.gif>>
  jet :: Double -> PixelRGB8
  jet t = PixelRGB8 red green blue
    where
      red   = trunc $ min (4*t - 1.5) (-4*t + 4.5)
      green = trunc $ min (4*t - 0.5) (-4*t + 3.5)
      blue  = trunc $ min (4*t + 0.5) (-4*t + 2.5)
      trunc :: Double -> Pixel8
      trunc = round . min 255 . max 0 . (*) 255
  
  -- | hsv colormap. Goes from 0 degrees to 360 degrees.
  --
  --   <<docs/gifs/doc_hsv.gif>>
  hsv :: Double -> PixelRGB8
  hsv t = PixelRGB8 (round $ r*255) (round $ g*255) (round $ b*255)
    where
      RGB r g b = HSV.hsv (t * 360) 1 1
  
  -- | Matlab hsv colormap. Goes from 0 degrees to 330 degrees.
  --
  --   <<docs/gifs/doc_hsvMatlab.gif>>
  hsvMatlab :: Double -> PixelRGB8
  hsvMatlab t = PixelRGB8 (round $ r*255) (round $ g*255) (round $ b*255)
    where
      RGB r g b = HSV.hsv (t * 330) 1 1
  
  -- | Greyscale colormap.
  --
  --   <<docs/gifs/doc_greyscale.gif>>
  greyscale :: Double -> PixelRGB8
  greyscale t = PixelRGB8 v v v
    where
      v = round $ t * 255
  
  -- | Parula is the default colormap for matlab.
  --
  --   <<docs/gifs/doc_parula.gif>>
  parula :: Double -> PixelRGB8
  parula = ramp vec
    where
      vec = V.fromList $ pixels colorList
      pixels [] = []
      pixels (r:g:b:xs) =
        PixelRGB8 (round $ r*255) (round $ g*255) (round $ b*255) :
        pixels xs
      pixels _ = error "Reanimate.ColorMap.parula: Broken data"
      colorList :: [Double]
      colorList =
         [0.2081, 0.1663, 0.5292
         ,0.2091, 0.1721, 0.5411
         ,0.2101, 0.1779, 0.5530
         ,0.2109, 0.1837, 0.5650
         ,0.2116, 0.1895, 0.5771
         ,0.2121, 0.1954, 0.5892
         ,0.2124, 0.2013, 0.6013
         ,0.2125, 0.2072, 0.6135
         ,0.2123, 0.2132, 0.6258
         ,0.2118, 0.2192, 0.6381
         ,0.2111, 0.2253, 0.6505
         ,0.2099, 0.2315, 0.6629
         ,0.2084, 0.2377, 0.6753
         ,0.2063, 0.2440, 0.6878
         ,0.2038, 0.2503, 0.7003
         ,0.2006, 0.2568, 0.7129
         ,0.1968, 0.2632, 0.7255
         ,0.1921, 0.2698, 0.7381
         ,0.1867, 0.2764, 0.7507
         ,0.1802, 0.2832, 0.7634
         ,0.1728, 0.2902, 0.7762
         ,0.1641, 0.2975, 0.7890
         ,0.1541, 0.3052, 0.8017
         ,0.1427, 0.3132, 0.8145
         ,0.1295, 0.3217, 0.8269
         ,0.1147, 0.3306, 0.8387
         ,0.0986, 0.3397, 0.8495
         ,0.0816, 0.3486, 0.8588
         ,0.0646, 0.3572, 0.8664
         ,0.0482, 0.3651, 0.8722
         ,0.0329, 0.3724, 0.8765
         ,0.0213, 0.3792, 0.8796
         ,0.0136, 0.3853, 0.8815
         ,0.0086, 0.3911, 0.8827
         ,0.0060, 0.3965, 0.8833
         ,0.0051, 0.4017, 0.8834
         ,0.0054, 0.4066, 0.8831
         ,0.0067, 0.4113, 0.8825
         ,0.0089, 0.4159, 0.8816
         ,0.0116, 0.4203, 0.8805
         ,0.0148, 0.4246, 0.8793
         ,0.0184, 0.4288, 0.8779
         ,0.0223, 0.4329, 0.8763
         ,0.0264, 0.4370, 0.8747
         ,0.0306, 0.4410, 0.8729
         ,0.0349, 0.4449, 0.8711
         ,0.0394, 0.4488, 0.8692
         ,0.0437, 0.4526, 0.8672
         ,0.0477, 0.4564, 0.8652
         ,0.0514, 0.4602, 0.8632
         ,0.0549, 0.4640, 0.8611
         ,0.0582, 0.4677, 0.8589
         ,0.0612, 0.4714, 0.8568
         ,0.0640, 0.4751, 0.8546
         ,0.0666, 0.4788, 0.8525
         ,0.0689, 0.4825, 0.8503
         ,0.0710, 0.4862, 0.8481
         ,0.0729, 0.4899, 0.8460
         ,0.0746, 0.4937, 0.8439
         ,0.0761, 0.4974, 0.8418
         ,0.0773, 0.5012, 0.8398
         ,0.0782, 0.5051, 0.8378
         ,0.0789, 0.5089, 0.8359
         ,0.0794, 0.5129, 0.8341
         ,0.0795, 0.5169, 0.8324
         ,0.0793, 0.5210, 0.8308
         ,0.0788, 0.5251, 0.8293
         ,0.0778, 0.5295, 0.8280
         ,0.0764, 0.5339, 0.8270
         ,0.0746, 0.5384, 0.8261
         ,0.0724, 0.5431, 0.8253
         ,0.0698, 0.5479, 0.8247
         ,0.0668, 0.5527, 0.8243
         ,0.0636, 0.5577, 0.8239
         ,0.0600, 0.5627, 0.8237
         ,0.0562, 0.5677, 0.8234
         ,0.0523, 0.5727, 0.8231
         ,0.0484, 0.5777, 0.8228
         ,0.0445, 0.5826, 0.8223
         ,0.0408, 0.5874, 0.8217
         ,0.0372, 0.5922, 0.8209
         ,0.0342, 0.5968, 0.8198
         ,0.0317, 0.6012, 0.8186
         ,0.0296, 0.6055, 0.8171
         ,0.0279, 0.6097, 0.8154
         ,0.0265, 0.6137, 0.8135
         ,0.0255, 0.6176, 0.8114
         ,0.0248, 0.6214, 0.8091
         ,0.0243, 0.6250, 0.8066
         ,0.0239, 0.6285, 0.8039
         ,0.0237, 0.6319, 0.8010
         ,0.0235, 0.6352, 0.7980
         ,0.0233, 0.6384, 0.7948
         ,0.0231, 0.6415, 0.7916
         ,0.0230, 0.6445, 0.7881
         ,0.0229, 0.6474, 0.7846
         ,0.0227, 0.6503, 0.7810
         ,0.0227, 0.6531, 0.7773
         ,0.0232, 0.6558, 0.7735
         ,0.0238, 0.6585, 0.7696
         ,0.0246, 0.6611, 0.7656
         ,0.0263, 0.6637, 0.7615
         ,0.0282, 0.6663, 0.7574
         ,0.0306, 0.6688, 0.7532
         ,0.0338, 0.6712, 0.7490
         ,0.0373, 0.6737, 0.7446
         ,0.0418, 0.6761, 0.7402
         ,0.0467, 0.6784, 0.7358
         ,0.0516, 0.6808, 0.7313
         ,0.0574, 0.6831, 0.7267
         ,0.0629, 0.6854, 0.7221
         ,0.0692, 0.6877, 0.7173
         ,0.0755, 0.6899, 0.7126
         ,0.0820, 0.6921, 0.7078
         ,0.0889, 0.6943, 0.7029
         ,0.0956, 0.6965, 0.6979
         ,0.1031, 0.6986, 0.6929
         ,0.1104, 0.7007, 0.6878
         ,0.1180, 0.7028, 0.6827
         ,0.1258, 0.7049, 0.6775
         ,0.1335, 0.7069, 0.6723
         ,0.1418, 0.7089, 0.6669
         ,0.1499, 0.7109, 0.6616
         ,0.1585, 0.7129, 0.6561
         ,0.1671, 0.7148, 0.6507
         ,0.1758, 0.7168, 0.6451
         ,0.1849, 0.7186, 0.6395
         ,0.1938, 0.7205, 0.6338
         ,0.2033, 0.7223, 0.6281
         ,0.2128, 0.7241, 0.6223
         ,0.2224, 0.7259, 0.6165
         ,0.2324, 0.7275, 0.6107
         ,0.2423, 0.7292, 0.6048
         ,0.2527, 0.7308, 0.5988
         ,0.2631, 0.7324, 0.5929
         ,0.2735, 0.7339, 0.5869
         ,0.2845, 0.7354, 0.5809
         ,0.2953, 0.7368, 0.5749
         ,0.3064, 0.7381, 0.5689
         ,0.3177, 0.7394, 0.5630
         ,0.3289, 0.7406, 0.5570
         ,0.3405, 0.7417, 0.5512
         ,0.3520, 0.7428, 0.5453
         ,0.3635, 0.7438, 0.5396
         ,0.3753, 0.7446, 0.5339
         ,0.3869, 0.7454, 0.5283
         ,0.3986, 0.7461, 0.5229
         ,0.4103, 0.7467, 0.5175
         ,0.4218, 0.7473, 0.5123
         ,0.4334, 0.7477, 0.5072
         ,0.4447, 0.7482, 0.5021
         ,0.4561, 0.7485, 0.4972
         ,0.4672, 0.7487, 0.4924
         ,0.4783, 0.7489, 0.4877
         ,0.4892, 0.7491, 0.4831
         ,0.5000, 0.7491, 0.4786
         ,0.5106, 0.7492, 0.4741
         ,0.5212, 0.7492, 0.4698
         ,0.5315, 0.7491, 0.4655
         ,0.5418, 0.7490, 0.4613
         ,0.5519, 0.7489, 0.4571
         ,0.5619, 0.7487, 0.4531
         ,0.5718, 0.7485, 0.4490
         ,0.5816, 0.7482, 0.4451
         ,0.5913, 0.7479, 0.4412
         ,0.6009, 0.7476, 0.4374
         ,0.6103, 0.7473, 0.4335
         ,0.6197, 0.7469, 0.4298
         ,0.6290, 0.7465, 0.4261
         ,0.6382, 0.7460, 0.4224
         ,0.6473, 0.7456, 0.4188
         ,0.6564, 0.7451, 0.4152
         ,0.6653, 0.7446, 0.4116
         ,0.6742, 0.7441, 0.4081
         ,0.6830, 0.7435, 0.4046
         ,0.6918, 0.7430, 0.4011
         ,0.7004, 0.7424, 0.3976
         ,0.7091, 0.7418, 0.3942
         ,0.7176, 0.7412, 0.3908
         ,0.7261, 0.7405, 0.3874
         ,0.7346, 0.7399, 0.3840
         ,0.7430, 0.7392, 0.3806
         ,0.7513, 0.7385, 0.3773
         ,0.7596, 0.7378, 0.3739
         ,0.7679, 0.7372, 0.3706
         ,0.7761, 0.7364, 0.3673
         ,0.7843, 0.7357, 0.3639
         ,0.7924, 0.7350, 0.3606
         ,0.8005, 0.7343, 0.3573
         ,0.8085, 0.7336, 0.3539
         ,0.8166, 0.7329, 0.3506
         ,0.8246, 0.7322, 0.3472
         ,0.8325, 0.7315, 0.3438
         ,0.8405, 0.7308, 0.3404
         ,0.8484, 0.7301, 0.3370
         ,0.8563, 0.7294, 0.3336
         ,0.8642, 0.7288, 0.3300
         ,0.8720, 0.7282, 0.3265
         ,0.8798, 0.7276, 0.3229
         ,0.8877, 0.7271, 0.3193
         ,0.8954, 0.7266, 0.3156
         ,0.9032, 0.7262, 0.3117
         ,0.9110, 0.7259, 0.3078
         ,0.9187, 0.7256, 0.3038
         ,0.9264, 0.7256, 0.2996
         ,0.9341, 0.7256, 0.2953
         ,0.9417, 0.7259, 0.2907
         ,0.9493, 0.7264, 0.2859
         ,0.9567, 0.7273, 0.2808
         ,0.9639, 0.7285, 0.2754
         ,0.9708, 0.7303, 0.2696
         ,0.9773, 0.7326, 0.2634
         ,0.9831, 0.7355, 0.2570
         ,0.9882, 0.7390, 0.2504
         ,0.9922, 0.7431, 0.2437
         ,0.9952, 0.7476, 0.2373
         ,0.9973, 0.7524, 0.2310
         ,0.9986, 0.7573, 0.2251
         ,0.9991, 0.7624, 0.2195
         ,0.9990, 0.7675, 0.2141
         ,0.9985, 0.7726, 0.2090
         ,0.9976, 0.7778, 0.2042
         ,0.9964, 0.7829, 0.1995
         ,0.9950, 0.7880, 0.1949
         ,0.9933, 0.7931, 0.1905
         ,0.9914, 0.7981, 0.1863
         ,0.9894, 0.8032, 0.1821
         ,0.9873, 0.8083, 0.1780
         ,0.9851, 0.8133, 0.1740
         ,0.9828, 0.8184, 0.1700
         ,0.9805, 0.8235, 0.1661
         ,0.9782, 0.8286, 0.1622
         ,0.9759, 0.8337, 0.1583
         ,0.9736, 0.8389, 0.1544
         ,0.9713, 0.8441, 0.1505
         ,0.9692, 0.8494, 0.1465
         ,0.9672, 0.8548, 0.1425
         ,0.9654, 0.8603, 0.1385
         ,0.9638, 0.8659, 0.1343
         ,0.9623, 0.8716, 0.1301
         ,0.9611, 0.8774, 0.1258
         ,0.9600, 0.8834, 0.1215
         ,0.9593, 0.8895, 0.1171
         ,0.9588, 0.8958, 0.1126
         ,0.9586, 0.9022, 0.1082
         ,0.9587, 0.9088, 0.1036
         ,0.9591, 0.9155, 0.0990
         ,0.9599, 0.9225, 0.0944
         ,0.9610, 0.9296, 0.0897
         ,0.9624, 0.9368, 0.0850
         ,0.9641, 0.9443, 0.0802
         ,0.9662, 0.9518, 0.0753
         ,0.9685, 0.9595, 0.0703
         ,0.9710, 0.9673, 0.0651
         ,0.9736, 0.9752, 0.0597
         ,0.9763, 0.9831, 0.0538]
  
  --------------------------------------------------------------------------------
  -- Helpers
  
  colors :: Text -> Vector PixelRGB8
  colors = V.fromList . map (toColor . map (fromIntegral . digitToInt) . T.unpack) . T.chunksOf 6
    where
      toColor [r1,r2,g1,g2,b1,b2] =
        PixelRGB8 (r1 `shiftL` 4 + r2) (g1 `shiftL` 4 + g2) (b1 `shiftL` 4+b2)
      toColor _ = error "Reanimate.ColorMap.colors: Broken data"
  
  ramp :: Vector PixelRGB8 -> Double -> PixelRGB8
  ramp v = \t -> v V.! max 0 (min (len-1) $ round $ t * (len'-1))
    where
      len = V.length v
      len' = fromIntegral len
  