[0.4.10] [FONT][WIN32SS] Include the style name in the registry key.

Thanks to Doug Lyons for pinpointing the issue.

CORE-14044

cherry picked from commit 0.4.11-dev-311-g
3d44f79e3e
This commit is contained in:
Mark Jansen 2018-10-02 00:50:34 +02:00 committed by Joachim Henze
parent 86e0a30bcb
commit f6a9392a3c
2 changed files with 43 additions and 16 deletions

View file

@ -6,6 +6,7 @@ typedef struct _FONT_ENTRY
LIST_ENTRY ListEntry;
FONTGDI *Font;
UNICODE_STRING FaceName;
UNICODE_STRING StyleName;
BYTE NotEnum;
} FONT_ENTRY, *PFONT_ENTRY;

View file

@ -828,7 +828,7 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont,
FONTGDI * FontGDI;
NTSTATUS Status;
FT_Face Face;
ANSI_STRING AnsiFaceName;
ANSI_STRING AnsiString;
FT_WinFNT_HeaderRec WinFNT;
INT FaceCount = 0, CharSetCount = 0;
PUNICODE_STRING pFileName = pLoadFont->pFileName;
@ -950,8 +950,24 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont,
FontGDI->OriginalWeight = WeightFromStyle(Face->style_name);
FontGDI->RequestWeight = FW_NORMAL;
RtlInitAnsiString(&AnsiFaceName, Face->family_name);
Status = RtlAnsiStringToUnicodeString(&Entry->FaceName, &AnsiFaceName, TRUE);
RtlInitAnsiString(&AnsiString, Face->family_name);
Status = RtlAnsiStringToUnicodeString(&Entry->FaceName, &AnsiString, TRUE);
if (NT_SUCCESS(Status))
{
if (Face->style_name[0] && strcmp(Face->style_name, "Regular"))
{
RtlInitAnsiString(&AnsiString, Face->style_name);
Status = RtlAnsiStringToUnicodeString(&Entry->StyleName, &AnsiString, TRUE);
if (!NT_SUCCESS(Status))
{
RtlFreeUnicodeString(&Entry->FaceName);
}
}
else
{
RtlInitUnicodeString(&Entry->StyleName, NULL);
}
}
if (!NT_SUCCESS(Status))
{
if (PrivateEntry)
@ -1081,15 +1097,25 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont,
if (CharSetIndex == -1)
{
INT i;
USHORT NameLength = Entry->FaceName.Length;
if (Entry->StyleName.Length)
NameLength += Entry->StyleName.Length + sizeof(WCHAR);
if (pLoadFont->RegValueName.Length == 0)
{
RtlCreateUnicodeString(pValueName, Entry->FaceName.Buffer);
pValueName->Length = 0;
pValueName->MaximumLength = NameLength + sizeof(WCHAR);
pValueName->Buffer = ExAllocatePoolWithTag(PagedPool,
pValueName->MaximumLength,
TAG_USTR);
pValueName->Buffer[0] = UNICODE_NULL;
RtlAppendUnicodeStringToString(pValueName, &Entry->FaceName);
}
else
{
UNICODE_STRING NewString;
USHORT Length = pValueName->Length + 3 * sizeof(WCHAR) + Entry->FaceName.Length;
USHORT Length = pValueName->Length + 3 * sizeof(WCHAR) + NameLength;
NewString.Length = 0;
NewString.MaximumLength = Length + sizeof(WCHAR);
NewString.Buffer = ExAllocatePoolWithTag(PagedPool,
@ -1104,6 +1130,11 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont,
RtlFreeUnicodeString(pValueName);
*pValueName = NewString;
}
if (Entry->StyleName.Length)
{
RtlAppendUnicodeToString(pValueName, L" ");
RtlAppendUnicodeStringToString(pValueName, &Entry->StyleName);
}
for (i = 1; i < CharSetCount; ++i)
{
@ -5020,15 +5051,10 @@ IntGdiGetFontResourceInfo(
case 1: /* copy the font title */
/* calculate the required size */
Size = 0;
Size += wcslen(FamInfo[0].EnumLogFontEx.elfLogFont.lfFaceName);
if (FamInfo[0].EnumLogFontEx.elfStyle[0] &&
_wcsicmp(FamInfo[0].EnumLogFontEx.elfStyle, L"Regular") != 0)
for (i = 0; i < Count; ++i)
{
Size += 1 + wcslen(FamInfo[0].EnumLogFontEx.elfStyle);
}
for (i = 1; i < Count; ++i)
{
Size += 3; /* " & " */
if (i > 0)
Size += 3; /* " & " */
Size += wcslen(FamInfo[i].EnumLogFontEx.elfLogFont.lfFaceName);
if (FamInfo[i].EnumLogFontEx.elfStyle[0] &&
_wcsicmp(FamInfo[i].EnumLogFontEx.elfStyle, L"Regular") != 0)
@ -5051,10 +5077,10 @@ IntGdiGetFontResourceInfo(
/* store font title to buffer */
WCHAR *psz = pBuffer;
*psz = 0;
IntAddNameFromFamInfo(psz, &FamInfo[0]);
for (i = 1; i < Count; ++i)
for (i = 0; i < Count; ++i)
{
wcscat(psz, L" & ");
if (i > 0)
wcscat(psz, L" & ");
IntAddNameFromFamInfo(psz, &FamInfo[i]);
}
psz[wcslen(psz) + 1] = UNICODE_NULL;