mirror of
https://github.com/reactos/reactos.git
synced 2025-05-29 05:58:13 +00:00
[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:
parent
1f29f725d8
commit
448bcede24
1 changed files with 44 additions and 0 deletions
|
@ -13,6 +13,48 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#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 *****************************************************************/
|
/** Functions *****************************************************************/
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
|
@ -154,6 +196,7 @@ GreGetTextMetricsW(
|
||||||
{
|
{
|
||||||
TMW_INTERNAL tmwi;
|
TMW_INTERNAL tmwi;
|
||||||
if (!ftGdiGetTextMetricsW(hdc, &tmwi)) return FALSE;
|
if (!ftGdiGetTextMetricsW(hdc, &tmwi)) return FALSE;
|
||||||
|
IntTMWFixUp(hdc, &tmwi);
|
||||||
*lptm = tmwi.TextMetric;
|
*lptm = tmwi.TextMetric;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -555,6 +598,7 @@ NtGdiGetTextMetricsW(
|
||||||
{
|
{
|
||||||
if (ftGdiGetTextMetricsW(hDC, &Tmwi))
|
if (ftGdiGetTextMetricsW(hDC, &Tmwi))
|
||||||
{
|
{
|
||||||
|
IntTMWFixUp(hDC, &Tmwi);
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
ProbeForWrite(pUnsafeTmwi, cj, 1);
|
ProbeForWrite(pUnsafeTmwi, cj, 1);
|
||||||
|
|
Loading…
Reference in a new issue