From 29f2d4537cf4d4d4c74c16447a45a5d7034161f4 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 10 Dec 2024 09:47:46 +0100 Subject: sdlfontcontext --- src/crepe/facade/CMakeLists.txt | 2 ++ src/crepe/facade/SDLFontContext.cpp | 51 +++++++++++++++++++++++++++++++++++++ src/crepe/facade/SDLFontContext.h | 15 +++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/crepe/facade/SDLFontContext.cpp create mode 100644 src/crepe/facade/SDLFontContext.h (limited to 'src/crepe/facade') diff --git a/src/crepe/facade/CMakeLists.txt b/src/crepe/facade/CMakeLists.txt index 4cc53bc..9b73323 100644 --- a/src/crepe/facade/CMakeLists.txt +++ b/src/crepe/facade/CMakeLists.txt @@ -3,6 +3,7 @@ target_sources(crepe PUBLIC SoundContext.cpp SDLContext.cpp DB.cpp + SDLFontContext.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -10,5 +11,6 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES SoundContext.h SDLContext.h DB.h + SDLFontContext.h ) diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp new file mode 100644 index 0000000..6ce5efd --- /dev/null +++ b/src/crepe/facade/SDLFontContext.cpp @@ -0,0 +1,51 @@ +#include "SDLFontContext.h" +#include + +using namespace crepe; +using namespace std; + +SDLFontContext::SDLFontContext(){ + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } +} + +SDLFontContext::~SDLFontContext(){ + FcFini(); +} +Asset SDLFontContext::get_font_asset(const std::string & font_family) { + // Create a pattern to search for the font family + FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); + if (!pattern) { + throw std::runtime_error("Failed to create font pattern."); + } + + // Default configuration + FcConfig* config = FcConfigGetCurrent(); + if (!config) { + FcPatternDestroy(pattern); + throw std::runtime_error("Failed to get current Fontconfig configuration."); + } + + // Match the font pattern + FcResult result; + FcPattern* matched_pattern = FcFontMatch(config, pattern, &result); + FcPatternDestroy(pattern); + + if (!matched_pattern) { + throw std::runtime_error("No matching font found."); + } + + // Extract the file path + FcChar8* file_path = nullptr; + if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch || !file_path) { + FcPatternDestroy(matched_pattern); + throw std::runtime_error("Failed to get font file path."); + } + + // Convert the file path to a std::string + std::string font_file_path(reinterpret_cast(file_path)); + FcPatternDestroy(matched_pattern); + + return Asset(font_file_path); +} diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h new file mode 100644 index 0000000..3b2e162 --- /dev/null +++ b/src/crepe/facade/SDLFontContext.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include "../api/Asset.h" +namespace crepe { + class SDLFontContext{ + public: + SDLFontContext(); + ~SDLFontContext(); + Asset get_font_asset(const std::string & font_family); + private: + }; + +} -- cgit v1.2.3 From b2c72ee8ce282bb13b0fbeb2ddb01fdfd6ad1280 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 10 Dec 2024 12:27:59 +0100 Subject: font progress --- src/crepe/api/Config.h | 11 +++++++++ src/crepe/facade/SDLFontContext.cpp | 19 ++++++++------- src/crepe/facade/SDLFontContext.h | 5 +++- src/crepe/facade/font.cpp | 21 +++++++++++++++++ src/crepe/facade/font.h | 47 +++++++++++++++++++++++++++++++++++++ src/example/CMakeLists.txt | 1 + src/example/loadfont.cpp | 13 ++++++++++ 7 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 src/crepe/facade/font.cpp create mode 100644 src/crepe/facade/font.h create mode 100644 src/example/loadfont.cpp (limited to 'src/crepe/facade') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..e4808fe 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -86,6 +86,17 @@ public: */ std::string root_pattern = ".crepe-root"; } asset; + //! Default font options + struct { + /** + * \brief Default font size + * + * using the SDL_ttf library the font size needs to be set when loading the font. + * This config option is the font size at which all fonts will be loaded initially. + * + */ + int font_size = 16; + } font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 6ce5efd..a4be143 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -1,19 +1,22 @@ -#include "SDLFontContext.h" #include +#include "SDLFontContext.h" + + using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + } SDLFontContext::~SDLFontContext(){ - FcFini(); + } -Asset SDLFontContext::get_font_asset(const std::string & font_family) { +unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -46,6 +49,6 @@ Asset SDLFontContext::get_font_asset(const std::string & font_family) { // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - - return Asset(font_file_path); + FcFini(); + return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index 3b2e162..cd91383 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -1,14 +1,17 @@ #pragma once +#include #include #include + #include "../api/Asset.h" + namespace crepe { class SDLFontContext{ public: SDLFontContext(); ~SDLFontContext(); - Asset get_font_asset(const std::string & font_family); + std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/crepe/facade/font.cpp b/src/crepe/facade/font.cpp new file mode 100644 index 0000000..259a6cd --- /dev/null +++ b/src/crepe/facade/font.cpp @@ -0,0 +1,21 @@ +#include "font.h" +#include "../api/Config.h" +using namespace std; +using namespace crepe; + +void Font::load(unique_ptr res){ + const char* font_path = res->get_path(); + int font_size = Config::get_instance().font.font_size; + this->font = std::unique_ptr( + TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + + if (!font) { + throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); + } +} +Font::Font(const char* src){ + this->load(make_unique(src)); +} +Font::Font(std::unique_ptr res){ + this->load(std::move(res)); +} diff --git a/src/crepe/facade/font.h b/src/crepe/facade/font.h new file mode 100644 index 0000000..f5c7785 --- /dev/null +++ b/src/crepe/facade/font.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +#include "../api/Asset.h" + +namespace crepe { + +/** + * \brief Font resource facade + * + * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + */ +class Font { +public: + /** + * \param src The file path to the font file. + */ + Font(const char* src); + + /** + * \param res A unique pointer to an Asset holding the font resource. + */ + Font(std::unique_ptr res); + + /** + * \brief Destructor to clean up font resources. + */ + ~Font() = default; + + void draw(const vec2& pos, const vec2&) +private: + /** + * \brief Load the font from the given resource. + * + * This method is used by both constructors to load the font resource. + * + * \param res A unique pointer to an Asset holding the font resource. + */ + void load(std::unique_ptr res); + +private: + std::unique_ptr font; ///< The SDL_ttf font object with custom deleter. +}; + +} // namespace crepe diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 8ef71bb..7fc81d7 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -21,3 +21,4 @@ add_example(savemgr) add_example(rendering_particle) add_example(game) add_example(button) +add_example(loadfont) diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp new file mode 100644 index 0000000..8931ce3 --- /dev/null +++ b/src/example/loadfont.cpp @@ -0,0 +1,13 @@ +#include +#include + +#include + +using namespace crepe; + +int main(){ + SDLFontContext font_facade; + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << std::endl; + return 0; +} -- cgit v1.2.3 From 007fe1ecb5e9f76539cdffd6a96afe22c8b2d214 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Wed, 11 Dec 2024 18:21:03 +0100 Subject: save --- src/crepe/facade/Font.cpp | 24 ++++++++++++++++++++++++ src/crepe/facade/Font.h | 33 +++++++++++++++++++++++++++++++++ src/crepe/facade/font.cpp | 21 --------------------- src/crepe/facade/font.h | 31 ------------------------------- 4 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 src/crepe/facade/Font.cpp create mode 100644 src/crepe/facade/Font.h delete mode 100644 src/crepe/facade/font.cpp delete mode 100644 src/crepe/facade/font.h (limited to 'src/crepe/facade') diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp new file mode 100644 index 0000000..2ad176a --- /dev/null +++ b/src/crepe/facade/Font.cpp @@ -0,0 +1,24 @@ +#include "font.h" +#include "../api/Config.h" +using namespace std; +using namespace crepe; + +void Font::load(unique_ptr res){ + const char* font_path = res->get_path(); + int font_size = Config::get_instance().font.font_size; + this->font = std::unique_ptr( + TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + + if (!font) { + throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); + } +} +Font::Font(const char* src){ + this->load(make_unique(src)); +} +Font::Font(std::unique_ptr res){ + this->load(std::move(res)); +} +const TTF_Font& Font::get_font() const{ + return this->font; +} diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h new file mode 100644 index 0000000..e34ac63 --- /dev/null +++ b/src/crepe/facade/Font.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include "../api/Asset.h" +#include "../api/Config.h" + +namespace crepe { + +/** + * \brief Font resource facade + * + * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + */ +class Font : public Resource{ +public: + /**. + * \param src Asset with texture data to load. + * \param mediator use the SDLContext reference to load the image + */ + Font(const Asset & src, Mediator & mediator); + + + ~Font() = default + const TTF_Font& get_font() const; +private: + //! The SDL_ttf font object with custom deleter. + std::unique_ptr font; + int default_font_size = Config::get_instance().font.font_size; +}; + +} // namespace crepe diff --git a/src/crepe/facade/font.cpp b/src/crepe/facade/font.cpp deleted file mode 100644 index 259a6cd..0000000 --- a/src/crepe/facade/font.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "font.h" -#include "../api/Config.h" -using namespace std; -using namespace crepe; - -void Font::load(unique_ptr res){ - const char* font_path = res->get_path(); - int font_size = Config::get_instance().font.font_size; - this->font = std::unique_ptr( - TTF_OpenFont(font_path, font_size), &TTF_CloseFont); - - if (!font) { - throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); - } -} -Font::Font(const char* src){ - this->load(make_unique(src)); -} -Font::Font(std::unique_ptr res){ - this->load(std::move(res)); -} diff --git a/src/crepe/facade/font.h b/src/crepe/facade/font.h deleted file mode 100644 index a8d8040..0000000 --- a/src/crepe/facade/font.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include -#include - -#include "../api/Asset.h" - -namespace crepe { - -/** - * \brief Font resource facade - * - * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. - */ -class Font : public Resource{ -public: - /** - * \param res A unique pointer to an Asset holding the font resource. - */ - Font(const Asset & src, Mediator & mediator); - - /** - * \brief Destructor to clean up font resources. - */ - ~Font() = default; -private: - //! The SDL_ttf font object with custom deleter. - std::unique_ptr font; -}; - -} // namespace crepe -- cgit v1.2.3 From e75e355c3a59d53a1d64fd8fae3331b2234083e2 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Wed, 11 Dec 2024 22:17:43 +0100 Subject: text component pretty much finished --- src/crepe/api/CMakeLists.txt | 2 ++ src/crepe/api/Config.h | 4 ++-- src/crepe/api/Text.cpp | 6 ++++++ src/crepe/api/Text.h | 8 ++++---- src/crepe/facade/Font.cpp | 10 +++++++--- src/crepe/facade/Font.h | 12 ++++++------ src/crepe/facade/SDLFontContext.cpp | 11 +++++------ src/crepe/facade/SDLFontContext.h | 8 ++++++++ src/example/loadfont.cpp | 23 +++++++++++++++++------ 9 files changed, 57 insertions(+), 27 deletions(-) (limited to 'src/crepe/facade') diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index fb11c8d..90e4d1f 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -20,6 +20,7 @@ target_sources(crepe PUBLIC Button.cpp UIObject.cpp AI.cpp + Text.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -49,4 +50,5 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES Button.h UIObject.h AI.h + Text.h ) diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index def4c49..159be99 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -81,11 +81,11 @@ struct Config final { /** * \brief Default font size * - * using the SDL_ttf library the font size needs to be set when loading the font. + * Using the SDL_ttf library the font size needs to be set when loading the font. * This config option is the font size at which all fonts will be loaded initially. * */ - int font_size = 16; + unsigned int size = 16; } font; //! Audio system settings diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index e69de29..dd44dd9 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -0,0 +1,6 @@ +#include "Text.h" + +using namespace crepe; + +Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font) : UIObject(id,dimensions,offset),source(font){} + diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 9dd275b..d5f47fa 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -11,11 +11,11 @@ namespace crepe{ class Text : public UIObject{ public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font, int font_size); + Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font); //! Label text. std::string text; - //! Label text color + //! Label text color. Color text_color = Color::BLACK; /** * \brief fontsize for text rendering @@ -26,8 +26,8 @@ public: * The default font size that is loaded is set in the Config. * Instead this value is used to upscale the font texture which can cause blurring or distorted text when upscaling or downscaling too much. */ - int font_size = 16; - + unsigned int font_size = 16; + //! Font asset const Asset source; private: }; diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 2ad176a..b600b01 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -1,24 +1,28 @@ -#include "font.h" #include "../api/Config.h" + +#include "font.h" + using namespace std; using namespace crepe; void Font::load(unique_ptr res){ const char* font_path = res->get_path(); - int font_size = Config::get_instance().font.font_size; this->font = std::unique_ptr( - TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + TTF_OpenFont(font_path, this->default_font_size), &TTF_CloseFont); if (!font) { throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); } } + Font::Font(const char* src){ this->load(make_unique(src)); } + Font::Font(std::unique_ptr res){ this->load(std::move(res)); } + const TTF_Font& Font::get_font() const{ return this->font; } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index e34ac63..8bf9fc9 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -9,17 +9,17 @@ namespace crepe { /** - * \brief Font resource facade + * \brief Resource for managing font creation and destruction * * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. */ class Font : public Resource{ public: - /**. - * \param src Asset with texture data to load. - * \param mediator use the SDLContext reference to load the image + /** + * \param src Asset with font data to load. + * \param mediator use the SDLContext reference to load text */ - Font(const Asset & src, Mediator & mediator); + Font( src, Mediator & mediator); ~Font() = default @@ -27,7 +27,7 @@ public: private: //! The SDL_ttf font object with custom deleter. std::unique_ptr font; - int default_font_size = Config::get_instance().font.font_size; + unsigned int default_font_size = Config::get_instance().font.size; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index a4be143..d7a0bff 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -7,16 +7,16 @@ using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } } SDLFontContext::~SDLFontContext(){ - + FcFini(); } unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -49,6 +49,5 @@ unique_ptr SDLFontContext::get_font_asset(const std::string & font_family // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - FcFini(); return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index cd91383..c890b2d 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -11,6 +11,14 @@ namespace crepe { public: SDLFontContext(); ~SDLFontContext(); + /** + * + * \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. + * + * \param font_family Name of the font family name. + */ std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 8931ce3..0002026 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,13 +1,24 @@ #include +#include #include - #include +#include using namespace crepe; -int main(){ - SDLFontContext font_facade; - std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); - std::cout << "path: " << asset->get_path() << std::endl; - return 0; +int main() { + SDLFontContext font_facade; + + // Create a unique pointer to the font asset + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << std::endl; + try{ + // Correct way to create a unique pointer for Text + std::unique_ptr label = std::make_unique(1, vec2(100, 100), vec2(0, 0), *asset); + }catch (const std::exception& e) { + std::cout << "Standard exception thrown: " << e.what() << std::endl; + } + + + return 0; } -- cgit v1.2.3 From 297d621987c224db26eadfb9bde9235741387496 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Thu, 12 Dec 2024 19:46:15 +0100 Subject: more cleanup + script utilities --- src/crepe/api/Animator.cpp | 2 +- src/crepe/api/BehaviorScript.hpp | 3 -- src/crepe/api/Camera.cpp | 2 +- src/crepe/api/Script.h | 78 +++++++++++++++++----------------- src/crepe/api/Script.hpp | 23 ++++++++-- src/crepe/api/Sprite.cpp | 2 +- src/crepe/api/Transform.cpp | 2 +- src/crepe/facade/DB.cpp | 2 +- src/crepe/facade/SDLContext.cpp | 2 +- src/crepe/facade/Sound.cpp | 2 +- src/crepe/facade/SoundContext.cpp | 2 +- src/crepe/facade/Texture.cpp | 2 +- src/crepe/manager/ComponentManager.cpp | 2 +- src/crepe/manager/LoopTimerManager.cpp | 2 +- src/crepe/manager/ResourceManager.cpp | 2 +- src/crepe/system/ScriptSystem.cpp | 1 + src/crepe/util/Log.cpp | 1 + src/crepe/util/Log.h | 21 --------- src/crepe/util/dbg.h | 19 +++++++++ src/example/replay.cpp | 6 ++- 20 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 src/crepe/util/dbg.h (limited to 'src/crepe/facade') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 4ce4bf0..203cef3 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -1,5 +1,5 @@ -#include "util/Log.h" +#include "util/dbg.h" #include "Animator.h" #include "Component.h" diff --git a/src/crepe/api/BehaviorScript.hpp b/src/crepe/api/BehaviorScript.hpp index b9bb1e2..353d5e2 100644 --- a/src/crepe/api/BehaviorScript.hpp +++ b/src/crepe/api/BehaviorScript.hpp @@ -2,8 +2,6 @@ #include -#include "../util/Log.h" - #include "BehaviorScript.h" #include "Script.h" @@ -11,7 +9,6 @@ namespace crepe { template BehaviorScript & BehaviorScript::set_script(Args &&... args) { - dbg_trace(); static_assert(std::is_base_of::value); this->script = std::unique_ptr