gdi32: Use NtGdiGetTextExtentExPointW for GetTextExtentExPoint.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-08-20 10:41:56 +02:00 committed by Alexandre Julliard
parent ff36618c96
commit c0486678eb
3 changed files with 107 additions and 207 deletions

View File

@ -4761,211 +4761,13 @@ INT WINAPI NtGdiGetTextFaceW( HDC hdc, INT count, WCHAR *name, BOOL alias_name )
/*********************************************************************** /***********************************************************************
* GetTextExtentPoint32A (GDI32.@) * NtGdiGetTextExtentExW (win32u.@)
*
* See GetTextExtentPoint32W.
*/
BOOL WINAPI GetTextExtentPoint32A( HDC hdc, LPCSTR str, INT count,
LPSIZE size )
{
BOOL ret = FALSE;
INT wlen;
LPWSTR p;
if (count < 0) return FALSE;
p = FONT_mbtowc(hdc, str, count, &wlen, NULL);
if (p)
{
ret = GetTextExtentPoint32W( hdc, p, wlen, size );
HeapFree( GetProcessHeap(), 0, p );
}
TRACE("(%p %s %d %p): returning %d x %d\n",
hdc, debugstr_an (str, count), count, size, size->cx, size->cy );
return ret;
}
/***********************************************************************
* GetTextExtentPoint32W [GDI32.@]
*
* Computes width/height for a string.
*
* Computes width and height of the specified string.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI GetTextExtentPoint32W(
HDC hdc, /* [in] Handle of device context */
LPCWSTR str, /* [in] Address of text string */
INT count, /* [in] Number of characters in string */
LPSIZE size) /* [out] Address of structure for string size */
{
return GetTextExtentExPointW(hdc, str, count, 0, NULL, NULL, size);
}
/***********************************************************************
* GetTextExtentExPointI [GDI32.@]
*
* Computes width and height of the array of glyph indices.
*
* PARAMS
* hdc [I] Handle of device context.
* indices [I] Glyph index array.
* count [I] Number of glyphs in array.
* max_ext [I] Maximum width in glyphs.
* nfit [O] Maximum number of characters.
* dxs [O] Partial string widths.
* size [O] Returned string size.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT max_ext,
LPINT nfit, LPINT dxs, LPSIZE size )
{
DC *dc;
int i;
BOOL ret;
INT buffer[256], *pos = dxs;
if (count < 0) return FALSE;
dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
if (!dxs)
{
pos = buffer;
if (count > 256 && !(pos = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pos) )))
{
release_dc_ptr( dc );
return FALSE;
}
}
ret = get_char_positions_indices( dc, indices, count, pos, size );
if (ret)
{
if (dxs || nfit)
{
for (i = 0; i < count; i++)
{
unsigned int dx = abs( INTERNAL_XDSTOWS( dc, pos[i] )) +
(i + 1) * dc->attr->char_extra;
if (nfit && dx > (unsigned int)max_ext) break;
if (dxs) dxs[i] = dx;
}
if (nfit) *nfit = i;
}
size->cx = abs( INTERNAL_XDSTOWS( dc, size->cx )) + count * dc->attr->char_extra;
size->cy = abs( INTERNAL_YDSTOWS( dc, size->cy ));
}
if (pos != buffer && pos != dxs) HeapFree( GetProcessHeap(), 0, pos );
release_dc_ptr( dc );
TRACE("(%p %p %d %p): returning %d x %d\n",
hdc, indices, count, size, size->cx, size->cy );
return ret;
}
/***********************************************************************
* GetTextExtentPointI [GDI32.@]
*
* Computes width and height of the array of glyph indices.
*
* PARAMS
* hdc [I] Handle of device context.
* indices [I] Glyph index array.
* count [I] Number of glyphs in array.
* size [O] Returned string size.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI GetTextExtentPointI( HDC hdc, const WORD *indices, INT count, LPSIZE size )
{
return GetTextExtentExPointI( hdc, indices, count, 0, NULL, NULL, size );
}
/***********************************************************************
* GetTextExtentPointA (GDI32.@)
*/
BOOL WINAPI GetTextExtentPointA( HDC hdc, LPCSTR str, INT count,
LPSIZE size )
{
TRACE("not bug compatible.\n");
return GetTextExtentPoint32A( hdc, str, count, size );
}
/***********************************************************************
* GetTextExtentPointW (GDI32.@)
*/
BOOL WINAPI GetTextExtentPointW( HDC hdc, LPCWSTR str, INT count,
LPSIZE size )
{
TRACE("not bug compatible.\n");
return GetTextExtentPoint32W( hdc, str, count, size );
}
/***********************************************************************
* GetTextExtentExPointA (GDI32.@)
*/
BOOL WINAPI GetTextExtentExPointA( HDC hdc, LPCSTR str, INT count,
INT maxExt, LPINT lpnFit,
LPINT alpDx, LPSIZE size )
{
BOOL ret;
INT wlen;
INT *walpDx = NULL;
LPWSTR p = NULL;
if (count < 0) return FALSE;
if (maxExt < -1) return FALSE;
if (alpDx)
{
walpDx = HeapAlloc( GetProcessHeap(), 0, count * sizeof(INT) );
if (!walpDx) return FALSE;
}
p = FONT_mbtowc(hdc, str, count, &wlen, NULL);
ret = GetTextExtentExPointW( hdc, p, wlen, maxExt, lpnFit, walpDx, size);
if (walpDx)
{
INT n = lpnFit ? *lpnFit : wlen;
INT i, j;
for(i = 0, j = 0; i < n; i++, j++)
{
alpDx[j] = walpDx[i];
if (IsDBCSLeadByte(str[j])) alpDx[++j] = walpDx[i];
}
}
if (lpnFit) *lpnFit = WideCharToMultiByte(CP_ACP,0,p,*lpnFit,NULL,0,NULL,NULL);
HeapFree( GetProcessHeap(), 0, p );
HeapFree( GetProcessHeap(), 0, walpDx );
return ret;
}
/***********************************************************************
* GetTextExtentExPointW (GDI32.@)
* *
* Return the size of the string as it would be if it was output properly by * Return the size of the string as it would be if it was output properly by
* e.g. TextOut. * e.g. TextOut.
*/ */
BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count, INT max_ext, BOOL WINAPI NtGdiGetTextExtentExW( HDC hdc, const WCHAR *str, INT count, INT max_ext,
LPINT nfit, LPINT dxs, LPSIZE size ) INT *nfit, INT *dxs, SIZE *size, UINT flags )
{ {
DC *dc; DC *dc;
int i; int i;
@ -4987,7 +4789,11 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count, INT max_ext,
} }
} }
ret = get_char_positions( dc, str, count, pos, size );
if (flags)
ret = get_char_positions_indices( dc, str, count, pos, size );
else
ret = get_char_positions( dc, str, count, pos, size );
if (ret) if (ret)
{ {
if (dxs || nfit) if (dxs || nfit)
@ -5902,10 +5708,7 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
{ {
INT *dx = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*dx) ); INT *dx = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*dx) );
if (flags & ETO_GLYPH_INDEX) NtGdiGetTextExtentExW( hdc, str, count, -1, NULL, dx, &sz, !!(flags & ETO_GLYPH_INDEX) );
GetTextExtentExPointI( hdc, str, count, -1, NULL, dx, &sz );
else
GetTextExtentExPointW( hdc, str, count, -1, NULL, dx, &sz );
deltas[0].x = dx[0]; deltas[0].x = dx[0];
deltas[0].y = 0; deltas[0].y = 0;

