[ros-dev] [ros-diffs] [reactos] 01/01: [FREETYPE] Fix 3 regressions in one patch
Pierre Schweitzer
pierre at reactos.org
Tue Mar 12 07:30:08 UTC 2019
Hi,
This commit broke HEAD; both VBox & KVM regtesters are red.
Either fix this commit or revert it.
In the meantime, please refrain from pushing to HEAD.
Cheers,
Pierre
Le 11/03/2019 à 20:11, Joachim Henze a écrit :
> https://git.reactos.org/?p=reactos.git;a=commitdiff;h=98b7ecd280c0f641d4593c8ba792b463a5117550
>
> commit 98b7ecd280c0f641d4593c8ba792b463a5117550
> Author: Joachim Henze <Joachim.Henze at reactos.org>
> AuthorDate: Mon Mar 11 20:10:14 2019 +0100
> Commit: Joachim Henze <Joachim.Henze at reactos.org>
> CommitDate: Mon Mar 11 20:10:14 2019 +0100
>
> [FREETYPE] Fix 3 regressions in one patch
>
> Fixes regression CORE-15785 (Zim Desktop Wiki 0.67 crashed) and
> Fixes regression CORE-15755 (NLite 1.4.9.3 used wrong font)
>
> without reintroducing regression CORE-15558 (AbiWord 2.6.8 font enumeration)
>
> This is achieved by partial revert of
> 0.4.12-dev-320-g
> 6e4e5a004c9da6276695d90187fb577812e8892f
> and got ack of Katayama Hirofumi MZ.
>
> Thanks to patches author Doug Lyons.
> Test-results: https://reactos.org/testman/compare.php?ids=66264,66267
> ---
> win32ss/gdi/ntgdi/freetype.c | 196 +++++++++++++++++++++++++++++++++----------
> 1 file changed, 152 insertions(+), 44 deletions(-)
>
> diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c
> index 7005057a077..4f58f030f27 100644
> --- a/win32ss/gdi/ntgdi/freetype.c
> +++ b/win32ss/gdi/ntgdi/freetype.c
> @@ -2244,6 +2244,73 @@ IntGetOutlineTextMetrics(PFONTGDI FontGDI,
> return Cache->OutlineRequiredSize;
> }
>
> +static PFONTGDI FASTCALL
> +FindFaceNameInList(PUNICODE_STRING FaceName, PLIST_ENTRY Head)
> +{
> + PLIST_ENTRY Entry;
> + PFONT_ENTRY CurrentEntry;
> + ANSI_STRING EntryFaceNameA;
> + UNICODE_STRING EntryFaceNameW;
> + FONTGDI *FontGDI;
> + NTSTATUS status;
> +
> + for (Entry = Head->Flink; Entry != Head; Entry = Entry->Flink)
> + {
> + CurrentEntry = CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry);
> +
> + FontGDI = CurrentEntry->Font;
> + ASSERT(FontGDI);
> +
> + RtlInitAnsiString(&EntryFaceNameA, FontGDI->SharedFace->Face->family_name);
> + status = RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE);
> + if (!NT_SUCCESS(status))
> + {
> + break;
> + }
> +
> + if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length)
> + {
> + EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR);
> + EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0';
> + }
> +
> + if (RtlEqualUnicodeString(FaceName, &EntryFaceNameW, TRUE))
> + {
> + RtlFreeUnicodeString(&EntryFaceNameW);
> + return FontGDI;
> + }
> +
> + RtlFreeUnicodeString(&EntryFaceNameW);
> + }
> +
> + return NULL;
> +}
> +
> +static PFONTGDI FASTCALL
> +FindFaceNameInLists(PUNICODE_STRING FaceName)
> +{
> + PPROCESSINFO Win32Process;
> + PFONTGDI Font;
> +
> + /* Search the process local list.
> + We do not have to search the 'Mem' list, since those fonts are linked in the PrivateFontListHead */
> + Win32Process = PsGetCurrentProcessWin32Process();
> + IntLockProcessPrivateFonts(Win32Process);
> + Font = FindFaceNameInList(FaceName, &Win32Process->PrivateFontListHead);
> + IntUnLockProcessPrivateFonts(Win32Process);
> + if (NULL != Font)
> + {
> + return Font;
> + }
> +
> + /* Search the global list */
> + IntLockGlobalFonts();
> + Font = FindFaceNameInList(FaceName, &g_FontListHead);
> + IntUnLockGlobalFonts();
> +
> + return Font;
> +}
> +
> /* See https://msdn.microsoft.com/en-us/library/bb165625(v=vs.90).aspx */
> static BYTE
> CharSetFromLangID(LANGID LangID)
> @@ -2670,10 +2737,67 @@ FontFamilyFillInfo(PFONTFAMILYINFO Info, LPCWSTR FaceName,
> Info->NewTextMetricEx.ntmFontSig = fs;
> }
>
> +static int FASTCALL
> +FindFaceNameInInfo(PUNICODE_STRING FaceName, PFONTFAMILYINFO Info, DWORD InfoEntries)
> +{
> + DWORD i;
> + UNICODE_STRING InfoFaceName;
> +
> + for (i = 0; i < InfoEntries; i++)
> + {
> + RtlInitUnicodeString(&InfoFaceName, Info[i].EnumLogFontEx.elfLogFont.lfFaceName);
> + if (RtlEqualUnicodeString(&InfoFaceName, FaceName, TRUE))
> + {
> + return i;
> + }
> + }
> +
> + return -1;
> +}
> +
> +static BOOLEAN FASTCALL
> +FontFamilyInclude(LPLOGFONTW LogFont, PUNICODE_STRING FaceName,
> + PFONTFAMILYINFO Info, DWORD InfoEntries)
> +{
> + UNICODE_STRING LogFontFaceName;
> +
> + RtlInitUnicodeString(&LogFontFaceName, LogFont->lfFaceName);
> + if (0 != LogFontFaceName.Length &&
> + !RtlEqualUnicodeString(&LogFontFaceName, FaceName, TRUE))
> + {
> + return FALSE;
> + }
> +
> + return FindFaceNameInInfo(FaceName, Info, InfoEntries) < 0;
> +}
> +
> +static BOOL FASTCALL
> +FontFamilyFound(PFONTFAMILYINFO InfoEntry,
> + PFONTFAMILYINFO Info, DWORD InfoCount)
> +{
> + LPLOGFONTW plf1 = &InfoEntry->EnumLogFontEx.elfLogFont;
> + LPWSTR pFullName1 = InfoEntry->EnumLogFontEx.elfFullName;
> + LPWSTR pFullName2;
> + DWORD i;
> +
> + for (i = 0; i < InfoCount; ++i)
> + {
> + LPLOGFONTW plf2 = &Info[i].EnumLogFontEx.elfLogFont;
> + if (plf1->lfCharSet != plf2->lfCharSet)
> + continue;
> +
> + pFullName2 = Info[i].EnumLogFontEx.elfFullName;
> + if (_wcsicmp(pFullName1, pFullName2) != 0)
> + continue;
> +
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> static BOOLEAN FASTCALL
> GetFontFamilyInfoForList(LPLOGFONTW LogFont,
> PFONTFAMILYINFO Info,
> - LPCWSTR NominalName,
> DWORD *pCount,
> DWORD MaxCount,
> PLIST_ENTRY Head)
> @@ -2700,38 +2824,28 @@ GetFontFamilyInfoForList(LPLOGFONTW LogFont,
> {
> if (Count < MaxCount)
> {
> - FontFamilyFillInfo(&Info[Count], NominalName, NULL, FontGDI);
> + FontFamilyFillInfo(&Info[Count], NULL, NULL, FontGDI);
> }
> Count++;
> continue;
> }
>
> - FontFamilyFillInfo(&InfoEntry, NominalName, NULL, FontGDI);
> + FontFamilyFillInfo(&InfoEntry, NULL, NULL, FontGDI);
>
> - if (NominalName)
> + if (_wcsnicmp(LogFont->lfFaceName, InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName, RTL_NUMBER_OF(LogFont->lfFaceName)-1) != 0 &&
> + _wcsnicmp(LogFont->lfFaceName, InfoEntry.EnumLogFontEx.elfFullName, RTL_NUMBER_OF(LogFont->lfFaceName)-1) != 0)
> {
> - RtlStringCchCopyW(InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName,
> - RTL_NUMBER_OF(InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName),
> - NominalName);
> + continue;
> }
> - else
> +
> + if (!FontFamilyFound(&InfoEntry, Info, min(Count, MaxCount)))
> {
> - if (_wcsnicmp(LogFont->lfFaceName,
> - InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName,
> - RTL_NUMBER_OF(LogFont->lfFaceName) - 1) != 0 &&
> - _wcsnicmp(LogFont->lfFaceName,
> - InfoEntry.EnumLogFontEx.elfFullName,
> - RTL_NUMBER_OF(LogFont->lfFaceName) - 1) != 0)
> + if (Count < MaxCount)
> {
> - continue;
> + RtlCopyMemory(&Info[Count], &InfoEntry, sizeof(InfoEntry));
> }
> + Count++;
> }
> -
> - if (Count < MaxCount)
> - {
> - RtlCopyMemory(&Info[Count], &InfoEntry, sizeof(InfoEntry));
> - }
> - Count++;
> }
>
> *pCount = Count;
> @@ -2747,9 +2861,10 @@ GetFontFamilyInfoForSubstitutes(LPLOGFONTW LogFont,
> {
> PLIST_ENTRY pEntry, pHead = &g_FontSubstListHead;
> PFONTSUBST_ENTRY pCurrentEntry;
> - PUNICODE_STRING pFromW, pToW;
> + PUNICODE_STRING pFromW;
> + FONTGDI *FontGDI;
> LOGFONTW lf = *LogFont;
> - PPROCESSINFO Win32Process = PsGetCurrentProcessWin32Process();
> + UNICODE_STRING NameW;
>
> for (pEntry = pHead->Flink; pEntry != pHead; pEntry = pEntry->Flink)
> {
> @@ -2758,32 +2873,25 @@ GetFontFamilyInfoForSubstitutes(LPLOGFONTW LogFont,
> pFromW = &pCurrentEntry->FontNames[FONTSUBST_FROM];
> if (LogFont->lfFaceName[0] != UNICODE_NULL)
> {
> - if (_wcsicmp(LogFont->lfFaceName, pFromW->Buffer) != 0)
> + if (!FontFamilyInclude(LogFont, pFromW, Info, min(*pCount, MaxCount)))
> continue; /* mismatch */
> }
>
> - pToW = &pCurrentEntry->FontNames[FONTSUBST_TO];
> - if (RtlEqualUnicodeString(pFromW, pToW, TRUE) &&
> - pCurrentEntry->CharSets[FONTSUBST_FROM] ==
> - pCurrentEntry->CharSets[FONTSUBST_TO])
> - {
> - continue;
> - }
> -
> IntUnicodeStringToBuffer(lf.lfFaceName, sizeof(lf.lfFaceName), pFromW);
> SubstituteFontRecurse(&lf);
> - if (LogFont->lfCharSet != DEFAULT_CHARSET && LogFont->lfCharSet != lf.lfCharSet)
> - continue;
>
> - IntLockGlobalFonts();
> - GetFontFamilyInfoForList(&lf, Info, pFromW->Buffer, pCount, MaxCount, &g_FontListHead);
> - IntUnLockGlobalFonts();
> + RtlInitUnicodeString(&NameW, lf.lfFaceName);
> + FontGDI = FindFaceNameInLists(&NameW);
> + if (FontGDI == NULL)
> + {
> + continue; /* no real font */
> + }
>
> - IntLockProcessPrivateFonts(Win32Process);
> - GetFontFamilyInfoForList(&lf, Info, pFromW->Buffer, pCount, MaxCount,
> - &Win32Process->PrivateFontListHead);
> - IntUnLockProcessPrivateFonts(Win32Process);
> - break;
> + if (*pCount < MaxCount)
> + {
> + FontFamilyFillInfo(&Info[*pCount], pFromW->Buffer, NULL, FontGDI);
> + }
> + (*pCount)++;
> }
>
> return TRUE;
> @@ -5426,7 +5534,7 @@ NtGdiGetFontFamilyInfo(HDC Dc,
> /* Enumerate font families in the global list */
> IntLockGlobalFonts();
> Count = 0;
> - if (! GetFontFamilyInfoForList(&LogFont, Info, NULL, &Count, Size, &g_FontListHead) )
> + if (! GetFontFamilyInfoForList(&LogFont, Info, &Count, Size, &g_FontListHead) )
> {
> IntUnLockGlobalFonts();
> ExFreePoolWithTag(Info, GDITAG_TEXT);
> @@ -5437,7 +5545,7 @@ NtGdiGetFontFamilyInfo(HDC Dc,
> /* Enumerate font families in the process local list */
> Win32Process = PsGetCurrentProcessWin32Process();
> IntLockProcessPrivateFonts(Win32Process);
> - if (! GetFontFamilyInfoForList(&LogFont, Info, NULL, &Count, Size,
> + if (! GetFontFamilyInfoForList(&LogFont, Info, &Count, Size,
> &Win32Process->PrivateFontListHead))
> {
> IntUnLockProcessPrivateFonts(Win32Process);
>
--
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://reactos.org/pipermail/ros-dev/attachments/20190312/8cc61384/attachment.sig>
More information about the Ros-dev
mailing list