Commit cdb9a274 authored by Joachim Priesner's avatar Joachim Priesner Committed by Alexandre Julliard

windowscodecs: BitmapScaler_CopyPixels: Do not demand a larger buffer than necessary.

Only `bytesperrow` bytes are written to each row of the output rect. Therefore the last row need not be padded to `cbStride` bytes. Signed-off-by: 's avatarJoachim Priesner <joachim.priesner@web.de> Signed-off-by: 's avatarEsme Povirk <esme@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 38e3f3f3
...@@ -251,7 +251,7 @@ static HRESULT WINAPI BitmapScaler_CopyPixels(IWICBitmapScaler *iface, ...@@ -251,7 +251,7 @@ static HRESULT WINAPI BitmapScaler_CopyPixels(IWICBitmapScaler *iface,
goto end; goto end;
} }
if ((cbStride * dest_rect.Height) > cbBufferSize) if (cbStride * (dest_rect.Height - 1) + bytesperrow > cbBufferSize)
{ {
hr = E_INVALIDARG; hr = E_INVALIDARG;
goto end; goto end;
......
...@@ -1151,7 +1151,7 @@ static void test_bitmap_scaler(void) ...@@ -1151,7 +1151,7 @@ static void test_bitmap_scaler(void)
double res_x, res_y; double res_x, res_y;
IWICBitmap *bitmap; IWICBitmap *bitmap;
UINT width, height; UINT width, height;
BYTE buf[16]; BYTE buf[93]; /* capable of holding a 7*4px, 24bpp image with stride 24 -> buffer size = 3*24+21 */
HRESULT hr; HRESULT hr;
hr = IWICImagingFactory_CreateBitmap(factory, 4, 2, &GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnLoad, &bitmap); hr = IWICImagingFactory_CreateBitmap(factory, 4, 2, &GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnLoad, &bitmap);
...@@ -1243,7 +1243,7 @@ static void test_bitmap_scaler(void) ...@@ -1243,7 +1243,7 @@ static void test_bitmap_scaler(void)
WICBitmapInterpolationModeNearestNeighbor); WICBitmapInterpolationModeNearestNeighbor);
ok(hr == E_INVALIDARG, "Failed to initialize bitmap scaler, hr %#lx.\n", hr); ok(hr == E_INVALIDARG, "Failed to initialize bitmap scaler, hr %#lx.\n", hr);
hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4, hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 7, 4,
WICBitmapInterpolationModeNearestNeighbor); WICBitmapInterpolationModeNearestNeighbor);
ok(hr == S_OK, "Failed to initialize bitmap scaler, hr %#lx.\n", hr); ok(hr == S_OK, "Failed to initialize bitmap scaler, hr %#lx.\n", hr);
...@@ -1251,20 +1251,20 @@ static void test_bitmap_scaler(void) ...@@ -1251,20 +1251,20 @@ static void test_bitmap_scaler(void)
WICBitmapInterpolationModeNearestNeighbor); WICBitmapInterpolationModeNearestNeighbor);
ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 0, hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 7, 0,
WICBitmapInterpolationModeNearestNeighbor); WICBitmapInterpolationModeNearestNeighbor);
ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4, WICBitmapInterpolationModeNearestNeighbor); hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4, WICBitmapInterpolationModeNearestNeighbor);
ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4, hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 7, 4,
WICBitmapInterpolationModeNearestNeighbor); WICBitmapInterpolationModeNearestNeighbor);
ok(hr == WINCODEC_ERR_WRONGSTATE, "Unexpected hr %#lx.\n", hr); ok(hr == WINCODEC_ERR_WRONGSTATE, "Unexpected hr %#lx.\n", hr);
hr = IWICBitmapScaler_GetSize(scaler, &width, &height); hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
ok(hr == S_OK, "Failed to get scaler size, hr %#lx.\n", hr); ok(hr == S_OK, "Failed to get scaler size, hr %#lx.\n", hr);
ok(width == 8, "Unexpected width %u.\n", width); ok(width == 7, "Unexpected width %u.\n", width);
ok(height == 4, "Unexpected height %u.\n", height); ok(height == 4, "Unexpected height %u.\n", height);
hr = IWICBitmapScaler_GetSize(scaler, NULL, &height); hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
...@@ -1307,6 +1307,9 @@ static void test_bitmap_scaler(void) ...@@ -1307,6 +1307,9 @@ static void test_bitmap_scaler(void)
ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "Unexpected hr %#lx.\n", hr); ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "Unexpected hr %#lx.\n", hr);
IWICPalette_Release(palette); IWICPalette_Release(palette);
hr = IWICBitmapScaler_CopyPixels(scaler, NULL, /*cbStride=*/24, sizeof(buf), buf);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IWICBitmapScaler_Release(scaler); IWICBitmapScaler_Release(scaler);
IWICBitmap_Release(bitmap); IWICBitmap_Release(bitmap);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment