Batik терпит неудачу при преобразованиях, начиная с JRE 1.7.0_25

Поскольку я обновился до JRE 1.7.0_25, батик выдает исключения при применении преобразований.

Трассировка стека:

java.awt.image.ImagingOpException: Unable to transform src image
at java.awt.image.AffineTransformOp.filter(Unknown Source)
at org.apache.batik.ext.awt.image.rendered.AffineRed.genRect(AffineRed.java:193)
at org.apache.batik.ext.awt.image.rendered.AffineRed.copyData(AffineRed.java:109)
at org.apache.batik.ext.awt.image.rendered.PadRed.copyData(PadRed.java:88)
at org.apache.batik.ext.awt.image.rendered.PadRed.copyData(PadRed.java:88)
at org.apache.batik.ext.awt.image.rendered.Any2sRGBRed.copyData(Any2sRGBRed.java:166)
at org.apache.batik.ext.awt.image.rendered.AbstractRed.getData(AbstractRed.java:526)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:264)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:455)
at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:549)
at org.apache.batik.gvt.ShapeNode.paint(ShapeNode.java:143)
at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165)
at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:509)
at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165)
at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.genRect(GraphicsNodeRed8Bit.java:140)
at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.copyData(GraphicsNodeRed8Bit.java:116)
at org.apache.batik.ext.awt.image.rendered.PadRed.copyData(PadRed.java:88)
at org.apache.batik.ext.awt.image.rendered.Any2LsRGBRed.copyData(Any2LsRGBRed.java:109)
at org.apache.batik.ext.awt.image.rendered.AbstractRed.getData(AbstractRed.java:526)
at org.apache.batik.ext.awt.image.rendered.CompositeRed.genRect(CompositeRed.java:188)
at org.apache.batik.ext.awt.image.rendered.CompositeRed.copyData(CompositeRed.java:139)
at org.apache.batik.ext.awt.image.rendered.Any2sRGBRed.copyData(Any2sRGBRed.java:166)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:347)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:455)
at org.apache.batik.ext.awt.image.renderable.PadRable8Bit.paintRable(PadRable8Bit.java:135)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:440)
at org.apache.batik.ext.awt.image.renderable.PadRable8Bit.paintRable(PadRable8Bit.java:135)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:440)
at org.apache.batik.ext.awt.image.renderable.FilterChainRable8Bit.paintRable(FilterChainRable8Bit.java:251)
at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(GraphicsUtil.java:440)
at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:549)
at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165)
at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:509)
at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165)
at org.apache.batik.gvt.CanvasGraphicsNode.primitivePaint(CanvasGraphicsNode.java:159)
at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:509)
at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165)
at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.genRect(GraphicsNodeRed8Bit.java:140)
at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.copyData(GraphicsNodeRed8Bit.java:116)
at org.apache.batik.ext.awt.image.rendered.TranslateRed.copyData(TranslateRed.java:105)
at org.apache.batik.gvt.renderer.DynamicRenderer.repaint(DynamicRenderer.java:244)
at org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.java:344)
at org.apache.batik.swing.gvt.GVTTreeRenderer.run(GVTTreeRenderer.java:123)

Исключение выдается по адресу эту строку в AffineRed.java.

Кто-нибудь как это исправить или это временная ошибка в JRE?


person Stephan    schedule 27.06.2013    source источник


Ответы (2)


Это регрессия в Java 7 Update 25. К сожалению, Oracle выглядит настроенным на отложить исправление регрессии до обновления 60. Никто ни в чем не зависит от Java. Спасибо, Оракул!

Краткое описание приведено в этот пост из списка рассылки Batik о том, как избежать этой проблемы:

Единственный обходной путь, который мне удалось найти до сих пор, — это исправление источников BATIK, чтобы больше не вызывать BufferedImageOp.filter непосредственно для исходного и целевого изображения, а фильтровать две копии ARGB BufferedImage.

К сожалению, это означает необходимость делать копии исходного и целевого изображений, если они не являются ARGB.

person uckelman    schedule 24.07.2013
comment
Спасибо, я уже читал про регрессию. Починка батика - ха-ха, годами нет особого прогресса. - person Stephan; 25.07.2013
comment
В Батике нечего исправлять. Это не их баг. В этом случае Batik использует Java согласно спецификации. - person uckelman; 25.07.2013
comment
Томас (парень, написавший этот пост) любезно прислал мне патч к источникам Batik, который исправляет эту проблему. Он еще не ответил на мое электронное письмо, поэтому я не публикую его, но если кто-то еще столкнулся с этой проблемой, напишите мне по электронной почте. - person Dan Abramov; 11.12.2013
comment
Обновление: я разместил патч в ответе родного брата. - person Dan Abramov; 12.05.2014

Томас Бер (парень, который написал этот пост) создал патч, который устраняет проблему, используя обходной путь, описанный в одноуровневом ответе .

Он любезно прислал его мне, когда я спросил его, и, поскольку многие люди связались со мной по поводу этого патча, я решил опубликовать его, потому что Томас не возражает против этого.

Примените его поверх исходников Batik 1.7, и все будет в порядке.

person Dan Abramov    schedule 12.05.2014
comment
Спасибо, я попробую. - person Stephan; 15.05.2014