From 5df07dbf538d951275a23206fac3c0b9b0a2b27b Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 03 Aug 2021 16:55:06 -0400 Subject: ttf: Rename to widget --- (limited to 'src/widget.c') diff --git a/src/widget.c b/src/widget.c new file mode 100644 index 0000000..0b6929c --- /dev/null +++ b/src/widget.c @@ -0,0 +1,77 @@ +/* + * 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 "widget.h" + +SDL_Texture * +mf_widget_text(TTF_Font *font, const char *text, SDL_Color *color, + SDL_Renderer *renderer, SDL_Rect *rect) +{ + SDL_Surface *surface; + SDL_Texture *texture; + int line_skip; + 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()); + SDL_FreeSurface(surface); + return NULL; + } + + line_skip = TTF_FontLineSkip(font); + 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 = (line_skip - ascent) / 2 + (ascent - max_y); + rect->w = surface->w; + rect->h = surface->h; + + SDL_FreeSurface(surface); + + return texture; +} -- cgit v0.9.1