content: {-# LANGUAGE CPP #-}
  module Codec.Picture.Jpg.Internal.Metadata ( extractMetadatas, encodeMetadatas ) where
  
  #if !MIN_VERSION_base(4,8,0)
  import Control.Applicative( pure )
  import Data.Monoid( mempty )
  import Data.Word( Word )
  #endif
  
  import Data.Word( Word16 )
  import Data.Maybe( fromMaybe )
  import qualified Codec.Picture.Metadata as Met
  import Codec.Picture.Metadata( Metadatas )
  import Codec.Picture.Jpg.Internal.Types
  
  scalerOfUnit :: JFifUnit -> Met.Keys Word -> Word16 -> Metadatas -> Metadatas
  scalerOfUnit unit k v = case unit of
    JFifUnitUnknown -> id
    JFifPixelsPerInch -> Met.insert k (fromIntegral v)
    JFifPixelsPerCentimeter ->
      Met.insert k (Met.dotsPerCentiMeterToDotPerInch $ fromIntegral v)
  
  extractMetadatas :: JpgJFIFApp0 -> Metadatas
  extractMetadatas jfif = 
      inserter Met.DpiX (_jfifDpiX jfif)
          $ inserter Met.DpiY (_jfifDpiY jfif) mempty
    where
      inserter = scalerOfUnit $ _jfifUnit jfif
  
  
  encodeMetadatas :: Metadatas -> [JpgFrame]
  encodeMetadatas metas = fromMaybe [] $ do
    dpiX <- Met.lookup Met.DpiX metas
    dpiY <- Met.lookup Met.DpiY metas
    pure . pure . JpgJFIF $ JpgJFIFApp0
      { _jfifUnit      = JFifPixelsPerInch
      , _jfifDpiX      = fromIntegral dpiX
      , _jfifDpiY      = fromIntegral dpiY
      , _jfifThumbnail = Nothing
      }
  
  