{-# LANGUAGE OverloadedStrings #-}
module Main where
import Graphics.UI.GLUT
import Graphics.GL.Core32
import FreeType.Core.Base
import FreeType.FontConfig (instantiatePattern, bmpAndMetricsForIndex, FTFC_Subpixel(..))
import Graphics.Text.Font.Choose as Font
import Typograffiti (makeDrawGlyphs, allocAtlas, AllocatedRendering(..), move)
import Linear (V2(..))
import Data.Text.Glyphize
import Data.Text.Glyphize.Choose
import System.Environment (getArgs)
import System.Exit (die)
import Control.Monad.Except (runExceptT, liftIO)
import Data.Maybe (fromMaybe)
main :: IO ()
main = do
(progName, args) <- getArgsAndInitialize
w <- createWindow progName
args <- getArgs
let query = nameParse $ case args of
[] -> "serif"
(q:_) -> q
let query' = defaultSubstitute $ configSubstitute' query MatchPattern
font <- case fontSort' query' False of
Just (f:_, _) -> return f
_ -> do
die ("Failed to locate font " ++ show query)
let buf = defaultBuffer { text = "sphinx of black quartz judge my vow" }
let glyphs = shape (pattern2hbfont font []) buf []
ft_With_FreeType $ \ft -> do
inst <- instantiatePattern ft font (fromMaybe 12 $ getValue' "size" font, 20)
res <- runExceptT $ do
render <- makeDrawGlyphs
let codepoints = map codepoint $ map fst $ glyphs
atlas <- allocAtlas (liftIO . bmpAndMetricsForIndex inst SubpixelNone) codepoints
renderer <- render atlas glyphs
return renderer
renderer <- case res of
Left err -> die $ show err
Right r -> return r
displayCallback $= do
clear [ ColorBuffer ]
Size x y <- get windowSize
arDraw renderer [move 0 50] $ V2 (fromEnum x) (fromEnum y)
flush
mainLoop