https://git.reactos.org/?p=reactos.git;a=commitdiff;h=641a0ea99be50975e7949…
commit 641a0ea99be50975e79498e48ae73b2edfc5c616
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Thu Jun 20 18:58:45 2019 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Thu Jun 20 18:58:45 2019 +0900
[WIN32SS][NTGDI] usWinAscent and usWinDescent must be treated as signed (#1670)
TT_OS2.usWinAscent and TT_OS2.usWinDescent must be treated as FT_Short. These values
affect font metrics. This PR will fix CORE-14994.
---
win32ss/gdi/ntgdi/freetype.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c
index 6a2fae1ed7..027ccdb66e 100644
--- a/win32ss/gdi/ntgdi/freetype.c
+++ b/win32ss/gdi/ntgdi/freetype.c
@@ -1868,21 +1868,17 @@ FillTMEx(TEXTMETRICW *TM, PFONTGDI FontGDI,
return;
}
- if (pOS2->usWinAscent + pOS2->usWinDescent == 0)
+ if ((FT_Short)pOS2->usWinAscent + (FT_Short)pOS2->usWinDescent == 0)
{
Ascent = pHori->Ascender;
Descent = -pHori->Descender;
}
else
{
- Ascent = pOS2->usWinAscent;
- Descent = pOS2->usWinDescent;
+ Ascent = (FT_Short)pOS2->usWinAscent;
+ Descent = (FT_Short)pOS2->usWinDescent;
}
- if (FontGDI->Magic != FONTGDI_MAGIC)
- {
- IntRequestFontSize(NULL, FontGDI, 0, 0);
- }
TM->tmAscent = FontGDI->tmAscent;
TM->tmDescent = FontGDI->tmDescent;
TM->tmHeight = TM->tmAscent + TM->tmDescent;
@@ -2649,7 +2645,7 @@ FontFamilyFillInfo(PFONTFAMILYINFO Info, LPCWSTR FaceName,
}
Ntm->ntmSizeEM = Otm->otmEMSquare;
- Ntm->ntmCellHeight = pOS2->usWinAscent + pOS2->usWinDescent;
+ Ntm->ntmCellHeight = (FT_Short)pOS2->usWinAscent +
(FT_Short)pOS2->usWinDescent;
Ntm->ntmAvgWidth = 0;
ExFreePoolWithTag(Otm, GDITAG_TEXT);
@@ -3273,12 +3269,20 @@ IntRequestFontSize(PDC dc, PFONTGDI FontGDI, LONG lfWidth, LONG
lfHeight)
return FT_Request_Size(face, &req);
}
- /* See also:
https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fsselection */
+ /*
+ * NOTE: We cast TT_OS2.usWinAscent and TT_OS2.usWinDescent to signed FT_Short.
+ * Why? See:
https://docs.microsoft.com/en-us/typography/opentype/spec/os2#uswindescent
+ *
+ * > usWinDescent is "usually" a positive value ...
+ *
+ * We can read it as "not always". See CORE-14994.
+ * See also:
https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fsselection
+ */
#define FM_SEL_USE_TYPO_METRICS 0x80
if (lfHeight > 0)
{
/* case (A): lfHeight is positive */
- Sum = pOS2->usWinAscent + pOS2->usWinDescent;
+ Sum = (FT_Short)pOS2->usWinAscent + (FT_Short)pOS2->usWinDescent;
if (Sum == 0 || (pOS2->fsSelection & FM_SEL_USE_TYPO_METRICS))
{
Ascent = pHori->Ascender;
@@ -3287,8 +3291,8 @@ IntRequestFontSize(PDC dc, PFONTGDI FontGDI, LONG lfWidth, LONG
lfHeight)
}
else
{
- Ascent = pOS2->usWinAscent;
- Descent = pOS2->usWinDescent;
+ Ascent = (FT_Short)pOS2->usWinAscent;
+ Descent = (FT_Short)pOS2->usWinDescent;
}
FontGDI->tmAscent = FT_MulDiv(lfHeight, Ascent, Sum);
@@ -3306,8 +3310,8 @@ IntRequestFontSize(PDC dc, PFONTGDI FontGDI, LONG lfWidth, LONG
lfHeight)
}
else
{
- FontGDI->tmAscent = FT_MulDiv(-lfHeight, pOS2->usWinAscent,
face->units_per_EM);
- FontGDI->tmDescent = FT_MulDiv(-lfHeight, pOS2->usWinDescent,
face->units_per_EM);
+ FontGDI->tmAscent = FT_MulDiv(-lfHeight, (FT_Short)pOS2->usWinAscent,
face->units_per_EM);
+ FontGDI->tmDescent = FT_MulDiv(-lfHeight, (FT_Short)pOS2->usWinDescent,
face->units_per_EM);
}
FontGDI->tmHeight = FontGDI->tmAscent + FontGDI->tmDescent;
FontGDI->tmInternalLeading = FontGDI->tmHeight + lfHeight;