{-# LANGUAGE OverloadedStrings #-}
module Reanimate.ColorMap
( turbo
, viridis
, magma
, inferno
, plasma
, sinebow
, parula
, cividis
, jet
, hsv
, hsvMatlab
, greyscale
) where
import Data.Text (Text)
import Data.Vector (Vector)
import qualified Data.Text as T
import qualified Data.Vector as V
import Codec.Picture
import Data.Char
import Data.Bits
import qualified Data.Colour.RGBSpace.HSV as HSV
import Data.Colour.RGBSpace
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
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")
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")
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")
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")
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
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 :: 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 :: 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
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 :: Double -> PixelRGB8
greyscale t = PixelRGB8 v v v
where
v = round $ t * 255
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]
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