diff --git a/kitty/freetype_render_ui_text.c b/kitty/freetype_render_ui_text.c index fe6daf7c2..53051678e 100644 --- a/kitty/freetype_render_ui_text.c +++ b/kitty/freetype_render_ui_text.c @@ -77,9 +77,12 @@ cleanup(RenderCtx *ctx) { void set_main_face_family(FreeTypeRenderCtx ctx_, const char *family, bool bold, bool italic) { RenderCtx *ctx = (RenderCtx*)ctx_; - if (family == main_face_family.name || (main_face_family.name && strcmp(family, main_face_family.name) == 0)) return; + if ( + (family == main_face_family.name || (main_face_family.name && strcmp(family, main_face_family.name) == 0)) && + main_face_family.bold == bold && main_face_family.italic == italic + ) return; cleanup(ctx); - main_face_family.name = strdup(family); + main_face_family.name = family ? strdup(family) : NULL; main_face_family.bold = bold; main_face_family.italic = italic; } @@ -104,18 +107,6 @@ load_font(FontConfigFace *info, Face *ans) { return true; } -static bool -ensure_state(RenderCtx *ctx) { - if (main_face.freetype && main_face.hb) return true; - if (!information_for_font_family(main_face_family.name, main_face_family.bold, main_face_family.italic, &main_face_information)) return false; - if (!load_font(&main_face_information, &main_face)) return false; - hb_buffer = hb_buffer_create(); - if (!hb_buffer) { PyErr_NoMemory(); return false; } - return true; -} - - - static int font_units_to_pixels_y(FT_Face face, int x) { return (int)ceil((double)FT_MulFix(x, face->size->metrics.y_scale) / 64.0); @@ -375,9 +366,14 @@ end: } FreeTypeRenderCtx -create_freetype_render_context(void) { +create_freetype_render_context(const char *family, bool bold, bool italic) { RenderCtx *ctx = calloc(1, sizeof(RenderCtx)); - if (!ensure_state(ctx)) { free(ctx); return NULL; } + main_face_family.name = family ? strdup(family) : NULL; + main_face_family.bold = bold; main_face_family.italic = italic; + if (!information_for_font_family(main_face_family.name, main_face_family.bold, main_face_family.italic, &main_face_information)) return false; + if (!load_font(&main_face_information, &main_face)) return false; + hb_buffer = hb_buffer_create(); + if (!hb_buffer) { PyErr_NoMemory(); return false; } ctx->created = true; return (FreeTypeRenderCtx)ctx; } @@ -399,9 +395,8 @@ render_line(PyObject *self UNUSED, PyObject *args, PyObject *kw) { PyObject *ans = PyBytes_FromStringAndSize(NULL, width * height * 4); if (!ans) return NULL; uint8_t *buffer = (u_int8_t*) PyBytes_AS_STRING(ans); - RenderCtx *ctx = (RenderCtx*)create_freetype_render_context(); + RenderCtx *ctx = (RenderCtx*)create_freetype_render_context(family, bold, italic); if (!ctx) return NULL; - if (family) set_main_face_family((FreeTypeRenderCtx)ctx, family, bold, italic); if (!render_single_line((FreeTypeRenderCtx)ctx, text, 3 * height / 4, 0, 0xffffffff, buffer, width, height, x_offset, y_offset)) { Py_CLEAR(ans); if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, "Unknown error while rendering text"); diff --git a/kitty/freetype_render_ui_text.h b/kitty/freetype_render_ui_text.h index 289568dcf..229503840 100644 --- a/kitty/freetype_render_ui_text.h +++ b/kitty/freetype_render_ui_text.h @@ -11,7 +11,7 @@ typedef struct {bool created;} *FreeTypeRenderCtx; -FreeTypeRenderCtx create_freetype_render_context(void); +FreeTypeRenderCtx create_freetype_render_context(const char *family, bool bold, bool italic); void set_main_face_family(FreeTypeRenderCtx ctx, const char *family, bool bold, bool italic); bool render_single_line(FreeTypeRenderCtx ctx, const char *text, unsigned sz_px, uint32_t fg, uint32_t bg, uint8_t *output_buf, size_t width, size_t height, float x_offset, float y_offset); void release_freetype_render_context(FreeTypeRenderCtx ctx); diff --git a/kitty/glfw.c b/kitty/glfw.c index 7ec46f6ac..2faf0319b 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -401,7 +401,7 @@ static bool draw_text_callback(GLFWwindow *window, const char *text, uint32_t fg, uint32_t bg, uint8_t *output_buf, size_t width, size_t height, float x_offset, float y_offset) { if (!set_callback_window(window)) return false; if (!csd_title_render_ctx) { - csd_title_render_ctx = create_freetype_render_context(); + csd_title_render_ctx = create_freetype_render_context(NULL, true, false); if (!csd_title_render_ctx) { if (PyErr_Occurred()) PyErr_Print(); return false;