You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by "Konstantin Bulenkov (Jira)" <ji...@apache.org> on 2021/06/28 10:05:00 UTC

[jira] [Comment Edited] (BATIK-1285) Batik fails to parse an svg with missing 'offset' attribute

    [ https://issues.apache.org/jira/browse/BATIK-1285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17370504#comment-17370504 ] 

Konstantin Bulenkov edited comment on BATIK-1285 at 6/28/21, 10:04 AM:
-----------------------------------------------------------------------

Hello! 
 The bug was reported one year ago, has Priority: Blocker, has a pull request that fixes the problem, but still has no assignee and not fixed. Please could someone from the Batik team take a look at the problem and finally merge the pull request? 

I wrote a simple reproducer:
 Java:

 

{{import org.apache.batik.transcoder.TranscoderException;}}
 {{import org.apache.batik.transcoder.TranscoderInput;}}
 {{import org.apache.batik.transcoder.TranscoderOutput;}}
 {{import org.apache.batik.transcoder.image.PNGTranscoder;}}

{{import java.io.ByteArrayInputStream;}}
 {{import java.io.ByteArrayOutputStream;}}

{{/**}}
 {{ * @author Konstantin Bulenkov}}
 {{ */}}
 {{public class Batik1285Bug {}}
 {{  public static void main(String[] args) throws TranscoderException {}}
 {{    String svg = "<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n" +}}
 {{                 "<circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"url(#paint0_linear)\"/>\n" +}}
 {{                 "<defs>\n" +}}
 {{                 "<linearGradient id=\"paint0_linear\" x1=\"28.5\" y1=\"27.5\" x2=\"3\" y2=\"6\" gradientUnits=\"userSpaceOnUse\">\n" +}}
 {{                 "<stop stop-color=\"#C4C4C4\"/>\n" +}}
 {{                 "<stop offset=\"1\" stop-color=\"#C4C4C4\" stop-opacity=\"0\"/>\n" +}}
 {{                 "</linearGradient>\n" +}}
 {{                 "</defs>\n" +}}
 {{                 "</svg>";}}

{{    TranscoderInput transcoderInput = new TranscoderInput(new ByteArrayInputStream(svg.getBytes()));}}
 {{    PNGTranscoder converter = new PNGTranscoder();}}
 {{    converter.transcode(transcoderInput, new TranscoderOutput(new ByteArrayOutputStream()));}}

 {{}}}
{{}}}

{{Output:}}

{{Exception in thread "main" org.apache.batik.transcoder.TranscoderException: null}}

{{Enclosed Exception:}}

{{null:-1}}

{\{The attribute "offset" of the element <stop> is required }}

{\{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:226) }}

{\{    at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92) }}

{\{    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) }}

{\{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) }}

{{    at Batik1285Bug.main(Batik1285Bug.java:27)}}

{{Caused by: org.apache.batik.bridge.BridgeException: null:-1}}

{\{The attribute "offset" of the element <stop> is required }}

{\{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge$SVGStopElementBridge.createStop(AbstractSVGGradientElementBridge.java:316) }}

{\{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.extractLocalStop(AbstractSVGGradientElementBridge.java:236) }}

{\{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.extractStop(AbstractSVGGradientElementBridge.java:188) }}

{\{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.createPaint(AbstractSVGGradientElementBridge.java:69) }}

{\{    at org.apache.batik.bridge.PaintServer.convertURIPaint(PaintServer.java:373) }}

{\{    at org.apache.batik.bridge.PaintServer.convertPaint(PaintServer.java:273) }}

{\{    at org.apache.batik.bridge.PaintServer.convertFillPaint(PaintServer.java:242) }}

{\{    at org.apache.batik.bridge.PaintServer.convertFillAndStroke(PaintServer.java:160) }}

{\{    at org.apache.batik.bridge.SVGShapeElementBridge.createShapePainter(SVGShapeElementBridge.java:117) }}

{\{    at org.apache.batik.bridge.SVGCircleElementBridge.createShapePainter(SVGCircleElementBridge.java:123) }}

{\{    at org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(SVGShapeElementBridge.java:91) }}

{\{    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:224) }}

{\{    at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171) }}

{\{    at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82) }}

{\{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) }}

{{    ... 4 more}}


was (Author: bulenkov):
Hello! 
The bug was reported one year ago, has Priority: Blocker, has a pull request that fixes the problem, but still has no assignee and not fixed. Please could someone from the Batik team take a look at the problem and finally merge the pull request? 

I wrote a simple reproducer:
Java:

 

