NAME¶
SDL::TTF - True Type Font functions (libfreetype)
CATEGORY¶
TTF
CONSTANTS¶
The constants are exported by default. You can avoid this by doing:
use SDL::TTF ();
and access them directly:
SDL::TTF::TTF_HINTING_NORMAL;
Available constants for "hinting":
- •
- TTF_HINTING_NORMAL
- •
- TTF_HINTING_LIGHT
- •
- TTF_HINTING_MONO
- •
- TTF_HINTING_NONE
Available constants for "style":
- •
- TTF_STYLE_NORMAL
- •
- TTF_STYLE_BOLD
- •
- TTF_STYLE_ITALIC
- •
- TTF_STYLE_UNDERLINE
- •
- TTF_STYLE_STRIKETHROUGH
METHODS¶
General methods¶
linked_version
my $version = SDL::TTF::linked_version();
This gives you the SDL::Version object which SDL_ttf lib is used on the system.
No prior initialization needs to be done before these function is called.
Example:
use SDL::TTF;
use SDL::Version;
my $version = SDL::TTF::linked_version();
printf("got version: %d.%d.%d\n", $version->major, $version->minor, $version->patch);
compile_time_version
my $version = SDL::TTF::compile_time_version();
This gives you the SDL::Version object which SDL_ttf was present at compile
time.
init
my $success = SDL::TTF::init();
Initialize the truetype font API. This must be called before using other
functions in this library, except SDL::TTF::was_init and
SDL::TTF::linked_version. SDL does not have to be initialized before this
call.
Returns: 0 on success, "-1" on any error.
was_init
my $was_init = SDL::TTF::was_init();
Query the initialization status of the truetype font API. You may, of course,
use this before SDL::TTF::init to avoid initializing twice in a row. Or use
this to determine if you need to call SDL::TTF::quit.
quit
SDL::TTF::quit();
Shutdown and cleanup the truetype font API. After calling this the SDL::TTF
functions should not be used, excepting SDL::TTF::was_init. You may, of
course, use SDL::TTF::init to use the functionality again
Management functions¶
open_font
my $font = SDL::TTF::open_font($font_file, $point_size);
Load file for use as a font, at the given size. This is actually
"SDL::TTF::open_font_index(..., ..., $index = 0)". This can load
TTF, OTF and FON files.
Returns: a SDL::TTF::Font object. "undef" is returned on errors.
Example:
use SDL::TTF;
use SDL::TTF::Font;
my $font = SDL::TTF::open_font('arial.ttf', 24);
open_font_index
my $font = SDL::TTF::open_font($font_file, $point_size, $face_index);
This is the same as SDL::TTF::open_font, except you can specify the face index
of a font file containing multiple faces. This can load TTF and FON files.
open_font_RW
my $font = SDL::TTF::open_font_RW($rwops_object, $free, $point_size);
This is the same as SDL::TTF::open_font, except you can pass an
SDL::RWOps-object. If you pass true as $free, the SDL::RWOps-object will be
freed by SDL_ttf library. Don't do this, perl will free this object for you.
Example:
my $font = SDL::TTF::open_font_RW(SDL::RWOps->new_file($font_file, 'r'), 0, 24);
open_font_index_RW
my $font = SDL::TTF::open_font_index_RW($rwops_object, $free, $point_size, $face_index);
This is the same as SDL::TTF::open_font_index, except you can pass an
SDL::RWOps-object. If you pass true as $free, the SDL::RWOps-object will be
freed by SDL_ttf library. Don't do this, perl will free this object for you.
Attributes¶
Global attributes
byte_swapped_unicode
SDL::TTF::byte_swapped_unicode( $bool );
This function tells SDL_ttf whether UNICODE (2 bytes per character) text is
generally byteswapped. A "UNICODE_BOM_NATIVE" or
"UNICODE_BOM_SWAPPED" character in a string will temporarily
override this setting for the remainder of that string, however this setting
will be restored for the next one. The default mode is non-swapped, native
endianness of the CPU.
Font style
get_font_style
SDL::TTF::get_font_style($font);
Returns: The style as a bitmask composed of the following masks:
- •
- TTF_STYLE_NORMAL
- •
- TTF_STYLE_BOLD
- •
- TTF_STYLE_ITALIC
- •
- TTF_STYLE_UNDERLINE
- •
- TTF_STYLE_STRIKETHROUGH (since SDL_ttf 2.0.10)
Example:
my $style = SDL::TTF::get_font_style($font);
print("normal\n") if $style == TTF_STYLE_NORMAL;
print("bold\n") if $style & TTF_STYLE_BOLD;
print("italic\n") if $style & TTF_STYLE_ITALIC;
print("underline\n") if $style & TTF_STYLE_UNDERLINE;
print("strikethrough\n") if $style & TTF_STYLE_STRIKETHROUGH;
set_font_style
SDL::TTF::set_font_style($font, $style);
Set the rendering style of the loaded font.
Note: "TTF_STYLE_UNDERLINE" may cause surfaces created by
"SDL::TTF::render_glyph_*" functions to be extended vertically,
downward only, to encompass the underline if the original glyph metrics didn't
allow for the underline to be drawn below. This does not change the math used
to place a glyph using glyph metrics. On the other hand
"TTF_STYLE_STRIKETHROUGH" doesn't extend the glyph, since this would
invalidate the metrics used to position the glyph when blitting, because they
would likely be extended vertically upward. There is perhaps a workaround, but
it would require programs to be smarter about glyph blitting math than they
are currently designed for. Still, sometimes the underline or strikethrough
may be outside of the generated surface, and thus not visible when blitted to
the screen. In this case, you should probably turn off these styles and draw
your own strikethroughs and underlines.
get_font_outline
my $outline = SDL::TTF::get_font_outline($font);
Get the current outline width of the font, in pixels.
Note: at least SDL_ttf 2.0.10 needed
set_font_outline
SDL::TTF::set_font_outline($font, $outline);
Set the outline pixel width of the loaded font. Use 0(zero) to turn off
outlining.
Note: at least SDL_ttf 2.0.10 needed
Font settings
get_font_hinting
my $hinting = SDL::TTF::get_font_hinting($font);
Get the current hinting setting of the loaded font.
Note: at least SDL_ttf 2.0.10 needed
Returns the hinting type matching one of the following defined values:
- •
- TTF_HINTING_NORMAL
- •
- TTF_HINTING_LIGHT
- •
- TTF_HINTING_MONO
- •
- TTF_HINTING_NONE
set_font_hinting
SDL::TTF::set_font_hinting($font, $hinting);
Set the hinting of the loaded font. You should experiment with this setting if
you know which font you are using beforehand, especially when using smaller
sized fonts. If the user is selecting a font, you may wish to let them select
the hinting mode for that font as well.
Note: at least SDL_ttf 2.0.10 needed
Example:
SDL::TTF::set_font_hinting($font, TTF_HINTING_LIGHT);
get_font_kerning
my $kerning_enabled = SDL::TTF::get_font_kerning($font);
Get the current kerning setting of the loaded font.
Returns: 0(zero) if kerning is disabled. A non-zero value is returned when
enabled. The default for a newly loaded font is enabled(1).
Note: at least SDL_ttf 2.0.10 needed
Note: This function returns wrong values: See
<
http://bugzilla.libsdl.org/show_bug.cgi?id=973>
set_font_kerning
SDL::TTF::set_font_kerning($font, $kerning_enabled);
Set whether to use kerning when rendering the loaded font. This has no effect on
individual glyphs, but rather when rendering whole strings of characters, at
least a word at a time. Perhaps the only time to disable this is when kerning
is not working for a specific font, resulting in overlapping glyphs or
abnormal spacing within words.
Pass 0 to disable kerning, 1 to enable.
Note: at least SDL_ttf 2.0.10 needed
Font metrics
font_height
my $font_height = SDL::TTF::font_height($font);
Get the maximum pixel height of all glyphs of the loaded font. You may use this
height for rendering text as close together vertically as possible, though
adding at least one pixel height to it will space it so they can't touch.
Remember that SDL_ttf doesn't handle multiline printing, so you are
responsible for line spacing, see the SDL::TTF::font_line_skip as well.
font_ascent
my $font_ascent = SDL::TTF::font_ascent($font);
Get the maximum pixel ascent of all glyphs of the loaded font. This can also be
interpreted as the distance from the top of the font to the baseline. It could
be used when drawing an individual glyph relative to a top point, by combining
it with the glyph's "maxy" metric to resolve the top of the
rectangle used when blitting the glyph on the screen.
Example:
my ($minx, $maxx, $miny, $maxy, $advance) = @{ SDL::TTF::glyph_metrics($font, "\0M") };
$rect->y( $top + SDL::TTF::font_ascent($font) - $maxy );
font_descent
my $font_descent = SDL::TTF::font_descent($font);
Get the maximum pixel descent of all glyphs of the loaded font. This can also be
interpreted as the distance from the baseline to the bottom of the font. It
could be used when drawing an individual glyph relative to a bottom point, by
combining it with the glyph's "maxy" metric to resolve the top of
the rectangle used when blitting the glyph on the screen.
Example:
my ($minx, $maxx, $miny, $maxy, $advance) = @{ SDL::TTF::glyph_metrics($font, "\0M") };
$rect->y( $bottom - SDL::TTF::font_descent($font) - $maxy );
font_line_skip
my $font_line_skip = SDL::TTF::font_line_skip($font);
Get the recommended pixel height of a rendered line of text of the loaded font.
This is usually larger than the SDL::TTF::font_height of the font.
Face attributes
font_faces
my $font_faces = SDL::TTF::font_faces($font);
Get the number of faces ("sub-fonts") available in the loaded font.
This is a count of the number of specific fonts (based on size and style and
other typographical features perhaps) contained in the font itself.
font_face_is_fixed_width
my $font_face_is_fixed_width = SDL::TTF::font_face_is_fixed_width($font);
Test if the current font face of the loaded font is a fixed width font. Fixed
width fonts are monospace, meaning every character that exists in the font is
the same width, thus you can assume that a rendered string's width is going to
be the result of "glyph_width * string_length".
Returns: ">0" if font is a fixed width font. 0 if not a fixed width
font.
font_face_family_name
my $font_face_family_name = SDL::TTF::font_face_family_name($font);
Get the current font face family name from the loaded font. This information is
not for every font available.
Example:
my $font = SDL::TTF::open_font('arialuni.ttf', 8);
printf("%s\n", SDL::TTF::font_face_family_name($font)); # will print "Arial Unicode MS"
font_face_style_name
my $font_face_style_name = SDL::TTF::font_face_style_name($font);
Get the current font face style name from the loaded font. This information is
not for every font available.
Example:
my $font = SDL::TTF::open_font('arialuni.ttf', 8);
printf("%s\n", SDL::TTF::font_face_style_name($font)); # will print "Regular"
Glyphs
glyph_is_provided
my $glyph_is_provided = SDL::TTF::glyph_is_provided($font, $unicode_char);
Get the status of the availability of the glyph from the loaded font.
Returns: the index of the glyph in font, or 0 for an undefined character code.
Note: You have to pass this unicode character either as UTF16/UCS-2 big
endian without BOM, or with BOM as UTF16/UCS-2 big/little endian.
Note: at least SDL_ttf 2.0.10 needed
Example:
print("We have this char!\n") if SDL::TTF::glyph_is_provided($font, "\0M");
glyph_metrics
my @glyph_metrics = @{ SDL::TTF::glyph_metrics($font, $unicode_char) };
Get desired glyph metrics of the UNICODE char from the loaded font.
See also: The FreeType2 Documentation Tutorial
<
http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html>
Note: You have to pass this unicode character either as UTF16/UCS-2 big
endian without BOM, or with BOM as UTF16/UCS-2 big/little endian.
Example:
my ($minx, $maxx, $miny, $maxy, $advance) = @{ SDL::TTF::glyph_metrics($font, "\0M") };
Text metrics
size_text
my ($width, $height) = @{ SDL::TTF::size_text($font, $text) };
Calculate the resulting surface size of the LATIN1 encoded text rendered using
$font. No actual rendering is done, however correct kerning is done to get the
actual width. The height returned is the same as you can get using
SDL::TTF::font_height.
size_utf8
my ($width, $height) = @{ SDL::TTF::size_utf8($font, $text) };
Calculate the resulting surface size of the UTF8 encoded text rendered using
$font. No actual rendering is done, however correct kerning is done to get the
actual width. The height returned in h is the same as you can get using
SDL::TTF::font_height.
Note that the first example uses the same text as in the LATIN1 example, that is
because plain ASCII is UTF8 compatible.
Examples:
($width, $height) = @{ SDL::TTF::size_utf8($font, 'Hello World!') }; # plain text, if your script is in utf8 or ansi-format
# or
($width, $height) = @{ SDL::TTF::size_utf8($font, "\xE4\xBB\x8A\xE6\x97\xA5\xE3\x81\xAF") }; # utf8 hex-data
# or
use Unicode::String;
my $unicode = utf8($data_from_somewhere);
($width, $height) = @{ SDL::TTF::size_utf8($font, $unicode->utf8) }; # utf8 via Unicode::String
size_unicode
my ($width, $height) = @{ SDL::TTF::size_unicode($font, $text) };
Calculate the resulting surface size of the UNICODE encoded text rendered using
$font. No actual rendering is done, however correct kerning is done to get the
actual width. The height returned in h is the same as you can get using
SDL::TTF::font_height.
$text has to be:
- UTF16BE without BOM
- "hello" will look like "\0h\0e\0l\0l\0o"
- UTF16BE with BOM
- "hello" will look like "\xFE\xFF\0h\0e\0l\0l\0o"
- UTF16LE with BOM
- "hello" will look like "\xFF\xFEh\0e\0l\0l\0o\0"
You may use Unicode::String for this.
Font Rendering¶
Solid
render_glyph_solid
my $surface = SDL::TTF::render_glyph_solid($font, $char, $color);
Render the unicode encoded char onto a new surface, using the Solid mode. After
that you can blit this surface to your display-surface.
Note: The unicode char has to be passed exactly like for
SDL::TTF::size_unicode.
Note: See space-character bug
<
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=374062>. You have to
upgrade libfreetype2 to at least version 2.3.5
render_text_solid
my $surface = SDL::TTF::render_text_solid($font, $text, $color);
Render the LATIN1 encoded text onto a new surface, using the Solid mode. After
that you can blit this surface to your display-surface.
Note: See space-character bug
<
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=374062>. You have to
upgrade libfreetype2 to at least version 2.3.5
Example:
use SDL;
use SDL::Rect;
use SDL::Video;
use SDL::Color;
use SDL::TTF;
use SDL::TTF::Font;
SDL::init(SDL_INIT_VIDEO);
SDL::TTF::init();
my $display = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE);
my $font = SDL::TTF::open_font('somefont.ttf', '24');
die 'Coudnt make font '. SDL::get_error if !$font;
my $surface = SDL::TTF::render_text_solid($font, 'Hello!', SDL::Color->new(0xFF,0xFF,0xFF));
SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480));
SDL::Video::update_rect($display, 0, 0, 0, 0);
SDL::delay(5000);
render_utf8_solid
my $surface = SDL::TTF::render_utf8_solid($font, $text, $color);
Render the UTF8 encoded text onto a new surface, using the Solid mode. After
that you can blit this surface to your display-surface.
Note: See space-character bug
<
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=374062>. You have to
upgrade libfreetype2 to at least version 2.3.5
render_unicode_solid
my $surface = SDL::TTF::render_unicode_solid($font, $text, $color);
Render the unicode encoded text onto a new surface, using the Solid mode. After
that you can blit this surface to your display-surface.
Note: The unicode test has to be passed exactly like for
SDL::TTF::size_unicode.
Note: See space-character bug
<
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=374062>. You have to
upgrade libfreetype2 to at least version 2.3.5
Shaded
render_glyph_shaded
my $surface = SDL::TTF::render_glyph_shaded($font, $char, $color, $background_color);
Render the unicode encoded char onto a new surface. The surface is filled with
$background_color. After that you can blit this surface to your
display-surface.
Note: The unicode char has to be passed exactly like for
SDL::TTF::size_unicode.
render_text_shaded
my $surface = SDL::TTF::render_text_shaded($font, $text, $color, $background_color);
Render the LATIN1 encoded text onto a new surface. The surface is filled with
$background_color. After that you can blit this surface to your
display-surface.
Example:
use SDL;
use SDL::Video;
use SDL::Color;
use SDL::TTF;
use SDL::TTF::Font;
SDL::init(SDL_INIT_VIDEO);
SDL::TTF::init();
my $display = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE);
my $font = SDL::TTF::open_font('arial.ttf', '24');
my $white = SDL::Color->new(0xFF, 0xFF, 0xFF);
my $black = SDL::Color->new(0x00, 0x00, 0x00);
my $surface = SDL::TTF::render_text_solid($font, 'Hello!', $white, $black);
SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480));
SDL::Video::update_rect($display, 0, 0, 0, 0);
SDL::delay(5000);
render_utf8_shaded
my $surface = SDL::TTF::render_utf8_shaded($font, $text, $color, $background_color);
Render the UTF8 encoded text onto a new surface. The surface is filled with
$background_color. After that you can blit this surface to your
display-surface.
render_unicode_shaded
my $surface = SDL::TTF::render_unicode_shaded($font, $text, $color, $background_color);
Render the unicode encoded text onto a new surface. The surface is filled with
$background_color. After that you can blit this surface to your
display-surface.
Note: The unicode text has to be passed exactly like for
SDL::TTF::size_unicode.
Blended
render_glyph_blended
my $surface = SDL::TTF::render_glyph_blended($font, $char, $color);
Render the unicode encoded char onto a new surface. After that you can blit this
surface to your display-surface.
Note: The unicode char has to be passed exactly like for
SDL::TTF::size_unicode.
render_text_blended
my $surface = SDL::TTF::render_text_blended($font, $text, $color);
Render the LATIN1 encoded text onto a new surface. After that you can blit this
surface to your display-surface.
Example:
use SDL;
use SDL::Video;
use SDL::Color;
use SDL::TTF;
use SDL::TTF::Font;
SDL::init(SDL_INIT_VIDEO);
SDL::TTF::init();
my $display = SDL::Video::set_video_mode(640, 480, 32, SDL_SWSURFACE);
my $font = SDL::TTF::open_font('arial.ttf', '24');
my $surface = SDL::TTF::render_text_blended($font, 'Hello!', SDL::Color->new(0xFF,0xFF,0xFF));
SDL::Video::blit_surface($surface, SDL::Rect->new(0, 0, 640, 480), $display, SDL::Rect->new(10, 10, 640, 480));
SDL::Video::update_rect($display, 0, 0, 0, 0);
SDL::delay(5000);
render_utf8_blended
my $surface = SDL::TTF::render_utf8_blended($font, $text, $color);
Render the UTF8 encoded text onto a new surface. After that you can blit this
surface to your display-surface.
render_unicode_blended
my $surface = SDL::TTF::render_unicode_blended($font, $text, $color);
Render the unicode encoded text onto a new surface. After that you can blit this
surface to your display-surface.
Note: The unicode char has to be passed exactly like for
SDL::TTF::size_unicode.
AUTHORS¶
See "AUTHORS" in SDL.
SEE ALSO¶
SDL::TTF::Font, Unicode::String, SDL::Video, SDL::Surface