Skip to content

Commit

Permalink
Upstream Patch - windowscodecs: BitmapScaler_CopyPixels: Do not deman…
Browse files Browse the repository at this point in the history
…d a larger buffer than necessary.

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 <[email protected]>
Signed-off-by: Esme Povirk <[email protected]>
Signed-off-by: Alexandre Julliard <[email protected]>
(cherry picked from commit cdb9a27)

Fix for the black texture problem in BeamNG.drive.

Link: ValveSoftware/wine#160
  • Loading branch information
IsaacMarovitz committed Sep 19, 2024
1 parent cc25700 commit f32b9f0
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 6 deletions.
2 changes: 1 addition & 1 deletion dlls/windowscodecs/scaler.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
13 changes: 8 additions & 5 deletions dlls/windowscodecs/tests/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -1243,28 +1243,28 @@ 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);

hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 4,
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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f32b9f0

Please sign in to comment.