From: James Tabor Date: Thu, 22 Dec 2016 06:51:32 +0000 (+0000) Subject: [User32|RTL] X-Git-Tag: ReactOS-0.4.4-FOSDEM2017~62 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=7761bf28baa4a493c8fb314a1a907e649b98e3a4 [User32|RTL] - Move TEXT_TabbedTextOut back into User32. svn path=/trunk/; revision=73474 --- diff --git a/reactos/win32ss/user/rtl/text.c b/reactos/win32ss/user/rtl/text.c index 0184b5beb73..00a38e09030 100644 --- a/reactos/win32ss/user/rtl/text.c +++ b/reactos/win32ss/user/rtl/text.c @@ -63,128 +63,6 @@ void _font_assert(const char *msg, const char *file, int line) #endif } -/*********************************************************************** - * TEXT_TabbedTextOut - * - * Helper function for TabbedTextOut() and GetTabbedTextExtent(). - * Note: this doesn't work too well for text-alignment modes other - * than TA_LEFT|TA_TOP. But we want bug-for-bug compatibility :-) - */ -/* WINE synced 22-May-2006 */ -LONG TEXT_TabbedTextOut( HDC hdc, - INT x, - INT y, - LPCWSTR lpstr, - INT count, - INT cTabStops, - const INT *lpTabPos, - INT nTabOrg, - BOOL fDisplayText ) -{ - INT defWidth; - SIZE extent; - int i, j; - int start = x; - TEXTMETRICW tm; - - if (!lpTabPos) - cTabStops=0; - -#ifdef _WIN32K_ - GreGetTextMetricsW( hdc, &tm ); -#else - GetTextMetricsW( hdc, &tm ); -#endif - - if (cTabStops == 1) - { - defWidth = *lpTabPos; - cTabStops = 0; - } - else - { - defWidth = 8 * tm.tmAveCharWidth; - } - - while (count > 0) - { - RECT r; - INT x0; - x0 = x; - r.left = x0; - /* chop the string into substrings of 0 or more - * possibly followed by 1 or more normal characters */ - for (i = 0; i < count; i++) - if (lpstr[i] != '\t') break; - for (j = i; j < count; j++) - if (lpstr[j] == '\t') break; - /* get the extent of the normal character part */ -#ifdef _WIN32K_ - GreGetTextExtentW( hdc, lpstr + i, j - i , &extent, 0 ); -#else - GetTextExtentPointW( hdc, lpstr + i, j - i , &extent ); -#endif - /* and if there is a , calculate its position */ - if( i) { - /* get x coordinate for the drawing of this string */ - for (; cTabStops > i; lpTabPos++, cTabStops--) - { - if( nTabOrg + abs( *lpTabPos) > x) { - if( lpTabPos[ i - 1] >= 0) { - /* a left aligned tab */ - x = nTabOrg + lpTabPos[ i-1] + extent.cx; - break; - } - else - { - /* if tab pos is negative then text is right-aligned - * to tab stop meaning that the string extends to the - * left, so we must subtract the width of the string */ - if (nTabOrg - lpTabPos[ i - 1] - extent.cx > x) - { - x = nTabOrg - lpTabPos[ i - 1]; - x0 = x - extent.cx; - break; - } - } - } - } - /* if we have run out of tab stops and we have a valid default tab - * stop width then round x up to that width */ - if ((cTabStops <= i) && (defWidth > 0)) { - x0 = nTabOrg + ((x - nTabOrg) / defWidth + i) * defWidth; - x = x0 + extent.cx; - } else if ((cTabStops <= i) && (defWidth < 0)) { - x = nTabOrg + ((x - nTabOrg + extent.cx) / -defWidth + i) - * -defWidth; - x0 = x - extent.cx; - } - } else - x += extent.cx; - - if (fDisplayText) - { - r.top = y; - r.right = x; - r.bottom = y + extent.cy; -#ifdef _WIN32K_ - GreExtTextOutW( hdc, x0, y, GreGetBkMode(hdc) == OPAQUE ? ETO_OPAQUE : 0, - &r, lpstr + i, j - i, NULL, 0 ); -#else - ExtTextOutW( hdc, x0, y, GetBkMode(hdc) == OPAQUE ? ETO_OPAQUE : 0, - &r, lpstr + i, j - i, NULL ); -#endif - } - count -= j; - lpstr += j; - } - - if(!extent.cy) - extent.cy = tm.tmHeight; - - return MAKELONG(x - start, extent.cy); -} - /********************************************************************* * * DrawText functions diff --git a/reactos/win32ss/user/user32/windows/font.c b/reactos/win32ss/user/user32/windows/font.c index 953d776bacd..56d0ec06561 100644 --- a/reactos/win32ss/user/user32/windows/font.c +++ b/reactos/win32ss/user/user32/windows/font.c @@ -38,12 +38,120 @@ DWORD WINAPI GdiGetCodePage(HDC hdc); INT WINAPI DrawTextExWorker( HDC hdc, LPWSTR str, INT i_count, LPRECT rect, UINT flags, LPDRAWTEXTPARAMS dtp ); -LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr, - INT count, INT cTabStops, const INT *lpTabPos, INT nTabOrg, - BOOL fDisplayText ); /* FUNCTIONS *****************************************************************/ + +/*********************************************************************** + * TEXT_TabbedTextOut + * + * Helper function for TabbedTextOut() and GetTabbedTextExtent(). + * Note: this doesn't work too well for text-alignment modes other + * than TA_LEFT|TA_TOP. But we want bug-for-bug compatibility :-) + */ +/* WINE synced 22-May-2006 */ +LONG TEXT_TabbedTextOut( HDC hdc, + INT x, + INT y, + LPCWSTR lpstr, + INT count, + INT cTabStops, + const INT *lpTabPos, + INT nTabOrg, + BOOL fDisplayText ) +{ + INT defWidth; + SIZE extent; + int i, j; + int start = x; + TEXTMETRICW tm; + + if (!lpTabPos) + cTabStops=0; + + GetTextMetricsW( hdc, &tm ); + + if (cTabStops == 1) + { + defWidth = *lpTabPos; + cTabStops = 0; + } + else + { + defWidth = 8 * tm.tmAveCharWidth; + } + + while (count > 0) + { + RECT r; + INT x0; + x0 = x; + r.left = x0; + /* chop the string into substrings of 0 or more + * possibly followed by 1 or more normal characters */ + for (i = 0; i < count; i++) + if (lpstr[i] != '\t') break; + for (j = i; j < count; j++) + if (lpstr[j] == '\t') break; + /* get the extent of the normal character part */ + GetTextExtentPointW( hdc, lpstr + i, j - i , &extent ); + /* and if there is a , calculate its position */ + if( i) { + /* get x coordinate for the drawing of this string */ + for (; cTabStops > i; lpTabPos++, cTabStops--) + { + if( nTabOrg + abs( *lpTabPos) > x) { + if( lpTabPos[ i - 1] >= 0) { + /* a left aligned tab */ + x = nTabOrg + lpTabPos[ i-1] + extent.cx; + break; + } + else + { + /* if tab pos is negative then text is right-aligned + * to tab stop meaning that the string extends to the + * left, so we must subtract the width of the string */ + if (nTabOrg - lpTabPos[ i - 1] - extent.cx > x) + { + x = nTabOrg - lpTabPos[ i - 1]; + x0 = x - extent.cx; + break; + } + } + } + } + /* if we have run out of tab stops and we have a valid default tab + * stop width then round x up to that width */ + if ((cTabStops <= i) && (defWidth > 0)) { + x0 = nTabOrg + ((x - nTabOrg) / defWidth + i) * defWidth; + x = x0 + extent.cx; + } else if ((cTabStops <= i) && (defWidth < 0)) { + x = nTabOrg + ((x - nTabOrg + extent.cx) / -defWidth + i) + * -defWidth; + x0 = x - extent.cx; + } + } else + x += extent.cx; + + if (fDisplayText) + { + r.top = y; + r.right = x; + r.bottom = y + extent.cy; + + ExtTextOutW( hdc, x0, y, GetBkMode(hdc) == OPAQUE ? ETO_OPAQUE : 0, + &r, lpstr + i, j - i, NULL ); + } + count -= j; + lpstr += j; + } + + if(!extent.cy) + extent.cy = tm.tmHeight; + + return MAKELONG(x - start, extent.cy); +} + /* * @implemented */