diff options
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | src/geometry.h | 4 | ||||
| -rw-r--r-- | src/text.cc | 47 | ||||
| -rw-r--r-- | src/text.h | 25 |
4 files changed, 71 insertions, 6 deletions
@@ -93,6 +93,7 @@ SOURCES = \ $(SRC_DIR)/window.c \ $(SRC_DIR)/graphics.cc \ $(SRC_DIR)/gfx.c \ + $(SRC_DIR)/text.cc \ $(GLAD_DIR)/glad.c \ $(ASSETS_DIR)/text_shader.c \ $(HASHMAP_SOURCE) diff --git a/src/geometry.h b/src/geometry.h index 19698c6..6c3e36a 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -10,8 +10,8 @@ struct quad_s { u32 indices[WAYC_QUAD_NINDICES]; }; -static inline void wayc_quad_init(quad_s* quad, f32 left, f32 top, f32 right, - f32 bottom) { +static inline void wayc_quad_init(struct quad_s* quad, f32 left, f32 top, + f32 right, f32 bottom) { wayc_notnull(quad); /* diff --git a/src/text.cc b/src/text.cc new file mode 100644 index 0000000..7131d44 --- /dev/null +++ b/src/text.cc @@ -0,0 +1,47 @@ +#include "text.h" + +#include "freetype/freetype.h" +#include "freetype/fttypes.h" +#include "graphics.h" +#include "text_shader.h" +#include "utils.h" + +static void font_context_sampler_desc(struct sg_sampler_desc* desc) { + wayc_notnull(desc); + + desc->min_filter = SG_FILTER_LINEAR; + desc->mag_filter = SG_FILTER_LINEAR; + desc->wrap_u = SG_WRAP_CLAMP_TO_EDGE; + desc->wrap_v = SG_WRAP_CLAMP_TO_EDGE; +} + +static void font_context_pipeline_desc(struct sg_pipeline_desc* desc) { + wayc_notnull(desc); + + struct sg_shader_desc shader_desc = *text_shader_desc(sg_query_backend()); + sg_shader shader = sg_make_shader(&shader_desc); + + desc->shader = shader; +} + +enum font_context_error_e font_context_init(struct font_context_s* context) { + wayc_notnull(context); + + FT_Library ft; + FT_Error fterr = FT_Init_FreeType(&ft); + if (fterr) return FONT_CONTEXT_ERROR_LOAD_LIBRARY; + + struct sg_sampler_desc sampler_desc = {}; + font_context_sampler_desc(&sampler_desc); + + struct sg_pipeline_desc pipeline_desc = {}; + font_context_pipeline_desc(&pipeline_desc); + + context->ft = ft; + context->sampler = sg_make_sampler(&sampler_desc); + context->pipeline = sg_make_pipeline(&pipeline_desc); + + return FONT_CONTEXT_ERROR_NONE; +} + +void font_context_deinit(struct font_context_s* context);
\ No newline at end of file @@ -1,11 +1,28 @@ #pragma once #include "freetype/freetype.h" +#include "sokol_gfx.h" +#include "utils.h" -struct face_ctx_s { - FT_Library library; +enum font_context_error_e : u8 { + FONT_CONTEXT_ERROR_NONE = 0, + FONT_CONTEXT_ERROR_LOAD_LIBRARY, }; -struct face_s { +struct font_context_s { + FT_Library ft; + struct sg_pipeline pipeline; + struct sg_sampler sampler; +}; + +enum font_context_error_e font_context_init(struct font_context_s* context); +void font_context_deinit(struct font_context_s* context); + +struct font_s { FT_Face face; -};
\ No newline at end of file + u8* source; + + u8* staging; + bool staging_dirty; + struct sg_image atlas; +}; |
