On 11/13/14 2:56 PM, Sergey Bylokhov wrote:
Hi, Jim

Please revert all "iff => if" changes in Region - those are not typos.

ok

Hand-coding would require adding a bunch of code for clipping, though
it might be faster still by avoiding all of the "are we on a new row?"
testing in appendSpan/endRow().

Looks like we get a big drawimage performance improvement from the previous fix 
- 30%(which is 10000% for the current jdk code) So I will try to go deeper and 
eliminate the call to appendSpan()/endRow.


Why does line 272 add "+1" for ?endIndex?  Other places simply use
"#rows * 5".

This is because of needSpace() implementation:
private void needSpace(int num) {
     if (endIndex + num >= bands.length) { }
If we have only one row then we need 5 bytes and num will be 5 => equal to the 
bands.length => unnecessary copyArray will occures.
I suppose this is because endIndex should be a valid index in the bands array.

That is probably a bug. That should probably be just ">" since I don't see anywhere where we ever place anything in that last entry.

Other places in the code use the "clipAdd" and "dimAdd" methods to
avoid
overflow.  In this particular case we might have overflow for
box[0-3].
   On the other hand, since appendSpan() clips against the bounds we'd

resulting spans to be missing or incorrect (though it will never
exceed
the indicated bounding box even with overflow occuring)".

I do not clip edges intentionally, because I trust the output of 
TransformHelper, which I assume should validate possible overflow. I'll update 
a javadoc.

Exactly, this falls more under the realm of "we're creating a new API and even though it is only currently used by TransformHelper and we know how that works, we should consider that this API might get re-used in the future in other cases". As I said, this code ensures that the Region is valid, it just might produce unexpected (i.e. incorrect) results if we ever overflow. TransformHelper is unlikely to ever produce values that are much outside of the 0-<couple thousand> range since it only generates drawable-bounded coordinates so we should be very far from overflow, though what if someone creates a BufferedImage that is 1<<30 in dimensions (with the 64-bit VM and a lot of RAM)?

                        ...jim

Reply via email to