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

Alexandre Julliard julliard at winehq.org
Wed Apr 27 16:12:13 CDT 2022


Module: wine
Branch: master
Commit: cdb9a2748ba62891bfcd342cb3da82c204f896d2
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cdb9a2748ba62891bfcd342cb3da82c204f896d2

Author: Joachim Priesner <joachim.priesner at web.de>
Date:   Tue Apr 26 19:16:15 2022 +0200

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: Joachim Priesner <joachim.priesner at web.de>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/windowscodecs/scaler.c       |  2 +-
 dlls/windowscodecs/tests/bitmap.c | 13 ++++++++-----
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/dlls/windowscodecs/scaler.c b/dlls/windowscodecs/scaler.c
index f8f81c0a990..c31aac79861 100644
--- a/dlls/windowscodecs/scaler.c
+++ b/dlls/windowscodecs/scaler.c
@@ -251,7 +251,7 @@ static HRESULT WINAPI BitmapScaler_CopyPixels(IWICBitmapScaler *iface,
         goto end;
     }
 
-    if ((cbStride * dest_rect.Height) > cbBufferSize)
+    if (cbStride * (dest_rect.Height - 1) + bytesperrow > cbBufferSize)
     {
         hr = E_INVALIDARG;
         goto end;
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index 0d0d27e2707..3ddd3bbdbae 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -1151,7 +1151,7 @@ static void test_bitmap_scaler(void)
     double res_x, res_y;
     IWICBitmap *bitmap;
     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;
 
     hr = IWICImagingFactory_CreateBitmap(factory, 4, 2, &GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnLoad, &bitmap);
@@ -1243,7 +1243,7 @@ static void test_bitmap_scaler(void)
         WICBitmapInterpolationModeNearestNeighbor);
     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);
     ok(hr == S_OK, "Failed to initialize bitmap scaler, hr %#lx.\n", hr);
 
@@ -1251,20 +1251,20 @@ static void test_bitmap_scaler(void)
         WICBitmapInterpolationModeNearestNeighbor);
     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);
     ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
 
     hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4, WICBitmapInterpolationModeNearestNeighbor);
     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);
     ok(hr == WINCODEC_ERR_WRONGSTATE, "Unexpected hr %#lx.\n", hr);
 
     hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
     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);
 
     hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
@@ -1307,6 +1307,9 @@ static void test_bitmap_scaler(void)
     ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "Unexpected hr %#lx.\n", hr);
     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);
 
     IWICBitmap_Release(bitmap);




More information about the wine-cvs mailing list