Page tree
Skip to end of metadata
Go to start of metadata

The following function allows to keep zoom-constant or zoom-proportional (see code remarks) a text group in a JSVGCanvas through DOM functionalities.

Typically it is invoked inside interactors which apply zoom transformations:

private void antiTransformText() {

    // Specifies the DOM text group to keep constant
    final Element textElementsGroup = canvas.getSVGDocument().getElementById("WHATEVER");
    final NodeList textElement = textElementsGroup.getChildNodes();
    final int multiplier = 15;// Scale factor multiplier

    for (int i = 0; i < textElement.getLength(); i++) {

        final Element element = (Element) textElement.item(i);

        try {
            final AffineTransform crt = canvas.getRenderingTransform().createInverse();

            // Constant scale factor
            // final double scale = (crt.getScaleX() < crt.getScaleY())? crt.getScaleX() * multiplier : crt.getScaleY() * multiplier;

            // Autoreduced scale factor
            final double scale = Math.sqrt((crt.getScaleX() < crt.getScaleY()) ? crt.getScaleX() * multiplier : crt.getScaleY() * multiplier);

            final SVGLocatable loc = (SVGLocatable) element;
            final SVGRect bbox = loc.getBBox();
            if (bbox != null) {
                final float cx = bbox.getX();
                final float cy = bbox.getY();

                canvas.getUpdateManager().getUpdateRunnableQueue().
                        invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // DOM Actions
                        element.setAttributeNS(
                                null,
                                "transform",
                                "translate(" + cx + "," + cy + "), " +
                                "scale(" + scale + "), " +
                                "translate(" + (-cx) + "," + (-cy) + ")");
                    }
                });
            }
        } catch (NoninvertibleTransformException ex) {
            Logger.getLogger(JFrameSvg.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
  • No labels