DPtoLP needs to round the result.
Fixed MulDiv to deal better with negative numbers.
This commit is contained in:
parent
d3d2477014
commit
ec09a400a7
|
@ -402,24 +402,24 @@ static inline void WINE_UNUSED INTERNAL_LPTODP(DC *dc, LPPOINT point)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define XDPTOLP(dc,x) \
|
#define XDPTOLP(dc,x) \
|
||||||
(((x)-(dc)->vportOrgX) * (dc)->wndExtX / (dc)->vportExtX+(dc)->wndOrgX)
|
(MulDiv(((x)-(dc)->vportOrgX), (dc)->wndExtX, (dc)->vportExtX) + (dc)->wndOrgX)
|
||||||
#define YDPTOLP(dc,y) \
|
#define YDPTOLP(dc,y) \
|
||||||
(((y)-(dc)->vportOrgY) * (dc)->wndExtY / (dc)->vportExtY+(dc)->wndOrgY)
|
(MulDiv(((y)-(dc)->vportOrgY), (dc)->wndExtY, (dc)->vportExtY) + (dc)->wndOrgY)
|
||||||
#define XLPTODP(dc,x) \
|
#define XLPTODP(dc,x) \
|
||||||
(((x)-(dc)->wndOrgX) * (dc)->vportExtX / (dc)->wndExtX+(dc)->vportOrgX)
|
(MulDiv(((x)-(dc)->wndOrgX), (dc)->vportExtX, (dc)->wndExtX) + (dc)->vportOrgX)
|
||||||
#define YLPTODP(dc,y) \
|
#define YLPTODP(dc,y) \
|
||||||
(((y)-(dc)->wndOrgY) * (dc)->vportExtY / (dc)->wndExtY+(dc)->vportOrgY)
|
(MulDiv(((y)-(dc)->wndOrgY), (dc)->vportExtY, (dc)->wndExtY) + (dc)->vportOrgY)
|
||||||
|
|
||||||
/* Device <-> logical size conversion */
|
/* Device <-> logical size conversion */
|
||||||
|
|
||||||
#define XDSTOLS(dc,x) \
|
#define XDSTOLS(dc,x) \
|
||||||
((x) * (dc)->wndExtX / (dc)->vportExtX)
|
MulDiv((x), (dc)->wndExtX, (dc)->vportExtX)
|
||||||
#define YDSTOLS(dc,y) \
|
#define YDSTOLS(dc,y) \
|
||||||
((y) * (dc)->wndExtY / (dc)->vportExtY)
|
MulDiv((y), (dc)->wndExtY, (dc)->vportExtY)
|
||||||
#define XLSTODS(dc,x) \
|
#define XLSTODS(dc,x) \
|
||||||
((x) * (dc)->vportExtX / (dc)->wndExtX)
|
MulDiv((x), (dc)->vportExtX, (dc)->wndExtX)
|
||||||
#define YLSTODS(dc,y) \
|
#define YLSTODS(dc,y) \
|
||||||
((y) * (dc)->vportExtY / (dc)->wndExtY)
|
MulDiv((y), (dc)->vportExtY, (dc)->wndExtY)
|
||||||
|
|
||||||
/* GDI local heap */
|
/* GDI local heap */
|
||||||
|
|
||||||
|
|
|
@ -1029,13 +1029,42 @@ INT WINAPI MulDiv(
|
||||||
) {
|
) {
|
||||||
#if (SIZEOF_LONG_LONG >= 8)
|
#if (SIZEOF_LONG_LONG >= 8)
|
||||||
long long ret;
|
long long ret;
|
||||||
|
|
||||||
if (!nDivisor) return -1;
|
if (!nDivisor) return -1;
|
||||||
ret = (((long long)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
|
||||||
|
/* We want to deal with a positive divisor to simplify the logic. */
|
||||||
|
if (nDivisor < 0)
|
||||||
|
{
|
||||||
|
nMultiplicand = - nMultiplicand;
|
||||||
|
nDivisor = -nDivisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the result is positive, we "add" to round. else, we subtract to round. */
|
||||||
|
if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
|
||||||
|
( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
|
||||||
|
ret = (((long long)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
||||||
|
else
|
||||||
|
ret = (((long long)nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
if ((ret > 2147483647) || (ret < -2147483647)) return -1;
|
if ((ret > 2147483647) || (ret < -2147483647)) return -1;
|
||||||
return ret;
|
return ret;
|
||||||
#else
|
#else
|
||||||
if (!nDivisor) return -1;
|
if (!nDivisor) return -1;
|
||||||
return ((nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
|
||||||
|
/* We want to deal with a positive divisor to simplify the logic. */
|
||||||
|
if (nDivisor < 0)
|
||||||
|
{
|
||||||
|
nMultiplicand = - nMultiplicand;
|
||||||
|
nDivisor = -nDivisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the result is positive, we "add" to round. else, we subtract to round. */
|
||||||
|
if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
|
||||||
|
( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
|
||||||
|
return ((nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
|
return ((nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
|
|
Loading…
Reference in New Issue