[GDI32] Preserve PitchAndFamily across GetTextMetricsW call (#2689)

ReactOS has no Raster fonts today, so compensate for this affecting the editbox margins.
CORE-1091
This patch fixes the inability to see all of the characters in the CD-KEY box of Starcraft and Visual Basic 5 and Visual Basic 6 Installs. It supersedes #2656
This commit is contained in:
Doug Lyons 2020-09-01 06:08:26 -05:00 committed by GitHub
parent 1f29f725d8
commit 448bcede24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -13,6 +13,48 @@
#define NDEBUG
#include <debug.h>
/*
This is a hack. See CORE-1091.
It is needed because ReactOS does not support raster fonts now.
After Raster Font support is added, then it can be removed.
Find the current font's logfont for testing its lf.lfFaceName.
The ftGdiGetTextMetricsW function currently in ReactOS will always return a Truetype font
because we cannot yet handle raster fonts. So it will return flags
TMPF_VECTOR and TMPF_TRUETYPE, which can cause problems in edit boxes.
*/
VOID FASTCALL
IntTMWFixUp(
HDC hDC,
TMW_INTERNAL *ptm)
{
LOGFONTW lf;
HFONT hCurrentFont;
hCurrentFont = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_FONT);
GreGetObject(hCurrentFont, sizeof(LOGFONTW), &lf);
/* To compensate for the GetTextMetricsW call changing the PitchAndFamily
* to a TrueType one when we have a 'Raster' font as our input we filter
* out the problematic TrueType and Vector bits.
* Our list below checks for Raster Font Facenames. */
DPRINT1("Font Facename is '%S'.\n", lf.lfFaceName);
if ((wcsicmp(lf.lfFaceName, L"Helv") == 0) ||
(wcsicmp(lf.lfFaceName, L"Courier") == 0) ||
(wcsicmp(lf.lfFaceName, L"MS Sans Serif") == 0) ||
(wcsicmp(lf.lfFaceName, L"MS Serif") == 0) ||
(wcsicmp(lf.lfFaceName, L"Times New Roman") == 0) ||
(wcsicmp(lf.lfFaceName, L"MS Shell Dlg") == 0) ||
(wcsicmp(lf.lfFaceName, L"System") == 0) ||
(wcsicmp(lf.lfFaceName, L"Terminal") == 0))
{
ptm->TextMetric.tmPitchAndFamily &= ~(TMPF_TRUETYPE | TMPF_VECTOR);
}
}
/** Functions *****************************************************************/
BOOL FASTCALL
@ -154,6 +196,7 @@ GreGetTextMetricsW(
{
TMW_INTERNAL tmwi;
if (!ftGdiGetTextMetricsW(hdc, &tmwi)) return FALSE;
IntTMWFixUp(hdc, &tmwi);
*lptm = tmwi.TextMetric;
return TRUE;
}
@ -555,6 +598,7 @@ NtGdiGetTextMetricsW(
{
if (ftGdiGetTextMetricsW(hDC, &Tmwi))
{
IntTMWFixUp(hDC, &Tmwi);
_SEH2_TRY
{
ProbeForWrite(pUnsafeTmwi, cj, 1);