{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

module IHaskell.Display.Juicypixels (
  module IHaskell.Display,
  module Codec.Picture
) where

import qualified Codec.Picture as P
import Codec.Picture (Image(..))
import Codec.Picture.Png (PngSavable, encodePng)
import IHaskell.Display (IHaskellDisplay, Display(..), display, png, base64)
import Data.ByteString.Lazy (ByteString, toStrict)

instance IHaskellDisplay (Image P.Pixel8) where
  display = return . format

instance IHaskellDisplay (Image P.Pixel16) where
  display = return . format

instance IHaskellDisplay (Image P.PixelYA8) where
  display = return . format

instance IHaskellDisplay (Image P.PixelYA16) where
  display = return . format

instance IHaskellDisplay (Image P.PixelRGB8) where
  display = return . format

instance IHaskellDisplay (Image P.PixelRGB16) where
  display = return . format

instance IHaskellDisplay (Image P.PixelRGBA8) where
  display = return . format

instance IHaskellDisplay (Image P.PixelRGBA16) where
  display = return . format

format :: PngSavable a => Image a -> Display
format im@(Image w h _) = Display [png w h . base64 . toStrict . encodePng $ im]