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/Text.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/crepe/api/Text.cpp') 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){} + -- cgit v1.2.3 From 431d7cceb25db86f31a8c89440f3cdd2c7bf061f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 20:45:49 +0100 Subject: load font almost working --- src/crepe/api/Text.cpp | 2 +- src/crepe/api/Text.h | 49 ++++++---- src/crepe/facade/Font.cpp | 4 +- src/crepe/facade/Font.h | 15 +-- src/crepe/facade/SDLContext.cpp | 202 ++++++++++++++++++++++++++-------------- src/example/loadfont.cpp | 13 +-- 6 files changed, 181 insertions(+), 104 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index dd44dd9..12d01f1 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,5 +2,5 @@ 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){} +Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family) : UIObject(id,dimensions,offset),text(text), font_family(font_family){} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index d5f47fa..51bab98 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -9,27 +9,42 @@ #include "UIObject.h" namespace crepe{ + +/** + * \brief Text UIObject component for displaying text + * + * This class can be used to display text on screen. By setting the font_family to a font already stored on the current device it will automatically be loaded in. + */ class Text : public UIObject{ public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font); + Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family); + //! Text data that does not have to be set in the constructor + struct Data { + //! Label text color. + Color text_color = Color::BLACK; + /** + * \brief fontsize for text rendering + * + * \note this is not the actual font size that is loaded in. + * + * Since SDL_TTF requires the font size when loading in the font it is not possible to switch the font size. + * 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. + */ + unsigned int font_size = 16; + //! Layer sorting level of the text + const int sorting_in_layer = 0; + //! Order within the sorting text + const int order_in_layer = 0; + }; +public: + //! font family name such as (Arial,Helvetica,Inter) + std::string font_family = ""; //! Label text. - std::string text; - //! Label text color. - Color text_color = Color::BLACK; - /** - * \brief fontsize for text rendering - * - * \note this is not the actual font size that is loaded in. - * - * Since SDL_TTF requires the font size when loading in the font it is not possible to switch the font size. - * 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. - */ - unsigned int font_size = 16; - //! Font asset - const Asset source; -private: + std::string text = ""; + // Data instance for data not gotten from constructor + Data data; }; } // namespace crepe diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index b600b01..66835ee 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -23,6 +23,6 @@ Font::Font(std::unique_ptr res){ this->load(std::move(res)); } -const TTF_Font& Font::get_font() const{ - return this->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 index 8bf9fc9..dd1cebf 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -17,17 +17,20 @@ class Font : public Resource{ public: /** * \param src Asset with font data to load. - * \param mediator use the SDLContext reference to load text + * \param mediator use the SDLContext reference to get_font() */ - Font( src, Mediator & mediator); + Font(const Asset & src, Mediator & mediator); - - ~Font() = default - const TTF_Font& get_font() const; + /** + * \brief getter for TTF_Font + * + * \param src Asset with font data to load. + * \param mediator use the SDLContext reference to get_font() + */ + TTF_Font* get_font() const; private: //! The SDL_ttf font object with custom deleter. std::unique_ptr font; - unsigned int default_font_size = Config::get_instance().font.size; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index d71a9c8..8f6c02c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -18,18 +18,23 @@ #include "../api/Color.h" #include "../api/Config.h" #include "../api/Sprite.h" +#include "../api/Texture.h" #include "../util/Log.h" -#include "manager/Mediator.h" #include "SDLContext.h" -#include "Texture.h" #include "types.h" using namespace crepe; using namespace std; -SDLContext::SDLContext(Mediator & mediator) { +SDLContext & SDLContext::get_instance() { + static SDLContext instance; + return instance; +} + +SDLContext::SDLContext() { dbg_trace(); + if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } @@ -57,8 +62,6 @@ SDLContext::SDLContext(Mediator & mediator) { if (!(IMG_Init(img_flags) & img_flags)) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } - - mediator.sdl_context = *this; } SDLContext::~SDLContext() { @@ -74,11 +77,12 @@ SDLContext::~SDLContext() { SDL_Quit(); } -Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { +Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { static const std::array LOOKUP_TABLE = [] { std::array table{}; table.fill(Keycode::NONE); + // Map all SDL scancodes to Keycodes table[SDL_SCANCODE_SPACE] = Keycode::SPACE; table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; table[SDL_SCANCODE_COMMA] = Keycode::COMMA; @@ -180,13 +184,27 @@ Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { return table; }(); - if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { return Keycode::NONE; } - return LOOKUP_TABLE[sdl_key]; } +std::array SDLContext::get_keyboard_state() { + // Array to hold the key states (true if pressed, false if not) + std::array keyState{}; + SDL_PumpEvents(); + const Uint8 * current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast(i)); + + if (key != Keycode::NONE) { + keyState[key] = current_state[i] != 0; + } + } + + return keyState; +} MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { static const std::array MOUSE_BUTTON_LOOKUP_TABLE = [] { @@ -218,19 +236,25 @@ void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } +SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { + return SDL_Rect{ + .x = sprite.mask.x, + .y = sprite.mask.y, + .w = sprite.mask.w, + .h = sprite.mask.h, + }; +} + SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { const Sprite::Data & data = ctx.sprite.data; - float aspect_ratio - = (ctx.sprite.aspect_ratio == 0) ? ctx.texture.get_ratio() : ctx.sprite.aspect_ratio; - vec2 size = data.size; if (data.size.x == 0 && data.size.y != 0) { - size.x = data.size.y * aspect_ratio; + size.x = data.size.y * ctx.sprite.aspect_ratio; } if (data.size.y == 0 && data.size.x != 0) { - size.y = data.size.x / aspect_ratio; + size.y = data.size.x / ctx.sprite.aspect_ratio; } const CameraValues & cam = ctx.cam; @@ -251,24 +275,15 @@ SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { } void SDLContext::draw(const RenderContext & ctx) { + const Sprite::Data & data = ctx.sprite.data; SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * data.flip.flip_x) | (SDL_FLIP_VERTICAL * data.flip.flip_y)); - SDL_Rect srcrect; - SDL_Rect * srcrect_ptr = NULL; - if (ctx.sprite.mask.w != 0 || ctx.sprite.mask.h != 0) { - srcrect.w = ctx.sprite.mask.w; - srcrect.h = ctx.sprite.mask.h; - srcrect.x = ctx.sprite.mask.x; - srcrect.y = ctx.sprite.mask.y; - srcrect_ptr = &srcrect; - } - + SDL_Rect srcrect = this->get_src_rect(ctx.sprite); SDL_FRect dstrect = this->get_dst_rect(SDLContext::DestinationRectangleData{ .sprite = ctx.sprite, - .texture = ctx.texture, .cam = ctx.cam, .pos = ctx.pos, .img_scale = ctx.scale, @@ -276,9 +291,9 @@ void SDLContext::draw(const RenderContext & ctx) { double angle = ctx.angle + data.angle_offset; - this->set_color_texture(ctx.texture, ctx.sprite.data.color); - SDL_RenderCopyExF(this->game_renderer.get(), ctx.texture.get_img(), srcrect_ptr, &dstrect, - angle, NULL, render_flip); + this->set_color_texture(ctx.sprite.texture, ctx.sprite.data.color); + SDL_RenderCopyExF(this->game_renderer.get(), ctx.sprite.texture.texture.get(), &srcrect, + &dstrect, angle, NULL, render_flip); } SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { @@ -340,6 +355,8 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { return ret_cam; } +uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } + std::unique_ptr> SDLContext::texture_from_path(const std::string & path) { @@ -366,71 +383,112 @@ SDLContext::texture_from_path(const std::string & path) { ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; - SDL_QueryTexture(ctx.get_img(), NULL, NULL, &size.x, &size.y); + SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); return size; } +void SDLContext::delay(int ms) const { SDL_Delay(ms); } + std::vector SDLContext::get_events() { std::vector event_list; SDL_Event event; + + // Handle general SDL events while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::SHUTDOWN, - }); + event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); break; case SDL_KEYDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYDOWN, - .key = sdl_to_keycode(event.key.keysym.scancode), - .key_repeat = (event.key.repeat != 0), - }); + event_list.push_back( + {SDLContext::EventType::KEYDOWN, + {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, + {}, + {}}); break; case SDL_KEYUP: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYUP, - .key = sdl_to_keycode(event.key.keysym.scancode), - }); + event_list.push_back({SDLContext::EventType::KEYUP, + {sdl_to_keycode(event.key.keysym.scancode), false}, + {}, + {}}); break; case SDL_MOUSEBUTTONDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEDOWN, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); + event_list.push_back({SDLContext::EventType::MOUSEDOWN, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEBUTTONUP: + event_list.push_back({SDLContext::EventType::MOUSEUP, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEMOTION: + event_list.push_back({SDLContext::EventType::MOUSEMOVE, + {}, + {{}, + {event.motion.x, event.motion.y}, + -1, + INFINITY, + {event.motion.xrel, event.motion.yrel}}, + {}}); break; - case SDL_MOUSEBUTTONUP: { - int x, y; - SDL_GetMouseState(&x, &y); - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEUP, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); - } break; - - case SDL_MOUSEMOTION: { + case SDL_MOUSEWHEEL: event_list.push_back( - EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, - .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); - } break; - - case SDL_MOUSEWHEEL: { - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, - // TODO: why is this needed? - .scroll_direction = event.wheel.y < 0 ? -1 : 1, - .scroll_delta = event.wheel.preciseY, - }); - } break; + {SDLContext::EventType::MOUSEWHEEL, + {}, + {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, + {}}); + break; + + // Forward window events for further processing + case SDL_WINDOWEVENT: + this->handle_window_event(event.window, event_list); + break; } } + return event_list; } + +// Separate function for SDL_WINDOWEVENT subtypes +void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, + std::vector & event_list) { + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, + {}, + {}, + {{}, {window_event.data1, window_event.data2}}}); + break; + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, + {}, + {}, + {{window_event.data1, window_event.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } +} + 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); + SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture.texture.get(), color.a); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 0002026..fe5466f 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -3,18 +3,19 @@ #include #include #include - +#include +#include using namespace crepe; 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; + Mediator mediator; 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); + std::unique_ptr label = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test","OpenSymbol"); + std::unique_ptr asset = font_facade.get_font_asset(label->font_family); + std::cout << "path: " << asset->get_path() << std::endl; + std::unique_ptr font = make_unique(asset,mediator) }catch (const std::exception& e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- cgit v1.2.3 From 5ef7c56e44a864e580810952450c43c0f9a7b6e0 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:26:03 +0100 Subject: make format --- src/crepe/api/Text.cpp | 7 +++- src/crepe/api/Text.h | 8 ++-- src/crepe/facade/Font.cpp | 28 ++++++------- src/crepe/facade/Font.h | 16 ++++---- src/crepe/facade/SDLContext.cpp | 4 +- src/crepe/facade/SDLContext.h | 3 +- src/crepe/facade/SDLFontContext.cpp | 80 ++++++++++++++++++------------------- src/crepe/facade/SDLFontContext.h | 21 +++++----- src/example/loadfont.cpp | 34 ++++++++-------- 9 files changed, 102 insertions(+), 99 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 12d01f1..b30ccf6 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,5 +2,8 @@ using namespace crepe; -Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family) : UIObject(id,dimensions,offset),text(text), font_family(font_family){} - +Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, + std::string font_family) + : UIObject(id, dimensions, offset), + text(text), + font_family(font_family) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 8436611..ebf413b 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -8,16 +8,17 @@ #include "Color.h" #include "UIObject.h" -namespace crepe{ +namespace crepe { /** * \brief Text UIObject component for displaying text * * This class can be used to display text on screen. By setting the font_family to a font already stored on the current device it will automatically be loaded in. */ -class Text : public UIObject{ +class Text : public UIObject { public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family); + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, + std::string font_family); //! Text data that does not have to be set in the constructor struct Data { /** @@ -40,6 +41,7 @@ public: //! Label text color. Color text_color = Color::BLACK; }; + public: //! font family name such as (Arial,Helvetica,Inter) std::string font_family = ""; diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 37dee3a..85b0e13 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -5,21 +5,21 @@ using namespace std; using namespace crepe; -Font::Font(const Asset& src, Mediator& mediator) - : Resource(src, mediator), font(nullptr, TTF_CloseFont) { - // Get the font file path from the Asset - const std::string font_path = src.get_path(); +Font::Font(const Asset & src, Mediator & mediator) + : Resource(src, mediator), + font(nullptr, TTF_CloseFont) { + // Get the font file path from the Asset + const std::string font_path = src.get_path(); - // Attempt to load the font - this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); + // Attempt to load the font + this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); - // Check if font loading failed - if (!this->font) { - throw runtime_error(format("Failed to load font from path: {}" - ". SDL_ttf error: {}",font_path, TTF_GetError())); - } + // Check if font loading failed + if (!this->font) { + throw runtime_error(format("Failed to load font from path: {}" + ". SDL_ttf error: {}", + font_path, TTF_GetError())); + } } -TTF_Font* Font::get_font() const { - return this->font.get(); -} +TTF_Font * Font::get_font() const { return this->font.get(); } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index fbc1b8f..983ef31 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -2,9 +2,9 @@ #include #include +#include "../Resource.h" #include "../api/Asset.h" #include "../api/Config.h" -#include "../Resource.h" namespace crepe { @@ -15,15 +15,15 @@ namespace crepe { * 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{ +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); + 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 @@ -31,11 +31,11 @@ public: * * \return The raw TTF_Font object wrapped in a unique pointer. */ - TTF_Font* get_font() const; + TTF_Font * get_font() const; private: - //! The SDL_ttf font object with custom deleter. - std::unique_ptr font; + //! The SDL_ttf font object with custom deleter. + std::unique_ptr font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 274c14a..cbb0f3b 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -32,8 +32,8 @@ using namespace std; SDLContext::SDLContext(Mediator & mediator) { dbg_trace(); if (TTF_Init() == -1) { - throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError())); - } + 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())); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index d7b8365..76cd99a 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -4,8 +4,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -225,7 +225,6 @@ public: void set_color_texture(const Texture & texture, const Color & color); private: - //! sdl Window std::unique_ptr> game_window; diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 851016b..2bccac4 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -2,54 +2,52 @@ #include "SDLFontContext.h" - using namespace crepe; using namespace std; -SDLFontContext::SDLFontContext(){ +SDLFontContext::SDLFontContext() { if (!FcInit()) { - throw runtime_error("Failed to initialize Fontconfig."); - } + throw runtime_error("Failed to initialize Fontconfig."); + } } -SDLFontContext::~SDLFontContext(){ - FcFini(); -} +SDLFontContext::~SDLFontContext() { FcFini(); } unique_ptr SDLFontContext::get_font_asset(const string & font_family) { - - // Create a pattern to search for the font family - FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); - if (!pattern) { - throw runtime_error("Failed to create font pattern."); - } - - // Default configuration - FcConfig* config = FcConfigGetCurrent(); - if (!config) { - FcPatternDestroy(pattern); - throw 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) { + + // Create a pattern to search for the font family + FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); + if (!pattern) { + throw runtime_error("Failed to create font pattern."); + } + + // Default configuration + FcConfig * config = FcConfigGetCurrent(); + if (!config) { + FcPatternDestroy(pattern); + throw 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) { FcPatternDestroy(matched_pattern); - throw 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 runtime_error("Failed to get font file path."); - } - - // Convert the file path to a string - string font_file_path(reinterpret_cast(file_path)); - FcPatternDestroy(matched_pattern); - return move(make_unique(font_file_path)); + throw 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 runtime_error("Failed to get font file path."); + } + + // Convert the file path to a string + string font_file_path(reinterpret_cast(file_path)); + FcPatternDestroy(matched_pattern); + return move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index c890b2d..b9e1f23 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -1,17 +1,17 @@ #pragma once -#include #include #include +#include #include "../api/Asset.h" namespace crepe { - class SDLFontContext{ - public: - SDLFontContext(); - ~SDLFontContext(); - /** +class SDLFontContext { +public: + SDLFontContext(); + ~SDLFontContext(); + /** * * \brief Facade function to convert a font_family into an asset. * @@ -19,8 +19,9 @@ namespace crepe { * * \param font_family Name of the font family name. */ - std::unique_ptr get_font_asset(const std::string & font_family); - private: - }; + std::unique_ptr get_font_asset(const std::string & font_family); + +private: +}; -} +} // namespace crepe diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 52454a1..efd5a98 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,27 +1,27 @@ -#include -#include -#include -#include #include #include -#include #include +#include +#include +#include +#include +#include using namespace crepe; int main() { - - SDLFontContext font_facade; + + SDLFontContext font_facade; Mediator mediator; SDLContext sdl_context{mediator}; - try{ - // Correct way to create a unique pointer for Text - std::unique_ptr label = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test","OpenSymbol"); - std::unique_ptr asset = font_facade.get_font_asset(label->font_family); - std::cout << "path: " << asset->get_path() << std::endl; - std::unique_ptr font = std::make_unique(*asset,mediator); - }catch (const std::exception& e) { - std::cout << "Standard exception thrown: " << e.what() << 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), "test test", "OpenSymbol"); + std::unique_ptr asset = font_facade.get_font_asset(label->font_family); + std::cout << "path: " << asset->get_path() << std::endl; + std::unique_ptr font = std::make_unique(*asset, mediator); + } catch (const std::exception & e) { + std::cout << "Standard exception thrown: " << e.what() << std::endl; } - - return 0; + return 0; } -- cgit v1.2.3 From 55329845de3aceef8b3672779f3930cee18e2298 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:47:46 +0100 Subject: added const std::string& --- src/crepe/api/Text.cpp | 4 ++-- src/crepe/api/Text.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index b30ccf6..c072ee7 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,8 +2,8 @@ using namespace crepe; -Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, - std::string font_family) +Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string & text, + const std::string & font_family) : UIObject(id, dimensions, offset), text(text), font_family(font_family) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index f8ce845..2ad1db3 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -15,8 +15,8 @@ namespace crepe { */ class Text : public UIObject { public: - Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, - std::string font_family); + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string &, + const std::string & font_family); //! Text data that does not have to be set in the constructor struct Data { /** -- cgit v1.2.3 From aa1f1f9460fa713e00fd1830b08be743395110ce Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Sat, 14 Dec 2024 14:37:55 +0100 Subject: sdl_ttf to submodules + feedback changes --- .vscode/launch.json | 28 ++++++++++++++++++++++++++++ mwe/events/include/event.h | 2 +- readme.md | 1 + src/CMakeLists.txt | 4 ++-- src/crepe/api/Text.cpp | 3 ++- src/crepe/api/Text.h | 4 ++-- src/crepe/facade/Font.cpp | 17 ++++++----------- src/crepe/facade/Font.h | 2 +- src/crepe/facade/SDLFontContext.cpp | 4 ++-- src/crepe/facade/SDLFontContext.h | 6 +++++- src/example/loadfont.cpp | 8 ++++---- 11 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 .vscode/launch.json (limited to 'src/crepe/api/Text.cpp') diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..07bd65f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug test_main", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/src/build/test_main", // Path to your executable + "args": [], // Optional: add any arguments here if needed + "stopAtEntry": false, // Set to true if you want to break at the entry point + "cwd": "${workspaceFolder}", // Working directory for the program + "environment": [], + "externalConsole": false, // Set to true to use an external console + "MIMode": "gdb", // Use "lldb" if you're using LLDB instead of GDB + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "miDebuggerPath": "/usr/bin/gdb", // Path to gdb, adjust based on your system + "preLaunchTask": "", // Optional: specify a pre-launch task like building your project + "sourceFileMap": {}, + "logging": { "moduleLoad": false, "engineLogging": false } + } + ] +} diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h index ee1bf52..e1b220b 100644 --- a/mwe/events/include/event.h +++ b/mwe/events/include/event.h @@ -148,7 +148,7 @@ private: }; class ShutDownEvent : public Event { public: - ShutDownEvent() : Event("ShutDownEvent") {}; + ShutDownEvent() : Event("ShutDownEvent"){}; REGISTER_EVENT_TYPE(ShutDownEvent) diff --git a/readme.md b/readme.md index d309b30..984a368 100644 --- a/readme.md +++ b/readme.md @@ -60,6 +60,7 @@ Then, follow these steps for each library you want to install: $ cd lib/googletest $ cd lib/sdl2 $ cd lib/soloud/contrib + $ cd lib/sdl_ttf $ cd lib/sdl_image $ cd lib/sdl_ttf $ cd lib/whereami diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a525c74..696856c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(SoLoud REQUIRED) find_package(GTest REQUIRED) find_package(whereami REQUIRED) find_library(BERKELEY_DB db) -find_package(Fontconfig REQUIRED) +find_library(FONTCONFIG_LIB fontconfig) add_library(crepe SHARED) add_executable(test_main EXCLUDE_FROM_ALL) @@ -30,7 +30,7 @@ target_link_libraries(crepe PUBLIC SDL2_image PUBLIC ${BERKELEY_DB} PUBLIC whereami - PUBLIC ${Fontconfig_LIBRARIES} + PUBLIC ${FONTCONFIG_LIB} ) add_subdirectory(crepe) diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index c072ee7..9de9038 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -3,7 +3,8 @@ using namespace crepe; Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string & text, - const std::string & font_family) + const std::string & font_family,const Data & data) : UIObject(id, dimensions, offset), text(text), + data(data), font_family(font_family) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 2ad1db3..96e1265 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -15,8 +15,6 @@ namespace crepe { */ class Text : public UIObject { public: - Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string &, - const std::string & font_family); //! Text data that does not have to be set in the constructor struct Data { /** @@ -41,6 +39,8 @@ public: }; public: + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string &, + const std::string & font_family, const Data& data); //! font family name such as (Arial,Helvetica,Inter) std::string font_family = ""; //! Label text. diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index a39af75..f111af9 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -8,17 +8,12 @@ using namespace crepe; Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator), font(nullptr, TTF_CloseFont) { - // Get the font file path from the Asset - const std::string font_path = src.get_path(); - - // Attempt to load the font - this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); - - // Check if font loading failed - if (!this->font) { - throw runtime_error(format("Failed to load font from path: {}. SDL_ttf error: {}", - font_path, TTF_GetError())); - } + Config & config = Config::get_instance(); + const std::string FONT_PATH = src.get_path(); + TTF_Font * font = TTF_OpenFont(FONT_PATH.c_str(), config.font.size); + if (font == NULL) + throw runtime_error(format("Font: {} (path: {})", TTF_GetError(), FONT_PATH)); + this->font = { font, [] (TTF_Font * font) { TTF_CloseFont(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 index 983ef31..f7d5b50 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -35,7 +35,7 @@ public: private: //! The SDL_ttf font object with custom deleter. - std::unique_ptr font; + std::unique_ptr> font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 1037ac4..5123b3b 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -13,7 +13,7 @@ SDLFontContext::SDLFontContext() { SDLFontContext::~SDLFontContext() { FcFini(); } -unique_ptr SDLFontContext::get_font_asset(const string font_family) { +Asset SDLFontContext::get_font_asset(const string font_family) { // Create a pattern to search for the font family FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); @@ -49,5 +49,5 @@ unique_ptr SDLFontContext::get_font_asset(const string font_family) { // Convert the file path to a string string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - return move(make_unique(font_file_path)); + return Asset(font_file_path); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index efeaa33..cb3ca9d 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -11,6 +11,10 @@ class SDLFontContext { public: SDLFontContext(); ~SDLFontContext(); + SDLFontContext(const SDLFontContext &) = delete; + SDLFontContext(SDLFontContext &&) = delete; + SDLFontContext & operator=(const SDLFontContext &) = delete; + SDLFontContext & operator=(SDLFontContext &&) = delete; /** * * \brief Facade function to convert a font_family into an asset. @@ -19,7 +23,7 @@ public: * * \param font_family Name of the font family name. */ - std::unique_ptr get_font_asset(const std::string font_family); + Asset get_font_asset(const std::string font_family); private: }; diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 3cbe559..a52e7f0 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -15,10 +15,10 @@ int main() { try { // Correct way to create a unique pointer for Text std::unique_ptr label - = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol"); - std::unique_ptr asset = font_facade.get_font_asset(label->font_family); - std::cout << "path: " << asset->get_path() << std::endl; - std::unique_ptr font = std::make_unique(*asset, mediator); + = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol",Text::Data{}); + Asset asset = font_facade.get_font_asset(label->font_family); + std::cout << "path: " << asset.get_path() << std::endl; + std::unique_ptr font = std::make_unique(asset, mediator); // Get the TTF_Font from the Font object TTF_Font* ttf_font = font->get_font(); -- cgit v1.2.3 From 9579f2a385de42cf74d50038c79a58c14eb0d980 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Sat, 14 Dec 2024 14:45:28 +0100 Subject: make format --- src/crepe/api/Text.cpp | 4 ++-- src/crepe/api/Text.h | 4 ++-- src/crepe/facade/Font.cpp | 2 +- src/crepe/facade/Font.h | 2 +- src/crepe/facade/SDLContext.cpp | 2 +- src/example/loadfont.cpp | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 9de9038..568af7f 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,8 +2,8 @@ using namespace crepe; -Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string & text, - const std::string & font_family,const Data & data) +Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, + const std::string & text, const std::string & font_family, const Data & data) : UIObject(id, dimensions, offset), text(text), data(data), diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 96e1265..64b2008 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -39,8 +39,8 @@ public: }; public: - Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string &, - const std::string & font_family, const Data& data); + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, + const std::string &, const std::string & font_family, const Data & data); //! font family name such as (Arial,Helvetica,Inter) std::string font_family = ""; //! Label text. diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index f111af9..1ee3de1 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -13,7 +13,7 @@ Font::Font(const Asset & src, Mediator & mediator) TTF_Font * font = TTF_OpenFont(FONT_PATH.c_str(), config.font.size); if (font == NULL) throw runtime_error(format("Font: {} (path: {})", TTF_GetError(), FONT_PATH)); - this->font = { font, [] (TTF_Font * font) { TTF_CloseFont(font); } }; + this->font = {font, [](TTF_Font * font) { TTF_CloseFont(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 index f7d5b50..e93bfe9 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -35,7 +35,7 @@ public: private: //! The SDL_ttf font object with custom deleter. - std::unique_ptr> font; + std::unique_ptr> font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 47dda81..d1d109c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 6020908..dae64bc 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -14,13 +14,13 @@ int main() { SDLContext sdl_context{mediator}; try { // Correct way to create a unique pointer for Text - std::unique_ptr label - = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol",Text::Data{}); + std::unique_ptr label = std::make_unique( + 1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol", Text::Data{}); Asset asset = font_facade.get_font_asset(label->font_family); std::cout << "path: " << asset.get_path() << std::endl; std::unique_ptr font = std::make_unique(asset, mediator); // Get the TTF_Font from the Font object - TTF_Font* ttf_font = font->get_font(); + TTF_Font * ttf_font = font->get_font(); //example if the asset is not correct for font //std::unique_ptr fontThrow = std::make_unique(Asset("../help.txt"), mediator); // Check if the font is loaded properly -- cgit v1.2.3 From 55f4aaf179cf723c5b703b0c4d848bf059ae190a Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 16 Dec 2024 19:08:22 +0100 Subject: font family implemented in the text component --- src/crepe/api/Text.cpp | 8 ++++-- src/crepe/api/Text.h | 17 +++++++++--- src/crepe/facade/CMakeLists.txt | 4 +-- src/crepe/facade/FontFacade.cpp | 50 +++++++++++++++++++++++++++++++++ src/crepe/facade/FontFacade.h | 28 +++++++++++++++++++ src/crepe/facade/SDLFontContext.cpp | 55 ------------------------------------- src/crepe/facade/SDLFontContext.h | 29 ------------------- src/example/loadfont.cpp | 21 ++++---------- 8 files changed, 105 insertions(+), 107 deletions(-) create mode 100644 src/crepe/facade/FontFacade.cpp create mode 100644 src/crepe/facade/FontFacade.h delete mode 100644 src/crepe/facade/SDLFontContext.cpp delete mode 100644 src/crepe/facade/SDLFontContext.h (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 568af7f..e6db140 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -1,10 +1,14 @@ +#include "../facade/FontFacade.h" + #include "Text.h" + using namespace crepe; Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string & text, const std::string & font_family, const Data & data) : UIObject(id, dimensions, offset), text(text), - data(data), - font_family(font_family) {} + data(data), + font(FontFacade::get_font_asset(font_family)) { +} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 64b2008..13b4375 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -5,6 +5,7 @@ #include "../Component.h" #include "Color.h" +#include "Asset.h" #include "UIObject.h" namespace crepe { @@ -39,13 +40,21 @@ public: }; public: + /** + * + * \param dimensions Width and height of the UIObject. + * \param offset Offset of the UIObject relative to its transform + * \param text The text to be displayed. + * \param font_family The font style name to be displayed. + * \param data Data struct containing extra text parameters. + */ Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string &, const std::string & font_family, const Data & data); - //! font family name such as (Arial,Helvetica,Inter) - std::string font_family = ""; + const std::string & text, const std::string & font_family, const Data & data); //! Label text. std::string text = ""; - // Data instance for data not gotten from constructor + //! Font asset variable + Asset font; + //! Data instance Data data; }; diff --git a/src/crepe/facade/CMakeLists.txt b/src/crepe/facade/CMakeLists.txt index e61b680..243ae46 100644 --- a/src/crepe/facade/CMakeLists.txt +++ b/src/crepe/facade/CMakeLists.txt @@ -4,7 +4,7 @@ target_sources(crepe PUBLIC SoundContext.cpp SDLContext.cpp DB.cpp - SDLFontContext.cpp + FontFacade.cpp Font.cpp ) @@ -14,7 +14,7 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES SoundContext.h SDLContext.h DB.h - SDLFontContext.h + FontFacade.h Font.h ) diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp new file mode 100644 index 0000000..12e10ed --- /dev/null +++ b/src/crepe/facade/FontFacade.cpp @@ -0,0 +1,50 @@ +#include +#include +#include + +#include "FontFacade.h" + +using namespace crepe; +using namespace std; + +Asset FontFacade::get_font_asset(const string font_family) { + if (!FcInit()) { + throw 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 == NULL) { + throw runtime_error("Failed to create font pattern."); + } + + // Default configuration + FcConfig * config = FcConfigGetCurrent(); + if (config == NULL) { + FcPatternDestroy(pattern); + throw 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 == NULL) { + FcPatternDestroy(matched_pattern); + throw 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 == NULL) { + FcPatternDestroy(matched_pattern); + throw runtime_error("Failed to get font file path."); + } + + // Convert the file path to a string + string font_file_path(reinterpret_cast(file_path)); + FcPatternDestroy(matched_pattern); + FcFini(); + 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..1b835d4 --- /dev/null +++ b/src/crepe/facade/FontFacade.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "../api/Asset.h" + +namespace crepe { + +/** + * + * \brief Font facade class for converting font family names to absolute file paths + * + */ +class FontFacade { +public: + /** + * + * \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 is static so the member function can be used without create a FontFacade object. This way it can be used in a constructor as FontFacade::get_font_asset(). + * \param font_family Name of the font family name. + * \return Asset with filepath to the font. + */ + static Asset get_font_asset(const std::string font_family); +}; + +} // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp deleted file mode 100644 index 45d70cb..0000000 --- a/src/crepe/facade/SDLFontContext.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -#include "SDLFontContext.h" - -using namespace crepe; -using namespace std; - -SDLFontContext::SDLFontContext() { - if (!FcInit()) { - throw runtime_error("Failed to initialize Fontconfig."); - } -} - -SDLFontContext::~SDLFontContext() { FcFini(); } - -Asset SDLFontContext::get_font_asset(const string font_family) { - - // Create a pattern to search for the font family - FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); - if (pattern == NULL) { - throw runtime_error("Failed to create font pattern."); - } - - // Default configuration - FcConfig * config = FcConfigGetCurrent(); - if (config == NULL) { - FcPatternDestroy(pattern); - throw 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 == NULL) { - FcPatternDestroy(matched_pattern); - throw 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 == NULL) { - FcPatternDestroy(matched_pattern); - throw runtime_error("Failed to get font file path."); - } - - // Convert the file path to a string - 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 deleted file mode 100644 index d15e1a3..0000000 --- a/src/crepe/facade/SDLFontContext.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - - -#include - -#include "../api/Asset.h" - -namespace crepe { -class SDLFontContext { -public: - SDLFontContext(); - ~SDLFontContext(); - SDLFontContext(const SDLFontContext &) = delete; - SDLFontContext(SDLFontContext &&) = delete; - SDLFontContext & operator=(const SDLFontContext &) = delete; - SDLFontContext & operator=(SDLFontContext &&) = 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. - * - * \param font_family Name of the font family name. - */ - Asset get_font_asset(const std::string font_family); - -}; - -} // namespace crepe diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index dae64bc..0ea6d86 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -9,26 +8,18 @@ using namespace crepe; int main() { - SDLFontContext font_facade; + // SDLFontContext font_facade; Mediator mediator; SDLContext sdl_context{mediator}; try { // Correct way to create a unique pointer for Text std::unique_ptr label = std::make_unique( 1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol", Text::Data{}); - Asset asset = font_facade.get_font_asset(label->font_family); - std::cout << "path: " << asset.get_path() << std::endl; - std::unique_ptr font = std::make_unique(asset, mediator); - // Get the TTF_Font from the Font object - TTF_Font * ttf_font = font->get_font(); - //example if the asset is not correct for font - //std::unique_ptr fontThrow = std::make_unique(Asset("../help.txt"), mediator); - // Check if the font is loaded properly - if (ttf_font != nullptr) { - std::cout << "Font successfully loaded!" << std::endl; - } else { - std::cout << "Failed to load font." << std::endl; - } + std::cout << "Path: " << label->font.get_path() << std::endl; + + std::unique_ptr label2 = std::make_unique( + 1, vec2(100, 100), vec2(0, 0), "test test", "fsaafdafsdafsdafsdasfdds", Text::Data{}); + std::cout << "Path: " << label2->font.get_path() << std::endl; } catch (const std::exception & e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- cgit v1.2.3 From 56342ffab9daade7802b015ac83b9c47a8b9b18b Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 16 Dec 2024 19:36:40 +0100 Subject: make format --- src/crepe/api/Text.cpp | 6 ++---- src/crepe/api/Text.h | 2 +- src/crepe/facade/FontFacade.cpp | 2 +- src/crepe/facade/FontFacade.h | 2 +- src/example/loadfont.cpp | 5 +++-- 5 files changed, 8 insertions(+), 9 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index e6db140..5b2befe 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,13 +2,11 @@ #include "Text.h" - using namespace crepe; Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, const std::string & text, const std::string & font_family, const Data & data) : UIObject(id, dimensions, offset), text(text), - data(data), - font(FontFacade::get_font_asset(font_family)) { -} + data(data), + font(FontFacade::get_font_asset(font_family)) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 13b4375..fbb1ad6 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -4,8 +4,8 @@ #include "../Component.h" -#include "Color.h" #include "Asset.h" +#include "Color.h" #include "UIObject.h" namespace crepe { diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 12e10ed..708b2ff 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -1,6 +1,6 @@ -#include #include #include +#include #include "FontFacade.h" diff --git a/src/crepe/facade/FontFacade.h b/src/crepe/facade/FontFacade.h index 1b835d4..0e6b7da 100644 --- a/src/crepe/facade/FontFacade.h +++ b/src/crepe/facade/FontFacade.h @@ -22,7 +22,7 @@ public: * \param font_family Name of the font family name. * \return Asset with filepath to the font. */ - static Asset get_font_asset(const std::string font_family); + static Asset get_font_asset(const std::string font_family); }; } // namespace crepe diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 0ea6d86..508197a 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -17,8 +17,9 @@ int main() { 1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol", Text::Data{}); std::cout << "Path: " << label->font.get_path() << std::endl; - std::unique_ptr label2 = std::make_unique( - 1, vec2(100, 100), vec2(0, 0), "test test", "fsaafdafsdafsdafsdasfdds", Text::Data{}); + std::unique_ptr label2 + = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", + "fsaafdafsdafsdafsdasfdds", Text::Data{}); std::cout << "Path: " << label2->font.get_path() << std::endl; } catch (const std::exception & e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; -- cgit v1.2.3 From b99f5fc0f52fdd4ec96be844e643060503a8860b Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 17 Dec 2024 13:22:34 +0100 Subject: text now working with optional --- src/crepe/api/Asset.h | 2 +- src/crepe/api/LoopManager.h | 7 ++++--- src/crepe/api/Script.h | 5 +++-- src/crepe/api/Text.cpp | 8 +++++--- src/crepe/api/Text.h | 15 +++++++++++---- src/crepe/facade/Font.cpp | 3 +-- src/crepe/facade/Font.h | 10 +--------- src/crepe/facade/FontFacade.cpp | 11 ++++++++--- src/crepe/facade/FontFacade.h | 12 +++++++++--- src/crepe/facade/SDLContext.cpp | 5 +++++ src/crepe/facade/SDLContext.h | 15 +++++++++++++++ src/crepe/system/RenderSystem.cpp | 28 +++++++++++++++++++++++++--- src/crepe/system/RenderSystem.h | 10 ++++++++-- src/example/FontExample.cpp | 6 ++++-- src/example/loadfont.cpp | 31 ++++++++++++++++++------------- 15 files changed, 118 insertions(+), 50 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Asset.h b/src/crepe/api/Asset.h index bfd0ac7..b367a92 100644 --- a/src/crepe/api/Asset.h +++ b/src/crepe/api/Asset.h @@ -37,7 +37,7 @@ public: private: //! path to asset - const std::string src; + std::string src; private: /** diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index 40e6b38..1725810 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -71,7 +71,9 @@ private: private: //! Global context Mediator mediator; - + + //! SDLContext instance + SDLContext sdl_context{mediator}; //! Component manager instance ComponentManager component_manager{mediator}; //! Scene manager instance @@ -84,8 +86,7 @@ private: ResourceManager resource_manager{mediator}; //! Save manager instance SaveManager save_manager{mediator}; - //! SDLContext instance - SDLContext sdl_context{mediator}; + private: /** diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index a24e32e..4503525 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -156,7 +156,7 @@ private: void subscribe_internal(const EventHandler & callback, event_channel_t channel); protected: - OptionalRef mediator; + // NOTE: This must be the only constructor on Script, see "Late references" below Script() = default; //! Only \c BehaviorScript instantiates Script @@ -186,12 +186,13 @@ private: * * \{ */ + //! Game object ID of game object parent BehaviorScript is attached to game_object_id_t game_object_id; //! Reference to parent component OptionalRef active; //! Mediator reference - + OptionalRef mediator; //! \} private: diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 5b2befe..0624c98 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -4,9 +4,11 @@ using namespace crepe; -Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string & text, const std::string & font_family, const Data & data) +Text::Text(game_object_id_t id, const vec2 & dimensions,const vec2 & offset, const std::string & font_family, + const Data & data, const std::string & text, std::optional font) : UIObject(id, dimensions, offset), text(text), data(data), - font(FontFacade::get_font_asset(font_family)) {} + font_family(font_family), + font(font) { +} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index ec0bf74..ab72bc0 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../Component.h" @@ -47,15 +48,21 @@ public: * \param text The text to be displayed. * \param font_family The font style name to be displayed. * \param data Data struct containing extra text parameters. + * \param font Optional font asset that can be passed or left empty. */ - Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string & text, const std::string & font_family, const Data & data); + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, + const std::string & font_family, const Data & data, + const std::string & text = "", std::optional font = std::nullopt); + //! Label text. std::string text = ""; - //! Font asset variable - const Asset font; + //! font family name + std::string font_family = ""; + //! Font asset variable if this is not set, it will use the font_family to create an asset. + std::optional font; //! Data instance Data data; + }; } // namespace crepe diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 5af943d..558641f 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -9,8 +9,7 @@ using namespace std; using namespace crepe; Font::Font(const Asset & src, Mediator & mediator) - : Resource(src, mediator), - font(nullptr, TTF_CloseFont) { + : Resource(src, mediator){ 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); diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index 16f8cb6..b208d96 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -24,14 +24,6 @@ public: * \param mediator The Mediator object used for managing the SDL context or related systems. */ Font(const Asset & src, Mediator & mediator); - Font(const Font &) = delete; - Font &operator=(const Font &) = delete; - - // Default move constructor and move assignment operator - Font(Font &&) noexcept = delete; - Font &operator=(Font &&) noexcept = delete; - - ~Font() = default; /** * \brief Gets the underlying TTF_Font resource. * @@ -44,7 +36,7 @@ public: private: //! The SDL_ttf font object with custom deleter. - std::unique_ptr> font; + std::unique_ptr> font = nullptr; }; } // namespace crepe diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index d447b6d..0a8ba5f 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "FontFacade.h" @@ -6,10 +7,16 @@ using namespace crepe; using namespace std; -Asset FontFacade::get_font_asset(const string& font_family) { +FontFacade::FontFacade(){ if (!FcInit()) { throw runtime_error("Failed to initialize Fontconfig."); } +} +FontFacade::~FontFacade(){ + FcFini(); +} +Asset FontFacade::get_font_asset(const string& font_family) { + // Create a pattern to search for the font family FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (pattern == NULL) { @@ -32,7 +39,6 @@ Asset FontFacade::get_font_asset(const string& font_family) { FcPatternDestroy(matched_pattern); throw runtime_error("No matching font found."); } - // Extract the file path FcChar8 * file_path = nullptr; if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch @@ -44,6 +50,5 @@ Asset FontFacade::get_font_asset(const string& font_family) { // Convert the file path to a string string font_file_path = reinterpret_cast(file_path); FcPatternDestroy(matched_pattern); - FcFini(); return Asset(font_file_path); } diff --git a/src/crepe/facade/FontFacade.h b/src/crepe/facade/FontFacade.h index fc200d6..2e08f3f 100644 --- a/src/crepe/facade/FontFacade.h +++ b/src/crepe/facade/FontFacade.h @@ -13,16 +13,22 @@ namespace crepe { */ 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 is static so the member function can be used without create a FontFacade object. This way it can be used in a constructor as FontFacade::get_font_asset(). + * 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 font. + * \return Asset with filepath to the corresponding font. */ - static Asset get_font_asset(const std::string& font_family); + 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 d1d109c..8ffaad9 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -434,7 +434,12 @@ std::vector SDLContext::get_events() { } return event_list; } + 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 efdd6fe..ffa3cc0 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -17,6 +17,7 @@ #include "api/Transform.h" #include "types.h" +#include "FontFacade.h" namespace crepe { class Texture; @@ -239,6 +240,20 @@ private: * - this is defined in this class because get_events() needs this information aswell */ 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); }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 5aa00b5..18f6393 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -22,6 +23,7 @@ using namespace crepe; using namespace std; + void RenderSystem::clear_screen() { SDLContext & ctx = this->mediator.sdl_context; ctx.clear_screen(); @@ -124,9 +126,11 @@ void RenderSystem::render() { RefVector sprites = mgr.get_components_by_type(); ResourceManager & resource_manager = this->mediator.resource_manager; RefVector sorted_sprites = this->sort(sprites); - RefVector texts = mgr.get_components_by_type(); - for(const Text& text : texts){ - const Font & res = resource_manager.get(text.font); + RefVector text_components = mgr.get_components_by_type(); + for(Text& text : text_components){ + const Transform & transform + = mgr.get_components_by_id(text.game_object_id).front().get(); + this->render_text(text,transform); } for (const Sprite & sprite : sorted_sprites) { @@ -143,4 +147,22 @@ void RenderSystem::render() { } + } +void RenderSystem::render_text(Text & text, const Transform & tm) { + SDLContext & ctx = this->mediator.sdl_context; + + // Check if font is available in text + if (!text.font.has_value()) { + } + + ResourceManager & resource_manager = this->mediator.resource_manager; + + if (text.font.has_value()) { + const Asset& font_asset = text.font.value(); + const Font & res = resource_manager.get(font_asset); + } +} + + + diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index fc7b46e..56a0553 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -10,7 +10,7 @@ namespace crepe { class Camera; class Sprite; class Transform; - +class Text; /** * \brief Manages rendering operations for all game objects. * @@ -50,7 +50,13 @@ private: * \return true if particles have been rendered */ bool render_particle(const Sprite & sprite, const double & scale); - + /** + * \brief Renders all Text components + * + * \param text The text component to be rendered. + * \param tm the Transform component that holds the position,rotation and scale + */ + void render_text(Text & text, const Transform & tm); /** * \brief renders a sprite with a Transform component on the screen * diff --git a/src/example/FontExample.cpp b/src/example/FontExample.cpp index 3f5af48..7b2dadb 100644 --- a/src/example/FontExample.cpp +++ b/src/example/FontExample.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -36,14 +37,15 @@ class TestScene : public Scene { public: void load_scene() override { GameObject text_object = this->new_object("test", "test", vec2{0, 0}, 0, 1); - text_object.add_component(vec2(100, 100), vec2(0, 0), "test test", "Noto Sans", - Text::Data{}); + text_object.add_component(vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{}); text_object.add_component().set_script(); text_object.add_component(ivec2{300, 300}, vec2{100, 100}, Camera::Data{}); } std::string get_name() const override { return "hey"; } }; int main() { + // Config& config = Config::get_instance(); + // config.log.level = Log::Level::TRACE; LoopManager engine; engine.add_scene(); engine.start(); diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index ce287b4..9d59afc 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -2,10 +2,12 @@ #include #include #include +#include #include #include #include #include +#include #include using namespace crepe; int main() { @@ -18,21 +20,24 @@ int main() { try { // Correct way to create a unique pointer for Text std::unique_ptr label = std::make_unique( - 1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol", Text::Data{}); - std::cout << "Path: " << label->font.get_path() << std::endl; + 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{},"test text", Asset("")); + // std::cout << "Path: " << label->font.get_path() << std::endl; std::unique_ptr label2 - = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", - "fsaafdafsdafsdafsdasfdds", Text::Data{}); - std::cout << "Path: " << label2->font.get_path() << std::endl; - ResourceManager & resource_mgr = mediator.resource_manager; - const Font & res = resource_manager.get(label->font); - TTF_Font * test_font = res.get_font(); - if (test_font == NULL) { - std::cout << "error with font" << std::endl; - } else { - std::cout << "correct font retrieved" << std::endl; - } + = std::make_unique(1, vec2(100, 100), vec2(0, 0),"fsaafdafsdafsdafsdasfdds", Text::Data{}); + Asset asset = Asset("test test"); + label->font = std::make_optional(asset); + std::cout << label->font.value().get_path() << std::endl; + // label2->font = std::make_optional(asset); + // std::cout << "Path: " << label2->font.get_path() << std::endl; + // ResourceManager & resource_mgr = mediator.resource_manager; + // const Font & res = resource_manager.get(label->font); + // TTF_Font * test_font = res.get_font(); + // if (test_font == NULL) { + // std::cout << "error with font" << std::endl; + // } else { + // std::cout << "correct font retrieved" << std::endl; + // } } catch (const std::exception & e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- cgit v1.2.3 From 69ca7fdd738fd4ed98aefc07bab5a43486a55619 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 17 Dec 2024 13:34:19 +0100 Subject: final changes --- src/crepe/api/LoopManager.h | 3 +-- src/crepe/api/Script.h | 1 - src/crepe/api/Text.cpp | 8 ++++---- src/crepe/api/Text.h | 11 +++++------ src/crepe/facade/Font.cpp | 3 +-- src/crepe/facade/FontFacade.cpp | 10 ++++------ src/crepe/facade/FontFacade.h | 10 +++++----- src/crepe/facade/SDLContext.cpp | 2 +- src/crepe/facade/SDLContext.h | 6 ++++-- src/crepe/system/RenderSystem.cpp | 35 ++++++++++++++--------------------- src/example/FontExample.cpp | 5 +++-- src/example/loadfont.cpp | 10 +++++----- 12 files changed, 47 insertions(+), 57 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index 1725810..1d23cbf 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -71,7 +71,7 @@ private: private: //! Global context Mediator mediator; - + //! SDLContext instance SDLContext sdl_context{mediator}; //! Component manager instance @@ -86,7 +86,6 @@ private: ResourceManager resource_manager{mediator}; //! Save manager instance SaveManager save_manager{mediator}; - private: /** diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 4503525..8bca38a 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -156,7 +156,6 @@ private: void subscribe_internal(const EventHandler & callback, event_channel_t channel); protected: - // NOTE: This must be the only constructor on Script, see "Late references" below Script() = default; //! Only \c BehaviorScript instantiates Script diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 0624c98..58dc6c6 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -4,11 +4,11 @@ using namespace crepe; -Text::Text(game_object_id_t id, const vec2 & dimensions,const vec2 & offset, const std::string & font_family, - const Data & data, const std::string & text, std::optional font) +Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, + const std::string & font_family, const Data & data, const std::string & text, + std::optional font) : UIObject(id, dimensions, offset), text(text), data(data), font_family(font_family), - font(font) { -} + font(font) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index ab72bc0..92cca18 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -1,7 +1,7 @@ #pragma once +#include #include -#include #include "../Component.h" @@ -50,10 +50,10 @@ public: * \param data Data struct containing extra text parameters. * \param font Optional font asset that can be passed or left empty. */ - Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string & font_family, const Data & data, - const std::string & text = "", std::optional font = std::nullopt); - + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, + const std::string & font_family, const Data & data, const std::string & text = "", + std::optional font = std::nullopt); + //! Label text. std::string text = ""; //! font family name @@ -62,7 +62,6 @@ public: std::optional font; //! Data instance Data data; - }; } // namespace crepe diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 558641f..f202c05 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -8,8 +8,7 @@ using namespace std; using namespace crepe; -Font::Font(const Asset & src, Mediator & mediator) - : Resource(src, mediator){ +Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator) { 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); diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 08ff31c..7edfeb8 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -6,16 +6,14 @@ using namespace crepe; using namespace std; -FontFacade::FontFacade(){ +FontFacade::FontFacade() { if (!FcInit()) { throw runtime_error("Failed to initialize Fontconfig."); } } -FontFacade::~FontFacade(){ - FcFini(); -} -Asset FontFacade::get_font_asset(const string& font_family) { - +FontFacade::~FontFacade() { FcFini(); } +Asset FontFacade::get_font_asset(const string & font_family) { + // Create a pattern to search for the font family FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (pattern == NULL) { diff --git a/src/crepe/facade/FontFacade.h b/src/crepe/facade/FontFacade.h index 2e08f3f..9761070 100644 --- a/src/crepe/facade/FontFacade.h +++ b/src/crepe/facade/FontFacade.h @@ -15,10 +15,10 @@ 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; + 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. @@ -28,7 +28,7 @@ public: * \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); + 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 8ffaad9..c88687e 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -440,6 +440,6 @@ void SDLContext::set_color_texture(const Texture & texture, const Color & color) SDL_SetTextureAlphaMod(texture.get_img(), color.a); } -Asset SDLContext::get_font_from_name(const std::string& font_family){ +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 e348ff6..6f6eddb 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -241,9 +241,11 @@ private: * - this is defined in this class because get_events() needs this information aswell */ CameraAuxiliaryData cam_aux_data; -private: + +private: //! instance of the font_facade FontFacade font_facade{}; + public: /** * \brief Function to Get asset from font_family @@ -254,7 +256,7 @@ public: * * \return asset with the font style absolute path */ - Asset get_font_from_name(const std::string& font_family); + Asset get_font_from_name(const std::string & font_family); }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 5fc98a9..a03c636 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -10,8 +10,8 @@ #include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Text.h" -#include "../facade/Font.h" #include "../api/Transform.h" +#include "../facade/Font.h" #include "../facade/SDLContext.h" #include "../facade/Texture.h" #include "../manager/ComponentManager.h" @@ -23,7 +23,6 @@ using namespace crepe; using namespace std; - void RenderSystem::clear_screen() { SDLContext & ctx = this->mediator.sdl_context; ctx.clear_screen(); @@ -126,12 +125,11 @@ void RenderSystem::render() { RefVector sprites = mgr.get_components_by_type(); ResourceManager & resource_manager = this->mediator.resource_manager; RefVector sorted_sprites = this->sort(sprites); - RefVector text_components = mgr.get_components_by_type(); - for(Text& text : text_components){ + RefVector text_components = mgr.get_components_by_type(); + for (Text & text : text_components) { const Transform & transform = mgr.get_components_by_id(text.game_object_id).front().get(); - this->render_text(text,transform); - + this->render_text(text, transform); } for (const Sprite & sprite : sorted_sprites) { if (!sprite.active) continue; @@ -143,25 +141,20 @@ void RenderSystem::render() { if (rendered_particles) continue; this->render_normal(sprite, transform); - - - } - } void RenderSystem::render_text(Text & text, const Transform & tm) { - SDLContext & ctx = this->mediator.sdl_context; + SDLContext & ctx = this->mediator.sdl_context; - if (!text.font.has_value()) { - text.font = ctx.get_font_from_name(text.font_family); - } + if (!text.font.has_value()) { + text.font = ctx.get_font_from_name(text.font_family); + } - ResourceManager & resource_manager = this->mediator.resource_manager; + ResourceManager & resource_manager = this->mediator.resource_manager; - if (!text.font.has_value()) {return;} - const Asset& font_asset = text.font.value(); - const Font & res = resource_manager.get(font_asset); + if (!text.font.has_value()) { + return; + } + const Asset & font_asset = text.font.value(); + const Font & res = resource_manager.get(font_asset); } - - - diff --git a/src/example/FontExample.cpp b/src/example/FontExample.cpp index 7b2dadb..6a334b1 100644 --- a/src/example/FontExample.cpp +++ b/src/example/FontExample.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -11,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -37,7 +37,8 @@ class TestScene : public Scene { public: void load_scene() override { GameObject text_object = this->new_object("test", "test", vec2{0, 0}, 0, 1); - text_object.add_component(vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{}); + text_object.add_component(vec2(100, 100), vec2(0, 0), "OpenSymbol", + Text::Data{}); text_object.add_component().set_script(); text_object.add_component(ivec2{300, 300}, vec2{100, 100}, Camera::Data{}); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 36d00dd..ed67ffa 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,14 +1,14 @@ #include +#include #include #include #include -#include #include #include #include #include -#include #include +#include using namespace crepe; int main() { @@ -20,11 +20,11 @@ int main() { try { // Correct way to create a unique pointer for Text std::unique_ptr label = std::make_unique( - 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{},"test text", Asset("")); + 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{}, "test text", Asset("")); // std::cout << "Path: " << label->font.get_path() << std::endl; - std::unique_ptr label2 - = std::make_unique(1, vec2(100, 100), vec2(0, 0),"fsaafdafsdafsdafsdasfdds", Text::Data{}); + std::unique_ptr label2 = std::make_unique( + 1, vec2(100, 100), vec2(0, 0), "fsaafdafsdafsdafsdasfdds", Text::Data{}); Asset asset = Asset("test test"); label->font = asset; std::cout << label->font.value().get_path() << std::endl; -- cgit v1.2.3 From e1e7ead5df44383c78c8da65fc5916be13d111b6 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 17 Dec 2024 15:14:32 +0100 Subject: feedback changes --- src/crepe/api/Text.cpp | 6 ++---- src/crepe/api/Text.h | 3 +-- src/crepe/facade/FontFacade.cpp | 48 ++++++++++++++++++++++------------------- src/example/loadfont.cpp | 7 ++++-- 4 files changed, 34 insertions(+), 30 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 58dc6c6..6c632f3 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -5,10 +5,8 @@ using namespace crepe; Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string & font_family, const Data & data, const std::string & text, - std::optional font) + const std::string & font_family, const Data & data, const std::string & text) : UIObject(id, dimensions, offset), text(text), data(data), - font_family(font_family), - font(font) {} + font_family(font_family){} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 92cca18..c30dc80 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -51,8 +51,7 @@ public: * \param font Optional font asset that can be passed or left empty. */ Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::string & font_family, const Data & data, const std::string & text = "", - std::optional font = std::nullopt); + const std::string & font_family, const Data & data, const std::string & text = ""); //! Label text. std::string text = ""; diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 7edfeb8..5382f1a 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -1,51 +1,55 @@ #include #include +#include +#include +#include #include "FontFacade.h" -using namespace crepe; 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) { +Asset FontFacade::get_font_asset(const string& font_family) { // Create a pattern to search for the font family - FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); - if (pattern == NULL) { + FcPattern* raw_pattern = FcNameParse(reinterpret_cast(font_family.c_str())); + if (!raw_pattern) { throw runtime_error("Failed to create font pattern."); } - // Default configuration - FcConfig * config = FcConfigGetCurrent(); - if (config == NULL) { - // FcPatternDestroy(pattern); + std::unique_ptr> pattern( + raw_pattern, + [](FcPattern* p) { FcPatternDestroy(p); } + ); + + FcConfig* config = FcConfigGetCurrent(); + if (!config) { throw 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 == NULL) { - FcPatternDestroy(matched_pattern); + FcPattern* raw_matched_pattern = FcFontMatch(config, pattern.get(), &result); + if (!raw_matched_pattern) { throw 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 == NULL) { - // FcPatternDestroy(matched_pattern); + + std::unique_ptr> matched_pattern( + raw_matched_pattern, + [](FcPattern* p) { FcPatternDestroy(p); } + ); + + FcChar8* file_path = nullptr; + if (FcPatternGetString(matched_pattern.get(), FC_FILE, 0, &file_path) != FcResultMatch || !file_path) { throw runtime_error("Failed to get font file path."); } - // Convert the file path to a string - string font_file_path = reinterpret_cast(file_path); - FcPatternDestroy(matched_pattern); + string font_file_path = reinterpret_cast(file_path); return Asset(font_file_path); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 78b3adb..788fac4 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -14,15 +15,17 @@ int main() { // SDLFontContext font_facade; Mediator mediator; + FontFacade font_facade{}; SDLContext sdl_context{mediator}; // ComponentManager component_manager{mediator}; ResourceManager resource_manager{mediator}; try { // Correct way to create a unique pointer for Text std::unique_ptr label = std::make_unique( - 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{}, "test text", Asset("")); + 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data{}, "test text"); // std::cout << "Path: " << label->font.get_path() << std::endl; - + Asset asset1 = font_facade.get_font_asset("OpenSymbol"); + std::cout << asset1.get_path() << std::endl; std::unique_ptr label2 = std::make_unique( 1, vec2(100, 100), vec2(0, 0), "fsaafdafsdafsdafsdasfdds", Text::Data{}); Asset asset = Asset("test test"); -- cgit v1.2.3 From 2772bb158f10fc051d35006041303f2e5418e817 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 17 Dec 2024 15:15:12 +0100 Subject: make format --- src/crepe/api/Text.cpp | 2 +- src/crepe/facade/FontFacade.cpp | 34 ++++++++++++++++------------------ src/example/loadfont.cpp | 2 +- 3 files changed, 18 insertions(+), 20 deletions(-) (limited to 'src/crepe/api/Text.cpp') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 6c632f3..54a4370 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -9,4 +9,4 @@ Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, : UIObject(id, dimensions, offset), text(text), data(data), - font_family(font_family){} + font_family(font_family) {} diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 5382f1a..5db06d2 100644 --- a/src/crepe/facade/FontFacade.cpp +++ b/src/crepe/facade/FontFacade.cpp @@ -1,7 +1,7 @@ #include -#include -#include #include +#include +#include #include #include "FontFacade.h" @@ -17,39 +17,37 @@ FontFacade::FontFacade() { FontFacade::~FontFacade() { FcFini(); } -Asset FontFacade::get_font_asset(const string& font_family) { - // Create a pattern to search for the font family - FcPattern* raw_pattern = FcNameParse(reinterpret_cast(font_family.c_str())); +Asset FontFacade::get_font_asset(const string & font_family) { + + FcPattern * raw_pattern + = FcNameParse(reinterpret_cast(font_family.c_str())); if (!raw_pattern) { throw runtime_error("Failed to create font pattern."); } - std::unique_ptr> pattern( - raw_pattern, - [](FcPattern* p) { FcPatternDestroy(p); } - ); + std::unique_ptr> pattern( + raw_pattern, [](FcPattern * p) { FcPatternDestroy(p); }); - FcConfig* config = FcConfigGetCurrent(); + FcConfig * config = FcConfigGetCurrent(); if (!config) { throw runtime_error("Failed to get current Fontconfig configuration."); } FcResult result; - FcPattern* raw_matched_pattern = FcFontMatch(config, pattern.get(), &result); + FcPattern * raw_matched_pattern = FcFontMatch(config, pattern.get(), &result); if (!raw_matched_pattern) { throw runtime_error("No matching font found."); } - std::unique_ptr> matched_pattern( - raw_matched_pattern, - [](FcPattern* p) { FcPatternDestroy(p); } - ); + std::unique_ptr> matched_pattern( + raw_matched_pattern, [](FcPattern * p) { FcPatternDestroy(p); }); - FcChar8* file_path = nullptr; - if (FcPatternGetString(matched_pattern.get(), FC_FILE, 0, &file_path) != FcResultMatch || !file_path) { + FcChar8 * file_path = nullptr; + if (FcPatternGetString(matched_pattern.get(), FC_FILE, 0, &file_path) != FcResultMatch + || !file_path) { throw runtime_error("Failed to get font file path."); } - string font_file_path = reinterpret_cast(file_path); + string font_file_path = reinterpret_cast(file_path); return Asset(font_file_path); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 788fac4..e459332 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -2,8 +2,8 @@ #include #include #include -#include #include +#include #include #include #include -- cgit v1.2.3