diff --git a/CMakeLists.txt b/CMakeLists.txt index c35427e..150046e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ add_library(${PROJECT_NAME} SHARED src/Renderer.c src/ObjectStore.c src/AssetManager.c + src/BitmapFont.c src/reusable_ids.c src/math_utils.c ) @@ -47,16 +48,17 @@ target_link_libraries(${PROJECT_NAME} PUBLIC ) install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/engine_build_config.h - include/aliases.h - include/constants.h - include/GameEngine.h - include/Window.h - include/Renderer.h - include/ObjectStore.h - include/AssetManager.h - include/reusable_ids.h - include/math_utils.h + ${CMAKE_CURRENT_BINARY_DIR}/engine_build_config.h + include/aliases.h + include/constants.h + include/GameEngine.h + include/Window.h + include/Renderer.h + include/ObjectStore.h + include/AssetManager.h + include/BitmapFont.h + include/reusable_ids.h + include/math_utils.h CONFIGURATIONS Release DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) diff --git a/include/BitmapFont.h b/include/BitmapFont.h new file mode 100644 index 0000000..fdea49f --- /dev/null +++ b/include/BitmapFont.h @@ -0,0 +1,25 @@ +#ifndef BITMAP_FONT_H +#define BITMAP_FONT_H + +#include "AssetManager.h" +#include "Renderer.h" + +#ifdef __cplusplus +extern "C" { +#endif // !__cplusplus + +typedef struct bitmap_font BitmapFont; + +BitmapFont *load_bitmap_font(AssetManager *am, const Renderer *renderer, + const char *filepath, u64 tile_width, + u64 tile_height); + +RenderRect get_character_sprite(BitmapFont *font, u64 index); + +void unload_bitmap_font(AssetManager *am, BitmapFont **font); + +#ifdef __cplusplus +} +#endif // !__cplusplus + +#endif // !BITMAP_FONT_H diff --git a/src/BitmapFont.c b/src/BitmapFont.c new file mode 100644 index 0000000..e89156d --- /dev/null +++ b/src/BitmapFont.c @@ -0,0 +1,83 @@ +#include "BitmapFont.h" +#include "AssetManager.h" +#include "Renderer.h" +#include "SDL_render.h" +#include "aliases.h" +#include "reusable_ids.h" +#include + +struct bitmap_font { + AssetID font_atlas; + u64 width; + u64 height; + u64 tile_width; + u64 tile_height; + u64 rows; + u64 cols; +}; + +BitmapFont *load_bitmap_font(AssetManager *am, const Renderer *renderer, + const char *filepath, u64 tile_width, + u64 tile_height) { + BitmapFont *font = (BitmapFont *)malloc(sizeof(BitmapFont)); + if (!font) { + return NULL; + } + + font->font_atlas = + load_asset_to_manager(am, filepath, ASSET_TYPE_IMAGE, renderer); + + if (font->font_atlas == INVALID_ID) { + unload_bitmap_font(am, &font); + + return NULL; + } + + SDL_Texture *texture = get_texture(am, font->font_atlas); + + i32 w; + i32 h; + + if (SDL_QueryTexture(texture, NULL, NULL, &w, &h) != 0) { + unload_bitmap_font(am, &font); + + return NULL; + } + + font->width = w; + font->height = h; + + font->tile_width = tile_width; + font->tile_height = tile_height; + + font->rows = font->height / font->tile_height; + font->cols = font->width / font->tile_width; + + return font; +} + +RenderRect get_character_sprite(BitmapFont *font, u64 index) { + u64 col = index % font->cols; + u64 row = index / font->cols; + + RenderRect rect = { + .x = col * font->tile_width, + .y = row * font->tile_height, + .width = font->tile_width, + .height = font->tile_height, + }; + + return rect; +} + +void unload_bitmap_font(AssetManager *am, BitmapFont **font) { + if (!am || !(*font)) { + return; + } + + remove_asset_from_manager(am, &((*font)->font_atlas)); + + free(*font); + + *font = NULL; +}