Note: typeof (int * unsigned) is unsigned. So: - on 64bit CPUs, where sizeof(int) = 4 < sizeof(void*) = 8, - when the result of the multiplication is supposed to be negative - there's no progation of the negative sign from 32bit to 64 bit integers
Fixes a crash in Age of Empire II.
Signed-off-by: Eric Pouech epouech@codeweavers.com
-- v2: evr: Fix incorrect integral computation.
From: Eric Pouech epouech@codeweavers.com
Note: typeof (int * unsigned) is unsigned. So: - on 64bit CPUs, where sizeof(int) = 4 < sizeof(void*) = 8, - when the result of the multiplication is supposed to be negative - there's no progation of the negative sign from 32bit to 64 bit integers
Fixes a crash in Age of Empire II.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/evr/evr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c index 26a2a3a1eb5..803c1d2dff9 100644 --- a/dlls/evr/evr.c +++ b/dlls/evr/evr.c @@ -382,7 +382,7 @@ static HRESULT evr_copy_sample_buffer(struct evr *filter, IMediaSample *input_sa { if (SUCCEEDED(hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, D3DLOCK_DISCARD))) { - if (src_stride < 0) src -= src_stride * (lines - 1); + if (src_stride < 0) src += (-src_stride) * (lines - 1); MFCopyImage(locked_rect.pBits, locked_rect.Pitch, src, src_stride, width * 4, lines); IDirect3DSurface9_UnlockRect(surface); }
On Wed May 3 07:00:46 2023 +0000, Alexandre Julliard wrote:
one could event prefer adding a positive integer to subtracting a
negative one:
if (src_stride < 0) src += (-src_stride) * (lines - 1);
which I find more readable to show to intent to walk the image
starting from last line in memory order Yes, that's definitely better.
V2 pushed with that change instead
This merge request was approved by Nikolay Sivov.