[
https://issues.apache.org/jira/browse/BATIK-724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17741154#comment-17741154
]
Bjoern Voigt commented on BATIK-724:
------------------------------------
This bug is still not solved in batik 1.16.
> JSVGCanvas ignores preferred size when viewBox is changed in the DOM
> --------------------------------------------------------------------
>
> Key: BATIK-724
> URL: https://issues.apache.org/jira/browse/BATIK-724
> Project: Batik
> Issue Type: Bug
> Components: Bridge
> Affects Versions: 1.7
> Environment: Operating System: Linux
> Platform: All
> Reporter: Archie Cobbs
> Assignee: Batik Developer's Mailing list
>
> The test program below demonstrates the bug, which is that when you
> change the "viewBox" attribute on the top level <svg> node, the JSVGCanvas
> redraws the image the height and width specified in the SVG document
> rather than using the height and width of the Swing container.
> The result is that even though the "viewBox" attribute is being changed
> to an equivalent value to what it was before (previous value plus space),
> the image shifts dramatically on the screen.
> Perhaps a call to this.computeRenderingTransform() is missing somewhere
> from SVGSVGElementBridge.java ?? If you subclass JSVGCanvas, and invoke
> this method after the DOM change, the image "snaps back" to where it
> should be.
> --------------------------- CUT HERE --------------------------
> import java.awt.Dimension;
> import java.awt.GraphicsEnvironment;
> import java.awt.Point;
> import java.awt.event.WindowAdapter;
> import java.awt.event.WindowEvent;
> import java.io.File;
> import javax.swing.JFrame;
> import javax.swing.SwingUtilities;
> import org.apache.batik.bridge.UpdateManager;
> import org.apache.batik.bridge.UpdateManagerEvent;
> import org.apache.batik.bridge.UpdateManagerListener;
> import org.apache.batik.swing.JSVGCanvas;
> import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
> import org.apache.batik.swing.gvt.GVTTreeRendererListener;
> import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
> import org.apache.batik.swing.svg.GVTTreeBuilderListener;
> import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
> import org.apache.batik.swing.svg.SVGDocumentLoaderListener;
> import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent;
> import org.apache.batik.swing.svg.SVGLoadEventDispatcherListener;
> import org.apache.batik.util.RunnableQueue;
> import org.apache.log4j.BasicConfigurator;
> import org.apache.log4j.ConsoleAppender;
> import org.apache.log4j.Level;
> import org.apache.log4j.Logger;
> import org.apache.log4j.PatternLayout;
> import org.w3c.dom.svg.SVGDocument;
> import org.w3c.dom.svg.SVGElement;
> public class ViewBoxTest extends WindowAdapter implements
> SVGDocumentLoaderListener, GVTTreeBuilderListener,
> SVGLoadEventDispatcherListener, GVTTreeRendererListener,
> UpdateManagerListener {
> private final Logger log = Logger.getLogger(getClass());
> private final String url;
> private final JFrame frame;
> private final JSVGCanvas canvas;
> private SVGDocument dom;
> public ViewBoxTest(String url) {
> this.url = url;
> frame = new JFrame("ViewBoxTest: "
> + url.substring(url.lastIndexOf('/') + 1));
> canvas = new JSVGCanvas(null, true, true);
> canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
> canvas.addSVGDocumentLoaderListener(this);
> canvas.addGVTTreeBuilderListener(this);
> canvas.addGVTTreeRendererListener(this);
> canvas.addSVGLoadEventDispatcherListener(this);
> canvas.addUpdateManagerListener(this);
> canvas.setFocusable(true);
> frame.addWindowListener(this);
> }
> public void go() {
> canvas.setURI(this.url);
> }
> public void cancel() {
> System.err.println("Something went wrong");
> }
> protected void updateSVG(final Runnable rable) {
> UpdateManager updateManager = canvas.getUpdateManager();
> updateManager.getUpdateRunnableQueue().invokeLater(
> new Runnable() {
> public void run() {
> try {
> rable.run();
> } catch (Throwable t) {
> t.printStackTrace(System.err);
> System.exit(1);
> }
> }
> });
> }
> protected void ready() {
> // Get SVG DOM
> this.dom = canvas.getSVGDocument();
> // Create mutator
> final Runnable mutator = new Runnable() {
> public void run() {
> SVGElement svg = (SVGElement)dom.getDocumentElement();
> String oldViewBox = svg.getAttribute("viewBox");
> String newViewBox = oldViewBox + " ";
> System.out.println("CHANGING VIEWBOX from \""
> + oldViewBox + "\" to \"" + newViewBox + "\"");
> svg.setAttribute("viewBox", newViewBox);
> }
> };
> // Start thread to pause and then mutate
> new Thread() {
> public void run() {
> try {
> Thread.sleep(2000);
> } catch (InterruptedException e) {
> }
> updateSVG(mutator);
> }
> }.start();
> }
> public void showFrame() {
> SwingUtilities.invokeLater(new Runnable() {
> public void run() {
> frame.getContentPane().add(canvas);
> // NOTE: change size this to see different effects
> frame.setPreferredSize(new java.awt.Dimension(800, 800));
> frame.pack();
> Dimension size = frame.getSize();
> Point center = GraphicsEnvironment
> .getLocalGraphicsEnvironment().getCenterPoint();
> int x = (int)(center.getX() - size.getWidth() / 2);
> int y = (int)(center.getY() - size.getHeight() / 2);
> frame.setLocation(new Point(x, y));
> frame.setVisible(true);
> frame.toFront();
> }
> });
> }
> // SVGDocumentLoaderListener methods
> public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
> log.debug("Document loading started");
> }
> public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
> log.debug("Document loading completed");
> }
> public void documentLoadingCancelled(SVGDocumentLoaderEvent e) {
> log.debug("Document loading canceled");
> }
> public void documentLoadingFailed(SVGDocumentLoaderEvent e) {
> log.debug("Document loading failed: " + e);
> cancel();
> }
> // GVTTreeBuilderListener methods
> public void gvtBuildStarted(GVTTreeBuilderEvent e) {
> log.debug("GVT build started");
> }
> public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
> log.debug("GVT build completed");
> showFrame();
> }
> public void gvtBuildCancelled(GVTTreeBuilderEvent e) {
> log.debug("GVT build canceled");
> }
> public void gvtBuildFailed(GVTTreeBuilderEvent e) {
> log.debug("GVT build failed: " + e);
> cancel();
> }
> // GVTTreeRendererListener methods
> public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
> log.debug("GVT rendering preparing");
> }
> public void gvtRenderingStarted(GVTTreeRendererEvent e) {
> log.debug("GVT rendering started");
> }
> public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
> log.debug("GVT rendering complete");
> ready();
> }
> public void gvtRenderingCancelled(GVTTreeRendererEvent e) {
> log.debug("GVT rendering canceled");
> }
> public void gvtRenderingFailed(GVTTreeRendererEvent e) {
> log.debug("GVT rendering failed: " + e);
> cancel();
> }
> // SVGLoadEventDispatcherListener methods
> public void svgLoadEventDispatchCancelled(SVGLoadEventDispatcherEvent e) {
> log.debug("Load event dispatch cancelled");
> }
> public void svgLoadEventDispatchCompleted(SVGLoadEventDispatcherEvent e) {
> log.debug("Load event dispatch completed");
> }
> public void svgLoadEventDispatchFailed(SVGLoadEventDispatcherEvent e) {
> log.debug("Load event dispatch failed: " + e);
> }
> public void svgLoadEventDispatchStarted(SVGLoadEventDispatcherEvent e) {
> log.debug("Load event dispatch started");
> }
> // UpdateManagerListener
> public void managerStarted(UpdateManagerEvent e) {
> log.debug("Update manager started");
> }
> public void managerSuspended(UpdateManagerEvent e) {
> log.debug("Update manager suspended");
> }
> public void managerResumed(UpdateManagerEvent e) {
> log.debug("Update manager resumed");
> }
> public void managerStopped(UpdateManagerEvent e) {
> log.debug("Update manager stopped");
> }
> public void updateStarted(UpdateManagerEvent e) {
> //log.debug("Update manager started");
> }
> public void updateCompleted(UpdateManagerEvent e) {
> //log.debug("Update manager completed");
> }
> public void updateFailed(UpdateManagerEvent e) {
> log.debug("Update manager failed: " + e);
> }
> // WindowListener methods
> public void windowClosing(WindowEvent e) {
> System.exit(0);
> }
> public static void main(String[] args) throws Exception {
> ConsoleAppender consoleAppender = new ConsoleAppender(
> new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN),
> ConsoleAppender.SYSTEM_ERR);
> consoleAppender.setThreshold(Level.DEBUG);
> BasicConfigurator.configure(consoleAppender);
> if (args.length == 0) {
> args = new String[] {
> "http://svn.apache.org/repos/asf/xmlgraphics/batik/trunk"
> + "/samples/tests/spec/coordinates/percentagesAndUnits.svg"
> };
> } else if (args.length != 1) {
> System.err.println("Usage: java ViewBoxTest [file | URL]");
> System.exit(1);
> }
> File file = new File(args[0]);
> if (file.exists())
> args[0] = file.toURL().toString();
> new ViewBoxTest(args[0]).go();
> }
> }
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]