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);
}
}
}