https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a1bff5b94efa36b9e48d3…
commit a1bff5b94efa36b9e48d37f91b56428131c10531
Author: Doug Lyons <douglyons(a)douglyons.com>
AuthorDate: Sun Sep 1 13:18:23 2024 -0500
Commit: GitHub <noreply(a)github.com>
CommitDate: Sun Sep 1 13:18:23 2024 -0500
[NTGDI:FREETYPE] Account for spaces in x-dimension of IntExtTextOutW function (#7274)
@I_Kill_Bugs fix
CORE-11787, CORE-17721 and CORE-19721
For function IntExtTextOutW with space character, the x-dimension should be taken into
account.
Fixes HexEdit 1.2.1 right side of display window not being cleared.
Account for x-dimension if TA_UPDATECP flag set and 'String' is not NULL.
Clarify 'etx' is ASCII End of Text
---
win32ss/gdi/ntgdi/freetype.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c
index 6a72112f2c9..5a6f8479bbc 100644
--- a/win32ss/gdi/ntgdi/freetype.c
+++ b/win32ss/gdi/ntgdi/freetype.c
@@ -6795,8 +6795,9 @@ IntExtTextOutW(
FONT_CACHE_ENTRY Cache;
FT_Matrix mat;
BOOL bNoTransform;
- DWORD ch0, ch1;
+ DWORD ch0, ch1, etx = 3; // etx is ASCII End of Text
FONTLINK_CHAIN Chain;
+ SIZE spaceWidth;
/* Check if String is valid */
if (Count > 0xFFFF || (Count > 0 && String == NULL))
@@ -7062,6 +7063,22 @@ IntExtTextOutW(
bitSize.cx = realglyph->bitmap.width;
bitSize.cy = realglyph->bitmap.rows;
+ /* Do chars other than space and etx have a bitSize.cx of zero? */
+ if (ch0 != L' ' && ch0 != etx && bitSize.cx == 0)
+ DPRINT1("WARNING: WChar 0x%04x has a bitSize.cx of zero\n", ch0);
+
+ /* Don't ignore spaces when computing offset.
+ * This completes the fix of CORE-11787. */
+ if ((pdcattr->flTextAlign & TA_UPDATECP) && ch0 == L' '
&& bitSize.cx == 0)
+ {
+ IntUnLockFreeType();
+ /* Get the width of the space character */
+ TextIntGetTextExtentPoint(dc, TextObj, L" ", 1, 0, NULL, 0,
&spaceWidth, 0);
+ IntLockFreeType();
+ bitSize.cx = spaceWidth.cx;
+ realglyph->left = 0;
+ }
+
MaskRect.right = realglyph->bitmap.width;
MaskRect.bottom = realglyph->bitmap.rows;
@@ -7166,8 +7183,8 @@ IntExtTextOutW(
previous = glyph_index;
}
-
- if (pdcattr->flTextAlign & TA_UPDATECP)
+ /* Don't update position if String == NULL. Fixes CORE-19721. */
+ if ((pdcattr->flTextAlign & TA_UPDATECP) && String)
pdcattr->ptlCurrent.x = DestRect.right - dc->ptlDCOrig.x;
if (plf->lfUnderline || plf->lfStrikeOut) /* Underline or strike-out? */