{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK hide #-}
module Imj.Graphics.Render.Delta.Buffers.Dimensions
( getDimensions
, bufferSizeFromWH
) where
import Imj.Prelude
import Data.Word( Word16, Word32 )
import System.Console.Terminal.Size as Term (size, Window(..))
import Imj.Graphics.Render.Delta.Types
getDimensions :: ResizePolicy -> IO (Dim Width, Dim Height)
getDimensions (FixedSize w h) =
return (w,h)
getDimensions MatchTerminalSize =
maybe
(Dim 300, Dim 90)
(\(Term.Window h w) -> (Dim w, Dim h))
<$> Term.size
bufferSizeFromWH :: Dim Width -> Dim Height -> (Dim BufferSize, Dim Width)
bufferSizeFromWH (Dim w') (Dim h') =
let w = max 1 w'
h = max 1 h'
sz = fromIntegral w * fromIntegral h :: Word32
in if sz > fromIntegral (maxBound :: Word16)
then
error $ "buffer size cannot be bigger than " ++ show (maxBound :: Word16) ++
" : " ++ show (sz, w, h)
else
(Dim $ fromIntegral sz, Dim w)