From 2856718617f21a8520ffcc3a8aed134d5df00555 Mon Sep 17 00:00:00 2001 From: Adrian Cochrane Date: Thu, 26 Jan 2023 14:04:36 +1300 Subject: [PATCH] Expose Harfbuzz 3.3 APIs. --- Data/Text/Glyphize/Buffer.hs | 7 +++---- Data/Text/Glyphize/Font.hs | 18 ++++++++---------- Data/Text/Glyphize/Oom.hs | 17 +++++++++++++++++ harfbuzz-pure.cabal | 3 ++- 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 Data/Text/Glyphize/Oom.hs diff --git a/Data/Text/Glyphize/Buffer.hs b/Data/Text/Glyphize/Buffer.hs index caa63ac..a17f2e2 100644 --- a/Data/Text/Glyphize/Buffer.hs +++ b/Data/Text/Glyphize/Buffer.hs @@ -201,7 +201,6 @@ hb_language_from_string str = foreign import ccall "hb_language_from_string" hb_language_from_string' :: CString -> Int -> IO Language -{- -- | Check whether a second language tag is the same or a more specific version -- of the provided language tag. -- For example, "fa_IR.utf8" is a more specific tag for "fa" or for "fa_IR". @@ -318,7 +317,7 @@ withBuffer buf cb = withNewBuffer $ \buf' -> bufferWithText buf' (text buf) $ do ClusterChars -> 2 hb_buffer_set_invisible_glyph buf' $ c2w $ invisibleGlyph buf hb_buffer_set_replacement_codepoint buf' $ c2w $ replacementCodepoint buf --- hb_buffer_set_not_found_glyph buf' $ c2w $ notFoundGlyph buf + hb_buffer_set_not_found_glyph buf' $ c2w $ notFoundGlyph buf case (contentType buf, direction buf, script buf, language buf) of (Just ContentTypeUnicode, Nothing, _, _) -> hb_buffer_guess_segment_properties buf' (Just ContentTypeUnicode, _, Nothing, _) -> hb_buffer_guess_segment_properties buf' @@ -339,8 +338,8 @@ foreign import ccall "hb_buffer_set_invisible_glyph" hb_buffer_set_invisible_gly :: Buffer' -> Word32 -> IO () foreign import ccall "hb_buffer_set_replacement_codepoint" hb_buffer_set_replacement_codepoint :: Buffer' -> Word32 -> IO () ---foreign import ccall "hb_buffer_set_not_found_glyph" hb_buffer_set_not_found_glyph --- :: Buffer' -> Word32 -> IO () +foreign import ccall "hb_buffer_set_not_found_glyph" hb_buffer_set_not_found_glyph + :: Buffer' -> Word32 -> IO () foreign import ccall "hb_buffer_guess_segment_properties" hb_buffer_guess_segment_properties :: Buffer' -> IO () foreign import ccall "hb_buffer_allocation_successful" hb_buffer_allocation_successful diff --git a/Data/Text/Glyphize/Font.hs b/Data/Text/Glyphize/Font.hs index 6c04532..8395ee9 100644 --- a/Data/Text/Glyphize/Font.hs +++ b/Data/Text/Glyphize/Font.hs @@ -666,12 +666,11 @@ fontScale font = unsafePerformIO $ foreign import ccall "hb_font_get_scale" hb_font_get_scale :: Font_ -> Ptr Int -> Ptr Int -> IO () -{- -- | Fetches the "synthetic slant" of a font. fontSyntheticSlant :: Font -> Float fontSyntheticSlant = fontFunc hb_font_get_synthetic_slant foreign import ccall "hb_font_get_synthetic_slant" hb_font_get_synthetic_slant :: - Font_ -> Float-} + Font_ -> Float -- | Fetches the glyph ID for a Unicode codepoint when followed by -- the specified variation-selector codepoint, in the specified `Font`. @@ -689,7 +688,6 @@ fontVarGlyph' font unicode varSel = unsafePerformIO $ foreign import ccall "hb_font_get_variation_glyph" hb_font_get_variation_glyph :: Font_ -> Word32 -> Word32 -> Ptr Word32 -> IO Bool -{- -- | Fetches the list of variation coordinates (in design-space units) -- currently set on a `Font`. -- Note that this returned list may only contain values for some (or none) of the axes; @@ -701,7 +699,7 @@ fontVarCoordsDesign font = unsafePerformIO $ length <- peek length' forM [0..fromEnum length-1] $ peekElemOff arr foreign import ccall "hb_font_get_var_coords_design" - hb_font_get_var_coords_design :: Font_ -> Ptr Word -> IO (Ptr Float)-} + hb_font_get_var_coords_design :: Font_ -> Ptr Word -> IO (Ptr Float) -- | Fetches the list of normalized variation coordinates currently set on a font. -- Note that this returned list may only contain values for some (or none) of the axes; @@ -813,7 +811,7 @@ data FontOptions = FontOptions { -- ^ Sets the font-face value of the newly-created `Font`. optionParent :: Maybe Font, -- ^ Sets the parent `Font` of the newly-created `Font`. --- optionSynthSlant :: Maybe Float, + optionSynthSlant :: Maybe Float, -- ^ Sets the "synthetic slant" of a newly-created `Font`. By default is zero. -- Synthetic slant is the graphical skew applied to the font at rendering time. -- Harfbuzz needs to know this value to adjust shaping results, metrics, @@ -837,7 +835,7 @@ data FontOptions = FontOptions { -- | `FontOptions` which has no effect on the newly-created `Font`. defaultFontOptions = FontOptions { optionPPEm = Nothing, optionPtEm = Nothing, optionScale = Nothing, - optionFace = Nothing, optionParent = Nothing,-- optionSynthSlant = Nothing, + optionFace = Nothing, optionParent = Nothing, optionSynthSlant = Nothing, optionVariations = [], optionVarCoordsDesign = [], optionVarCoordsNormalized = [], optionVarNamedInstance = Nothing } @@ -858,9 +856,9 @@ _setFontOptions font opts = do case optionParent opts of Just parent -> withForeignPtr parent $ hb_font_set_parent font Nothing -> return () - {-case optionSynthSlant opts of + case optionSynthSlant opts of Just slant -> hb_font_set_synthetic_slant font slant - Nothing -> return ()-} + Nothing -> return () unless (null $ optionVariations opts) $ withArrayLen (optionVariations opts) $ \len vars -> @@ -879,8 +877,8 @@ foreign import ccall "hb_font_set_ptem" hb_font_set_ptem :: Font_ -> Float -> IO foreign import ccall "hb_font_set_scale" hb_font_set_scale :: Font_ -> Int -> Int -> IO () foreign import ccall "hb_font_set_face" hb_font_set_face :: Font_ -> Face_ -> IO () foreign import ccall "hb_font_set_parent" hb_font_set_parent :: Font_ -> Font_ -> IO () -{-foreign import ccall "hb_font_set_synthetic_slant" hb_font_set_synthetic_slant :: - Font_ -> Float -> IO ()-} +foreign import ccall "hb_font_set_synthetic_slant" hb_font_set_synthetic_slant :: + Font_ -> Float -> IO () foreign import ccall "hb_font_set_variations" hb_font_set_variations :: Font_ -> Ptr Variation -> Word -> IO () foreign import ccall "hb_font_set_var_coords_design" hb_font_set_var_coords_design :: diff --git a/Data/Text/Glyphize/Oom.hs b/Data/Text/Glyphize/Oom.hs new file mode 100644 index 0000000..047a7ec --- /dev/null +++ b/Data/Text/Glyphize/Oom.hs @@ -0,0 +1,17 @@ +module Data.Text.Glyphize.Oom where + +import Control.Exception +import Foreign.Ptr (nullPtr, Ptr) + +data HarfbuzzError = OutOfMemory deriving (Show) +instance Exception HarfbuzzError + +throwFalse :: IO Bool -> IO () +throwFalse cb = do + ret <- cb + if ret then return () else throwIO OutOfMemory + +throwNull :: IO (Ptr a) -> IO (Ptr a) +throwNull cb = do + ptr <- cb + if ptr == nullPtr then throwIO OutOfMemory else return ptr diff --git a/harfbuzz-pure.cabal b/harfbuzz-pure.cabal index 09c6863..889483f 100644 --- a/harfbuzz-pure.cabal +++ b/harfbuzz-pure.cabal @@ -17,6 +17,7 @@ synopsis: Pure-functional Harfbuzz language bindings -- A longer description of the package. description: HarfBuzz is a text shaping library. Using the HarfBuzz library allows programs to convert a sequence of Unicode input into properly formatted and positioned glyph output—for any writing system and language. + NOTE: You may need to install Harfbuzz 3.3.0 (Jan 2022) from source, it hasn't been widely packaged yet. -- URL for the project homepage or repository. homepage: https://harfbuzz.github.io/ @@ -62,7 +63,7 @@ library -- Other library packages from which modules are imported. build-depends: base >=4.12 && <4.13, text >= 2.0 && < 3, bytestring >= 0.11, freetype2 >= 0.2, derive-storable >= 0.3 && < 1 - pkgconfig-depends: harfbuzz + pkgconfig-depends: harfbuzz >= 3.3 -- Directories containing source files. -- hs-source-dirs: -- 2.30.2