Hello,

I want to paint a SVG directly on a Graphics2D, without creating first a BufferedImage. Therefore I
used the GraphicsNodes paint()-method. But it doesn't work with SVGs using filter - the result looks ugly. Using the StaticRenderer instead works fine, but I don't want to use that. Why doesn't it work?


Here my SVG:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd";>
<svg xmlns="http://www.w3.org/2000/svg"; xmlns:xlink="http://www.w3.org/1999/xlink"; width="450" height="500" viewBox="0 0 450 500">
<defs>
<filter id="dropShadow" filterUnits="objectBoundingBox" width="1.4" height="1.4">
<feGaussianBlur in="SourceAlpha" stdDeviation="4" />
<feOffset dx="4" dy="4" />
<feComponentTransfer result="shadow">
<feFuncA type="linear" slope=".5" intercept="0" />
</feComponentTransfer>
</filter>
</defs>
<rect x="0" y="0" width="100%" height="100%" style="fill:gold" />
<g style="font-size:128; text-anchor:middle;">
<text x="50%" y="35%" style="filter:url(#dropShadow)">Batik</text>
<text x="50%" y="35%" style="fill:rgb(172,20,20)">Batik</text>
</g>
</svg>


My code:

public class Test
{
        public static void main(String[] args) {
                new Test();
        }
        public Test() {
                String url = "file:/mySVG.svg";
                try {
                        loadDocument(url);
                        buildGVTTree();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                JFrame f = new JFrame("Batik");
                JPanel p = new MyPanel();
                f.getContentPane().add(p);
                f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                f.setSize(400, 400);
                f.setVisible(true);
        }

        protected void loadDocument(String url) throws IOException {
                String parser = XMLResourceDescriptor.getXMLParserClassName();
                SAXSVGDocumentFactory fact = new SAXSVGDocumentFactory(parser);
                doc = fact.createSVGDocument(url);
        }
        
        protected void buildGVTTree() {
                UserAgent agent = new UserAgentAdapter();
                DocumentLoader loader = new DocumentLoader(agent);
                bridgeContext = new BridgeContext(agent, loader);
                bridgeContext.setDynamicState(BridgeContext.DYNAMIC);
                gvtRoot = new GVTBuilder().build(bridgeContext, doc);
        }

        class MyPanel extends JPanel
        {
                protected void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        Graphics2D g2d = (Graphics2D) g.create();
                        if (gvtRoot != null) {  
                                gvtRoot.paint(g2d);
                        }
                }
        }
        
        private GraphicsNode    gvtRoot;
        private SVGDocument     doc;
        private BridgeContext   bridgeContext;
}

Thanks for helping me!

Stephan Müller



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to