packages feed

keid-render-basic-0.1.8.0: src/Resource/Font.hs

module Resource.Font
  ( Config(..)
  , collectionTextures

  , Font(..)
  , allocate
  ) where

import RIO

import GHC.Stack (withFrozenCallStack)
import RIO.Vector qualified as Vector
import UnliftIO.Resource qualified as Resource
import Vulkan.Core10 qualified as Vk

import Engine.Vulkan.Types (MonadVulkan, Queues)
import Resource.Font.EvanW qualified as EvanW
import Resource.Source (Source)
import Resource.Texture (Texture, Flat)
import Resource.Texture.Ktx2 qualified as Ktx2

-- * General collection tools

data Config = Config
  { configContainer :: Source
  , configTexture   :: Source
  }
  deriving (Show)

collectionTextures :: Foldable collection => collection Font -> Vector (Texture Flat)
collectionTextures = Vector.fromList . map texture . toList

-- * Individual fonts

data Font = Font
  { container :: EvanW.Container
  , texture   :: Texture Flat
  }

allocate
  :: ( HasCallStack
     , MonadVulkan env m
     , HasLogFunc env
     , MonadThrow m
     , Resource.MonadResource m
     )
  => Queues Vk.CommandPool
  -> Config
  -> m Font
allocate pools Config{..} = do
  container <- withFrozenCallStack $
    EvanW.load configContainer

  texture <- withFrozenCallStack $
    Ktx2.load pools configTexture

  pure Font{..}