weisJ/jsvg

getavataaars svg file error

DJ-Raven opened this issue · 5 comments

am try to generate svg file from getavataaars and use with jsvg I got error

java.lang.IllegalArgumentException: Width (0) and height (0) must be > 0

And my output show only circle element

2023-09-23_024013

I have try to test with flatlaf svg icon. also error display with the red rectangle.
So how to fixed this. thank you.

And this am using with SvgSalamander it's working

image

weisJ commented

Can you please provide the code of an example svg and the stacktrace of the exception.

@weisJ here my full code

import com.github.weisj.jsvg.SVGDocument;
import com.github.weisj.jsvg.geometry.size.FloatSize;
import com.github.weisj.jsvg.parser.SVGLoader;
import com.kitfox.svg.SVGDiagram;
import com.kitfox.svg.SVGUniverse;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class TestSVG extends JFrame {
    
    public TestSVG() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(500, 500));
        JLabel lb = new JLabel(new SVGIcon("/icon/avataaars.svg"));
        lb.setBackground(Color.cyan);
        lb.setOpaque(true);
        setLayout(new BorderLayout());
        add(lb);
    }

    public class SVGIcon implements Icon {

        BufferedImage imageRender;

        public SVGIcon(String icon) {
            imageRender = createSvg(icon, true);
        }

        private BufferedImage createSvg(String icon, boolean useJSvg) {
            BufferedImage image;
            if (useJSvg) {
                SVGLoader loader = new SVGLoader();
                SVGDocument document = loader.load(getClass().getResource(icon));
                FloatSize size = document.size();
                image = new BufferedImage((int) size.width, (int) size.height, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = image.createGraphics();
                setRenderingHints(g);
                document.render(null, g);
                g.dispose();
            } else {
                SVGUniverse svgUniverse = new SVGUniverse();
                SVGDiagram svgDiagram = svgUniverse.getDiagram(svgUniverse.loadSVG(getClass().getResource(icon)));
                image = new BufferedImage((int) svgDiagram.getWidth(), (int) svgDiagram.getHeight(), BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = image.createGraphics();
                setRenderingHints(g);
                try {
                    svgDiagram.render(g);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                g.dispose();
            }
            return image;
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            g.drawImage(imageRender, x, y, null);
        }

        @Override
        public int getIconWidth() {
            return imageRender.getWidth();
        }

        @Override
        public int getIconHeight() {
            return imageRender.getHeight();
        }
    }

    private void setRenderingHints(Graphics2D g) {
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new TestSVG().setVisible(true);
        });
    }
}

and this StackTrace exception

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (0) and height (0) must be > 0
	at java.desktop/java.awt.image.SampleModel.<init>(SampleModel.java:126)
	at java.desktop/java.awt.image.ComponentSampleModel.<init>(ComponentSampleModel.java:140)
	at java.desktop/java.awt.image.PixelInterleavedSampleModel.<init>(PixelInterleavedSampleModel.java:87)
	at java.desktop/java.awt.image.Raster.createInterleavedRaster(Raster.java:642)
	at java.desktop/java.awt.image.Raster.createInterleavedRaster(Raster.java:278)
	at java.desktop/java.awt.image.Raster.createInterleavedRaster(Raster.java:212)
	at java.desktop/java.awt.image.ComponentColorModel.createCompatibleWritableRaster(ComponentColorModel.java:2827)
	at java.desktop/java.awt.image.BufferedImage.<init>(BufferedImage.java:420)
	at com.github.weisj.jsvg.util.ImageUtil.createLuminosityBuffer(ImageUtil.java:59)
	at com.github.weisj.jsvg.util.BlittableImage.create(BlittableImage.java:91)
	at com.github.weisj.jsvg.nodes.Mask.createMaskPaint(Mask.java:91)
	at com.github.weisj.jsvg.renderer.NodeRenderer.createRenderInfo(NodeRenderer.java:129)
	at com.github.weisj.jsvg.renderer.NodeRenderer.renderNode(NodeRenderer.java:94)
	at com.github.weisj.jsvg.nodes.container.CommonRenderableContainerNode.render(CommonRenderableContainerNode.java:81)
	at com.github.weisj.jsvg.renderer.NodeRenderer.renderNode(NodeRenderer.java:95)
	at com.github.weisj.jsvg.nodes.container.CommonRenderableContainerNode.render(CommonRenderableContainerNode.java:81)
	at com.github.weisj.jsvg.renderer.NodeRenderer.renderNode(NodeRenderer.java:95)
	at com.github.weisj.jsvg.nodes.container.CommonRenderableContainerNode.render(CommonRenderableContainerNode.java:81)
	at com.github.weisj.jsvg.renderer.NodeRenderer.renderNode(NodeRenderer.java:95)
	at com.github.weisj.jsvg.nodes.container.CommonRenderableContainerNode.render(CommonRenderableContainerNode.java:81)
	at com.github.weisj.jsvg.nodes.container.BaseInnerViewContainer.renderWithSize(BaseInnerViewContainer.java:141)
	at com.github.weisj.jsvg.nodes.container.BaseInnerViewContainer.renderWithSize(BaseInnerViewContainer.java:82)
	at com.github.weisj.jsvg.SVGDocument.render(SVGDocument.java:89)
	at com.github.weisj.jsvg.SVGDocument.render(SVGDocument.java:56)
	at test.TestSVG$SVGIcon.createSvg(TestSVG.java:44)
	at test.TestSVG$SVGIcon.<init>(TestSVG.java:32)
	at test.TestSVG.<init>(TestSVG.java:20)
	at test.TestSVG.lambda$main$0(TestSVG.java:86)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Process finished with exit code 0

When I use Transparent it's work well

2023-09-27_120819

weisJ commented

Fixed in version 1.2.0