Skip to content

Commit

Permalink
Fix crash when font load fails
Browse files Browse the repository at this point in the history
  • Loading branch information
luboslenco committed Jan 19, 2025
1 parent afbb1c6 commit a02ba94
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 9 deletions.
14 changes: 9 additions & 5 deletions armorcore/sources/kinc/graphics2/g2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}

Expand All @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion armorcore/sources/kinc/graphics2/g2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion armorcore/sources/ts/iron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions base/sources/import_font.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
5 changes: 3 additions & 2 deletions base/sources/util_render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit a02ba94

Please sign in to comment.