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') diff --git a/src/local.mk b/src/local.mk index bdde089..a357b2d 100644 --- a/src/local.mk +++ b/src/local.mk @@ -7,5 +7,7 @@ mazefight_SOURCES += \ %reldir%/maze.h \ %reldir%/splash.c \ %reldir%/splash.h \ + %reldir%/ttf.c \ + %reldir%/ttf.h \ %reldir%/util.c \ %reldir%/util.h diff --git a/src/splash.c b/src/splash.c index f662a0d..c11d76b 100644 --- a/src/splash.c +++ b/src/splash.c @@ -25,39 +25,9 @@ #include "dirs.h" #include "maze.h" #include "splash.h" +#include "ttf.h" #include "util.h" -static SDL_Texture * -_mf_splash_text(TTF_Font *font, const char *text, SDL_Color *color, - SDL_Renderer *renderer, SDL_Rect *rect) -{ - SDL_Surface *surface; - SDL_Texture *texture; - - 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; - } - - rect->w = surface->w; - rect->h = surface->h; - - SDL_FreeSurface(surface); - - return texture; -} - int mf_splash(SDL_Renderer *renderer) { @@ -87,7 +57,7 @@ mf_splash(SDL_Renderer *renderer) free(font_path); return -1; } - title_texture = _mf_splash_text(font, "Maze Fight", &text_color, + title_texture = mf_ttf_render(font, "Maze Fight", &text_color, renderer, &title_rect); if (title_texture == NULL) { goto err; @@ -95,7 +65,7 @@ mf_splash(SDL_Renderer *renderer) TTF_CloseFont(font); font = NULL; title_rect.x = (MF_WINDOW_W - title_rect.w) / 2; - title_rect.y = MF_SPLASH_WINDOW_P + MF_SPLASH_FORM_P; + title_rect.y += MF_SPLASH_WINDOW_P + MF_SPLASH_FORM_P; /* TODO: Widgets */ 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; +} diff --git a/src/ttf.h b/src/ttf.h new file mode 100644 index 0000000..5254eb2 --- /dev/null +++ b/src/ttf.h @@ -0,0 +1,30 @@ +/* + * 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 . + */ + +#ifndef MF_TTF_H_ +#define MF_TTF_H_ + +#include + +SDL_Texture * +mf_ttf_render(TTF_Font *font, const char *text, SDL_Color *color, + SDL_Renderer *renderer, SDL_Rect *rect); + +#endif /* MF_TTF_H_ */ + -- cgit v0.9.1