org.htmlunit.javascript.host.svg.SVGMatrix Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xlt Show documentation
Show all versions of xlt Show documentation
XLT (Xceptance LoadTest) is an extensive load and performance test tool developed and maintained by Xceptance.
The newest version!
/*
* Copyright (c) 2002-2024 Gargoyle Software Inc.
*
* Licensed 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
* https://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.htmlunit.javascript.host.svg;
import static org.htmlunit.javascript.configuration.SupportedBrowser.CHROME;
import static org.htmlunit.javascript.configuration.SupportedBrowser.EDGE;
import static org.htmlunit.javascript.configuration.SupportedBrowser.FF;
import static org.htmlunit.javascript.configuration.SupportedBrowser.FF_ESR;
import org.htmlunit.javascript.HtmlUnitScriptable;
import org.htmlunit.javascript.JavaScriptEngine;
import org.htmlunit.javascript.configuration.JsxClass;
import org.htmlunit.javascript.configuration.JsxConstructor;
import org.htmlunit.javascript.configuration.JsxFunction;
import org.htmlunit.javascript.configuration.JsxGetter;
import org.htmlunit.javascript.configuration.JsxSetter;
import org.htmlunit.javascript.host.Window;
/**
* A JavaScript object for {@code SVGMatrix}.
* @see MDN doc
* @author Marc Guillemot
* @author Ronald Brill
*/
@JsxClass
public class SVGMatrix extends HtmlUnitScriptable {
private double shearX_;
private double shearY_;
private double scaleX_;
private double scaleY_;
private double translateX_;
private double translateY_;
/**
* Creates an instance.
*/
public SVGMatrix() {
shearX_ = 0.0;
shearY_ = 0.0;
scaleX_ = 1.0;
scaleY_ = 1.0;
translateX_ = 0.0;
translateY_ = 0.0;
}
/**
* JavaScript constructor.
*/
@JsxConstructor({CHROME, EDGE, FF, FF_ESR})
public void jsConstructor() {
}
/**
* Instantiates and configure scope and prototype.
* @param scope the parent scope
*/
public SVGMatrix(final Window scope) {
this();
setParentScope(scope);
setPrototype(getPrototype(getClass()));
}
/**
* Gets the a
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getA() {
return scaleX_;
}
/**
* Gets the b
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getB() {
return shearY_;
}
/**
* Gets the c
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getC() {
return shearX_;
}
/**
* Gets the d
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getD() {
return scaleY_;
}
/**
* Gets the e
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getE() {
return translateX_;
}
/**
* Gets the f
entry of the matrix.
* @return the field
*/
@JsxGetter
public double getF() {
return translateY_;
}
/**
* Sets the a
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setA(final double newValue) {
scaleX_ = newValue;
}
/**
* Sets the b
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setB(final double newValue) {
shearY_ = newValue;
}
/**
* Sets the c
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setC(final double newValue) {
shearX_ = newValue;
}
/**
* Sets the d
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setD(final double newValue) {
scaleY_ = newValue;
}
/**
* Sets the e
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setE(final double newValue) {
translateX_ = newValue;
}
/**
* Sets the f
entry of the matrix.
* @param newValue the new value for the field
*/
@JsxSetter
public void setF(final double newValue) {
translateY_ = newValue;
}
/**
* Transforms the matrix.
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix flipX() {
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = shearX_;
result.shearY_ = -shearY_;
result.scaleX_ = -scaleX_;
result.scaleY_ = scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix flipY() {
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = -shearX_;
result.shearY_ = shearY_;
result.scaleX_ = scaleX_;
result.scaleY_ = -scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix inverse() {
final double determinant = scaleX_ * scaleY_ - shearX_ * shearY_;
if (Math.abs(determinant) < 1E-10) {
throw JavaScriptEngine.constructError("Error",
"Failed to execute 'inverse' on 'SVGMatrix': The matrix is not invertible.");
}
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = -shearX_ / determinant;
result.shearY_ = -shearY_ / determinant;
result.scaleX_ = scaleY_ / determinant;
result.scaleY_ = scaleX_ / determinant;
result.translateX_ = (shearX_ * translateY_ - scaleY_ * translateX_) / determinant;
result.translateY_ = (shearY_ * translateX_ - scaleX_ * translateY_) / determinant;
return result;
}
/**
* Transforms the matrix.
* @param by the matrix to multiply by
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix multiply(final SVGMatrix by) {
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = by.shearX_ * scaleX_ + by.scaleY_ * shearX_;
result.shearY_ = by.scaleX_ * shearY_ + by.shearY_ * scaleY_;
result.scaleX_ = by.scaleX_ * scaleX_ + by.shearY_ * shearX_;
result.scaleY_ = by.shearX_ * shearY_ + by.scaleY_ * scaleY_;
result.translateX_ = by.translateX_ * scaleX_ + by.translateY_ * shearX_ + translateX_;
result.translateY_ = by.translateX_ * shearY_ + by.translateY_ * scaleY_ + translateY_;
return result;
}
/**
* Rotates the matrix.
* @param angle the rotation angle
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix rotate(final double angle) {
final double theta = Math.toRadians(angle);
final double sin = Math.sin(theta);
final double cos = Math.cos(theta);
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = -sin * scaleX_ + cos * shearX_;
result.shearY_ = cos * shearY_ + sin * scaleY_;
result.scaleX_ = cos * scaleX_ + sin * shearX_;
result.scaleY_ = -sin * shearY_ + cos * scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @param x the x-coordinate of the vector
* @param y the y-coordinate of the vector
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix rotateFromVector(final double x, final double y) {
if (x == 0 || y == 0) {
throw JavaScriptEngine.constructError("Error",
"Failed to execute 'rotateFromVector' on 'SVGMatrix': Arguments cannot be zero.");
}
final double theta = Math.atan2(y, x);
final double sin = Math.sin(theta);
final double cos = Math.cos(theta);
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = -sin * scaleX_ + cos * shearX_;
result.shearY_ = cos * shearY_ + sin * scaleY_;
result.scaleX_ = cos * scaleX_ + sin * shearX_;
result.scaleY_ = -sin * shearY_ + cos * scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @param factor the scale factor
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix scale(final double factor) {
return scaleNonUniform(factor, factor);
}
/**
* Transforms the matrix.
* @param factorX the factor for the x-axis
* @param factorY the factor for the y-axis
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix scaleNonUniform(final double factorX, final double factorY) {
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = factorY * shearX_;
result.shearY_ = factorX * shearY_;
result.scaleX_ = factorX * scaleX_;
result.scaleY_ = factorY * scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @param angle the skew angle
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix skewX(final double angle) {
final double shear = Math.tan(Math.toRadians(angle));
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = shear * scaleX_ + shearX_;
result.shearY_ = shearY_;
result.scaleX_ = scaleX_;
result.scaleY_ = shear * shearY_ + scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Transforms the matrix.
* @param angle the skew angle
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix skewY(final double angle) {
final double shear = Math.tan(Math.toRadians(angle));
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = shearX_;
result.shearY_ = shearY_ + shear * scaleY_;
result.scaleX_ = scaleX_ + shear * shearX_;
result.scaleY_ = scaleY_;
result.translateX_ = translateX_;
result.translateY_ = translateY_;
return result;
}
/**
* Translates the matrix.
* @param x the distance along the x-axis
* @param y the distance along the y-axis
* @return the resulting matrix
*/
@JsxFunction
public SVGMatrix translate(final double x, final double y) {
final SVGMatrix result = new SVGMatrix(getWindow());
result.shearX_ = shearX_;
result.shearY_ = shearY_;
result.scaleX_ = scaleX_;
result.scaleY_ = scaleY_;
result.translateX_ = x * scaleX_ + y * shearX_ + translateX_;
result.translateY_ = x * shearY_ + y * scaleY_ + translateY_;
return result;
}
}