[PATCH 5/6] windowscodecs: Implement CommonEncoderFrame_GetMetadataQueryWriter().

Paul Gofman pgofman at codeweavers.com
Wed Jan 27 13:24:47 CST 2021


Forgot to mention, this fixes saving screenshots in Fallout 76 (this one
also crashes at character creation otherwise) and Path of Exile.

On 1/27/21 20:33, Paul Gofman wrote:
> Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
> ---
>  dlls/windowscodecs/encoder.c        | 16 ++++++++++++++--
>  dlls/windowscodecs/gifformat.c      | 13 +++++++++++--
>  dlls/windowscodecs/tests/metadata.c |  8 +++-----
>  3 files changed, 28 insertions(+), 9 deletions(-)
>
> diff --git a/dlls/windowscodecs/encoder.c b/dlls/windowscodecs/encoder.c
> index e72ceb0735c..a213e7d14d0 100644
> --- a/dlls/windowscodecs/encoder.c
> +++ b/dlls/windowscodecs/encoder.c
> @@ -467,8 +467,20 @@ static HRESULT WINAPI CommonEncoderFrame_Commit(IWICBitmapFrameEncode *iface)
>  static HRESULT WINAPI CommonEncoderFrame_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface,
>      IWICMetadataQueryWriter **ppIMetadataQueryWriter)
>  {
> -    FIXME("(%p, %p): stub\n", iface, ppIMetadataQueryWriter);
> -    return E_NOTIMPL;
> +    CommonEncoderFrame *encoder = impl_from_IWICBitmapFrameEncode(iface);
> +
> +    TRACE("iface, %p, ppIMetadataQueryWriter %p.\n", iface, ppIMetadataQueryWriter);
> +
> +    if (!ppIMetadataQueryWriter)
> +        return E_INVALIDARG;
> +
> +    if (!encoder->initialized)
> +        return WINCODEC_ERR_NOTINITIALIZED;
> +
> +    if (!(encoder->parent->encoder_info.flags & ENCODER_FLAGS_SUPPORTS_METADATA))
> +        return WINCODEC_ERR_UNSUPPORTEDOPERATION;
> +
> +    return MetadataQueryWriter_CreateInstance(&encoder->IWICMetadataBlockWriter_iface, NULL, ppIMetadataQueryWriter);
>  }
>  
>  static const IWICBitmapFrameEncodeVtbl CommonEncoderFrame_Vtbl = {
> diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
> index c807a7ee7db..53aeaec7e8d 100644
> --- a/dlls/windowscodecs/gifformat.c
> +++ b/dlls/windowscodecs/gifformat.c
> @@ -2117,8 +2117,17 @@ static HRESULT WINAPI GifFrameEncode_Commit(IWICBitmapFrameEncode *iface)
>  
>  static HRESULT WINAPI GifFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface, IWICMetadataQueryWriter **writer)
>  {
> -    FIXME("%p, %p: stub\n", iface, writer);
> -    return E_NOTIMPL;
> +    GifFrameEncode *encode = impl_from_IWICBitmapFrameEncode(iface);
> +
> +    TRACE("iface, %p, writer %p.\n", iface, writer);
> +
> +    if (!writer)
> +        return E_INVALIDARG;
> +
> +    if (!encode->initialized)
> +        return WINCODEC_ERR_NOTINITIALIZED;
> +
> +    return MetadataQueryWriter_CreateInstance(&encode->IWICMetadataBlockWriter_iface, NULL, writer);
>  }
>  
>  static const IWICBitmapFrameEncodeVtbl GifFrameEncode_Vtbl =
> diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
> index aaa733380fa..c1339e4bd1d 100644
> --- a/dlls/windowscodecs/tests/metadata.c
> +++ b/dlls/windowscodecs/tests/metadata.c
> @@ -3106,8 +3106,7 @@ static void test_metadata_writer(void)
>          ok(hr == (tests[i].metadata_supported ? S_OK : E_INVALIDARG), "Got unexpected hr %#x, i %u.\n", hr, i);
>  
>          hr = IWICBitmapFrameEncode_GetMetadataQueryWriter(frameencode, &querywriter2);
> -        todo_wine
> -        ok(hr == (tests[i].succeeds_unitialized ? S_OK : WINCODEC_ERR_NOTINITIALIZED),
> +        todo_wine_if(!i) ok(hr == (tests[i].succeeds_unitialized ? S_OK : WINCODEC_ERR_NOTINITIALIZED),
>                  "Got unexpected hr %#x, i %u.\n", hr, i);
>          if (hr == S_OK)
>              IWICMetadataQueryWriter_Release(querywriter2);
> @@ -3116,7 +3115,7 @@ static void test_metadata_writer(void)
>          ok(hr == S_OK, "Got unexpected hr %#x, i %u.\n", hr, i);
>  
>          hr = IWICBitmapFrameEncode_GetMetadataQueryWriter(frameencode, &querywriter2);
> -        todo_wine ok(hr == (tests[i].metadata_supported ? S_OK : WINCODEC_ERR_UNSUPPORTEDOPERATION),
> +        todo_wine_if(!i) ok(hr == (tests[i].metadata_supported ? S_OK : WINCODEC_ERR_UNSUPPORTEDOPERATION),
>                  "Got unexpected hr %#x, i %u.\n", hr, i);
>  
>          if (tests[i].metadata_supported)
> @@ -3126,8 +3125,7 @@ static void test_metadata_writer(void)
>          if (querywriter)
>          {
>              IWICMetadataQueryWriter_Release(querywriter);
> -            if (querywriter2)
> -                IWICMetadataQueryWriter_Release(querywriter2);
> +            IWICMetadataQueryWriter_Release(querywriter2);
>              IWICMetadataBlockWriter_Release(blockwriter);
>          }
>          IWICBitmapFrameEncode_Release(frameencode);





More information about the wine-devel mailing list