From f75620d8d873af217fffd3c574463a1931ae54c1 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 03 Aug 2021 00:07:46 -0400 Subject: splash: Align text by the baseline And factor out text rendering into a shared interface. --- (limited to 'src/ttf.c') diff --git a/src/ttf.c b/src/ttf.c new file mode 100644 index 0000000..9cfaab0 --- /dev/null +++ b/src/ttf.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2021 P. J. McDermott + * + * This file is part of Maze Fight + * + * Maze Fight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Maze Fight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Maze Fight. If not, see . + */ + +#include +#include +#include +#include "ttf.h" + +SDL_Texture * +mf_ttf_render(TTF_Font *font, const char *text, SDL_Color *color, + SDL_Renderer *renderer, SDL_Rect *rect) +{ + SDL_Surface *surface; + SDL_Texture *texture; + int ascent; + int max_y; + const char *c; + int glyph_max_y; + + surface = TTF_RenderUTF8_Blended(font, text, *color); + if (surface == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't create surface: %s", + TTF_GetError()); + return NULL; + } + + texture = SDL_CreateTextureFromSurface(renderer, surface); + if (texture == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't create texture: %s", + SDL_GetError()); + return NULL; + } + + ascent = TTF_FontAscent(font); + max_y = 0; + for (c = text; *c != '\0'; ++c) { + if (TTF_GlyphMetrics(font, *c, NULL, NULL, NULL, &glyph_max_y, + NULL) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't get glyph metrics: %s", + SDL_GetError()); + continue; + } + if (glyph_max_y > max_y) { + max_y = glyph_max_y; + } + } + rect->x = 0; + rect->y = ascent - max_y; + rect->w = surface->w; + rect->h = surface->h; + + SDL_FreeSurface(surface); + + return texture; +} -- cgit v0.9.1