[PATCH 4/5] d3dx9: Implement ID3DXFont_PreloadText.
Matteo Bruni
matteo.mystral at gmail.com
Thu Feb 27 06:02:42 CST 2020
On Wed, Feb 26, 2020 at 12:10 PM Sven Baars <sbaars at codeweavers.com> wrote:
>
> Based on a patch by Tony Wasserka.
>
> Signed-off-by: Sven Baars <sbaars at codeweavers.com>
> ---
> dlls/d3dx9_36/font.c | 48 ++++++++++++++++++++++++++++++++++----
> dlls/d3dx9_36/tests/core.c | 2 --
> 2 files changed, 44 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/d3dx9_36/font.c b/dlls/d3dx9_36/font.c
> index 00ba068f8e..44bd08a9fb 100644
> --- a/dlls/d3dx9_36/font.c
> +++ b/dlls/d3dx9_36/font.c
> @@ -409,14 +409,54 @@ static HRESULT WINAPI ID3DXFontImpl_PreloadGlyphs(ID3DXFont *iface, UINT first,
>
> static HRESULT WINAPI ID3DXFontImpl_PreloadTextA(ID3DXFont *iface, const char *string, INT count)
> {
> - FIXME("iface %p, string %s, count %d stub!\n", iface, debugstr_a(string), count);
> - return E_NOTIMPL;
> + WCHAR *wstr;
> + HRESULT hr;
> + INT countW;
> +
> + TRACE("iface %p, string %s, count %d\n", iface, debugstr_a(string), count);
> +
> + if (!string && count == 0) return D3D_OK;
> + if (!string) return D3DERR_INVALIDCALL;
> +
> + countW = MultiByteToWideChar(CP_ACP, 0, string, count < 0 ? -1 : count, NULL, 0);
> +
> + wstr = heap_alloc(countW * sizeof(WCHAR));
> + if (!wstr)
> + return E_OUTOFMEMORY;
> +
> + MultiByteToWideChar(CP_ACP, 0, string, count < 0 ? -1 : count, wstr, countW);
> +
> + hr = ID3DXFont_PreloadTextW(iface, wstr, count);
> +
> + heap_free(wstr);
> +
> + return hr;
> }
>
> static HRESULT WINAPI ID3DXFontImpl_PreloadTextW(ID3DXFont *iface, const WCHAR *string, INT count)
> {
> - FIXME("iface %p, string %s, count %d stub!\n", iface, debugstr_w(string), count);
> - return E_NOTIMPL;
> + struct d3dx_font *font = impl_from_ID3DXFont(iface);
> + WORD *indices;
> + UINT i;
> +
> + TRACE("iface %p, string %s, count %d\n", iface, debugstr_w(string), count);
> +
> + if (!string && count == 0) return D3D_OK;
> + if (!string) return D3DERR_INVALIDCALL;
> + if (count < 0) count = lstrlenW(string);
> +
> + indices = heap_alloc(count * sizeof(WORD));
> + if (!indices)
> + return E_OUTOFMEMORY;
> +
> + GetGlyphIndicesW(font->hdc, string, count, indices, 0);
> +
> + for (i = 0; i < count; ++i)
> + ID3DXFont_PreloadGlyphs(iface, indices[i], indices[i]);
> +
> + heap_free(indices);
> +
> + return D3D_OK;
> }
>
> static INT WINAPI ID3DXFontImpl_DrawTextA(ID3DXFont *iface, ID3DXSprite *sprite,
> diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
> index b8e680d1c5..662483b687 100644
> --- a/dlls/d3dx9_36/tests/core.c
> +++ b/dlls/d3dx9_36/tests/core.c
> @@ -504,7 +504,6 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
> DEFAULT_QUALITY, DEFAULT_PITCH, "Tahoma", &font);
> ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
>
> - todo_wine {
> hr = ID3DXFont_PreloadTextA(font, NULL, -1);
> ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
> hr = ID3DXFont_PreloadTextA(font, NULL, 0);
> @@ -530,7 +529,6 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
> ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
> hr = ID3DXFont_PreloadTextW(font, L"", -1);
> ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
> - }
>
> check_release((IUnknown*)font, 0);
>
> --
> 2.24.0
Hi Sven,
this patch (like the others) needs to be updated to the current d3d
style: no INT / UINT (or otherwise Windows-specific) local variable
types when there is no particular reason, period at the end of trace
messages, body of a single instruction if on the next line, use
sizeof(*var) in heap_alloc() instead of sizeof(type).
More information about the wine-devel
mailing list