{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc) The 'GI.Pango.Structs.GlyphString.GlyphString' structure is used to store strings of glyphs with geometry and visual attribute information. The storage for the glyph information is owned by the structure which simplifies memory management. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.Pango.Structs.GlyphString ( -- * Exported types GlyphString(..) , newZeroGlyphString , noGlyphString , -- * Methods -- ** copy #method:copy# #if ENABLE_OVERLOADING GlyphStringCopyMethodInfo , #endif glyphStringCopy , -- ** extents #method:extents# #if ENABLE_OVERLOADING GlyphStringExtentsMethodInfo , #endif glyphStringExtents , -- ** extentsRange #method:extentsRange# #if ENABLE_OVERLOADING GlyphStringExtentsRangeMethodInfo , #endif glyphStringExtentsRange , -- ** free #method:free# #if ENABLE_OVERLOADING GlyphStringFreeMethodInfo , #endif glyphStringFree , -- ** getLogicalWidths #method:getLogicalWidths# #if ENABLE_OVERLOADING GlyphStringGetLogicalWidthsMethodInfo , #endif glyphStringGetLogicalWidths , -- ** getWidth #method:getWidth# #if ENABLE_OVERLOADING GlyphStringGetWidthMethodInfo , #endif glyphStringGetWidth , -- ** indexToX #method:indexToX# #if ENABLE_OVERLOADING GlyphStringIndexToXMethodInfo , #endif glyphStringIndexToX , -- ** new #method:new# glyphStringNew , -- ** setSize #method:setSize# #if ENABLE_OVERLOADING GlyphStringSetSizeMethodInfo , #endif glyphStringSetSize , -- ** xToIndex #method:xToIndex# #if ENABLE_OVERLOADING GlyphStringXToIndexMethodInfo , #endif glyphStringXToIndex , -- * Properties -- ** logClusters #attr:logClusters# {- | logical cluster info, indexed by the byte index within the text corresponding to the glyph string. -} getGlyphStringLogClusters , #if ENABLE_OVERLOADING glyphString_logClusters , #endif setGlyphStringLogClusters , -- ** numGlyphs #attr:numGlyphs# {- | number of the glyphs in this glyph string. -} getGlyphStringNumGlyphs , #if ENABLE_OVERLOADING glyphString_numGlyphs , #endif setGlyphStringNumGlyphs , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.ShortPrelude as SP import qualified Data.GI.Base.Overloading as O import qualified Prelude as P import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr import qualified Data.GI.Base.GClosure as B.GClosure import qualified Data.GI.Base.GError as B.GError import qualified Data.GI.Base.GVariant as B.GVariant import qualified Data.GI.Base.GValue as B.GValue import qualified Data.GI.Base.GParamSpec as B.GParamSpec import qualified Data.GI.Base.CallStack as B.CallStack import qualified Data.GI.Base.Properties as B.Properties import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import qualified Foreign.Ptr as FP import qualified GHC.OverloadedLabels as OL import {-# SOURCE #-} qualified GI.Pango.Objects.Font as Pango.Font import {-# SOURCE #-} qualified GI.Pango.Structs.Analysis as Pango.Analysis import {-# SOURCE #-} qualified GI.Pango.Structs.Rectangle as Pango.Rectangle -- | Memory-managed wrapper type. newtype GlyphString = GlyphString (ManagedPtr GlyphString) foreign import ccall "pango_glyph_string_get_type" c_pango_glyph_string_get_type :: IO GType instance BoxedObject GlyphString where boxedType _ = c_pango_glyph_string_get_type -- | Construct a `GlyphString` struct initialized to zero. newZeroGlyphString :: MonadIO m => m GlyphString newZeroGlyphString = liftIO $ callocBoxedBytes 32 >>= wrapBoxed GlyphString instance tag ~ 'AttrSet => Constructible GlyphString tag where new _ attrs = do o <- newZeroGlyphString GI.Attributes.set o attrs return o -- | A convenience alias for `Nothing` :: `Maybe` `GlyphString`. noGlyphString :: Maybe GlyphString noGlyphString = Nothing {- | Get the value of the “@num_glyphs@” field. When is enabled, this is equivalent to @ 'Data.GI.Base.Attributes.get' glyphString #numGlyphs @ -} getGlyphStringNumGlyphs :: MonadIO m => GlyphString -> m Int32 getGlyphStringNumGlyphs s = liftIO $ withManagedPtr s $ \ptr -> do val <- peek (ptr `plusPtr` 0) :: IO Int32 return val {- | Set the value of the “@num_glyphs@” field. When is enabled, this is equivalent to @ 'Data.GI.Base.Attributes.set' glyphString [ #numGlyphs 'Data.GI.Base.Attributes.:=' value ] @ -} setGlyphStringNumGlyphs :: MonadIO m => GlyphString -> Int32 -> m () setGlyphStringNumGlyphs s val = liftIO $ withManagedPtr s $ \ptr -> do poke (ptr `plusPtr` 0) (val :: Int32) #if ENABLE_OVERLOADING data GlyphStringNumGlyphsFieldInfo instance AttrInfo GlyphStringNumGlyphsFieldInfo where type AttrAllowedOps GlyphStringNumGlyphsFieldInfo = '[ 'AttrSet, 'AttrGet] type AttrSetTypeConstraint GlyphStringNumGlyphsFieldInfo = (~) Int32 type AttrBaseTypeConstraint GlyphStringNumGlyphsFieldInfo = (~) GlyphString type AttrGetType GlyphStringNumGlyphsFieldInfo = Int32 type AttrLabel GlyphStringNumGlyphsFieldInfo = "num_glyphs" type AttrOrigin GlyphStringNumGlyphsFieldInfo = GlyphString attrGet _ = getGlyphStringNumGlyphs attrSet _ = setGlyphStringNumGlyphs attrConstruct = undefined attrClear _ = undefined glyphString_numGlyphs :: AttrLabelProxy "numGlyphs" glyphString_numGlyphs = AttrLabelProxy #endif -- XXX Skipped attribute for "GlyphString:glyphs" :: Not implemented: "Don't know how to unpack C array of type TCArray False (-1) 0 (TInterface (Name {namespace = \"Pango\", name = \"GlyphInfo\"}))" {- | Get the value of the “@log_clusters@” field. When is enabled, this is equivalent to @ 'Data.GI.Base.Attributes.get' glyphString #logClusters @ -} getGlyphStringLogClusters :: MonadIO m => GlyphString -> m Int32 getGlyphStringLogClusters s = liftIO $ withManagedPtr s $ \ptr -> do val <- peek (ptr `plusPtr` 16) :: IO Int32 return val {- | Set the value of the “@log_clusters@” field. When is enabled, this is equivalent to @ 'Data.GI.Base.Attributes.set' glyphString [ #logClusters 'Data.GI.Base.Attributes.:=' value ] @ -} setGlyphStringLogClusters :: MonadIO m => GlyphString -> Int32 -> m () setGlyphStringLogClusters s val = liftIO $ withManagedPtr s $ \ptr -> do poke (ptr `plusPtr` 16) (val :: Int32) #if ENABLE_OVERLOADING data GlyphStringLogClustersFieldInfo instance AttrInfo GlyphStringLogClustersFieldInfo where type AttrAllowedOps GlyphStringLogClustersFieldInfo = '[ 'AttrSet, 'AttrGet] type AttrSetTypeConstraint GlyphStringLogClustersFieldInfo = (~) Int32 type AttrBaseTypeConstraint GlyphStringLogClustersFieldInfo = (~) GlyphString type AttrGetType GlyphStringLogClustersFieldInfo = Int32 type AttrLabel GlyphStringLogClustersFieldInfo = "log_clusters" type AttrOrigin GlyphStringLogClustersFieldInfo = GlyphString attrGet _ = getGlyphStringLogClusters attrSet _ = setGlyphStringLogClusters attrConstruct = undefined attrClear _ = undefined glyphString_logClusters :: AttrLabelProxy "logClusters" glyphString_logClusters = AttrLabelProxy #endif #if ENABLE_OVERLOADING instance O.HasAttributeList GlyphString type instance O.AttributeList GlyphString = GlyphStringAttributeList type GlyphStringAttributeList = ('[ '("numGlyphs", GlyphStringNumGlyphsFieldInfo), '("logClusters", GlyphStringLogClustersFieldInfo)] :: [(Symbol, *)]) #endif -- method GlyphString::new -- method type : Constructor -- Args : [] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Pango", name = "GlyphString"})) -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_new" pango_glyph_string_new :: IO (Ptr GlyphString) {- | Create a new 'GI.Pango.Structs.GlyphString.GlyphString'. -} glyphStringNew :: (B.CallStack.HasCallStack, MonadIO m) => m GlyphString {- ^ __Returns:__ the newly allocated 'GI.Pango.Structs.GlyphString.GlyphString', which should be freed with 'GI.Pango.Structs.GlyphString.glyphStringFree'. -} glyphStringNew = liftIO $ do result <- pango_glyph_string_new checkUnexpectedReturnNULL "glyphStringNew" result result' <- (wrapBoxed GlyphString) result return result' #if ENABLE_OVERLOADING #endif -- method GlyphString::copy -- method type : OrdinaryMethod -- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString, may be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Pango", name = "GlyphString"})) -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_copy" pango_glyph_string_copy :: Ptr GlyphString -> -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"}) IO (Ptr GlyphString) {- | Copy a glyph string and associated storage. -} glyphStringCopy :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString', may be 'Nothing' -} -> m (Maybe GlyphString) {- ^ __Returns:__ the newly allocated 'GI.Pango.Structs.GlyphString.GlyphString', which should be freed with 'GI.Pango.Structs.GlyphString.glyphStringFree', or 'Nothing' if /@string@/ was 'Nothing'. -} glyphStringCopy string = liftIO $ do string' <- unsafeManagedPtrGetPtr string result <- pango_glyph_string_copy string' maybeResult <- convertIfNonNull result $ \result' -> do result'' <- (wrapBoxed GlyphString) result' return result'' touchManagedPtr string return maybeResult #if ENABLE_OVERLOADING data GlyphStringCopyMethodInfo instance (signature ~ (m (Maybe GlyphString)), MonadIO m) => O.MethodInfo GlyphStringCopyMethodInfo GlyphString signature where overloadedMethod _ = glyphStringCopy #endif -- method GlyphString::extents -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "font", argType = TInterface (Name {namespace = "Pango", name = "Font"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFont", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "ink_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to store the extents of the glyph string\n as drawn or %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "logical_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to store the logical extents of the\n glyph string or %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_extents" pango_glyph_string_extents :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) Ptr Pango.Font.Font -> -- font : TInterface (Name {namespace = "Pango", name = "Font"}) Ptr Pango.Rectangle.Rectangle -> -- ink_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"}) Ptr Pango.Rectangle.Rectangle -> -- logical_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"}) IO () {- | Compute the logical and ink extents of a glyph string. See the documentation for 'GI.Pango.Objects.Font.fontGetGlyphExtents' for details about the interpretation of the rectangles. -} glyphStringExtents :: (B.CallStack.HasCallStack, MonadIO m, Pango.Font.IsFont a) => GlyphString {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -} -> a {- ^ /@font@/: a 'GI.Pango.Objects.Font.Font' -} -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle)) glyphStringExtents glyphs font = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs font' <- unsafeManagedPtrCastPtr font inkRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle) logicalRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle) pango_glyph_string_extents glyphs' font' inkRect logicalRect inkRect' <- (wrapPtr Pango.Rectangle.Rectangle) inkRect logicalRect' <- (wrapPtr Pango.Rectangle.Rectangle) logicalRect touchManagedPtr glyphs touchManagedPtr font return (inkRect', logicalRect') #if ENABLE_OVERLOADING data GlyphStringExtentsMethodInfo instance (signature ~ (a -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))), MonadIO m, Pango.Font.IsFont a) => O.MethodInfo GlyphStringExtentsMethodInfo GlyphString signature where overloadedMethod _ = glyphStringExtents #endif -- method GlyphString::extents_range -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "start", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "start index", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "end", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "end index (the range is the set of bytes with\n\t indices such that start <= index < end)", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "font", argType = TInterface (Name {namespace = "Pango", name = "Font"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFont", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "ink_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to\n store the extents of the glyph string range as drawn or\n %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "logical_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to\n store the logical extents of the glyph string range or\n %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_extents_range" pango_glyph_string_extents_range :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) Int32 -> -- start : TBasicType TInt Int32 -> -- end : TBasicType TInt Ptr Pango.Font.Font -> -- font : TInterface (Name {namespace = "Pango", name = "Font"}) Ptr Pango.Rectangle.Rectangle -> -- ink_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"}) Ptr Pango.Rectangle.Rectangle -> -- logical_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"}) IO () {- | Computes the extents of a sub-portion of a glyph string. The extents are relative to the start of the glyph string range (the origin of their coordinate system is at the start of the range, not at the start of the entire glyph string). -} glyphStringExtentsRange :: (B.CallStack.HasCallStack, MonadIO m, Pango.Font.IsFont a) => GlyphString {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -} -> Int32 {- ^ /@start@/: start index -} -> Int32 {- ^ /@end@/: end index (the range is the set of bytes with indices such that start \<= index \< end) -} -> a {- ^ /@font@/: a 'GI.Pango.Objects.Font.Font' -} -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle)) glyphStringExtentsRange glyphs start end font = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs font' <- unsafeManagedPtrCastPtr font inkRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle) logicalRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle) pango_glyph_string_extents_range glyphs' start end font' inkRect logicalRect inkRect' <- (wrapPtr Pango.Rectangle.Rectangle) inkRect logicalRect' <- (wrapPtr Pango.Rectangle.Rectangle) logicalRect touchManagedPtr glyphs touchManagedPtr font return (inkRect', logicalRect') #if ENABLE_OVERLOADING data GlyphStringExtentsRangeMethodInfo instance (signature ~ (Int32 -> Int32 -> a -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))), MonadIO m, Pango.Font.IsFont a) => O.MethodInfo GlyphStringExtentsRangeMethodInfo GlyphString signature where overloadedMethod _ = glyphStringExtentsRange #endif -- method GlyphString::free -- method type : OrdinaryMethod -- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString, may be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_free" pango_glyph_string_free :: Ptr GlyphString -> -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"}) IO () {- | Free a glyph string and associated storage. -} glyphStringFree :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString', may be 'Nothing' -} -> m () glyphStringFree string = liftIO $ do string' <- unsafeManagedPtrGetPtr string pango_glyph_string_free string' touchManagedPtr string return () #if ENABLE_OVERLOADING data GlyphStringFreeMethodInfo instance (signature ~ (m ()), MonadIO m) => O.MethodInfo GlyphStringFreeMethodInfo GlyphString signature where overloadedMethod _ = glyphStringFree #endif -- method GlyphString::get_logical_widths -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text corresponding to the glyphs", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @text, in bytes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "embedding_level", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the embedding level of the string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "logical_widths", argType = TCArray False (-1) (-1) (TBasicType TInt), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an array whose length is the number of\n characters in text (equal to g_utf8_strlen (text,\n length) unless text has NUL bytes) to be filled in\n with the resulting character widths.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_get_logical_widths" pango_glyph_string_get_logical_widths :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) CString -> -- text : TBasicType TUTF8 Int32 -> -- length : TBasicType TInt Int32 -> -- embedding_level : TBasicType TInt Ptr Int32 -> -- logical_widths : TCArray False (-1) (-1) (TBasicType TInt) IO () {- | Given a 'GI.Pango.Structs.GlyphString.GlyphString' resulting from 'GI.Pango.Functions.shape' and the corresponding text, determine the screen width corresponding to each character. When multiple characters compose a single cluster, the width of the entire cluster is divided equally among the characters. See also 'GI.Pango.Structs.GlyphItem.glyphItemGetLogicalWidths'. -} glyphStringGetLogicalWidths :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -} -> T.Text {- ^ /@text@/: the text corresponding to the glyphs -} -> Int32 {- ^ /@length@/: the length of /@text@/, in bytes -} -> Int32 {- ^ /@embeddingLevel@/: the embedding level of the string -} -> [Int32] {- ^ /@logicalWidths@/: an array whose length is the number of characters in text (equal to g_utf8_strlen (text, length) unless text has NUL bytes) to be filled in with the resulting character widths. -} -> m () glyphStringGetLogicalWidths glyphs text length_ embeddingLevel logicalWidths = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs text' <- textToCString text logicalWidths' <- packStorableArray logicalWidths pango_glyph_string_get_logical_widths glyphs' text' length_ embeddingLevel logicalWidths' touchManagedPtr glyphs freeMem text' freeMem logicalWidths' return () #if ENABLE_OVERLOADING data GlyphStringGetLogicalWidthsMethodInfo instance (signature ~ (T.Text -> Int32 -> Int32 -> [Int32] -> m ()), MonadIO m) => O.MethodInfo GlyphStringGetLogicalWidthsMethodInfo GlyphString signature where overloadedMethod _ = glyphStringGetLogicalWidths #endif -- method GlyphString::get_width -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TBasicType TInt) -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_get_width" pango_glyph_string_get_width :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) IO Int32 {- | Computes the logical width of the glyph string as can also be computed using 'GI.Pango.Structs.GlyphString.glyphStringExtents'. However, since this only computes the width, it\'s much faster. This is in fact only a convenience function that computes the sum of geometry.width for each glyph in the /@glyphs@/. /Since: 1.14/ -} glyphStringGetWidth :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -} -> m Int32 {- ^ __Returns:__ the logical width of the glyph string. -} glyphStringGetWidth glyphs = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs result <- pango_glyph_string_get_width glyphs' touchManagedPtr glyphs return result #if ENABLE_OVERLOADING data GlyphStringGetWidthMethodInfo instance (signature ~ (m Int32), MonadIO m) => O.MethodInfo GlyphStringGetWidthMethodInfo GlyphString signature where overloadedMethod _ = glyphStringGetWidth #endif -- method GlyphString::index_to_x -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the glyphs return from pango_shape()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text for the run", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of bytes (not characters) in @text.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "analysis", argType = TInterface (Name {namespace = "Pango", name = "Analysis"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the analysis information return from pango_itemize()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index_", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the byte index within @text", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "trailing", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "whether we should compute the result for the beginning (%FALSE)\n or end (%TRUE) of the character.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "x_pos", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store result", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_index_to_x" pango_glyph_string_index_to_x :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) CString -> -- text : TBasicType TUTF8 Int32 -> -- length : TBasicType TInt Ptr Pango.Analysis.Analysis -> -- analysis : TInterface (Name {namespace = "Pango", name = "Analysis"}) Int32 -> -- index_ : TBasicType TInt CInt -> -- trailing : TBasicType TBoolean Ptr Int32 -> -- x_pos : TBasicType TInt IO () {- | Converts from character position to x position. (X position is measured from the left edge of the run). Character positions are computed by dividing up each cluster into equal portions. -} glyphStringIndexToX :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@glyphs@/: the glyphs return from 'GI.Pango.Functions.shape' -} -> T.Text {- ^ /@text@/: the text for the run -} -> Int32 {- ^ /@length@/: the number of bytes (not characters) in /@text@/. -} -> Pango.Analysis.Analysis {- ^ /@analysis@/: the analysis information return from 'GI.Pango.Functions.itemize' -} -> Int32 {- ^ /@index_@/: the byte index within /@text@/ -} -> Bool {- ^ /@trailing@/: whether we should compute the result for the beginning ('False') or end ('True') of the character. -} -> m (Int32) glyphStringIndexToX glyphs text length_ analysis index_ trailing = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs text' <- textToCString text analysis' <- unsafeManagedPtrGetPtr analysis let trailing' = (fromIntegral . fromEnum) trailing xPos <- allocMem :: IO (Ptr Int32) pango_glyph_string_index_to_x glyphs' text' length_ analysis' index_ trailing' xPos xPos' <- peek xPos touchManagedPtr glyphs touchManagedPtr analysis freeMem text' freeMem xPos return xPos' #if ENABLE_OVERLOADING data GlyphStringIndexToXMethodInfo instance (signature ~ (T.Text -> Int32 -> Pango.Analysis.Analysis -> Int32 -> Bool -> m (Int32)), MonadIO m) => O.MethodInfo GlyphStringIndexToXMethodInfo GlyphString signature where overloadedMethod _ = glyphStringIndexToX #endif -- method GlyphString::set_size -- method type : OrdinaryMethod -- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "new_len", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the new length of the string.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_set_size" pango_glyph_string_set_size :: Ptr GlyphString -> -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"}) Int32 -> -- new_len : TBasicType TInt IO () {- | Resize a glyph string to the given length. -} glyphStringSetSize :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString'. -} -> Int32 {- ^ /@newLen@/: the new length of the string. -} -> m () glyphStringSetSize string newLen = liftIO $ do string' <- unsafeManagedPtrGetPtr string pango_glyph_string_set_size string' newLen touchManagedPtr string return () #if ENABLE_OVERLOADING data GlyphStringSetSizeMethodInfo instance (signature ~ (Int32 -> m ()), MonadIO m) => O.MethodInfo GlyphStringSetSizeMethodInfo GlyphString signature where overloadedMethod _ = glyphStringSetSize #endif -- method GlyphString::x_to_index -- method type : OrdinaryMethod -- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the glyphs returned from pango_shape()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text for the run", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of bytes (not characters) in text.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "analysis", argType = TInterface (Name {namespace = "Pango", name = "Analysis"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the analysis information return from pango_itemize()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "x_pos", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the x offset (in Pango units)", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index_", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store calculated byte index within @text", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "trailing", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store a boolean indicating\n whether the user clicked on the leading or trailing\n edge of the character.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "pango_glyph_string_x_to_index" pango_glyph_string_x_to_index :: Ptr GlyphString -> -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"}) CString -> -- text : TBasicType TUTF8 Int32 -> -- length : TBasicType TInt Ptr Pango.Analysis.Analysis -> -- analysis : TInterface (Name {namespace = "Pango", name = "Analysis"}) Int32 -> -- x_pos : TBasicType TInt Ptr Int32 -> -- index_ : TBasicType TInt Ptr Int32 -> -- trailing : TBasicType TInt IO () {- | Convert from x offset to character position. Character positions are computed by dividing up each cluster into equal portions. In scripts where positioning within a cluster is not allowed (such as Thai), the returned value may not be a valid cursor position; the caller must combine the result with the logical attributes for the text to compute the valid cursor position. -} glyphStringXToIndex :: (B.CallStack.HasCallStack, MonadIO m) => GlyphString {- ^ /@glyphs@/: the glyphs returned from 'GI.Pango.Functions.shape' -} -> T.Text {- ^ /@text@/: the text for the run -} -> Int32 {- ^ /@length@/: the number of bytes (not characters) in text. -} -> Pango.Analysis.Analysis {- ^ /@analysis@/: the analysis information return from 'GI.Pango.Functions.itemize' -} -> Int32 {- ^ /@xPos@/: the x offset (in Pango units) -} -> m ((Int32, Int32)) glyphStringXToIndex glyphs text length_ analysis xPos = liftIO $ do glyphs' <- unsafeManagedPtrGetPtr glyphs text' <- textToCString text analysis' <- unsafeManagedPtrGetPtr analysis index_ <- allocMem :: IO (Ptr Int32) trailing <- allocMem :: IO (Ptr Int32) pango_glyph_string_x_to_index glyphs' text' length_ analysis' xPos index_ trailing index_' <- peek index_ trailing' <- peek trailing touchManagedPtr glyphs touchManagedPtr analysis freeMem text' freeMem index_ freeMem trailing return (index_', trailing') #if ENABLE_OVERLOADING data GlyphStringXToIndexMethodInfo instance (signature ~ (T.Text -> Int32 -> Pango.Analysis.Analysis -> Int32 -> m ((Int32, Int32))), MonadIO m) => O.MethodInfo GlyphStringXToIndexMethodInfo GlyphString signature where overloadedMethod _ = glyphStringXToIndex #endif #if ENABLE_OVERLOADING type family ResolveGlyphStringMethod (t :: Symbol) (o :: *) :: * where ResolveGlyphStringMethod "copy" o = GlyphStringCopyMethodInfo ResolveGlyphStringMethod "extents" o = GlyphStringExtentsMethodInfo ResolveGlyphStringMethod "extentsRange" o = GlyphStringExtentsRangeMethodInfo ResolveGlyphStringMethod "free" o = GlyphStringFreeMethodInfo ResolveGlyphStringMethod "indexToX" o = GlyphStringIndexToXMethodInfo ResolveGlyphStringMethod "xToIndex" o = GlyphStringXToIndexMethodInfo ResolveGlyphStringMethod "getLogicalWidths" o = GlyphStringGetLogicalWidthsMethodInfo ResolveGlyphStringMethod "getWidth" o = GlyphStringGetWidthMethodInfo ResolveGlyphStringMethod "setSize" o = GlyphStringSetSizeMethodInfo ResolveGlyphStringMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveGlyphStringMethod t GlyphString, O.MethodInfo info GlyphString p) => OL.IsLabel t (GlyphString -> p) where #if MIN_VERSION_base(4,10,0) fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #else fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #endif #endif