imj-base-0.1.0.2: src/Imj/Graphics/Render/Delta/Buffers/Dimensions.hs
{-# 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) -- sensible default values in case we fail to get terminal size
(\(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
-- indexed cells use a Word16 index so we can't exceed the Word16 maxBound
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)