@@ 35,16 35,27 @@ import FreeType.Exception (FtError(..))
c2w :: Char -> Word32
c2w = fromIntegral . fromEnum
+-- | Maps a Unicode char to a glyph index.
+-- This function uses information from several possible underlying encoding
+-- tables to work around broken fonts. As a result, this function isn't designed
+-- to be used in performance sensitive areas; results from this function are
+-- intended to be cached by higher level functions.
ftCharIndex :: FT_Face -> Char -> Word
ftCharIndex face = fcFreeTypeCharIndex face . c2w
foreign import ccall "FcFreeTypeCharIndex" fcFreeTypeCharIndex :: FT_Face -> Word32 -> Word
+-- | Scans a FreeType face and returns the set of encoded Unicode chars.
ftCharSet :: FT_Face -> CharSet
ftCharSet face = unsafePerformIO $ thawCharSet_ $ fcFreeTypeCharSet face nullPtr
foreign import ccall "FcFreeTypeCharSet" fcFreeTypeCharSet
:: FT_Face -> Ptr () -> IO CharSet_ -- 2nd arg's deprecated!
-data Spacing = Proportional | Dual | Mono
+-- | How consistant are the widths of the chars in a font.
+data Spacing = Proportional -- ^ Where the font has glyphs of many widths.
+ | Dual -- ^ Where the font has glyphs in precisely two widths.
+ | Mono -- ^ Where all glyphs have the same width.
+-- | Scans a FreeType face and returns the set of encoded Unicode chars.
+-- `snd` receives the computed spacing type of the font.
ftCharSetAndSpacing :: FT_Face -> (CharSet, Spacing)
ftCharSetAndSpacing face = unsafePerformIO $ alloca $ \spacing' -> do
chars <- thawCharSet_ $ fcFreeTypeCharSetAndSpacing face nullPtr spacing'
@@ 58,6 69,8 @@ ftCharSetAndSpacing face = unsafePerformIO $ alloca $ \spacing' -> do
foreign import ccall "FcFreeTypeCharSetAndSpacing" fcFreeTypeCharSetAndSpacing ::
FT_Face -> Ptr () -> Ptr Int -> IO CharSet_ -- 2nd arg's deprecated!
+-- | Constructs a pattern representing the 'id'th face in 'fst'.
+-- The number of faces in 'file' is returned in 'snd'.
ftQuery :: FilePath -> Int -> IO (Pattern, Int)
ftQuery filename id = withCString filename $ \filename' -> alloca $ \count' -> do
pattern <- thawPattern_ $ fcFreeTypeQuery filename' id nullPtr count'
@@ 66,6 79,10 @@ ftQuery filename id = withCString filename $ \filename' -> alloca $ \count' -> d
foreign import ccall "FcFreeTypeQuery" fcFreeTypeQuery ::
CString -> Int -> Ptr () -> Ptr Int -> IO Pattern_ -- 3rd arg's deprecated!
+-- | Constructs patterns found in 'filename'.
+-- If id is -1, then all patterns found in 'filename' are added to 'fst'.
+-- Otherwise, this function works exactly like `ftQuery`.
+-- The number of faces in 'filename' is returned in 'snd'.
ftQueryAll :: FilePath -> Int -> IO (FontSet, Int)
ftQueryAll filename id = withCString filename $ \filename' -> alloca $ \count' ->
withFontSet [] $ \fonts' -> do
@@ 76,6 93,8 @@ ftQueryAll filename id = withCString filename $ \filename' -> alloca $ \count' -
foreign import ccall "FcFreeTypeQueryAll" fcFreeTypeQueryAll ::
CString -> Int -> Ptr () -> Ptr Int -> FontSet_ -> IO Word -- 2nd arg's deprecated!
+-- | Constructs a pattern representing 'face'.
+-- 'filename' and 'id' are used solely as data for pattern elements.
ftQueryFace :: FT_Face -> FilePath -> Int -> IO Pattern
ftQueryFace face filename id = withCString filename $ \filename' ->
thawPattern_ $ fcFreeTypeQueryFace face filename' id nullPtr
@@ 88,8 107,9 @@ foreign import ccall "FcFreeTypeQueryFace" fcFreeTypeQueryFace ::
--- Untested
------
+-- | A `FT_Face` queried from FontConfig with glyph-loading parameters.
data FTFC_Instance = Instance {
- fontName :: String,
+ fontName :: Maybe String,
fontPath :: Maybe String,
fontFace :: FT_Face,
fontLoadFlags :: Int,
@@ 105,18 125,27 @@ data FTFC_Instance = Instance {
fontFeats :: [String], -- Callers probably want to validate via harfbuzz
fontMetrics :: FTFC_Metrics
}
+-- | Results queried from FontConfig with caller-relevant properties,
+-- notably relating to layout.
data FTFC_Metrics = Metrics {
height :: Int,
descent :: Int,
ascent :: Int,
- maxAdvance :: (Int, Int),
+ maxAdvance :: (Int, Int), -- Width/height of font's widest glyph.
metricsAntialias :: Bool,
metricsSubpixel :: FTFC_Subpixel,
- metricsName :: String
+ metricsName :: Maybe String
}
-data FTFC_Subpixel = SubpixelNone | SubpixelHorizontalRGB | SubpixelHorizontalBGR |
- SubpixelVerticalRGB | SubpixelVerticalBGR | SubpixelDefault
-
+-- | Defines subpixel order to use.
+-- Note that this is *ignored* if antialiasing has been disabled.
+data FTFC_Subpixel = SubpixelNone -- ^ From FontConfig.
+ | SubpixelHorizontalRGB | SubpixelHorizontalBGR |
+ SubpixelVerticalRGB | SubpixelVerticalBGR
+ | SubpixelDefault -- ^ Disable subpixel antialiasing.
+
+-- | Converts the results of a FontConfig query requesting a specific size
+-- into a `FT_Face` & related properties.
+-- Throw exceptions.
instantiatePattern :: FT_Library -> Pattern -> (Double, Double) -> IO FTFC_Instance
instantiatePattern ftlib pattern (req_pt_size, req_px_size) = do
let dpi = fromMaybe 75 $ getValue' "dpi" pattern :: Double
@@ 181,7 210,7 @@ instantiatePattern ftlib pattern (req_pt_size, req_px_size) = do
let metrics' = srMetrics size'
let c x = fromIntegral x / 64 * pixel_fixup
return Instance {
- fontName = getValue0 "fullname" pattern,
+ fontName = getValue' "fullname" pattern,
fontPath = getValue' "file" pattern,
fontFace = ft_face,
fontLoadFlags = load_target .|. load_flags .|. ft_LOAD_COLOR,
@@ 209,17 238,23 @@ instantiatePattern ftlib pattern (req_pt_size, req_px_size) = do
3 -> SubpixelVerticalRGB
4 -> SubpixelVerticalBGR
_ -> SubpixelNone,
- metricsName = getValue0 "fullname" pattern
+ metricsName = getValue' "fullname" pattern
}
}
+-- | Results from `glyphForIndex`.
data FTFC_Glyph a = Glyph {
- glyphFontName :: String,
+ glyphFontName :: Maybe String,
glyphImage :: a,
glyphAdvance :: (Double, Double),
glyphSubpixel :: FTFC_Subpixel
}
+-- | Looks up a given glyph in a `FTFC_Instance` & its underlying `FT_Face`
+-- Taking into account additional properties from FontConfig.
+-- Runs a provided callback to render the glyph into a reusable datastructure.
+-- The `FT_Bitmap` given to this callback must not be used outside it.
+-- Throws exceptions.
glyphForIndex :: FTFC_Instance -> Word32 -> FTFC_Subpixel ->
(FT_Bitmap -> IO a) -> IO (FTFC_Glyph a)
glyphForIndex font index subpixel cb = do