DPtoLP needs to round the result.
Fixed MulDiv to deal better with negative numbers.
diff --git a/include/gdi.h b/include/gdi.h
index da3a578..86ceca6 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -402,24 +402,24 @@
}
#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) \
- (((y)-(dc)->vportOrgY) * (dc)->wndExtY / (dc)->vportExtY+(dc)->wndOrgY)
+ (MulDiv(((y)-(dc)->vportOrgY), (dc)->wndExtY, (dc)->vportExtY) + (dc)->wndOrgY)
#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) \
- (((y)-(dc)->wndOrgY) * (dc)->vportExtY / (dc)->wndExtY+(dc)->vportOrgY)
+ (MulDiv(((y)-(dc)->wndOrgY), (dc)->vportExtY, (dc)->wndExtY) + (dc)->vportOrgY)
/* Device <-> logical size conversion */
#define XDSTOLS(dc,x) \
- ((x) * (dc)->wndExtX / (dc)->vportExtX)
+ MulDiv((x), (dc)->wndExtX, (dc)->vportExtX)
#define YDSTOLS(dc,y) \
- ((y) * (dc)->wndExtY / (dc)->vportExtY)
+ MulDiv((y), (dc)->wndExtY, (dc)->vportExtY)
#define XLSTODS(dc,x) \
- ((x) * (dc)->vportExtX / (dc)->wndExtX)
+ MulDiv((x), (dc)->vportExtX, (dc)->wndExtX)
#define YLSTODS(dc,y) \
- ((y) * (dc)->vportExtY / (dc)->wndExtY)
+ MulDiv((y), (dc)->vportExtY, (dc)->wndExtY)
/* GDI local heap */
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 70a7231..c48e050 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -1029,13 +1029,42 @@
) {
#if (SIZEOF_LONG_LONG >= 8)
long long ret;
+
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;
return ret;
#else
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
}
/*******************************************************************