mirror of
https://github.com/Drezil/dear-imgui.hs.git
synced 2025-04-21 10:54:00 +00:00
257 lines
7.0 KiB
Haskell
257 lines
7.0 KiB
Haskell
{-# LANGUAGE BlockArguments #-}
|
|
{-# LANGUAGE DuplicateRecordFields #-}
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE LambdaCase #-}
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE PatternSynonyms #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE ViewPatterns #-}
|
|
|
|
|
|
{-| Font configuration
|
|
|
|
IO functions to modify font config values.
|
|
|
|
-}
|
|
|
|
module DearImGui.Raw.Font.Config
|
|
( FontConfig(..)
|
|
, new
|
|
, destroy
|
|
-- * Changing settings
|
|
, setFontDataOwnedByAtlas
|
|
, setFontNo
|
|
, setSizePixels
|
|
, setOversampleH
|
|
, setOversampleV
|
|
, setPixelSnapH
|
|
, setGlyphExtraSpacing
|
|
, setGlyphOffset
|
|
, setGlyphRanges
|
|
, setGlyphMinAdvanceX
|
|
, setGlyphMaxAdvanceX
|
|
, setMergeMode
|
|
, setFontBuilderFlags
|
|
, setRasterizerMultiply
|
|
, setEllipsisChar
|
|
)
|
|
where
|
|
|
|
-- base
|
|
import Control.Monad.IO.Class
|
|
( MonadIO, liftIO )
|
|
import Foreign ( Ptr )
|
|
import Foreign.C
|
|
|
|
-- dear-imgui
|
|
import DearImGui.Raw.Context
|
|
( imguiContext )
|
|
import DearImGui.Structs
|
|
import DearImGui.Raw.Font.GlyphRanges
|
|
( GlyphRanges(..) )
|
|
|
|
-- inline-c
|
|
import qualified Language.C.Inline as C
|
|
|
|
-- inline-c-cpp
|
|
import qualified Language.C.Inline.Cpp as Cpp
|
|
|
|
C.context (Cpp.cppCtx <> C.bsCtx <> imguiContext)
|
|
C.include "imgui.h"
|
|
Cpp.using "namespace ImGui"
|
|
|
|
-- | Font configuration data handle
|
|
--
|
|
-- Wraps @ImFontConfig*@.
|
|
newtype FontConfig = FontConfig (Ptr ImFontConfig)
|
|
|
|
-- | Create an instance of config
|
|
new :: MonadIO m => m FontConfig
|
|
new = liftIO do
|
|
FontConfig <$> [C.block|
|
|
ImFontConfig* {
|
|
return IM_NEW(ImFontConfig);
|
|
}
|
|
|]
|
|
|
|
-- | Destroy an instance of config
|
|
--
|
|
-- Should be used __after__ font atlas building.
|
|
destroy :: MonadIO m => FontConfig -> m ()
|
|
destroy (FontConfig config) = liftIO do
|
|
[C.block|
|
|
void {
|
|
IM_DELETE($(ImFontConfig* config));
|
|
}
|
|
|]
|
|
|
|
|
|
-- | TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
|
|
--
|
|
-- By default, it is @true@
|
|
setFontDataOwnedByAtlas :: MonadIO m => FontConfig -> CBool -> m ()
|
|
setFontDataOwnedByAtlas (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->FontDataOwnedByAtlas = $(bool value);
|
|
}
|
|
|]
|
|
|
|
-- | Index of font within TTF/OTF file
|
|
--
|
|
-- By default, it is @0@
|
|
setFontNo :: MonadIO m => FontConfig -> CInt -> m ()
|
|
setFontNo (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->FontNo = $(int value);
|
|
}
|
|
|]
|
|
|
|
-- | Size in pixels for rasterizer (more or less maps to the resulting font height).
|
|
--
|
|
-- Implicitly set by @addFont...@ functions.
|
|
setSizePixels :: MonadIO m => FontConfig -> CFloat -> m ()
|
|
setSizePixels (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->SizePixels = $(float value);
|
|
}
|
|
|]
|
|
|
|
-- | Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
|
|
--
|
|
-- By default, it is @3@
|
|
setOversampleH :: MonadIO m => FontConfig -> CInt -> m ()
|
|
setOversampleH (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->OversampleH = $(int value);
|
|
}
|
|
|]
|
|
|
|
-- | Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis.
|
|
--
|
|
-- By default, it is @1@
|
|
setOversampleV :: MonadIO m => FontConfig -> CInt -> m ()
|
|
setOversampleV (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->OversampleV = $(int value);
|
|
}
|
|
|]
|
|
|
|
-- | Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
|
|
--
|
|
-- By default, it is @false@
|
|
setPixelSnapH :: MonadIO m => FontConfig -> CBool -> m ()
|
|
setPixelSnapH (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->PixelSnapH = $(bool value);
|
|
}
|
|
|]
|
|
|
|
-- | Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
|
|
--
|
|
-- By default, it is @0, 0@
|
|
setGlyphExtraSpacing :: MonadIO m => FontConfig -> Ptr ImVec2 -> m ()
|
|
setGlyphExtraSpacing (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->GlyphExtraSpacing = *$(ImVec2* value);
|
|
}
|
|
|]
|
|
|
|
-- | Offset all glyphs from this font input.
|
|
--
|
|
-- By default, it is @0, 0@
|
|
setGlyphOffset :: MonadIO m => FontConfig -> Ptr ImVec2 -> m ()
|
|
setGlyphOffset (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->GlyphOffset = *$(ImVec2* value);
|
|
}
|
|
|]
|
|
|
|
-- | Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
|
|
--
|
|
-- By default, it is @NULL@
|
|
setGlyphRanges :: MonadIO m => FontConfig -> GlyphRanges -> m ()
|
|
setGlyphRanges (FontConfig fc) (GlyphRanges value) = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->GlyphRanges = $(ImWchar* value);
|
|
}
|
|
|]
|
|
|
|
-- | Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font
|
|
--
|
|
-- By default, it is @0@
|
|
setGlyphMinAdvanceX :: MonadIO m => FontConfig -> CFloat -> m ()
|
|
setGlyphMinAdvanceX (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->GlyphMinAdvanceX = $(float value);
|
|
}
|
|
|]
|
|
|
|
-- | Maximum AdvanceX for glyphs
|
|
--
|
|
-- By default, it is @FLT_MAX@
|
|
setGlyphMaxAdvanceX :: MonadIO m => FontConfig -> CFloat -> m ()
|
|
setGlyphMaxAdvanceX (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->GlyphMaxAdvanceX = $(float value);
|
|
}
|
|
|]
|
|
|
|
-- | Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
|
|
--
|
|
-- By default, it is @false@
|
|
setMergeMode :: MonadIO m => FontConfig -> CBool -> m ()
|
|
setMergeMode (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->MergeMode = $(bool value);
|
|
}
|
|
|]
|
|
|
|
-- | Settings for custom font builder.
|
|
-- THIS IS BUILDER IMPLEMENTATION DEPENDENT.
|
|
--
|
|
-- By default, it is @0@. Leave it so if unsure.
|
|
setFontBuilderFlags :: MonadIO m => FontConfig -> CUInt -> m ()
|
|
setFontBuilderFlags (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->FontBuilderFlags = $(unsigned int value);
|
|
}
|
|
|]
|
|
|
|
-- | Brighten (>1.0f) or darken (<1.0f) font output.
|
|
-- Brightening small fonts may be a good workaround to make them more readable.
|
|
--
|
|
-- By default, it is @1.0f@
|
|
setRasterizerMultiply :: MonadIO m => FontConfig -> CFloat -> m ()
|
|
setRasterizerMultiply (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->RasterizerMultiply = $(float value);
|
|
}
|
|
|]
|
|
|
|
-- | Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
|
|
--
|
|
-- By default, it is @-1@
|
|
setEllipsisChar :: MonadIO m => FontConfig -> ImWchar -> m ()
|
|
setEllipsisChar (FontConfig fc) value = liftIO do
|
|
[C.block|
|
|
void {
|
|
$(ImFontConfig* fc)->EllipsisChar = $(ImWchar value);
|
|
}
|
|
|]
|