sdl_ttf not working
I am using debian linux and I cannot seem to get sdl_ttf working. It compiles fine but the program quits due to error checking in the code. It returns false at the ttf_init() part. Do not know if this makes a difference but I got sdl and ttf via apt.
Heres my compilation command :
g++ lesson07.cpp -o test -lSDL -lSDL_image -lSDL_ttf -lfreetype
heres my code (actually its a tutorials code. I do not claim that I made it or whatever)
/*This source code copyrighted by Lazy Foo' Productions (2004-2007) and may not be redestributed without written permission.*/
//The headers
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>
//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
SDL_Surface *screen = NULL;
//The event structure
SDL_Event event;
//The font that's going to be used
TTF_Font *font = NULL;
//The color of the font
SDL_Color textColor = { 255, 255, 255 };
SDL_Surface *load_image( std::string filename )
{
//The image that's loaded
SDL_Surface* loadedImage = NULL;
//The optimized surface that will be used
SDL_Surface* optimizedImage = NULL;
//Load the image
loadedImage = IMG_Load( filename.c_str() );
//If the image loaded
if( loadedImage != NULL )
{
//Create an optimized surface
optimizedImage = SDL_DisplayFormat( loadedImage );
//Free the old surface
SDL_FreeSurface( loadedImage );
//If the surface was optimized
if( optimizedImage != NULL )
{
//Color key surface
SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
}
}
//Return the optimized surface
return optimizedImage;
}
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
//Holds offsets
SDL_Rect offset;
//Get offsets
offset.x = x;
offset.y = y;
//Blit
SDL_BlitSurface( source, clip, destination, &offset );
}
bool init()
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return false;
}
//Set up the screen
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
//If there was in error in setting up the screen
if( screen == NULL )
{
return false;
}
//Initialize SDL_ttf
if( TTF_Init() == -1 )
{
return false;
}
//Set the window caption
SDL_WM_SetCaption( "TTF Test", NULL );
//If everything initialized fine
return true;
}
bool load_files()
{
//Load the background image
background = load_image( "background.png" );
//Open the font
font = TTF_OpenFont( "lazy.ttf", 28 );
//If there was a problem in loading the background
if( background == NULL )
{
return false;
}
//If there was an error in loading the font
if( font == NULL )
{
return false;
}
//If everything loaded fine
return true;
}
void clean_up()
{
//Free the surfaces
SDL_FreeSurface( background );
SDL_FreeSurface( message );
//Close the font that was used
TTF_CloseFont( font );
//Quit SDL_ttf
TTF_Quit();
//Quit SDL
SDL_Quit();
}
int main( int argc, char* args[] )
{
//Quit flag
bool quit = false;
//Initialize
if( init() == false )
{
return 1;
}
//Load the files
if( load_files() == false )
{
return 1;
}
//Render the text
message = TTF_RenderText_Solid( font, "The quick brown fox jumps over the lazy hound", textColor );
//If there was an error in rendering the text
if( message == NULL )
{
return 1;
}
//Apply the images to the screen
apply_surface( 0, 0, background, screen );
apply_surface( 0, 200, message, screen );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//While the user hasn't quit
while( quit == false )
{
//While there's events to handle
while( SDL_PollEvent( &event ) )
{
//If the user has Xed out the window
if( event.type == SDL_QUIT )
{
//Quit the program
quit = true;
}
}
}
//Free surfaces and font then quit SDL_ttf and SDL
clean_up();
return 0;
}
Sturm
Veteran Poster
1,079 posts since Jan 2007
Reputation Points: 343
Solved Threads: 24
Are you sure you have the SDL TTF runtime libraries installed properly? The code looks fine at first glance, but I don't really have time to run this code on my system right now, so I might in a few hours.
John A
Vampirical Lurker
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
Are you sure you have the SDL TTF runtime libraries installed properly?
Apt-get says that I have the following packages installed that relate to ttf:
libfreetype6, libsdl-ttf2.0-0, libsdl-ttf2.0-dev, libttf2, and libttf-dev
The strange thing is I have compiled The Battle for Wesnoth, Sauerbraten, and Action Cubers fine, all of which use ttf fonts. So is it the code? (sigh) My debian install seems rife with problems...;)
Sturm
Veteran Poster
1,079 posts since Jan 2007
Reputation Points: 343
Solved Threads: 24
Your header paths imply that they are a in a sub directory of your current directory.
Is that true?
In other words, if your current directory is
*/foo , the program will look for those headers in */foo/SDL
Otherwise the path is incomplete and/or incorrect.
From what you posted , I suspect that htses files may not exisit or are not where the program is looking for them.
do a dbupdate command (HD will churn for a few minutes) then type
locate SDL.h
This will return the path to that header if it exists.
JRM
Practically a Master Poster
621 posts since Nov 2006
Reputation Points: 130
Solved Threads: 75
do a dbupdate command (HD will churn for a few minutes) then type
locate SDL.h
This will return the path to that header if it exists.
Sorry, My dyslexia kicked in for a second...
the command is updatedb
JRM
Practically a Master Poster
621 posts since Nov 2006
Reputation Points: 130
Solved Threads: 75
ok I located the SDL stuff, its in /usr/include/SDL/*.
So it should be in the specified directory. SDL_ttf.h
is in there..I wonder why its acting up..
Sturm
Veteran Poster
1,079 posts since Jan 2007
Reputation Points: 343
Solved Threads: 24
Naw, just fix the paths in the include directive.\
Use the full path names, unless you have some compelling reason to do otherwise...
JRM
Practically a Master Poster
621 posts since Nov 2006
Reputation Points: 130
Solved Threads: 75
Im not sure I understand. All the SDL stuff is in /usr/include/SDL/ . So I would use SDL/foo as my includes, correct?
Sturm
Veteran Poster
1,079 posts since Jan 2007
Reputation Points: 343
Solved Threads: 24
Im not sure I understand. All the SDL stuff is in /usr/include/SDL/ . So I would use SDL/foo as my includes, correct?
No. Try changing your inclusions "s with < and >, because the directory that your SDL stuff resides in is a system directory, not a home one.
Although that's very unlikely to be what's causing you problems, as the code probably wouldn't even compile if the headers aren't being included.
John A
Vampirical Lurker
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
just chang all the include directives to absolute paths.
the first one would read:
#include "/usr/include/SDL/SDL.h"
which is the the absolute path name for THAT header. Do the rest of them using the same directory path. There is no doubt this way...
The compliler should be able to find the headers then. No gurantees that there will be no more problems, but at least that situation is handled.
JRM
Practically a Master Poster
621 posts since Nov 2006
Reputation Points: 130
Solved Threads: 75
Just occured to me that /user/include is probably in the standard search path for the the compiler as it is a standard system directory.
You DID say that it compiled! It would have complained about the functions if it couldn't find it's appropriate header.
Perhaps thay are incompatable versions?
anything in the doc's about the program requirements?
but hey, it's friggen Debian...who knows what lerks in the bowels of that beast?
JRM
Practically a Master Poster
621 posts since Nov 2006
Reputation Points: 130
Solved Threads: 75
Just occured to me that /user/include is probably in the standard search path for the the compiler as it is a standard system directory.
Which is why I said to use <> instead of quotes.You DID say that it compiled! It would have complained about the functions if it couldn't find it's appropriate header. Which is why I said that headers are unlikely to be causing the problems.Perhaps thay are incompatable versions?
anything in the doc's about the program requirements?
but hey, it's friggen Debian...who knows what lerks in the bowels of that beast? At the moment, I don't know enough about the guts of SDL to make a comment on the code. However, I'm hard at work installing SDL (I lost it when I did my hard drive wipe), and hopefully I can see if we can pinpoint this problem.
John A
Vampirical Lurker
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
However, I'm hard at work installing SDL (I lost it when I did my hard drive wipe), and hopefully I can see if we can pinpoint this problem.
Sorry, couldn't get it working. Somehow whenever I #include the SDL headers inside a simple blank main(), it mysteriously crashes on startup. And that's statically linking SDL.
So... I guess you're on your own unless someone else has any more ideas.
John A
Vampirical Lurker
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
THIS is why I am mad at debian:mad: It wont let me program! Allegro did not work on ubuntu and barely works on debian (it lags soooo...much), SDL is broken, ClanLib doesn't compile (another graphics library), and everything else is broken! Well whatever..thanks for your help. (NOTE: and debian is supposdly a "reliable distro", well I suppose since im taking from testing...;) )
Sturm
Veteran Poster
1,079 posts since Jan 2007
Reputation Points: 343
Solved Threads: 24
>NOTE: and debian is supposdly a "reliable distro", well I suppose since im taking from testing...
That probably has something to do with it. While I'm sure it's entirely possible to get it running under Debian Testing, the reality is that more things need configuration to get it working.
Interestingly enough, Slackware (which is supposedly a very hardcore distro and needs tons of configuration) seems to have all the development tools set up, and settings rarely need to be tweaked to get random code downloaded from the web to compile and work.
Regardless of the system/platform you're using, libraries are a pain to work with. They make it easier for the person writing the code, but make it a thousand times more complex for the person who has to setup the compiler/linker to read in the libraries.
John A
Vampirical Lurker
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339