with freetype_c.Binding, freetype_c.FT_BBox, freetype_c.FT_Vector; package body openGL.GlyphImpl is ----------- -- Utility -- function Bounds_of (glyth_Slot : in freetype_c.FT_GlyphSlot.item) return Bounds is use freetype_c.Binding; bBox : aliased freetype_c.FT_BBox.item; the_Bounds : Bounds; begin FT_Outline_Get_CBox (FT_GlyphSlot_Get_Outline (glyth_Slot).all'unchecked_Access, bBox'unchecked_Access); the_Bounds := (Ball => <>, Box => (Lower => [1 => Real (bbox.xMin) / 64.0, 2 => Real (bbox.yMin) / 64.0, 3 => 0.0], Upper => [1 => Real (bbox.xMax) / 64.0, 2 => Real (bbox.yMax) / 64.0, 3 => 0.0])); set_Ball_from_Box (the_Bounds); return the_Bounds; end Bounds_of; --------- -- Forge -- procedure define (Self : in out Item; glyth_Slot : in freetype_c.FT_GlyphSlot.item) is use type freetype_c.FT_GlyphSlot.item; begin Self.Err := no_Error; if glyth_Slot /= null then Self.bBox := Bounds_of (glyth_Slot); declare use freetype_c.Binding; the_Advance : constant freetype_c.FT_Vector.item := FT_GlyphSlot_Get_Advance (glyth_Slot); begin Self.Advance := [Real (the_Advance.x) / 64.0, Real (the_Advance.y) / 64.0, 0.0]; end; end if; end define; procedure destruct (Self : in out Item) is begin null; end destruct; -------------- -- Attributes -- function Advance (Self : in Item) return Real is begin return Self.Advance (1); end Advance; function BBox (Self : in Item) return Bounds is begin return Self.bBox; end BBox; function Error (Self : in Item) return error_Kind is begin return Self.Err; end Error; end openGL.GlyphImpl;