{{import org.apache.batik.transcoder.TranscoderException;}}
{{import org.apache.batik.transcoder.TranscoderInput;}}
{{import org.apache.batik.transcoder.TranscoderOutput;}}
{{import org.apache.batik.transcoder.image.PNGTranscoder;}}

{{import java.io.ByteArrayInputStream;}}
{{import java.io.ByteArrayOutputStream;}}

{{/**}}
{{ * @author Konstantin Bulenkov}}
{{ */}}
{{public class Batik1285Bug {}}
{{  public static void main(String[] args) throws TranscoderException {}}
{{    String svg = "<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n" +}}
{{                 "<circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"url(#paint0_linear)\"/>\n" +}}
{{                 "<defs>\n" +}}
{{                 "<linearGradient id=\"paint0_linear\" x1=\"28.5\" y1=\"27.5\" x2=\"3\" y2=\"6\" gradientUnits=\"userSpaceOnUse\">\n" +}}
{{                 "<stop stop-color=\"#C4C4C4\"/>\n" +}}
{{                 "<stop offset=\"1\" stop-color=\"#C4C4C4\" stop-opacity=\"0\"/>\n" +}}
{{                 "</linearGradient>\n" +}}
{{                 "</defs>\n" +}}
{{                 "</svg>";}}

{{    TranscoderInput transcoderInput = new TranscoderInput(new ByteArrayInputStream(svg.getBytes()));}}
{{    PNGTranscoder converter = new PNGTranscoder();}}
{{    converter.transcode(transcoderInput, new TranscoderOutput(new ByteArrayOutputStream()));}}
{{  }}}
{{}}}

{{Output:}}

{{Exception in thread "main" org.apache.batik.transcoder.TranscoderException: null}}

{{Enclosed Exception:}}

{{null:-1}}

{{The attribute "offset" of the element <stop> is required }}

{{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:226) }}

{{    at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92) }}

{{    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) }}

{{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) }}

{{    at Batik1285Bug.main(Batik1285Bug.java:27)}}

{{Caused by: org.apache.batik.bridge.BridgeException: null:-1}}

{{The attribute "offset" of the element <stop> is required }}

{{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge$SVGStopElementBridge.createStop(AbstractSVGGradientElementBridge.java:316) }}

{{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.extractLocalStop(AbstractSVGGradientElementBridge.java:236) }}

{{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.extractStop(AbstractSVGGradientElementBridge.java:188) }}

{{    at org.apache.batik.bridge.AbstractSVGGradientElementBridge.createPaint(AbstractSVGGradientElementBridge.java:69) }}

{{    at org.apache.batik.bridge.PaintServer.convertURIPaint(PaintServer.java:373) }}

{{    at org.apache.batik.bridge.PaintServer.convertPaint(PaintServer.java:273) }}

{{    at org.apache.batik.bridge.PaintServer.convertFillPaint(PaintServer.java:242) }}

{{    at org.apache.batik.bridge.PaintServer.convertFillAndStroke(PaintServer.java:160) }}

{{    at org.apache.batik.bridge.SVGShapeElementBridge.createShapePainter(SVGShapeElementBridge.java:117) }}

{{    at org.apache.batik.bridge.SVGCircleElementBridge.createShapePainter(SVGCircleElementBridge.java:123) }}

{{    at org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(SVGShapeElementBridge.java:91) }}

{{    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:224) }}

{{    at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171) }}

{{    at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82) }}

{{    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) }}

{{    ... 4 more}}

> Batik fails to parse an svg with missing 'offset' attribute
> -----------------------------------------------------------
>
>                 Key: BATIK-1285
>                 URL: https://issues.apache.org/jira/browse/BATIK-1285
>             Project: Batik
>          Issue Type: Bug
>    Affects Versions: 1.12
>            Reporter: Konstantin Bulenkov
>            Priority: Blocker
>
> Many modern design tools like Figma and others do not put {{offset}} attribute when generating a svg image if offset equals {{0}}. See [https://www.w3.org/TR/SVG/pservers.html#GradientStopAttributes]
> Batik fails with exception while trying to read such svgs. Other programs successfully open these files.
> The pull request sets {{offset}} to {{0}} when the attribute is missing.
> Please find a pull request and image example here: [https://github.com/apache/xmlgraphics-batik/pull/20] 
> IntelliJ Platform and all IDEs based on it use Batik (10M+ users). IDE fails when icon with the missing offset attribute is used.
> Could you verify and apply the patch, please.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-dev-help@xmlgraphics.apache.org