From a02ba9460cd799463a6d32fc634b9624c67bb8ad Mon Sep 17 00:00:00 2001 From: luboslenco Date: Sun, 19 Jan 2025 14:17:41 +0100 Subject: [PATCH] Fix crash when font load fails --- armorcore/sources/kinc/graphics2/g2.c | 14 +++++++++----- armorcore/sources/kinc/graphics2/g2.h | 2 +- armorcore/sources/ts/iron.ts | 2 +- base/sources/import_font.ts | 9 +++++++++ base/sources/util_render.ts | 5 +++-- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/armorcore/sources/kinc/graphics2/g2.c b/armorcore/sources/kinc/graphics2/g2.c index 2deb8626f..76b7414b7 100644 --- a/armorcore/sources/kinc/graphics2/g2.c +++ b/armorcore/sources/kinc/graphics2/g2.c @@ -801,8 +801,10 @@ static int stbtt_BakeFontBitmapArr(unsigned char *data, int offset, // Fo return bottom_y; } -void kinc_g2_font_load(kinc_g2_font_t *font, int size) { - if (!kinc_g2_prepare_font_load_internal(font, size)) return; +bool kinc_g2_font_load(kinc_g2_font_t *font, int size) { + if (!kinc_g2_prepare_font_load_internal(font, size)) { + return true; + } kinc_g2_font_image_t *img = &(font->images[font->m_images_len]); font->m_images_len += 1; @@ -821,7 +823,8 @@ void kinc_g2_font_load(kinc_g2_font_t *font, int size) { pixels = (unsigned char *)malloc(width * height); else pixels = (unsigned char *)realloc(pixels, width * height); - assert(pixels != NULL); + if (pixels == NULL) + return false; status = stbtt_BakeFontBitmapArr(font->blob, font->offset, (float)size, pixels, width, height, g2_font_glyphs, g2_font_num_glyphs, baked); } @@ -844,6 +847,7 @@ void kinc_g2_font_load(kinc_g2_font_t *font, int size) { kinc_g4_texture_init_from_image(img->tex, &fontimg); kinc_image_destroy(&fontimg); free(pixels); + return true; } kinc_g4_texture_t *kinc_g2_font_get_texture(kinc_g2_font_t *font, int size) { @@ -1149,11 +1153,11 @@ void kinc_g2_set_transform(buffer_t *matrix) { } } -void kinc_g2_set_font(kinc_g2_font_t *font, int size) { +bool kinc_g2_set_font(kinc_g2_font_t *font, int size) { kinc_g2_end(); // flush g2_font = font; g2_font_size = size; - kinc_g2_font_load(font, size); + return kinc_g2_font_load(font, size); } void kinc_g2_set_bilinear_filter(bool bilinear) { diff --git a/armorcore/sources/kinc/graphics2/g2.h b/armorcore/sources/kinc/graphics2/g2.h index bc7cf5c83..f3bef2a72 100644 --- a/armorcore/sources/kinc/graphics2/g2.h +++ b/armorcore/sources/kinc/graphics2/g2.h @@ -63,7 +63,7 @@ void kinc_g2_set_color(uint32_t color); uint32_t kinc_g2_get_color(); void kinc_g2_set_pipeline(kinc_g4_pipeline_t *pipeline); void kinc_g2_set_transform(buffer_t *matrix); -void kinc_g2_set_font(kinc_g2_font_t *font, int size); +bool kinc_g2_set_font(kinc_g2_font_t *font, int size); kinc_g2_font_t *kinc_g2_font_init(buffer_t *blob, int font_index); kinc_g2_font_t *kinc_g2_font_13(buffer_t *blob); bool kinc_g2_font_has_glyph(int glyph); diff --git a/armorcore/sources/ts/iron.ts b/armorcore/sources/ts/iron.ts index 14e78893d..54d757ac0 100644 --- a/armorcore/sources/ts/iron.ts +++ b/armorcore/sources/ts/iron.ts @@ -322,7 +322,7 @@ declare function kinc_g2_draw_rect(x: f32, y: f32, width: f32, height: f32, stre declare function kinc_g2_draw_line(x0: f32, y0: f32, x1: f32, y1: f32, strength: f32): void; declare function kinc_g2_draw_line_aa(x0: f32, y0: f32, x1: f32, y1: f32, strength: f32): void; declare function kinc_g2_draw_string(text: string, x: f32, y: f32): void; -declare function kinc_g2_set_font(font: any, size: i32): void; +declare function kinc_g2_set_font(font: any, size: i32): bool; declare function kinc_g2_font_init(blob: buffer_t, font_index: i32): any; declare function kinc_g2_font_13(blob: buffer_t): any; declare function kinc_g2_font_set_glyphs(glyphs: i32[]): void; diff --git a/base/sources/import_font.ts b/base/sources/import_font.ts index 0de6fe485..65dcccc70 100644 --- a/base/sources/import_font.ts +++ b/base/sources/import_font.ts @@ -7,15 +7,24 @@ function import_font_run(path: string) { return; } } + let font: g2_font_t = data_get_font(path); g2_font_init(font); // Make sure font_ is ready let count: i32 = kinc_g2_font_count(font.font_); let font_slots: slot_font_t[] = []; + for (let i: i32 = 0; i < count; ++i) { let ar: string[] = string_split(path, path_sep); let name: string = ar[ar.length - 1]; let f: g2_font_t = g2_font_clone(font); g2_font_set_font_index(f, i); + + g2_font_init(f); + if (!kinc_g2_set_font(f.font_, util_render_font_preview_size)) { + console_error(tr("Error: Failed to read font data")); + continue; + } + let font_slot: slot_font_t = slot_font_create(name, f, path); array_push(font_slots, font_slot); } diff --git a/base/sources/util_render.ts b/base/sources/util_render.ts index 6f6c110bd..02bfdd145 100644 --- a/base/sources/util_render.ts +++ b/base/sources/util_render.ts @@ -2,6 +2,7 @@ let util_render_material_preview_size: i32 = 256; let util_render_decal_preview_size: i32 = 512; let util_render_layer_preview_size: i32 = 200; +let util_render_font_preview_size: i32 = 200; let util_render_screen_aligned_full_vb: vertex_buffer_t = null; let util_render_screen_aligned_full_ib: index_buffer_t = null; @@ -167,7 +168,7 @@ function util_render_make_text_preview() { let text: string = context_raw.text_tool_text; let font: g2_font_t = context_raw.font.font; - let font_size: i32 = 200; + let font_size: i32 = util_render_font_preview_size; let text_w: i32 = math_floor(g2_font_width(font, font_size, text)); let text_h: i32 = math_floor(g2_font_height(font, font_size)); let tex_w: i32 = text_w + 32; @@ -203,7 +204,7 @@ function util_render_make_font_preview() { let text: string = "Abg"; let font: g2_font_t = context_raw.font.font; - let font_size: i32 = 318; + let font_size: i32 = util_render_font_preview_size; let text_w: i32 = math_floor(g2_font_width(font, font_size, text)) + 8; let text_h: i32 = math_floor(g2_font_height(font, font_size)) + 8; if (context_raw.font.image == null) {