@@ -357,7 +357,14 @@ - (int)getWidthForMessage:(const char *)msg length:(NSUInteger)length scale:(flo
357357{
358358 NSUInteger i;
359359 int delta_x = 0 ;
360- const struct font_glyph* glyph_q = _font_driver->get_glyph (_font_data, ' ?' );
360+ const struct font_glyph* glyph_q;
361+
362+ /* Validate font data before use - can become invalid during
363+ * video context reset or if font was freed while in use */
364+ if (!_font_driver || !_font_data)
365+ return 0 ;
366+
367+ glyph_q = _font_driver->get_glyph (_font_data, ' ?' );
361368
362369 for (i = 0 ; i < length; i++)
363370 {
@@ -376,7 +383,10 @@ - (int)getWidthForMessage:(const char *)msg length:(NSUInteger)length scale:(flo
376383
377384- (const struct font_glyph *)getGlyph : (uint32_t )code
378385{
379- const struct font_glyph *glyph = _font_driver->get_glyph (_font_data, code);
386+ const struct font_glyph *glyph;
387+ if (!_font_driver || !_font_data)
388+ return NULL ;
389+ glyph = _font_driver->get_glyph (_font_data, code);
380390 if (glyph)
381391 [self updateGlyph: glyph];
382392 return glyph;
@@ -428,15 +438,28 @@ - (void)_renderLine:(const char *)msg
428438 aligned : (unsigned )aligned
429439{
430440 const struct font_glyph* glyph_q;
431- const char *msg_end = msg + length;
432- int x = (int )roundf (posX * _driver.viewport ->full_width );
433- int y = (int )roundf ((1 .0f - posY) * _driver.viewport ->full_height );
434- int delta_x = 0 ;
435- int delta_y = 0 ;
436- float inv_tex_size_x = 1 .0f / _texture.width ;
437- float inv_tex_size_y = 1 .0f / _texture.height ;
438- float inv_win_width = 1 .0f / _driver.viewport ->full_width ;
439- float inv_win_height = 1 .0f / _driver.viewport ->full_height ;
441+ const char *msg_end;
442+ int x;
443+ int y;
444+ int delta_x;
445+ int delta_y;
446+ float inv_tex_size_x;
447+ float inv_tex_size_y;
448+ float inv_win_width;
449+ float inv_win_height;
450+
451+ if (!_font_driver || !_font_data)
452+ return ;
453+
454+ msg_end = msg + length;
455+ x = (int )roundf (posX * _driver.viewport ->full_width );
456+ y = (int )roundf ((1 .0f - posY) * _driver.viewport ->full_height );
457+ delta_x = 0 ;
458+ delta_y = 0 ;
459+ inv_tex_size_x = 1 .0f / _texture.width ;
460+ inv_tex_size_y = 1 .0f / _texture.height ;
461+ inv_win_width = 1 .0f / _driver.viewport ->full_width ;
462+ inv_win_height = 1 .0f / _driver.viewport ->full_height ;
440463
441464 switch (aligned)
442465 {
@@ -526,6 +549,10 @@ - (void)renderMessage:(const char *)msg
526549 int lines = 0 ;
527550 float line_height;
528551 struct font_line_metrics *line_metrics = NULL ;
552+
553+ if (!_font_driver || !_font_data)
554+ return ;
555+
529556 _font_driver->get_line_metrics (_font_data, &line_metrics);
530557 line_height = line_metrics->height * scale / height;
531558
0 commit comments