Skip to content

Commit 9804687

Browse files
committed
metal: try not to crash quite as much
1 parent 232692e commit 9804687

1 file changed

Lines changed: 38 additions & 11 deletions

File tree

gfx/drivers/metal.m

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)