{-# 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)