diff options
Diffstat (limited to 'src/crepe/facade')
-rw-r--r-- | src/crepe/facade/Font.cpp | 12 | ||||
-rw-r--r-- | src/crepe/facade/Font.h | 5 | ||||
-rw-r--r-- | src/crepe/facade/FontFacade.cpp | 6 | ||||
-rw-r--r-- | src/crepe/facade/SDLContext.cpp | 37 | ||||
-rw-r--r-- | src/crepe/facade/SDLContext.h | 4 |
5 files changed, 56 insertions, 8 deletions
diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 558641f..51e9690 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -2,6 +2,9 @@ #include "../api/Asset.h" #include "../api/Config.h" +#include "util/Log.h" +#include <iostream> +#include <string> #include "Font.h" @@ -12,6 +15,11 @@ Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator){ Config & config = Config::get_instance(); const std::string FONT_PATH = src.get_path(); + + this->path = FONT_PATH; + + cout << this->path << endl; + /* TTF_Font * loaded_font = TTF_OpenFont(FONT_PATH.c_str(), config.font.size); if (loaded_font == NULL) { throw runtime_error(format("Font: {} (path: {})", TTF_GetError(), FONT_PATH)); @@ -20,3 +28,7 @@ Font::Font(const Asset & src, Mediator & mediator) } TTF_Font * Font::get_font() const { return this->font.get(); } + +const string & Font::get_path() const noexcept{ + return this->path; +} diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index b208d96..3eff3c6 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -1,10 +1,11 @@ #pragma once #include <SDL2/SDL_ttf.h> +#include <functional> #include <memory> +#include <string> #include "../Resource.h" -#include "../api/Config.h" namespace crepe { @@ -34,6 +35,8 @@ public: */ TTF_Font * get_font() const; + const std::string & get_path() const noexcept; + private: //! The SDL_ttf font object with custom deleter. std::unique_ptr<TTF_Font, std::function<void(TTF_Font *)>> font = nullptr; diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 08ff31c..9919032 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -1,4 +1,5 @@ #include <fontconfig/fontconfig.h> +#include <iostream> #include <stdexcept> #include "FontFacade.h" @@ -18,7 +19,7 @@ Asset FontFacade::get_font_asset(const string& font_family) { // Create a pattern to search for the font family FcPattern * pattern = FcNameParse(reinterpret_cast<const FcChar8 *>(font_family.c_str())); - if (pattern == NULL) { + if (!pattern) { throw runtime_error("Failed to create font pattern."); } @@ -34,8 +35,7 @@ Asset FontFacade::get_font_asset(const string& font_family) { FcPattern * matched_pattern = FcFontMatch(config, pattern, &result); FcPatternDestroy(pattern); - if (matched_pattern == NULL) { - FcPatternDestroy(matched_pattern); + if (!matched_pattern) { throw runtime_error("No matching font found."); } // Extract the file path diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 8ffaad9..7bd9dbc 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -21,6 +21,8 @@ #include "../api/Config.h" #include "../api/Sprite.h" #include "../util/Log.h" +#include "api/Text.h" +#include "facade/Font.h" #include "manager/Mediator.h" #include "SDLContext.h" @@ -32,9 +34,6 @@ using namespace std; SDLContext::SDLContext(Mediator & mediator) { dbg_trace(); - if (TTF_Init() == -1) { - throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError())); - } if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } @@ -63,6 +62,10 @@ SDLContext::SDLContext(Mediator & mediator) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } + if (TTF_Init() == -1) { + throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError())); + } + mediator.sdl_context = *this; } @@ -75,8 +78,8 @@ SDLContext::~SDLContext() { // TODO: how are we going to ensure that these are called from the same // thread that SDL_Init() was called on? This has caused problems for me // before. - IMG_Quit(); TTF_Quit(); + IMG_Quit(); SDL_Quit(); } @@ -283,6 +286,32 @@ void SDLContext::draw(const RenderContext & ctx) { angle, NULL, render_flip); } + +void SDLContext::draw_text(const Text & text, const Font & font){ + SDL_Color color { + .r = text.data.text_color.r, + .g = text.data.text_color.g, + .b = text.data.text_color.b, + .a = text.data.text_color.a, + }; + TTF_Font * ttf_font = TTF_OpenFont(font.get_path().c_str(), Config::get_instance().font.size); + SDL_Surface * font_surface = TTF_RenderText_Solid(font.get_font(), text.text.c_str(), color); + TTF_CloseFont(ttf_font); + SDL_Texture * font_texture = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface); + SDL_FreeSurface(font_surface); + + SDL_Rect dstrect { + .x = (int)text.offset.x, + .y = (int)text.offset.y, + .w = (int)text.dimensions.x, + .h = (int)text.dimensions.y, + }; + + SDL_RenderCopy(this->game_renderer.get(), font_texture, NULL, NULL); + SDL_RenderCopyExF(this->game_renderer.get(), font_texture, NULL, NULL, 0 , NULL, SDL_FLIP_NONE); + SDL_DestroyTexture(font_texture); +} + void SDLContext::update_camera_view(const Camera & cam, const vec2 & new_pos) { const Camera::Data & cam_data = cam.data; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index ffa3cc0..fcf3559 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -21,6 +21,8 @@ namespace crepe { class Texture; +class Text; +class Font; class Mediator; /** @@ -184,6 +186,8 @@ public: */ void draw(const RenderContext & ctx); + void draw_text(const Text & text, const Font & font); + //! Clears the screen, preparing for a new frame. void clear_screen(); |