diff options
Diffstat (limited to 'src/crepe/facade')
| -rw-r--r-- | src/crepe/facade/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/crepe/facade/Font.cpp | 21 | ||||
| -rw-r--r-- | src/crepe/facade/Font.h | 42 | ||||
| -rw-r--r-- | src/crepe/facade/FontFacade.cpp | 43 | ||||
| -rw-r--r-- | src/crepe/facade/FontFacade.h | 34 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 15 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 18 | 
7 files changed, 173 insertions, 4 deletions
| diff --git a/src/crepe/facade/CMakeLists.txt b/src/crepe/facade/CMakeLists.txt index 0598e16..243ae46 100644 --- a/src/crepe/facade/CMakeLists.txt +++ b/src/crepe/facade/CMakeLists.txt @@ -4,6 +4,8 @@ target_sources(crepe PUBLIC  	SoundContext.cpp  	SDLContext.cpp  	DB.cpp +	FontFacade.cpp +	Font.cpp  )  target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -12,5 +14,7 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES  	SoundContext.h  	SDLContext.h  	DB.h +	FontFacade.h +	Font.h  ) diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp new file mode 100644 index 0000000..771002f --- /dev/null +++ b/src/crepe/facade/Font.cpp @@ -0,0 +1,21 @@ +#include <SDL2/SDL_ttf.h> + +#include "../api/Asset.h" +#include "../api/Config.h" + +#include "Font.h" + +using namespace std; +using namespace crepe; + +Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator) { +	const Config & config = Config::get_instance(); +	const std::string FONT_PATH = src.get_path(); +	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)); +	} +	this->font = {loaded_font, [](TTF_Font * close_font) { TTF_CloseFont(close_font); }}; +} + +TTF_Font * Font::get_font() const { return this->font.get(); } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h new file mode 100644 index 0000000..b208d96 --- /dev/null +++ b/src/crepe/facade/Font.h @@ -0,0 +1,42 @@ +#pragma once + +#include <SDL2/SDL_ttf.h> +#include <memory> + +#include "../Resource.h" +#include "../api/Config.h" + +namespace crepe { + +class Asset; +/** + * \brief Resource for managing font creation and destruction + * + * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + * It loads a font from an Asset and manages its lifecycle. The font is automatically unloaded + * when this object is destroyed. + */ +class Font : public Resource { + +public: +	/** +     * \param src The Asset containing the font file path and metadata to load the font. +     * \param mediator The Mediator object used for managing the SDL context or related systems. +     */ +	Font(const Asset & src, Mediator & mediator); +	/** +     * \brief Gets the underlying TTF_Font resource. +     *  +     * This function returns the raw pointer to the SDL_ttf TTF_Font object that represents +     * the loaded font. This can be used with SDL_ttf functions to render text. +     *  +     * \return The raw TTF_Font object wrapped in a unique pointer. +     */ +	TTF_Font * get_font() const; + +private: +	//! The SDL_ttf font object with custom deleter. +	std::unique_ptr<TTF_Font, std::function<void(TTF_Font *)>> font = nullptr; +}; + +} // namespace crepe diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp new file mode 100644 index 0000000..87f95ab --- /dev/null +++ b/src/crepe/facade/FontFacade.cpp @@ -0,0 +1,43 @@ +#include <fontconfig/fontconfig.h> +#include <functional> +#include <memory> +#include <stdexcept> +#include <string> + +#include "FontFacade.h" + +using namespace std; +using namespace crepe; + +FontFacade::FontFacade() { +	if (!FcInit()) throw runtime_error("Failed to initialize Fontconfig."); +} + +FontFacade::~FontFacade() { FcFini(); } + +Asset FontFacade::get_font_asset(const string & font_family) { +	FcPattern * raw_pattern +		= FcNameParse(reinterpret_cast<const FcChar8 *>(font_family.c_str())); +	if (raw_pattern == NULL) throw runtime_error("Failed to create font pattern."); + +	unique_ptr<FcPattern, function<void(FcPattern *)>> pattern{ +		raw_pattern, [](FcPattern * p) { FcPatternDestroy(p); }}; + +	FcConfig * config = FcConfigGetCurrent(); +	if (config == NULL) throw runtime_error("Failed to get current Fontconfig configuration."); + +	FcResult result; +	FcPattern * raw_matched_pattern = FcFontMatch(config, pattern.get(), &result); +	if (raw_matched_pattern == NULL) throw runtime_error("No matching font found."); + +	unique_ptr<FcPattern, function<void(FcPattern *)>> matched_pattern +		= {raw_matched_pattern, [](FcPattern * p) { FcPatternDestroy(p); }}; + +	FcChar8 * file_path = nullptr; +	FcResult res = FcPatternGetString(matched_pattern.get(), FC_FILE, 0, &file_path); +	if (res != FcResultMatch || file_path == NULL) +		throw runtime_error("Failed to get font file path."); + +	string font_file_path = reinterpret_cast<const char *>(file_path); +	return Asset(font_file_path); +} diff --git a/src/crepe/facade/FontFacade.h b/src/crepe/facade/FontFacade.h new file mode 100644 index 0000000..9761070 --- /dev/null +++ b/src/crepe/facade/FontFacade.h @@ -0,0 +1,34 @@ +#pragma once + +#include <memory> + +#include "../api/Asset.h" + +namespace crepe { + +/** + *  + * \brief Font facade class for converting font family names to absolute file paths + *  + */ +class FontFacade { +public: +	FontFacade(); +	~FontFacade(); +	FontFacade(const FontFacade & other) = delete; +	FontFacade & operator=(const FontFacade & other) = delete; +	FontFacade(FontFacade && other) noexcept = delete; +	FontFacade & operator=(FontFacade && other) noexcept = delete; +	/** +	 *  +	 * \brief Facade function to convert a font_family into an asset. +	 *  +	 * This function uses the FontConfig library to convert a font family name (Arial, Inter, Helvetica) and converts it to the font source path. +	 * This function returns a default font path if the font_family name doesnt exist or cant be found +	 * \param font_family Name of the font family name. +	 * \return Asset with filepath to the corresponding font. +	 */ +	Asset get_font_asset(const std::string & font_family); +}; + +} // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 7ccc243..fffbe34 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,6 +6,8 @@  #include <SDL2/SDL_rect.h>  #include <SDL2/SDL_render.h>  #include <SDL2/SDL_surface.h> +#include <SDL2/SDL_ttf.h> +#include <SDL2/SDL_video.h>  #include <array>  #include <cmath>  #include <cstddef> @@ -30,6 +32,9 @@ 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()));  	} @@ -71,13 +76,13 @@ SDLContext::~SDLContext() {  	// thread that SDL_Init() was called on? This has caused problems for me  	// before.  	IMG_Quit(); +	TTF_Quit();  	SDL_Quit();  }  Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { -	if (!LOOKUP_TABLE.contains(sdl_key)) return Keycode::NONE; - -	return LOOKUP_TABLE.at(sdl_key); +	if (!lookup_table.contains(sdl_key)) return Keycode::NONE; +	return lookup_table.at(sdl_key);  }  const keyboard_state_t & SDLContext::get_keyboard_state() { @@ -408,3 +413,7 @@ void SDLContext::set_color_texture(const Texture & texture, const Color & color)  	SDL_SetTextureColorMod(texture.get_img(), color.r, color.g, color.b);  	SDL_SetTextureAlphaMod(texture.get_img(), color.a);  } + +Asset SDLContext::get_font_from_name(const std::string & font_family) { +	return this->font_facade.get_font_asset(font_family); +} diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 8f4760e..b687f87 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -17,8 +17,10 @@  #include "api/KeyCodes.h"  #include "api/Sprite.h"  #include "api/Transform.h" +#include "types.h"  #include "EventData.h" +#include "FontFacade.h"  namespace crepe {  class Texture; @@ -242,10 +244,24 @@ private:  	CameraAuxiliaryData cam_aux_data;  private: +	//! instance of the font_facade +	FontFacade font_facade{}; + +public: +	/** +	 * \brief Function to Get asset from font_family +	 *  +	 * This function uses the FontFacade function to convert a font_family to an asset. +	 *  +	 * \param font_family name of the font style that needs to be used (will return an asset with default font path of the font_family doesnt exist) +	 *  +	 * \return asset with the font style absolute path +	 */ +	Asset get_font_from_name(const std::string & font_family);  	//! variable to store the state of each key (true = pressed, false = not pressed)  	keyboard_state_t keyboard_state;  	//! lookup table for converting SDL_SCANCODES to Keycodes -	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE +	const std::unordered_map<SDL_Scancode, Keycode> lookup_table  		= {{SDL_SCANCODE_SPACE, Keycode::SPACE},  		   {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},  		   {SDL_SCANCODE_COMMA, Keycode::COMMA}, |