[OpenJDK 2D-Dev] [9] Review Request: 8059942 Default implementation of DrawImage.renderImageXform() should be improved for d3d/ogl
Sergey Bylokhov
sergey.bylokhov at oracle.com
Fri Nov 14 14:40:01 UTC 2014
Hi, Jim.
Please review an updated version of the fix:
http://cr.openjdk.java.net/~serb/8059942/webrev.17
Two notes:
- one additional byte still is added to the bands, since I am still checking the code where we use endIndex-1/endIndex+1/endIndex++ or swap it with curYrow, etc. This isn't urgent.
- "end < bands.length" was added to the loop for the reason of overall loop performance(+15%).
----- james.graham at oracle.com wrote:
> 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
More information about the 2d-dev
mailing list