This repository has been archived on 2026-05-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libsdlgame/FontRenderer.cpp

104 lines
3.3 KiB
C++
Raw Normal View History

#include "FontRenderer.h"
#include "Common.h"
#include <SDL.h>
#include <SDL_gfxPrimitives.h>
FontRenderer::FontRenderer()
{
this->setColor((SDL_Color) {0,0,0,0}, (SDL_Color){255,255,255,0}, 1);
}
FontRenderer::~FontRenderer()
{
////std::cerr << "Freeing memory in FontRenderer is not yet implemented\n";
}
int FontRenderer::loadFont(std::string filename, std::string fontname, int pointsize)
{
TTF_Font *font = TTF_OpenFont(filename.c_str(), pointsize);
if ( font == NULL ) {
////std::cerr << "Unable to load font " << filename << "\n";
return 1;
}
this->loadedFonts[fontname][pointsize] = font;
return 0;
}
void FontRenderer::setColor(SDL_Color textColor, SDL_Color bgColor, int alpha)
{
//std::cerr << "FontRenderer::setColor (" << textColor.r << " : " << textColor.g << " : " << textColor.b << ") "
//<< " ( " << bgColor.r << " : " << bgColor.g << " : " << bgColor.b << " ) alpha " << alpha << "\n";
this->textColor = textColor;
this->bgColor = bgColor;
this->alpha = alpha;
}
SDL_Rect FontRenderer::renderString(std::string text,
SDL_Surface *dest,
std::string fontname,
Vector position,
int pointsize)
{
SDL_Rect destrect;
SDL_Surface *surface;
SDL_Color foregroundColor, backgroundColor;
TTF_Font *font;
SDL_Rect blankrect;
int plainTextWidth = 0;
if ( dest == NULL ) {
return blankrect;
}
if ( fontname == "" ) {
plainTextWidth = text.size() * 8;
if ( position.x == -1 )
position.x = (dest->w/2) - (plainTextWidth/2);
if ( position.y == -1 )
position.y = (dest->h/2) - 8;
//std::cerr << "Rendering (plain text) " << text << " at " << position.x << " x " << position.y << "\n";
stringRGBA(dest, (int)position.x, (int)position.y, text.c_str(),
this->textColor.r, this->textColor.g, this->textColor.b, this->alpha);
return blankrect;
}
////std::cerr << "Rendering (true type) " << text << " at " << position.x << " x " << position.y << "\n";
if ( this->loadedFonts.count(fontname) == 1 ) {
if ( this->loadedFonts[fontname].count(pointsize) == 1 ) {
////std::cerr << "Found font..";
font = this->loadedFonts[fontname][pointsize];
} else {
////std::cerr << "No font found for (point size) 20\n";
return blankrect;
}
} else {
////std::cerr << "No font found for (" << fontname << ")\n";
return blankrect;
}
surface = TTF_RenderUTF8_Shaded(font, text.c_str(), this->textColor, this->bgColor);
if (surface == NULL)
{
////std::cerr << "Couldn't create String " << text << ":" << SDL_GetError() << "\n";
return blankrect;
}
/* Blit the entire surface to the screen */
destrect.x = (position.x == -1 ? (dest->w - surface->w) / 2 : (Sint16) position.x);
destrect.y = (position.y == -1 ? (dest->h - surface->h) / 2 : (Sint16) position.y);
destrect.w = surface->w;
destrect.h = surface->h;
////std::cerr << "FontRenderer::renderString this->alpha " << this->alpha << "\n";
if ( this->alpha == 1 ) {
SDL_SetColorKey(surface, SDL_SRCCOLORKEY,
SDL_MapRGBA(surface->format, this->bgColor.r, this->bgColor.g, this->bgColor.b, 0) );
}
SDL_BlitSurface(surface, NULL, dest, &destrect);
/* Free the generated string image */
SDL_FreeSurface(surface);
return destrect;
}