content: module System.Terminal.Emulator.SDL.ImageFont where
  
  import Control.Monad (forM_)
  import Data.Bits (shiftR, (.&.), (.|.))
  import Data.Word (Word32)
  import Foreign.Ptr (Ptr, castPtr)
  import Foreign.Storable (peekElemOff, pokeElemOff)
  import Linear (V2 (..))
  import qualified SDL as SDL
  
  loadImageFont :: IO SDL.Surface
  loadImageFont = do
    bmp <- SDL.loadBMP "font.bmp"
    rgba <- convertGrayscaleToAlpha bmp
    SDL.freeSurface bmp
    pure rgba
  
  -- | Creates a new surface in RGBA format where the color of all pixels is
  -- white, and the alpha channel is taken from the grayscale values of the
  -- source surface
  convertGrayscaleToAlpha ::
    -- | 'Surface' to copy from
    SDL.Surface ->
    -- | New 'Surface' is created
    IO SDL.Surface
  convertGrayscaleToAlpha grayscaleRGB = do
    size@(V2 width height) <- SDL.surfaceDimensions grayscaleRGB
    rgba <- SDL.createRGBSurface size SDL.RGBA8888
    _ <- SDL.surfaceBlit grayscaleRGB Nothing rgba Nothing
  
    SDL.lockSurface rgba
    pixelsPtr <- SDL.surfacePixels rgba
    let pixels :: Ptr Word32
        pixels = castPtr pixelsPtr
    forM_ [0 .. fromIntegral (width * height) - 1] $ \i -> do
      pixel <- peekElemOff pixels i
      let intensity = (pixel .&. 0xFF000000) `shiftR` 24
      pokeElemOff pixels i (intensity .|. 0xFFFFFF00)
    SDL.unlockSurface rgba
  
    pure rgba
  