/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.apache.batik.dom.svg;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import org.w3c.dom.DOMException;
import org.w3c.dom.svg.SVGException;
import org.w3c.dom.svg.SVGMatrix;
This class provides an abstract implementation of the SVGMatrix
interface. Author: Stephane Hillion Version: $Id: AbstractSVGMatrix.java 1733416 2016-03-03 07:07:13Z gadams $
/**
* This class provides an abstract implementation of the {@link SVGMatrix}
* interface.
*
* @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
* @version $Id: AbstractSVGMatrix.java 1733416 2016-03-03 07:07:13Z gadams $
*/
public abstract class AbstractSVGMatrix implements SVGMatrix {
The transform used to implement flipX.
/**
* The transform used to implement flipX.
*/
protected static final AffineTransform FLIP_X_TRANSFORM =
new AffineTransform(-1, 0, 0, 1, 0, 0);
The transform used to implement flipX.
/**
* The transform used to implement flipX.
*/
protected static final AffineTransform FLIP_Y_TRANSFORM =
new AffineTransform(1, 0, 0, -1, 0, 0);
Returns the associated AffineTransform.
/**
* Returns the associated AffineTransform.
*/
protected abstract AffineTransform getAffineTransform();
Implements SVGMatrix.getA()
. /**
* Implements {@link SVGMatrix#getA()}.
*/
public float getA() {
return (float)getAffineTransform().getScaleX();
}
Implements SVGMatrix.setA(float)
. /**
* Implements {@link SVGMatrix#setA(float)}.
*/
public void setA(float a) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(a,
at.getShearY(),
at.getShearX(),
at.getScaleY(),
at.getTranslateX(),
at.getTranslateY());
}
Implements SVGMatrix.getB()
. /**
* Implements {@link SVGMatrix#getB()}.
*/
public float getB() {
return (float)getAffineTransform().getShearY();
}
Implements SVGMatrix.setB(float)
. /**
* Implements {@link SVGMatrix#setB(float)}.
*/
public void setB(float b) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(at.getScaleX(),
b,
at.getShearX(),
at.getScaleY(),
at.getTranslateX(),
at.getTranslateY());
}
Implements SVGMatrix.getC()
. /**
* Implements {@link SVGMatrix#getC()}.
*/
public float getC() {
return (float)getAffineTransform().getShearX();
}
Implements SVGMatrix.setC(float)
. /**
* Implements {@link SVGMatrix#setC(float)}.
*/
public void setC(float c) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(at.getScaleX(),
at.getShearY(),
c,
at.getScaleY(),
at.getTranslateX(),
at.getTranslateY());
}
Implements SVGMatrix.getD()
. /**
* Implements {@link SVGMatrix#getD()}.
*/
public float getD() {
return (float)getAffineTransform().getScaleY();
}
Implements SVGMatrix.setD(float)
. /**
* Implements {@link SVGMatrix#setD(float)}.
*/
public void setD(float d) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(at.getScaleX(),
at.getShearY(),
at.getShearX(),
d,
at.getTranslateX(),
at.getTranslateY());
}
Implements SVGMatrix.getE()
. /**
* Implements {@link SVGMatrix#getE()}.
*/
public float getE() {
return (float)getAffineTransform().getTranslateX();
}
Implements SVGMatrix.setE(float)
. /**
* Implements {@link SVGMatrix#setE(float)}.
*/
public void setE(float e) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(at.getScaleX(),
at.getShearY(),
at.getShearX(),
at.getScaleY(),
e,
at.getTranslateY());
}
Implements SVGMatrix.getF()
. /**
* Implements {@link SVGMatrix#getF()}.
*/
public float getF() {
return (float)getAffineTransform().getTranslateY();
}
Implements SVGMatrix.setF(float)
. /**
* Implements {@link SVGMatrix#setF(float)}.
*/
public void setF(float f) throws DOMException {
AffineTransform at = getAffineTransform();
at.setTransform(at.getScaleX(),
at.getShearY(),
at.getShearX(),
at.getScaleY(),
at.getTranslateX(),
f);
}
Implements SVGMatrix.multiply(SVGMatrix)
. /**
* Implements {@link SVGMatrix#multiply(SVGMatrix)}.
*/
public SVGMatrix multiply(SVGMatrix secondMatrix) {
AffineTransform at = new AffineTransform(secondMatrix.getA(),
secondMatrix.getB(),
secondMatrix.getC(),
secondMatrix.getD(),
secondMatrix.getE(),
secondMatrix.getF());
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.concatenate(at);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.inverse()
. /**
* Implements {@link SVGMatrix#inverse()}.
*/
public SVGMatrix inverse() throws SVGException {
try {
return new SVGOMMatrix(getAffineTransform().createInverse());
} catch (NoninvertibleTransformException e) {
throw new SVGOMException(SVGException.SVG_MATRIX_NOT_INVERTABLE,
e.getMessage());
}
}
Implements SVGMatrix.translate(float, float)
. /**
* Implements {@link SVGMatrix#translate(float,float)}.
*/
public SVGMatrix translate(float x, float y) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.translate(x, y);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.scale(float)
. /**
* Implements {@link SVGMatrix#scale(float)}.
*/
public SVGMatrix scale(float scaleFactor) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.scale(scaleFactor, scaleFactor);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.scaleNonUniform(float, float)
. /**
* Implements {@link SVGMatrix#scaleNonUniform(float,float)}.
*/
public SVGMatrix scaleNonUniform (float scaleFactorX, float scaleFactorY) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.scale(scaleFactorX, scaleFactorY);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.rotate(float)
. /**
* Implements {@link SVGMatrix#rotate(float)}.
*/
public SVGMatrix rotate(float angle) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.rotate( Math.toRadians( angle ) );
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.rotateFromVector(float, float)
. /**
* Implements {@link SVGMatrix#rotateFromVector(float,float)}.
*/
public SVGMatrix rotateFromVector(float x, float y) throws SVGException {
if (x == 0 || y == 0) {
throw new SVGOMException(SVGException.SVG_INVALID_VALUE_ERR, "");
}
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.rotate(Math.atan2(y, x));
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.flipX()
. /**
* Implements {@link SVGMatrix#flipX()}.
*/
public SVGMatrix flipX() {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.concatenate(FLIP_X_TRANSFORM);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.flipY()
. /**
* Implements {@link SVGMatrix#flipY()}.
*/
public SVGMatrix flipY() {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.concatenate(FLIP_Y_TRANSFORM);
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.skewX(float)
. /**
* Implements {@link SVGMatrix#skewX(float)}.
*/
public SVGMatrix skewX(float angleDeg) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.concatenate
(AffineTransform.getShearInstance( Math.tan( Math.toRadians( angleDeg )), 0));
return new SVGOMMatrix(tr);
}
Implements SVGMatrix.skewY(float)
. /**
* Implements {@link SVGMatrix#skewY(float)}.
*/
public SVGMatrix skewY(float angleDeg ) {
AffineTransform tr = (AffineTransform)getAffineTransform().clone();
tr.concatenate
(AffineTransform.getShearInstance(0, Math.tan( Math.toRadians( angleDeg ) ) ));
return new SVGOMMatrix(tr);
}
}