Hi,
I've written a function to encode a color value of type (Int,Int,Int)
into 8,16 or 32 byte ByteString depending on the value of bits per
pixel. This is for my VNC server implementation.
I'd appreciate some feedback on the Haskellism of the implementation.

import Data.Bits
import Data.ByteString.Lazy
import Data.Binary.Put
import Data.Word

type Red = Int
type Green = Int
type Blue = Int
type Color = (Red,Green,Blue)



encode :: Color -> Int-> Int-> Int-> Int-> Int-> Int-> Int -> ByteString
encode (r,g,b) bitsPerPixel redMax greenMax blueMax redShift
greenShift blueShift = runPut $ do
        case bitsPerPixel of
                8       -> putWord8 z8
                16      -> putWord16be z16
                32      -> putWord32be z32
        where
                z8  = (fromIntegral $ nr + ng + nb) :: Word8
                z16 = (fromIntegral $ nr + ng + nb) :: Word16
                z32 = (fromIntegral $ nr + ng + nb) :: Word32
                nr = scale r redMax redShift
                ng = scale g greenMax greenShift
                nb = scale b blueMax blueShift
                scale c cm cs = (c * cm `div` 255) `shift` cs



Regards,
Kashyap

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to