summaryrefslogtreecommitdiff
path: root/Source/WebCore/svg/SVGTransform.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/svg/SVGTransform.cpp')
-rw-r--r--Source/WebCore/svg/SVGTransform.cpp252
1 files changed, 23 insertions, 229 deletions
diff --git a/Source/WebCore/svg/SVGTransform.cpp b/Source/WebCore/svg/SVGTransform.cpp
index 5f9d56f46..59037945a 100644
--- a/Source/WebCore/svg/SVGTransform.cpp
+++ b/Source/WebCore/svg/SVGTransform.cpp
@@ -1,244 +1,38 @@
/*
- * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
*
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
-
-#if ENABLE(SVG)
#include "SVGTransform.h"
-#include "FloatConversion.h"
-#include "FloatPoint.h"
-#include "FloatSize.h"
-#include "SVGAngle.h"
-#include "SVGSVGElement.h"
-#include <wtf/MathExtras.h>
-#include <wtf/text/StringBuilder.h>
-#include <wtf/text/WTFString.h>
+#include "SVGMatrixTearOff.h"
namespace WebCore {
-SVGTransform::SVGTransform()
- : m_type(SVG_TRANSFORM_UNKNOWN)
- , m_angle(0)
+Ref<SVGMatrix> SVGTransform::matrix()
{
-}
-
-SVGTransform::SVGTransform(SVGTransformType type, ConstructionMode mode)
- : m_type(type)
- , m_angle(0)
-{
- if (mode == ConstructZeroTransform)
- m_matrix = AffineTransform(0, 0, 0, 0, 0, 0);
-}
-
-SVGTransform::SVGTransform(const AffineTransform& matrix)
- : m_type(SVG_TRANSFORM_MATRIX)
- , m_angle(0)
- , m_matrix(matrix)
-{
-}
-
-void SVGTransform::setMatrix(const AffineTransform& matrix)
-{
- m_type = SVG_TRANSFORM_MATRIX;
- m_angle = 0;
- m_matrix = matrix;
-}
-
-void SVGTransform::updateSVGMatrix()
-{
- // The underlying matrix has been changed, alter the transformation type.
- // Spec: In case the matrix object is changed directly (i.e., without using the methods on the SVGTransform interface itself)
- // then the type of the SVGTransform changes to SVG_TRANSFORM_MATRIX.
- m_type = SVG_TRANSFORM_MATRIX;
- m_angle = 0;
-}
-
-void SVGTransform::setTranslate(float tx, float ty)
-{
- m_type = SVG_TRANSFORM_TRANSLATE;
- m_angle = 0;
-
- m_matrix.makeIdentity();
- m_matrix.translate(tx, ty);
-}
-
-FloatPoint SVGTransform::translate() const
-{
- return FloatPoint::narrowPrecision(m_matrix.e(), m_matrix.f());
-}
-
-void SVGTransform::setScale(float sx, float sy)
-{
- m_type = SVG_TRANSFORM_SCALE;
- m_angle = 0;
- m_center = FloatPoint();
-
- m_matrix.makeIdentity();
- m_matrix.scaleNonUniform(sx, sy);
-}
-
-FloatSize SVGTransform::scale() const
-{
- return FloatSize::narrowPrecision(m_matrix.a(), m_matrix.d());
-}
-
-void SVGTransform::setRotate(float angle, float cx, float cy)
-{
- m_type = SVG_TRANSFORM_ROTATE;
- m_angle = angle;
- m_center = FloatPoint(cx, cy);
-
- // TODO: toString() implementation, which can show cx, cy (need to be stored?)
- m_matrix.makeIdentity();
- m_matrix.translate(cx, cy);
- m_matrix.rotate(angle);
- m_matrix.translate(-cx, -cy);
-}
-
-void SVGTransform::setSkewX(float angle)
-{
- m_type = SVG_TRANSFORM_SKEWX;
- m_angle = angle;
-
- m_matrix.makeIdentity();
- m_matrix.skewX(angle);
-}
-
-void SVGTransform::setSkewY(float angle)
-{
- m_type = SVG_TRANSFORM_SKEWY;
- m_angle = angle;
-
- m_matrix.makeIdentity();
- m_matrix.skewY(angle);
-}
-
-const String& SVGTransform::transformTypePrefixForParsing(SVGTransformType type)
-{
- switch (type) {
- case SVG_TRANSFORM_UNKNOWN:
- return emptyString();
- case SVG_TRANSFORM_MATRIX: {
- DEFINE_STATIC_LOCAL(String, matrixString, (ASCIILiteral("matrix(")));
- return matrixString;
- }
- case SVG_TRANSFORM_TRANSLATE: {
- DEFINE_STATIC_LOCAL(String, translateString, (ASCIILiteral("translate(")));
- return translateString;
- }
- case SVG_TRANSFORM_SCALE: {
- DEFINE_STATIC_LOCAL(String, scaleString, (ASCIILiteral("scale(")));
- return scaleString;
- }
- case SVG_TRANSFORM_ROTATE: {
- DEFINE_STATIC_LOCAL(String, rotateString, (ASCIILiteral("rotate(")));
- return rotateString;
- }
- case SVG_TRANSFORM_SKEWX: {
- DEFINE_STATIC_LOCAL(String, skewXString, (ASCIILiteral("skewX(")));
- return skewXString;
- }
- case SVG_TRANSFORM_SKEWY: {
- DEFINE_STATIC_LOCAL(String, skewYString, (ASCIILiteral("skewY(")));
- return skewYString;
- }
- }
-
- ASSERT_NOT_REACHED();
- return emptyString();
-}
-
-String SVGTransform::valueAsString() const
-{
- const String& prefix = transformTypePrefixForParsing(m_type);
- switch (m_type) {
- case SVG_TRANSFORM_UNKNOWN:
- return prefix;
- case SVG_TRANSFORM_MATRIX: {
- StringBuilder builder;
- builder.append(prefix);
- builder.appendNumber(m_matrix.a());
- builder.append(' ');
- builder.appendNumber(m_matrix.b());
- builder.append(' ');
- builder.appendNumber(m_matrix.c());
- builder.append(' ');
- builder.appendNumber(m_matrix.d());
- builder.append(' ');
- builder.appendNumber(m_matrix.e());
- builder.append(' ');
- builder.appendNumber(m_matrix.f());
- builder.append(')');
- return builder.toString();
- }
- case SVG_TRANSFORM_TRANSLATE: {
- StringBuilder builder;
- builder.append(prefix);
- builder.appendNumber(m_matrix.e());
- builder.append(' ');
- builder.appendNumber(m_matrix.f());
- builder.append(')');
- return builder.toString();
- }
- case SVG_TRANSFORM_SCALE: {
- StringBuilder builder;
- builder.append(prefix);
- builder.appendNumber(m_matrix.xScale());
- builder.append(' ');
- builder.appendNumber(m_matrix.yScale());
- builder.append(')');
- return builder.toString();
- }
- case SVG_TRANSFORM_ROTATE: {
- double angleInRad = deg2rad(m_angle);
- double cosAngle = cos(angleInRad);
- double sinAngle = sin(angleInRad);
- float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - cosAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0);
- float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAngle / (1 - cosAngle) + m_matrix.f()) / 2 : 0);
- StringBuilder builder;
- builder.append(prefix);
- builder.appendNumber(m_angle);
- if (cx || cy) {
- builder.append(' ');
- builder.appendNumber(cx);
- builder.append(' ');
- builder.appendNumber(cy);
- }
- builder.append(')');
- return builder.toString();
- }
- case SVG_TRANSFORM_SKEWX:
- case SVG_TRANSFORM_SKEWY: {
- StringBuilder builder;
- builder.append(prefix);
- builder.appendNumber(m_angle);
- builder.append(')');
- return builder.toString();
- }
- }
-
- ASSERT_NOT_REACHED();
- return emptyString();
+ return SVGMatrixTearOff::create(*this, propertyReference().svgMatrix());
}
} // namespace WebCore
-
-#endif // ENABLE(SVG)