packages feed

noise-0.0.1: src/Text/Noise/Compiler/Document/Color.hs

module Text.Noise.Compiler.Document.Color
( Color(..)
, toHex
, fromHex
, toRGBHex
, alpha
) where

import Data.Word
import Numeric (showHex, readHex)
import Control.Applicative

data Color = ARGB Word8 Word8 Word8 Word8
           | RGB Word8 Word8 Word8
           deriving (Eq, Show)

showHexByte :: Word8 -> String
showHexByte = pad . flip showHex ""
  where pad [x] = ['0', x]
        pad xs  = xs

readHexByte :: String -> Maybe Word8
readHexByte str@[_,_] = case readHex str of
  [(i,"")] -> Just i
  _        -> Nothing
readHexByte _ = Nothing

toHex :: Color -> String
toHex color = concatMap showHexByte $ case color of
  ARGB a r g b -> [a ,r, g, b]
  RGB r g b    -> [r, g, b]

toRGBHex :: Color -> String
toRGBHex color = toHex $ case color of
  ARGB _ r g b -> RGB r g b
  RGB {}       -> color

fromHex :: String -> Maybe Color
fromHex [a0,a1,r0,r1,g0,g1,b0,b1] = ARGB
  <$> readHexByte [a0,a1]
  <*> readHexByte [r0,r1]
  <*> readHexByte [g0,g1]
  <*> readHexByte [b0,b1]
fromHex [r0,r1,g0,g1,b0,b1] = RGB
  <$> readHexByte [r0,r1]
  <*> readHexByte [g0,g1]
  <*> readHexByte [b0,b1]
fromHex _ = Nothing

alpha :: Color -> Maybe Double
alpha (ARGB a _ _ _) = Just (fromIntegral a / 255.0)
alpha _              = Nothing