http://bugs.winehq.org/show_bug.cgi?id=421
--- Comment #373 from Ed Kolis edkolis@gmail.com 2010-05-26 10:17:09 --- (In reply to comment #372)
(In reply to comment #370)
Ok, I have take a look at your screen shots. The 1pixel error must come from center/radius calculation but I simply do : LONG a = (right - left) / 2.0; LONG b = (bottom - top) / 2.0; LONG cx = (right + left) / 2.0; LONG cy = (bottom + top) / 2.0;
So maybe, I have to use a cast somewhere because right, left, bottom and top are integer...
Pardon me if I'm wrong but wouldn't 2.0 be a float? That would cause two implicit casts which could cause the rounding issue.
Assuming type conversion and order of operations work similarly in C/C++ as it does in C#, then if right and left are ints,
long a = (right - left) / 2.0;
would be equivalent to
long a = (long)((double)(right - left) / 2.0);
So first you subtract left from right, then cast that to a double, divide by 2.0, and finally cast THAT to a long. There would be two implicit casts (int=>double and double=>long), but only the latter would potentially cause rounding error.
Actually, it would not cause rounding error; it would cause truncation error, unless your LONG type's implicit cast operator from double is set up to call a rounding function, since IIRC the default behavior of downcasting like that is to truncate... perhaps the issue is actually the fact that you're not calling a rounding function?