95 lines
2.1 KiB
Ada
95 lines
2.1 KiB
Ada
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;
|