module Data.Text.ParagraphLayout.Internal.Fragment (Fragment(..)) where import Data.Int (Int32) import Data.Text.Glyphize (GlyphInfo, GlyphPos) import Data.Text.ParagraphLayout.Internal.Rect -- | A unit of text laid out in a rectangular area. -- -- Equivalent to the CSS3 terms /box fragment/ or /fragment/, except that -- continuous text even within one line can be split into multiple fragments, -- either because it comes from multiple input spans, or because it contains -- glyphs from multiple scripts. data Fragment = Fragment { fragmentRect :: Rect Int32 -- ^ Physical position of the fragment within the paragraph, calculated -- using all glyph advances in this fragment and the calculated line height. -- -- This is the space that the glyphs "take up" and is probably what you -- want to use for detecting position-based events such as mouse clicks. -- -- Beware that actual glyphs will not be drawn exactly to the borders of -- this rectangle – they may be offset inwards and they can also extend -- outwards! -- -- These are not the typographic bounding boxes that you use for determining -- the area to draw on – you need FreeType or a similar library for that. -- -- The origin coordinates are relative to the paragraph. , fragmentPen :: (Int32, Int32) -- ^ Coordinates of the initial pen position, from which the first glyph -- should be drawn, relative to the origin of the `fragmentRect`. -- Each glyph's `x_advance` or `y_advance` are then used to move the pen -- position for the next glyph. , fragmentGlyphs :: [(GlyphInfo, GlyphPos)] -- ^ Glyphs contained in the fragment, as returned from HarfBuzz. } deriving (Eq, Read, Show)