47#define assert(e) ((e) ? (void)0 : _font_assert(#e, __FILE__, __LINE__))
114#define ALPHA_PREFIX 30
115#define KANA_PREFIX 31
117#define FORWARD_SLASH '/'
118#define BACK_SLASH '\\'
162 int *len_before,
int *len_ellip)
164 unsigned int len_ellipsis;
165 unsigned int lo, mid, hi;
167 if (len_ellipsis > max_len) len_ellipsis = max_len;
168 if (*len_str > max_len - len_ellipsis)
169 *len_str = max_len - len_ellipsis;
180 for (lo = 0, hi = *len_str; lo < hi; )
207 if (!*len_str ||
size->cx <=
width)
break;
211 *len_ellip = len_ellipsis;
212 *len_before = *len_str;
213 *len_str += len_ellipsis;
218 modstr[*len_str] =
'\0';
272 WCHAR *lastBkSlash, *lastFwdSlash, *lastSlash;
274 if (!max_len)
return;
275 if (len_ellipsis >= max_len) len_ellipsis = max_len - 1;
276 if (*len_str + len_ellipsis >= max_len)
277 *len_str = max_len - len_ellipsis-1;
281 str[*len_str] =
'\0';
289 lastSlash = lastBkSlash > lastFwdSlash ? lastBkSlash : lastFwdSlash;
291 if (!lastSlash) lastSlash =
str + *len_str;
293 if (!lastSlash) lastSlash =
str;
295 len_trailing = *len_str - (lastSlash -
str);
298 memmove (lastSlash+len_ellipsis, lastSlash, len_trailing *
sizeof(
WCHAR));
300 len_trailing += len_ellipsis;
318 memmove (lastSlash-1, lastSlash, len_trailing *
sizeof(
WCHAR));
326 pellip->
len = len_ellipsis;
327 pellip->
under = len_under;
328 pellip->
after = len_trailing - len_ellipsis;
329 *len_str += len_ellipsis;
334 modstr[*len_str] =
'\0';
341 if (0x0E00 <= wch && wch <= 0x0E7F)
344 if (0x3000 <= wch && wch <= 0x9FFF)
347 if (0xAC00 <= wch && wch <= 0xD7FF)
350 if (0xFF00 <= wch && wch <= 0xFFEF)
359 0x2010, 0x2013, 0x2019, 0x201D, 0x203C, 0x2047, 0x2048, 0x2049, 0x3001,
360 0x3002, 0x3005, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, 0x3017,
361 0x3019, 0x301C, 0x301F, 0x303B, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049,
362 0x3063, 0x3083, 0x3085, 0x3087, 0x308E, 0x3095, 0x3096, 0x30A0, 0x30A1,
363 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5, 0x30E7, 0x30EE,
364 0x30F5, 0x30F6, 0x30FB, 0x30FC, 0x30FD, 0x30FE, 0x31F0, 0x31F1, 0x31F2,
365 0x31F3, 0x31F4, 0x31F5, 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x31FA, 0x31FB,
366 0x31FC, 0x31FD, 0x31FE, 0x31FF, 0xFF01, 0xFF09, 0xFF0C, 0xFF0E, 0xFF1A,
367 0xFF1B, 0xFF1F, 0xFF3D, 0xFF5D, 0xFF60, 0
431 unsigned int *len_str,
433 unsigned int *chars_used,
SIZE *
size)
438 assert (chars_fit < *len_str);
463 next_is_space = (
unsigned int) (
p -
str) < *len_str && *
p ==
SPACE;
466 *chars_used = *len_str;
480 *len_str = chars_fit;
481 *chars_used = chars_fit;
496 *chars_used =
p -
str;
555 const WCHAR *str_on_entry = start_str;
571 *new_str = start_str;
601 if (
i == (
unsigned int) pe->
before)
604 if (
ns < (
unsigned int) pe->
under)
break;
608 if (!pe->
after)
break;
632 if (!num_chars)
return TRUE;
634 if (!--num_chars)
return TRUE;
638 if (--num_chars)
return FALSE;
672 SIZE *retsize,
int last_line,
WCHAR **p_retstr,
673 int tabwidth,
int *pprefix_offset,
680 int seg_i, seg_count, seg_j;
685 unsigned int j_in_seg;
687 *pprefix_offset = -1;
699 plen = ((plen/tabwidth)+1)*tabwidth;
700 (*count)--;
if (
j < maxl)
dest[
j++] =
str[
i++];
else i++;
704 (*count)--;
if (
j < maxl)
dest[
j++] =
str[
i++];
else i++;
721 (*count)--;
if (
j < maxl)
dest[
j++] =
str[
i++];
else i++;
730 (*count)--;
if (
j < maxl)
dest[
j++] =
str[
i++];
else i++;
732 else if (*pprefix_offset == -1 || *pprefix_offset >= seg_j)
749 (*count)--;
if (
j < maxl)
dest[
j++] =
str[
i++];
else i++;
758 j_in_seg =
j - seg_j;
759 max_seg_width =
width - plen;
772 line_fits = (num_fit >= j_in_seg);
776 unsigned int chars_used;
778 max_seg_width,
format, num_fit, &chars_used, &
size);
779 line_fits = (
size.cx <= max_seg_width);
786 pellip->
before = j_in_seg;
794 max_seg_width, &
size, *p_retstr, pellip);
795 line_fits = (
size.cx <= max_seg_width);
802 ((last_line && *
count) ||
807 max_seg_width, &
size, *p_retstr, &
before, &len_ellipsis);
821 pellip->
len = len_ellipsis;
826 line_fits = (
size.cx <= max_seg_width);
846 j = seg_j + j_in_seg;
847 if (*pprefix_offset >= seg_j + pellip->
before)
850 if (*pprefix_offset != -1)
851 *pprefix_offset += seg_j;
855 if (
size.cy > retsize->
cy)
910 prefix_x =
x +
size.cx;
916 prefix_end =
x +
size.cx - 1;
972 ULONG ArgumentLength;
980 pStringBuffer = ArgumentLength;
981 ArgumentLength +=
sizeof(
WCHAR) * (
count + 2);
1037 bResult = *(
LPBOOL)ResultPointer;
1041 ERR(
"Failed to copy result from user mode!\n");
1069#define MAX_BUFFER 1024
1083 const WCHAR *strPtr;
1084 WCHAR *retstr, *p_retstr;
1089 int lmargin = 0, rmargin = 0;
1107 if (dtp)
TRACE(
"Params: iTabLength=%d, iLeftMargin=%d, iRightMargin=%d\n",
1115 flags &= ~DT_WORDBREAK;
1122 lh =
tm.tmHeight +
tm.tmExternalLeading;
1134 SIZE window_ext, viewport_ext;
1137 if ((window_ext.
cy > 0) != (viewport_ext.
cy > 0))
1143 SIZE window_ext, viewport_ext;
1146 if ((window_ext.
cy > 0) != (viewport_ext.
cy > 0))
1183 tabwidth =
tm.tmAveCharWidth * tabstop;
1229 if (!retstr)
return 0;
1246 strPtr =
TEXT_NextLineW(
hdc, strPtr, &
count,
line, &
len,
width,
flags, &
size, last_line, &p_retstr, tabwidth, &prefix_offset, &ellip);
1293 if (len_seg !=
len &&
1329 if (prefix_offset != -1 && prefix_offset < len_seg)
1339 xseg += ((
size.cx/tabwidth)+1)*tabwidth;
1340 if (prefix_offset != -1)
1342 if (prefix_offset < len_seg)
1353 prefix_offset -= len_seg;
1358 else if (
size.cx > max_width)
1359 max_width =
size.cx;
1361 y += invert_y ? -lh : lh;
1365 while (strPtr && !last_line);
NTSTATUS NTAPI KeUserModeCallback(IN ULONG RoutineIndex, IN PVOID Argument, IN ULONG ArgumentLength, OUT PVOID *Result, OUT PULONG ResultLength)
static const char * wine_dbgstr_rect(const RECT *prc)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define DBG_DEFAULT_CHANNEL(ch)
static long long start_count
COLORREF FASTCALL GreGetTextColor(HDC)
int FASTCALL GreGetGraphicsMode(HDC)
#define NT_SUCCESS(StatCode)
#define HeapFree(x, y, z)
VOID WINAPI ExitProcess(IN UINT uExitCode)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
BOOL APIENTRY GreExtTextOutW(_In_ HDC hDC, _In_ INT XStart, _In_ INT YStart, _In_ UINT fuOptions, _In_opt_ PRECTL lprc, _In_reads_opt_(Count) PCWCH String, _In_ INT Count, _In_opt_ const INT *Dx, _In_ DWORD dwCodePage)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLint GLint GLint GLint GLint GLint y
GLint GLint GLsizei width
GLdouble GLdouble GLdouble GLdouble top
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define EXCEPTION_EXECUTE_HANDLER
BOOL FASTCALL GreMoveTo(HDC hdc, INT x, INT y, LPPOINT pptOut)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
#define ExFreePoolWithTag(_P, _T)
BOOL WINAPI GreGetViewportExtEx(_In_ HDC hdc, _Out_ LPSIZE lpSize)
BOOL WINAPI GreGetWindowExtEx(_In_ HDC hdc, _Out_ LPSIZE lpSize)
NTSTRSAFEAPI RtlStringCchCopyNW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cchToCopy)
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
__kernel_entry W32KAPI INT APIENTRY NtGdiExtSelectClipRgn(_In_ HDC hdc, _In_opt_ HRGN hrgn, _In_ INT iMode)
__kernel_entry W32KAPI INT APIENTRY NtGdiIntersectClipRect(_In_ HDC hdc, _In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
__kernel_entry W32KAPI INT APIENTRY NtGdiGetRandomRgn(_In_ HDC hdc, _In_ HRGN hrgn, _In_ INT iRgn)
__kernel_entry W32KAPI HPEN APIENTRY NtGdiCreatePen(_In_ INT iPenStyle, _In_ INT iPenWidth, _In_ COLORREF cr, _In_opt_ HBRUSH hbr)
__kernel_entry W32KAPI HPEN APIENTRY NtGdiSelectPen(_In_ HDC hdc, _In_ HPEN hpen)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiLineTo(_In_ HDC hdc, _In_ INT x, _In_ INT y)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
__inline int before(__u32 seq1, __u32 seq2)
Character const *const prefix
BOOL UserExtTextOutW(HDC hdc, INT x, INT y, UINT flags, PRECTL lprc, LPCWSTR lpString, UINT count)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
BOOL WINAPI ExtTextOutW(_In_ HDC hdc, _In_ INT x, _In_ INT y, _In_ UINT fuOptions, _In_opt_ const RECT *lprc, _In_reads_opt_(cwc) LPCWSTR lpString, _In_ UINT cwc, _In_reads_opt_(cwc) const INT *lpDx)
BOOL WINAPI GetTextMetricsW(_In_ HDC hdc, _Out_ LPTEXTMETRICW lptm)
BOOL APIENTRY GetTextExtentPointW(_In_ HDC hdc, _In_reads_(cchString) LPCWSTR lpString, _In_ INT cchString, _Out_ LPSIZE lpsz)
BOOL WINAPI GetTextExtentExPointW(_In_ HDC hdc, _In_reads_(cchString) LPCWSTR lpszString, _In_ INT cchString, _In_ INT nMaxExtent, _Out_opt_ LPINT lpnFit, _Out_writes_to_opt_(cchString, *lpnFit) LPINT lpnDx, _Out_ LPSIZE lpSize)
COLORREF WINAPI GetTextColor(_In_ HDC hdc)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
BOOL WINAPI GreGetTextMetricsW(_In_ HDC hdc, _Out_ LPTEXTMETRICW lptm)
BOOL FASTCALL GreGetTextExtentW(_In_ HDC hDC, _In_reads_(cwc) PCWCH lpwsz, _In_ INT cwc, _Out_ PSIZE psize, _In_ UINT flOpts)
BOOL FASTCALL GreGetTextExtentExW(_In_ HDC hDC, _In_ PCWCH String, _In_ ULONG Count, _In_ ULONG MaxExtent, _Out_opt_ PULONG Fit, _Out_writes_to_opt_(Count, *Fit) PULONG Dx, _Out_ PSIZE pSize, _In_ FLONG fl)
struct _LPK_CALLBACK_ARGUMENTS LPK_CALLBACK_ARGUMENTS
PVOID FASTCALL IntCbAllocateMemory(ULONG Size)
VOID FASTCALL IntCbFreeMemory(PVOID Data)
void _font_assert(const char *msg, const char *file, int line)
static void TEXT_DrawUnderscore(HDC hdc, int x, int y, const WCHAR *str, int offset, const RECT *rect)
static int remainder_is_none_or_newline(int num_chars, const WCHAR *str)
struct tag_ellipsis_data ellipsis_data
static const WCHAR * TEXT_NextLineW(HDC hdc, const WCHAR *str, int *count, WCHAR *dest, int *len, int width, DWORD format, SIZE *retsize, int last_line, WCHAR **p_retstr, int tabwidth, int *pprefix_offset, ellipsis_data *pellip)
static void TEXT_Ellipsify(HDC hdc, WCHAR *str, unsigned int max_len, unsigned int *len_str, int width, SIZE *size, WCHAR *modstr, int *len_before, int *len_ellip)
FORCEINLINE BOOL IsCJKT(WCHAR wch)
static const WCHAR KinsokuClassA[]
INT WINAPI DrawTextExWorker(HDC hdc, LPWSTR str, INT i_count, LPRECT rect, UINT flags, LPDRAWTEXTPARAMS dtp)
static int TEXT_Reprefix(const WCHAR *str, unsigned int ns, const ellipsis_data *pe)
static void TEXT_PathEllipsify(HDC hdc, WCHAR *str, unsigned int max_len, unsigned int *len_str, int width, SIZE *size, WCHAR *modstr, ellipsis_data *pellip)
static void TEXT_WordBreak(HDC hdc, WCHAR *str, unsigned int max_str, unsigned int *len_str, int width, int format, unsigned int chars_fit, unsigned int *chars_used, SIZE *size)
static const WCHAR ELLIPSISW[]
static void TEXT_SkipChars(int *new_count, const WCHAR **new_str, int start_count, const WCHAR *start_str, int max, int n, int prefix)
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
int WINAPI GetGraphicsMode(_In_ HDC)
int WINAPI IntersectClipRect(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
BOOL WINAPI GdiFlush(void)
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
int WINAPI GetClipRgn(_In_ HDC, _In_ HRGN)
BOOL WINAPI GetWindowExtEx(_In_ HDC, _Out_ LPSIZE)
BOOL WINAPI GetViewportExtEx(_In_ HDC, _Out_ LPSIZE)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
int WINAPI SelectClipRgn(_In_ HDC, _In_opt_ HRGN)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define DT_EXTERNALLEADING
_In_ int _Inout_ LPRECT lprc