Font: a little extra null safety for hhea and os2 font data, just to be safe

Followup to 62ab8eb6fc
This commit is contained in:
Josh Tynjala
2024-12-13 14:46:58 -08:00
parent 0db3c7c095
commit 9c4fa35361

View File

@@ -578,13 +578,21 @@ namespace lime {
TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2); TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);
TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea); TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);
int calculatedAscender = hhea->Ascender; int calculatedAscender = 0;
int calculatedDescender = hhea->Descender; int calculatedDescender = 0;
int calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap; int calculatedHeight = 0;
if (hhea) {
calculatedAscender = hhea->Ascender;
calculatedDescender = hhea->Descender;
calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;
}
if (!( calculatedAscender || calculatedDescender )) if (!( calculatedAscender || calculatedDescender ))
{ {
if (os2->version != 0xFFFFU) if (os2 && os2->version != 0xFFFFU)
{ {
if (os2->sTypoAscender || os2->sTypoDescender) if (os2->sTypoAscender || os2->sTypoDescender)
{ {
@@ -597,7 +605,7 @@ namespace lime {
else else
{ {
calculatedAscender = (FT_Short)os2->usWinAscent; calculatedAscender = (FT_Short)os2->usWinAscent;
calculatedDescender = -(FT_Short)os2->usWinDescent; calculatedDescender = -(FT_Short)os2->usWinDescent;
calculatedHeight = calculatedAscender - calculatedDescender; calculatedHeight = calculatedAscender - calculatedDescender;
@@ -835,28 +843,31 @@ namespace lime {
TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2); TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);
TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea); TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);
int calculatedAscender = hhea->Ascender; int calculatedAscender = 0;
int calculatedDescender = hhea->Descender; int calculatedDescender = 0;
int calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;
if (hhea) {
calculatedAscender = hhea->Ascender;
calculatedDescender = hhea->Descender;
}
if (!( calculatedAscender || calculatedDescender )) if (!( calculatedAscender || calculatedDescender ))
{ {
if (os2->version != 0xFFFFU) if (os2 && os2->version != 0xFFFFU)
{ {
if (os2->sTypoAscender || os2->sTypoDescender) if (os2->sTypoAscender || os2->sTypoDescender)
{ {
calculatedAscender = os2->sTypoAscender; calculatedAscender = os2->sTypoAscender;
calculatedDescender = os2->sTypoDescender; calculatedDescender = os2->sTypoDescender;
calculatedHeight = calculatedAscender - calculatedDescender + os2->sTypoLineGap;
} }
else else
{ {
calculatedAscender = (FT_Short)os2->usWinAscent; calculatedAscender = (FT_Short)os2->usWinAscent;
calculatedDescender = -(FT_Short)os2->usWinDescent; calculatedDescender = -(FT_Short)os2->usWinDescent;
calculatedHeight = calculatedAscender - calculatedDescender;
} }
} }
@@ -866,7 +877,6 @@ namespace lime {
calculatedAscender = ((FT_Face)face)->ascender; calculatedAscender = ((FT_Face)face)->ascender;
calculatedDescender = ((FT_Face)face)->descender; calculatedDescender = ((FT_Face)face)->descender;
calculatedHeight = ((FT_Face)face)->height;
} }
@@ -913,28 +923,32 @@ namespace lime {
TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2); TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);
TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea); TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);
int calculatedAscender = hhea->Ascender; int calculatedAscender = 0;
int calculatedDescender = hhea->Descender; int calculatedDescender = 0;
int calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;
if (hhea) {
calculatedAscender = hhea->Ascender;
calculatedDescender = hhea->Descender;
}
if (!( calculatedAscender || calculatedDescender )) if (!( calculatedAscender || calculatedDescender ))
{ {
if (os2->version != 0xFFFFU) if (os2 && os2->version != 0xFFFFU)
{ {
if (os2->sTypoAscender || os2->sTypoDescender) if (os2->sTypoAscender || os2->sTypoDescender)
{ {
calculatedAscender = os2->sTypoAscender; calculatedAscender = os2->sTypoAscender;
calculatedDescender = os2->sTypoDescender; calculatedDescender = os2->sTypoDescender;
calculatedHeight = calculatedAscender - calculatedDescender + os2->sTypoLineGap;
} }
else else
{ {
calculatedAscender = (FT_Short)os2->usWinAscent; calculatedAscender = (FT_Short)os2->usWinAscent;
calculatedDescender = -(FT_Short)os2->usWinDescent; calculatedDescender = -(FT_Short)os2->usWinDescent;
calculatedHeight = calculatedAscender - calculatedDescender;
} }
} }
@@ -944,7 +958,6 @@ namespace lime {
calculatedAscender = ((FT_Face)face)->ascender; calculatedAscender = ((FT_Face)face)->ascender;
calculatedDescender = ((FT_Face)face)->descender; calculatedDescender = ((FT_Face)face)->descender;
calculatedHeight = ((FT_Face)face)->height;
} }
@@ -1170,21 +1183,28 @@ namespace lime {
TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2); TT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);
TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea); TT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);
int calculatedAscender = hhea->Ascender; int calculatedAscender = 0;
int calculatedDescender = hhea->Descender; int calculatedDescender = 0;
int calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap; int calculatedHeight = 0;
if (hhea) {
calculatedAscender = hhea->Ascender;
calculatedDescender = hhea->Descender;
calculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;
}
if (!( calculatedAscender || calculatedDescender )) if (!( calculatedAscender || calculatedDescender ))
{ {
if (os2->version != 0xFFFFU) if (os2 && os2->version != 0xFFFFU)
{ {
if (os2->sTypoAscender || os2->sTypoDescender) if (os2->sTypoAscender || os2->sTypoDescender)
{ {
calculatedAscender = os2->sTypoAscender; calculatedAscender = os2->sTypoAscender;
calculatedDescender = os2->sTypoDescender; calculatedDescender = os2->sTypoDescender;
calculatedHeight = calculatedAscender - calculatedDescender + calculatedHeight = calculatedAscender - calculatedDescender + os2->sTypoLineGap;
os2->sTypoLineGap;
} }
else else