View File

@ -1088,3 +1088,98 @@ INT WINAPI GetTextFaceW( HDC hdc, INT count, WCHAR *name )
{ {
return NtGdiGetTextFaceW( hdc, count, name, FALSE ); return NtGdiGetTextFaceW( hdc, count, name, FALSE );
} }
/***********************************************************************
* GetTextExtentExPointW (GDI32.@)
*/
BOOL WINAPI GetTextExtentExPointW( HDC hdc, const WCHAR *str, INT count, INT max_ext,
INT *nfit, INT *dxs, SIZE *size )
{
return NtGdiGetTextExtentExW( hdc, str, count, max_ext, nfit, dxs, size, 0 );
}
/***********************************************************************
* GetTextExtentExPointI (GDI32.@)
*/
BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT max_ext,
INT *nfit, INT *dxs, SIZE *size )
{
return NtGdiGetTextExtentExW( hdc, indices, count, max_ext, nfit, dxs, size, 1 );
}
/***********************************************************************
* GetTextExtentExPointA (GDI32.@)
*/
BOOL WINAPI GetTextExtentExPointA( HDC hdc, const char *str, INT count, INT max_ext,
INT *nfit, INT *dxs, SIZE *size )
{
BOOL ret;
INT wlen;
INT *wdxs = NULL;
WCHAR *p = NULL;
if (count < 0 || max_ext < -1) return FALSE;
if (dxs)
{
wdxs = HeapAlloc( GetProcessHeap(), 0, count * sizeof(INT) );
if (!wdxs) return FALSE;
}
p = text_mbtowc( hdc, str, count, &wlen, NULL );
ret = GetTextExtentExPointW( hdc, p, wlen, max_ext, nfit, wdxs, size );
if (wdxs)
{
INT n = nfit ? *nfit : wlen;
INT i, j;
for (i = 0, j = 0; i < n; i++, j++)
{
dxs[j] = wdxs[i];
if (IsDBCSLeadByte( str[j] )) dxs[++j] = wdxs[i];
}
}
if (nfit) *nfit = WideCharToMultiByte( CP_ACP, 0, p, *nfit, NULL, 0, NULL, NULL );
HeapFree( GetProcessHeap(), 0, p );
HeapFree( GetProcessHeap(), 0, wdxs );
return ret;
}
/***********************************************************************
* GetTextExtentPoint32W (GDI32.@)
*/
BOOL WINAPI GetTextExtentPoint32W( HDC hdc, const WCHAR *str, INT count, SIZE *size )
{
return GetTextExtentExPointW( hdc, str, count, 0, NULL, NULL, size );
}
/***********************************************************************
* GetTextExtentPoint32A (GDI32.@)
*/
BOOL WINAPI GetTextExtentPoint32A( HDC hdc, const char *str, INT count, SIZE *size )
{
return GetTextExtentExPointA( hdc, str, count, 0, NULL, NULL, size );
}
/***********************************************************************
* GetTextExtentPointI (GDI32.@)
*/
BOOL WINAPI GetTextExtentPointI( HDC hdc, const WORD *indices, INT count, SIZE *size )
{
return GetTextExtentExPointI( hdc, indices, count, 0, NULL, NULL, size );
}
/***********************************************************************
* GetTextExtentPointA (GDI32.@)
*/
BOOL WINAPI GetTextExtentPointA( HDC hdc, const char *str, INT count, SIZE *size )
{
return GetTextExtentPoint32A( hdc, str, count, size );
}
/***********************************************************************
* GetTextExtentPointW (GDI32.@)
*/
BOOL WINAPI GetTextExtentPointW( HDC hdc, const WCHAR *str, INT count, SIZE *size )
{
return GetTextExtentPoint32W( hdc, str, count, size );
}

