Hi Jim, > I think the shape iterators used in the other pipelines (which should be > visible as it was code that we wrote, even if it isn't used for Pisces) > took a more flexible approach, testing each segment for NaN and overflow > and ignoring individual segments until the shape became finite again. > This happens somewhere in the src/share/classes/sun/java2d/pipe classes...
Ah cool. In this case we can implement it quite easily as in the attached patch. Seems the output is 1:1 the same as with the non-free JDK6. /Roman > > ...jim > > Roman Kennke wrote: > > Hi again, > > > >> 3. NotANumberTest: Double.NaN isn't handled gracefully. > > > > The problem here is that the renderer in OpenJDK is originally written > > for ME and uses fixed point arithmetic. I can't think of a quick fix, > > because shapes are processed by iterating over them, this means, by the > > time we hit the NaN, we might already have processed (==rendered) some > > of the shape, but your test seems to suggest that you expect nothing to > > be rendered in this case. The specification doesn't say anything about > > this particular problem (at least I can't find anything). One solution > > would be to pre-check all the incoming shapes for NaN or other invalid > > values (infinity, etc) and not go into the iteration at all. But this > > seems like quite a big overhead to me. We could also make the > > floating->fixed conversion to throw an exception, that we would have to > > catch higher up in the call tree and rollback what has already been > > rendered (which doesn't seem easy either, because in the case of > > strokeTo() this lies outside of the pisces renderer). > > > > /Roman -- Dipl.-Inform. (FH) Roman Kennke, Software Engineer, http://kennke.org aicas Allerton Interworks Computer Automated Systems GmbH Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany http://www.aicas.com * Tel: +49-721-663 968-48 USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe Geschäftsführer: Dr. James J. Hunt
diff --git a/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java b/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java --- a/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java +++ b/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java @@ -236,13 +236,17 @@ while (!pi.isDone()) { switch (pi.currentSegment(coords)) { case PathIterator.SEG_MOVETO: - lsink.moveTo(FloatToS15_16(coords[0]), - FloatToS15_16(coords[1])); + if (coordOk(coords[0]) && coordOk(coords[1])) { + lsink.moveTo(FloatToS15_16(coords[0]), + FloatToS15_16(coords[1])); + } break; case PathIterator.SEG_LINETO: - lsink.lineJoin(); - lsink.lineTo(FloatToS15_16(coords[0]), - FloatToS15_16(coords[1])); + if (coordOk(coords[0]) && coordOk(coords[1])) { + lsink.lineJoin(); + lsink.lineTo(FloatToS15_16(coords[0]), + FloatToS15_16(coords[1])); + } break; case PathIterator.SEG_CLOSE: lsink.close(); @@ -253,6 +257,10 @@ pi.next(); } lsink.end(); + } + + private boolean coordOk(float coord) { + return (! Float.isNaN(coord)) && (! Float.isInfinite(coord)); } /**