Measure the text more reasonably. This handles intercharacter spacing
and should handle any kerning etc. that might happen. Also ensure no
wordbreaking on singleline text.
diff --git a/dlls/user/text.c b/dlls/user/text.c
index d4f8cf7..074a708 100644
--- a/dlls/user/text.c
+++ b/dlls/user/text.c
@@ -334,21 +334,21 @@
* Returns pointer to next char in str after end of the line
* or NULL if end of str reached.
*
- * FIXME:
- * GetTextExtentPoint is used to get the width of each character,
- * rather than GetCharABCWidth... So the whitespace between
- * characters is ignored, and the reported len is too great.
*/
static const WCHAR *TEXT_NextLineW( HDC hdc, const WCHAR *str, int *count,
WCHAR *dest, int *len, int width, WORD format)
{
int i = 0, j = 0;
int plen = 0;
+ int seg_plen; /* plen at the beginning of the current text segment */
SIZE size;
int wb_i = 0, wb_j = 0, wb_count = 0;
int maxl = *len;
int normal_char;
+ int seg_j; /* j at the beginning of the current text segment */
+ seg_j = j;
+ seg_plen = plen;
while (*count && j < maxl)
{
normal_char = 1;
@@ -394,10 +394,12 @@
wb_j = j;
wb_count = *count;
plen = ((plen/tabwidth)+1)*tabwidth;
+ seg_plen = plen;
}
normal_char = 0;
dest[j++] = str[i++];
+ seg_j = j;
}
break;
@@ -418,9 +420,9 @@
dest[j++] = str[i++];
if ((format & DT_WORDBREAK))
{
- if (!GetTextExtentPointW(hdc, &dest[j-1], 1, &size))
+ if (!GetTextExtentPointW(hdc, &dest[seg_j], j-seg_j, &size))
return NULL;
- plen += size.cx;
+ plen = seg_plen + size.cx;
}
}
@@ -542,6 +544,9 @@
if (count == 0) return 0;
strPtr = str;
+ if (flags & DT_SINGLELINE)
+ flags &= ~DT_WORDBREAK;
+
GetTextMetricsW(hdc, &tm);
if (flags & DT_EXTERNALLEADING)
lh = tm.tmHeight + tm.tmExternalLeading;