packages feed

definitive-graphics-1.2: Data/Raster.hs

{-# LANGUAGE TypeOperators #-}
module Data.Raster (
  Raster,PNG,BMP,JPG,bmp,jpg,png,raster,
  ) where

import Definitive
import Data.Serialize
import Codec.Picture

data Raster = Raster DynamicImage
newtype JPG = JPG Raster
newtype PNG = PNG Raster
newtype BMP = BMP Raster

jpg :: Raster:<->:JPG
jpg = iso JPG (\(JPG r) -> r)
bmp :: Raster:<->:BMP
bmp = iso BMP (\(BMP r) -> r)
png :: Raster:<->:PNG
png = iso PNG (\(PNG r) -> r)

instance Serializable JPG where
  encode (yb (raster.jpg) -> ImageYCbCr8 i) = encodeJpeg i^.bytesBuilder
  encode _ = error "Unsupported image format for JPeg encoding"
  serializable = convert.decodeJpeg.by chunk^.mapping (mapping (raster.jpg.pureWriter)).parser
instance Serializable PNG where
  encode (yb (raster.png) -> i) = (error<|>by bytesBuilder) (encodeDynamicPng i)
  serializable = convert.decodePng.by chunk^.mapping (mapping (raster.png.pureWriter)).parser
instance Serializable BMP where
  encode (yb (raster.bmp) -> i) = (error<|>by bytesBuilder) (encodeDynamicBitmap i)
  serializable = convert.decodeBitmap.by chunk^.mapping (mapping (raster.bmp.pureWriter)).parser
     
raster :: DynamicImage:<->:Raster
raster = iso Raster (\(Raster i) -> i)