View File

@ -238,8 +238,10 @@ DWORD WINAPI NtGdiGetRegionData( HRGN hrgn, DWORD count, RGNDATA *data );
INT WINAPI NtGdiGetRgnBox( HRGN hrgn, RECT *rect ); INT WINAPI NtGdiGetRgnBox( HRGN hrgn, RECT *rect );
UINT WINAPI NtGdiGetSystemPaletteUse( HDC hdc ); UINT WINAPI NtGdiGetSystemPaletteUse( HDC hdc );
UINT WINAPI NtGdiGetTextCharsetInfo( HDC hdc, FONTSIGNATURE *fs, DWORD flags ); UINT WINAPI NtGdiGetTextCharsetInfo( HDC hdc, FONTSIGNATURE *fs, DWORD flags );
BOOL WINAPI NtGdiGetTextExtentExW( HDC hdc, const WCHAR *str, INT count, INT max_ext,
INT *nfit, INT *dxs, SIZE *size, UINT flags );
INT WINAPI NtGdiGetTextFaceW( HDC hdc, INT count, WCHAR *name, BOOL alias_name ); INT WINAPI NtGdiGetTextFaceW( HDC hdc, INT count, WCHAR *name, BOOL alias_name );
BOOL WINAPI NtGdiGetTextMetricsW( HDC hdc, TEXTMETRICW *metrics ); BOOL WINAPI NtGdiGetTextMetricsW( HDC hdc, TEXTMETRICW *metrics, ULONG flags );
BOOL WINAPI NtGdiGetTransform( HDC hdc, DWORD which, XFORM *xform ); BOOL WINAPI NtGdiGetTransform( HDC hdc, DWORD which, XFORM *xform );
BOOL WINAPI NtGdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert, BOOL WINAPI NtGdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
void *grad_array, ULONG ngrad, ULONG mode ); void *grad_array, ULONG ngrad, ULONG mode );