module File.Binary.PNG (
	getChunks,
	putChunks,

	mkChunks,
	ihdr, IHDR(..),
	plte,
	body,
	others,
	ICCP(..),

	TypeChunk(..),
	typeChunk,
	Chunk(..),
	makePNGHeader,
	bsToPNGImage,
	pngImageToBS,
	PNGImageL(..),
	PNGImageLColor(..),

	readIccp
) where

import Prelude hiding (concat)
import Data.List (find)
import Data.Maybe (fromJust)
import Data.ByteString.Lazy (ByteString, toChunks, fromChunks, concat)
import Codec.Compression.Zlib (
	decompress, compressWith, defaultCompressParams, CompressParams(..),
	bestCompression, WindowBits(..))
import File.Binary.PNG.DataChunks (
	Chunk(..), TypeChunk(..), typeChunk, IHDR(..), PLTE, IDAT(..),
	ICCP(..),
	getChunks, putChunks, makePNGHeader, bsToPNGImage, PNGImageL(..),
	PNGImageLColor(..), pngImageToBS, readIccp)

--------------------------------------------------------------------------------

body :: [Chunk] -> ByteString
body = decompress . concat . map (idat_body . (\(ChunkIDAT i) -> i)) .
	filter ((== T_IDAT) . typeChunk)

mkBody :: ByteString -> [Chunk]
mkBody = map (ChunkIDAT . IDAT . fromChunks . (: [])) . toChunks .
	compressWith defaultCompressParams {
		compressLevel = bestCompression,
		compressWindowBits = WindowBits 10
	 }

ihdr :: [Chunk] -> IHDR
ihdr = (\(ChunkIHDR i) -> i) . fromJust . find ((== T_IHDR) . typeChunk)

plte :: [Chunk] -> Maybe PLTE
plte c = do
	ChunkPLTE pl <- find ((== T_PLTE) . typeChunk) c
	return pl

others :: [Chunk] -> [Chunk]
others = filter $ (`notElem` [T_IHDR, T_PLTE, T_IDAT, T_IEND]) . typeChunk

mkChunks :: IHDR -> Maybe PLTE -> [Chunk] -> ByteString -> [Chunk]
mkChunks i (Just p) cs b = ChunkIHDR i : ChunkPLTE p : mkBody b ++ cs
mkChunks i Nothing cs b = ChunkIHDR i : mkBody b ++ cs