aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/facade
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/facade')
-rw-r--r--src/crepe/facade/SDLContext.cpp22
-rw-r--r--src/crepe/facade/SDLContext.h5
2 files changed, 21 insertions, 6 deletions
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 41c6d21..c3c1b59 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -292,6 +292,8 @@ void SDLContext::draw_text(const RenderText & data) {
const Text & text = data.text;
const Font & font = data.font;
const Transform & transform = data.transform;
+ std::unique_ptr<SDL_Surface, std::function<void(SDL_Surface *)>> font_surface;
+ std::unique_ptr<SDL_Texture, std::function<void(SDL_Texture *)>> font_texture;
SDL_Color color{
.r = text.data.text_color.r,
@@ -299,11 +301,20 @@ void SDLContext::draw_text(const RenderText & data) {
.b = text.data.text_color.b,
.a = text.data.text_color.a,
};
- SDL_Surface * font_surface
+ SDL_Surface * tmp_font_surface
= TTF_RenderText_Solid(font.get_font(), text.text.c_str(), color);
- SDL_Texture * font_texture
- = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface);
- SDL_FreeSurface(font_surface);
+ if (!tmp_font_surface) {
+ throw runtime_error(format("draw_text: font surface error: {}", SDL_GetError()));
+ }
+ font_surface = {tmp_font_surface, [](SDL_Surface * surface) { SDL_FreeSurface(surface); }};
+
+ SDL_Texture * tmp_font_texture
+ = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface.get());
+ if (!tmp_font_texture) {
+ throw runtime_error(format("draw_text: font texture error: {}", SDL_GetError()));
+ }
+ font_texture
+ = {tmp_font_texture, [](SDL_Texture * texture) { SDL_DestroyTexture(texture); }};
vec2 size = text.dimensions * cam_aux_data.render_scale;
vec2 screen_pos = (transform.position + text.offset - cam_aux_data.cam_pos
@@ -318,9 +329,8 @@ void SDLContext::draw_text(const RenderText & data) {
.h = size.y,
};
- SDL_RenderCopyExF(this->game_renderer.get(), font_texture, NULL, &dstrect, 0, NULL,
+ SDL_RenderCopyExF(this->game_renderer.get(), font_texture.get(), NULL, &dstrect, 0, NULL,
SDL_FLIP_NONE);
- SDL_DestroyTexture(font_texture);
}
void SDLContext::update_camera_view(const Camera & cam, const vec2 & new_pos) {
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 066a881..aeace07 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -193,6 +193,11 @@ public:
*/
void draw(const RenderContext & ctx);
+ /**
+ * \brief draws a text to the screen
+ *
+ * \param data Reference to the rendering data needed to draw
+ */
void draw_text(const RenderText & data);
//! Clears the screen, preparing for a new frame.