7 #include "sdl/renderer.h"
8 #include "sprite_font.h"
9 #include "system/error.h"
10 #include "system/lt.h"
12 #define FONT_ROW_SIZE 18
22 sprite_font_t *create_sprite_font_from_file(const char *bmp_file_path,
23 SDL_Renderer *renderer)
25 assert(bmp_file_path);
28 lt_t * const lt = create_lt();
33 sprite_font_t * const sprite_font = PUSH_LT(lt, malloc(sizeof(sprite_font_t)), free);
34 if (sprite_font == NULL) {
35 throw_error(ERROR_TYPE_LIBC);
39 SDL_Surface * const surface = PUSH_LT(lt, SDL_LoadBMP(bmp_file_path), SDL_FreeSurface);
40 if (surface == NULL) {
41 throw_error(ERROR_TYPE_SDL2);
45 if (SDL_SetColorKey(surface,
47 SDL_MapRGB(surface->format,
49 throw_error(ERROR_TYPE_SDL2);
53 sprite_font->texture = PUSH_LT(
55 SDL_CreateTextureFromSurface(renderer, surface),
57 if (sprite_font->texture == NULL) {
58 throw_error(ERROR_TYPE_SDL2);
62 SDL_FreeSurface(RELEASE_LT(lt, surface));
69 void destroy_sprite_font(sprite_font_t *sprite_font)
72 RETURN_LT0(sprite_font->lt);
75 static SDL_Rect sprite_font_char_rect(const sprite_font_t *sprite_font, char x)
79 if (32 <= x && x <= 126) {
80 const SDL_Rect rect = {
81 .x = ((x - 32) % FONT_ROW_SIZE) * CHAR_WIDTH,
82 .y = ((x - 32) / FONT_ROW_SIZE) * CHAR_HEIGHT,
88 return sprite_font_char_rect(sprite_font, '?');
92 int sprite_font_render_text(const sprite_font_t *sprite_font,
93 SDL_Renderer *renderer,
103 const SDL_Color sdl_color = color_for_sdl(color);
105 if (SDL_SetTextureColorMod(sprite_font->texture, sdl_color.r, sdl_color.g, sdl_color.b) < 0) {
106 throw_error(ERROR_TYPE_SDL2);
110 if (SDL_SetTextureAlphaMod(sprite_font->texture, sdl_color.a) < 0) {
111 throw_error(ERROR_TYPE_SDL2);
115 const size_t text_size = strlen(text);
116 for (size_t i = 0; i < text_size; ++i) {
117 const SDL_Rect char_rect = sprite_font_char_rect(sprite_font, text[i]);
118 const SDL_Rect dest_rect = rect_for_sdl(
120 position.x + (float) CHAR_WIDTH * (float) i * size.x,
122 (float) char_rect.w * size.x,
123 (float) char_rect.h * size.y));
124 if (SDL_RenderCopy(renderer, sprite_font->texture, &char_rect, &dest_rect) < 0) {
132 rect_t sprite_font_boundary_box(const sprite_font_t *sprite_font,
139 return rect(position.x, position.y, size.x * CHAR_WIDTH * (float) strlen(text), size.y * CHAR_HEIGHT);