It's also difficult to contribute. Because of the one-commit-per-release strategy, Pull Requests aren't accepted (though the changes normally end up in the next release).
I've had a one-line bug-fix pull request rejected with the answer of something like "that's fixed in version 2". Well, I'm glad it's fixed in v2, but now I have to maintain my own fork until v2 is released and is stable enough for production use.
I have massive respect for Dmitry's pure abilities and the library as a whole, but trying to contribute is pretty frustrating.
He does. Also, he doesn't like contributions that much because most of the contributions he gets are (his words) "bad". Dmitry is ultra talented, but some of his opinions are bound to shock a few developers. If interested, see this interview with him on The Changelog:
• New transformation API and implementation, dramatically faster and flexible (full support for matrix transformations)
• New animation API extension
• Fix for subpixel rendering in IE
• New arrowhead attributes
• Improved getBBox calculation
• Fix for HSB and HSL
• Added viewBox support
• New built-in event system
• and lots of tiny bug fixes
Bitwise operations coerce the value to a int32. If a value cannot be reasonably coerced to an int (e.g. 'foo'), you get zero. It's basically the same as parseInt(x,10) but is generally faster, you don't need to remember the radix, and you don't get NaN. The downside is that trying to coerce numbers outside int32 will give incorrect answers.
The other way to write it is 0|num which has the advantage of only applying one bitwise op.
These tend to crop up most often in graphics oriented libraries.
You'd have to bench it, but the only thing I could think of that'd be faster is the standard +num coercion that's also used in the code snippet. Unfortunately, that does generate NaNs.
Edit: Double checked the spec (it's quite readable) and the main difference is that + will coerce ignoring whitespace while parseFloat will ignore leading whitespace and parse leading digits. E.g. var x = '1.23foo'; parseFloat(x) is 1.23; +x is NaN. Neither looks like it should be faster than the other.
If num is an integer, it returns num + 0.5; otherwise it just returns num. I don't see why this is called 'round' or why it would be particularly useful behavior, so it's probably a bug.
I'm pretty sure it's to work around a difference in SVG and VML. In SVG, a one-pixel line rendered at an integral coordinate (like x=1) will render half-half on either side of that value, resulting in a blurry two-pixel-wide line. VML renders a one-pixel line in this case, automatically colouring the pixel(s) between x=1 and x=2.
Raphaël adds 0.5 to the values in SVG in order to make one-pixel-wide lines render as a single pixel instead of two.