summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/transforms
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /WebCore/platform/graphics/transforms
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_webkit-cad810f21b803229eb11403f9209855525a25d57.zip
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'WebCore/platform/graphics/transforms')
-rw-r--r--WebCore/platform/graphics/transforms/AffineTransform.cpp388
-rw-r--r--WebCore/platform/graphics/transforms/AffineTransform.h190
-rw-r--r--WebCore/platform/graphics/transforms/IdentityTransformOperation.h67
-rw-r--r--WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp56
-rw-r--r--WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h74
-rw-r--r--WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp52
-rw-r--r--WebCore/platform/graphics/transforms/MatrixTransformOperation.h101
-rw-r--r--WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp58
-rw-r--r--WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h73
-rw-r--r--WebCore/platform/graphics/transforms/RotateTransformOperation.cpp95
-rw-r--r--WebCore/platform/graphics/transforms/RotateTransformOperation.h90
-rw-r--r--WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp46
-rw-r--r--WebCore/platform/graphics/transforms/ScaleTransformOperation.h87
-rw-r--r--WebCore/platform/graphics/transforms/SkewTransformOperation.cpp41
-rw-r--r--WebCore/platform/graphics/transforms/SkewTransformOperation.h77
-rw-r--r--WebCore/platform/graphics/transforms/TransformOperation.h86
-rw-r--r--WebCore/platform/graphics/transforms/TransformOperations.cpp49
-rw-r--r--WebCore/platform/graphics/transforms/TransformOperations.h77
-rw-r--r--WebCore/platform/graphics/transforms/TransformationMatrix.cpp1132
-rw-r--r--WebCore/platform/graphics/transforms/TransformationMatrix.h364
-rw-r--r--WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp44
-rw-r--r--WebCore/platform/graphics/transforms/TranslateTransformOperation.h92
22 files changed, 0 insertions, 3339 deletions
diff --git a/WebCore/platform/graphics/transforms/AffineTransform.cpp b/WebCore/platform/graphics/transforms/AffineTransform.cpp
deleted file mode 100644
index f275526..0000000
--- a/WebCore/platform/graphics/transforms/AffineTransform.cpp
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * 2010 Dirk Schulze <krit@webkit.org>
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR
- * 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"
-#include "AffineTransform.h"
-
-#include "FloatConversion.h"
-#include "FloatQuad.h"
-#include "FloatRect.h"
-#include "IntRect.h"
-
-#include <wtf/MathExtras.h>
-
-namespace WebCore {
-
-static void affineTransformDecompose(const AffineTransform& matrix, double sr[9])
-{
- AffineTransform m(matrix);
-
- // Compute scaling factors
- double sx = matrix.xScale();
- double sy = matrix.yScale();
-
- // Compute cross product of transformed unit vectors. If negative,
- // one axis was flipped.
- if (m.a() * m.d() - m.c() * m.b() < 0.0) {
- // Flip axis with minimum unit vector dot product
- if (m.a() < m.d())
- sx = -sx;
- else
- sy = -sy;
- }
-
- // Remove scale from matrix
- m.scale(1.0 / sx, 1.0 / sy);
-
- // Compute rotation
- double angle = atan2(m.b(), m.a());
-
- // Remove rotation from matrix
- m.rotate(rad2deg(-angle));
-
- // Return results
- sr[0] = sx;
- sr[1] = sy;
- sr[2] = angle;
- sr[3] = m.a();
- sr[4] = m.b();
- sr[5] = m.c();
- sr[6] = m.d();
- sr[7] = m.e();
- sr[8] = m.f();
-}
-
-static void affineTransformCompose(AffineTransform& m, const double sr[9])
-{
- m.setA(sr[3]);
- m.setB(sr[4]);
- m.setC(sr[5]);
- m.setD(sr[6]);
- m.setE(sr[7]);
- m.setF(sr[8]);
- m.rotate(rad2deg(sr[2]));
- m.scale(sr[0], sr[1]);
-}
-
-AffineTransform::AffineTransform()
-{
- setMatrix(1, 0, 0, 1, 0, 0);
-}
-
-AffineTransform::AffineTransform(double a, double b, double c, double d, double e, double f)
-{
- setMatrix(a, b, c, d, e, f);
-}
-
-void AffineTransform::makeIdentity()
-{
- setMatrix(1, 0, 0, 1, 0, 0);
-}
-
-void AffineTransform::setMatrix(double a, double b, double c, double d, double e, double f)
-{
- m_transform[0] = a;
- m_transform[1] = b;
- m_transform[2] = c;
- m_transform[3] = d;
- m_transform[4] = e;
- m_transform[5] = f;
-}
-
-bool AffineTransform::isIdentity() const
-{
- return (m_transform[0] == 1 && m_transform[1] == 0
- && m_transform[2] == 0 && m_transform[3] == 1
- && m_transform[4] == 0 && m_transform[5] == 0);
-}
-
-double AffineTransform::xScale() const
-{
- return sqrt(m_transform[0] * m_transform[0] + m_transform[1] * m_transform[1]);
-}
-
-double AffineTransform::yScale() const
-{
- return sqrt(m_transform[2] * m_transform[2] + m_transform[3] * m_transform[3]);
-}
-
-double AffineTransform::det() const
-{
- return m_transform[0] * m_transform[3] - m_transform[1] * m_transform[2];
-}
-
-bool AffineTransform::isInvertible() const
-{
- return det() != 0.0;
-}
-
-AffineTransform AffineTransform::inverse() const
-{
- double determinant = det();
- if (determinant == 0.0)
- return AffineTransform();
-
- AffineTransform result;
- if (isIdentityOrTranslation()) {
- result.m_transform[4] = -m_transform[4];
- result.m_transform[5] = -m_transform[5];
- return result;
- }
-
- result.m_transform[0] = m_transform[3] / determinant;
- result.m_transform[1] = -m_transform[1] / determinant;
- result.m_transform[2] = -m_transform[2] / determinant;
- result.m_transform[3] = m_transform[0] / determinant;
- result.m_transform[4] = (m_transform[2] * m_transform[5]
- - m_transform[3] * m_transform[4]) / determinant;
- result.m_transform[5] = (m_transform[1] * m_transform[4]
- - m_transform[0] * m_transform[5]) / determinant;
-
- return result;
-}
-
-AffineTransform& AffineTransform::multiply(const AffineTransform& other)
-{
- return (*this) *= other;
-}
-
-AffineTransform& AffineTransform::multLeft(const AffineTransform& other)
-{
- AffineTransform trans;
-
- trans.m_transform[0] = other.m_transform[0] * m_transform[0] + other.m_transform[1] * m_transform[2];
- trans.m_transform[1] = other.m_transform[0] * m_transform[1] + other.m_transform[1] * m_transform[3];
- trans.m_transform[2] = other.m_transform[2] * m_transform[0] + other.m_transform[3] * m_transform[2];
- trans.m_transform[3] = other.m_transform[2] * m_transform[1] + other.m_transform[3] * m_transform[3];
- trans.m_transform[4] = other.m_transform[4] * m_transform[0] + other.m_transform[5] * m_transform[2] + m_transform[4];
- trans.m_transform[5] = other.m_transform[4] * m_transform[1] + other.m_transform[5] * m_transform[3] + m_transform[5];
-
- setMatrix(trans.m_transform);
- return *this;
-}
-
-AffineTransform& AffineTransform::rotate(double a)
-{
- // angle is in degree. Switch to radian
- a = deg2rad(a);
- double cosAngle = cos(a);
- double sinAngle = sin(a);
- AffineTransform rot(cosAngle, sinAngle, -sinAngle, cosAngle, 0, 0);
-
- multLeft(rot);
- return *this;
-}
-
-AffineTransform& AffineTransform::scale(double s)
-{
- return scale(s, s);
-}
-
-AffineTransform& AffineTransform::scale(double sx, double sy)
-{
- m_transform[0] *= sx;
- m_transform[1] *= sx;
- m_transform[2] *= sy;
- m_transform[3] *= sy;
- return *this;
-}
-
-// *this = *this * translation
-AffineTransform& AffineTransform::translate(double tx, double ty)
-{
- if (isIdentityOrTranslation()) {
- m_transform[4] += tx;
- m_transform[5] += ty;
- return *this;
- }
-
- m_transform[4] += tx * m_transform[0] + ty * m_transform[2];
- m_transform[5] += tx * m_transform[1] + ty * m_transform[3];
- return *this;
-}
-
-// *this = translation * *this
-AffineTransform& AffineTransform::translateRight(double tx, double ty)
-{
- m_transform[4] += tx;
- m_transform[5] += ty;
- return *this;
-}
-
-AffineTransform& AffineTransform::scaleNonUniform(double sx, double sy)
-{
- return scale(sx, sy);
-}
-
-AffineTransform& AffineTransform::rotateFromVector(double x, double y)
-{
- return rotate(rad2deg(atan2(y, x)));
-}
-
-AffineTransform& AffineTransform::flipX()
-{
- return scale(-1, 1);
-}
-
-AffineTransform& AffineTransform::flipY()
-{
- return scale(1, -1);
-}
-
-AffineTransform& AffineTransform::shear(double sx, double sy)
-{
- double a = m_transform[0];
- double b = m_transform[1];
-
- m_transform[0] += sy * m_transform[2];
- m_transform[1] += sy * m_transform[3];
- m_transform[2] += sx * a;
- m_transform[3] += sx * b;
-
- return *this;
-}
-
-AffineTransform& AffineTransform::skew(double angleX, double angleY)
-{
- return shear(tan(deg2rad(angleX)), tan(deg2rad(angleY)));
-}
-
-AffineTransform& AffineTransform::skewX(double angle)
-{
- return shear(tan(deg2rad(angle)), 0);
-}
-
-AffineTransform& AffineTransform::skewY(double angle)
-{
- return shear(0, tan(deg2rad(angle)));
-}
-
-AffineTransform makeMapBetweenRects(const FloatRect& source, const FloatRect& dest)
-{
- AffineTransform transform;
- transform.translate(dest.x() - source.x(), dest.y() - source.y());
- transform.scale(dest.width() / source.width(), dest.height() / source.height());
- return transform;
-}
-
-void AffineTransform::map(double x, double y, double& x2, double& y2) const
-{
- x2 = (m_transform[0] * x + m_transform[2] * y + m_transform[4]);
- y2 = (m_transform[1] * x + m_transform[3] * y + m_transform[5]);
-}
-
-IntPoint AffineTransform::mapPoint(const IntPoint& point) const
-{
- double x2, y2;
- map(point.x(), point.y(), x2, y2);
-
- // Round the point.
- return IntPoint(lround(x2), lround(y2));
-}
-
-FloatPoint AffineTransform::mapPoint(const FloatPoint& point) const
-{
- double x2, y2;
- map(point.x(), point.y(), x2, y2);
-
- return FloatPoint(narrowPrecisionToFloat(x2), narrowPrecisionToFloat(y2));
-}
-
-IntRect AffineTransform::mapRect(const IntRect &rect) const
-{
- return enclosingIntRect(mapRect(FloatRect(rect)));
-}
-
-FloatRect AffineTransform::mapRect(const FloatRect& rect) const
-{
- if (isIdentityOrTranslation()) {
- FloatRect mappedRect(rect);
- mappedRect.move(narrowPrecisionToFloat(m_transform[4]), narrowPrecisionToFloat(m_transform[5]));
- return mappedRect;
- }
-
- FloatQuad result;
- result.setP1(mapPoint(rect.location()));
- result.setP2(mapPoint(FloatPoint(rect.right(), rect.y())));
- result.setP3(mapPoint(FloatPoint(rect.right(), rect.bottom())));
- result.setP4(mapPoint(FloatPoint(rect.x(), rect.bottom())));
- return result.boundingBox();
-}
-
-FloatQuad AffineTransform::mapQuad(const FloatQuad& q) const
-{
- if (isIdentityOrTranslation()) {
- FloatQuad mappedQuad(q);
- mappedQuad.move(narrowPrecisionToFloat(m_transform[4]), narrowPrecisionToFloat(m_transform[5]));
- return mappedQuad;
- }
-
- FloatQuad result;
- result.setP1(mapPoint(q.p1()));
- result.setP2(mapPoint(q.p2()));
- result.setP3(mapPoint(q.p3()));
- result.setP4(mapPoint(q.p4()));
- return result;
-}
-
-void AffineTransform::blend(const AffineTransform& from, double progress)
-{
- double srA[9], srB[9];
-
- affineTransformDecompose(from, srA);
- affineTransformDecompose(*this, srB);
-
- // If x-axis of one is flipped, and y-axis of the other, convert to an unflipped rotation.
- if ((srA[0] < 0 && srB[1] < 0) || (srA[1] < 0 && srB[0] < 0)) {
- srA[0] = -srA[0];
- srA[1] = -srA[1];
- srA[2] += srA[2] < 0 ? piDouble : -piDouble;
- }
-
- // Don't rotate the long way around.
- srA[2] = fmod(srA[2], 2.0 * piDouble);
- srB[2] = fmod(srB[2], 2.0 * piDouble);
-
- if (fabs(srA[2] - srB[2]) > piDouble) {
- if (srA[2] > srB[2])
- srA[2] -= piDouble * 2.0;
- else
- srB[2] -= piDouble * 2.0;
- }
-
- for (int i = 0; i < 9; i++)
- srA[i] = srA[i] + progress * (srB[i] - srA[i]);
-
- affineTransformCompose(*this, srA);
-}
-
-TransformationMatrix AffineTransform::toTransformationMatrix() const
-{
- return TransformationMatrix(m_transform[0], m_transform[1], m_transform[2],
- m_transform[3], m_transform[4], m_transform[5]);
-}
-
-}
diff --git a/WebCore/platform/graphics/transforms/AffineTransform.h b/WebCore/platform/graphics/transforms/AffineTransform.h
deleted file mode 100644
index baee102..0000000
--- a/WebCore/platform/graphics/transforms/AffineTransform.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * 2010 Dirk Schulze <krit@webkit.org>
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR
- * 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.
- */
-
-#ifndef AffineTransform_h
-#define AffineTransform_h
-
-#include "TransformationMatrix.h"
-
-#include <string.h> // for memcpy
-#include <wtf/FastAllocBase.h>
-
-#if PLATFORM(CG)
-#include <CoreGraphics/CGAffineTransform.h>
-#elif PLATFORM(CAIRO)
-#include <cairo.h>
-#elif PLATFORM(OPENVG)
-#include "VGUtils.h"
-#elif PLATFORM(QT)
-#include <QTransform>
-#elif PLATFORM(SKIA)
-#include <SkMatrix.h>
-#elif PLATFORM(WX) && USE(WXGC)
-#include <wx/graphics.h>
-#endif
-
-namespace WebCore {
-
-class FloatPoint;
-class FloatQuad;
-class FloatRect;
-class IntPoint;
-class IntRect;
-class TransformationMatrix;
-
-class AffineTransform : public FastAllocBase {
-public:
- typedef double Transform[6];
-
- AffineTransform();
- AffineTransform(double a, double b, double c, double d, double e, double f);
-
- void setMatrix(double a, double b, double c, double d, double e, double f);
-
- void map(double x, double y, double& x2, double& y2) const;
-
- // Rounds the mapped point to the nearest integer value.
- IntPoint mapPoint(const IntPoint&) const;
-
- FloatPoint mapPoint(const FloatPoint&) const;
-
- // Rounds the resulting mapped rectangle out. This is helpful for bounding
- // box computations but may not be what is wanted in other contexts.
- IntRect mapRect(const IntRect&) const;
-
- FloatRect mapRect(const FloatRect&) const;
- FloatQuad mapQuad(const FloatQuad&) const;
-
- bool isIdentity() const;
-
- double a() const { return m_transform[0]; }
- void setA(double a) { m_transform[0] = a; }
- double b() const { return m_transform[1]; }
- void setB(double b) { m_transform[1] = b; }
- double c() const { return m_transform[2]; }
- void setC(double c) { m_transform[2] = c; }
- double d() const { return m_transform[3]; }
- void setD(double d) { m_transform[3] = d; }
- double e() const { return m_transform[4]; }
- void setE(double e) { m_transform[4] = e; }
- double f() const { return m_transform[5]; }
- void setF(double f) { m_transform[5] = f; }
-
- void makeIdentity();
-
- AffineTransform& multiply(const AffineTransform&);
- AffineTransform& multLeft(const AffineTransform&);
- AffineTransform& scale(double);
- AffineTransform& scale(double sx, double sy);
- AffineTransform& scaleNonUniform(double sx, double sy);
- AffineTransform& rotate(double d);
- AffineTransform& rotateFromVector(double x, double y);
- AffineTransform& translate(double tx, double ty);
- AffineTransform& translateRight(double tx, double ty);
- AffineTransform& shear(double sx, double sy);
- AffineTransform& flipX();
- AffineTransform& flipY();
- AffineTransform& skew(double angleX, double angleY);
- AffineTransform& skewX(double angle);
- AffineTransform& skewY(double angle);
-
- double xScale() const;
- double yScale() const;
-
- double det() const;
- bool isInvertible() const;
- AffineTransform inverse() const;
-
- void blend(const AffineTransform& from, double progress);
-
- TransformationMatrix toTransformationMatrix() const;
-
- bool isIdentityOrTranslation() const
- {
- return m_transform[0] == 1 && m_transform[1] == 0 && m_transform[2] == 0 && m_transform[3] == 1;
- }
-
- bool isIdentityOrTranslationOrFlipped() const
- {
- return m_transform[0] == 1 && m_transform[1] == 0 && m_transform[2] == 0 && (m_transform[3] == 1 || m_transform[3] == -1);
- }
-
- bool operator== (const AffineTransform& m2) const
- {
- return (m_transform[0] == m2.m_transform[0]
- && m_transform[1] == m2.m_transform[1]
- && m_transform[2] == m2.m_transform[2]
- && m_transform[3] == m2.m_transform[3]
- && m_transform[4] == m2.m_transform[4]
- && m_transform[5] == m2.m_transform[5]);
- }
-
- bool operator!=(const AffineTransform& other) const { return !(*this == other); }
-
- // *this = *this * t (i.e., a multRight)
- AffineTransform& operator*=(const AffineTransform& t)
- {
- *this = *this * t;
- return *this;
- }
-
- // result = *this * t (i.e., a multRight)
- AffineTransform operator*(const AffineTransform& t) const
- {
- AffineTransform result = t;
- result.multLeft(*this);
- return result;
- }
-
-#if PLATFORM(CG)
- operator CGAffineTransform() const;
-#elif PLATFORM(CAIRO)
- operator cairo_matrix_t() const;
-#elif PLATFORM(OPENVG)
- operator VGMatrix() const;
-#elif PLATFORM(QT)
- operator QTransform() const;
-#elif PLATFORM(SKIA)
- operator SkMatrix() const;
-#elif PLATFORM(WX) && USE(WXGC)
- operator wxGraphicsMatrix() const;
-#endif
-
-private:
- void setMatrix(const Transform m)
- {
- if (m && m != m_transform)
- memcpy(m_transform, m, sizeof(Transform));
- }
-
- Transform m_transform;
-};
-
-AffineTransform makeMapBetweenRects(const FloatRect& source, const FloatRect& dest);
-
-}
-
-#endif
diff --git a/WebCore/platform/graphics/transforms/IdentityTransformOperation.h b/WebCore/platform/graphics/transforms/IdentityTransformOperation.h
deleted file mode 100644
index 347737c..0000000
--- a/WebCore/platform/graphics/transforms/IdentityTransformOperation.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef IdentityTransformOperation_h
-#define IdentityTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class IdentityTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<IdentityTransformOperation> create()
- {
- return adoptRef(new IdentityTransformOperation());
- }
-
-private:
- virtual bool isIdentity() const { return true; }
- virtual OperationType getOperationType() const { return IDENTITY; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == IDENTITY; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- return isSameType(o);
- }
-
- virtual bool apply(TransformationMatrix&, const IntSize&) const
- {
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation*, double, bool = false)
- {
- return this;
- }
-
- IdentityTransformOperation()
- {
- }
-
-};
-
-} // namespace WebCore
-
-#endif // IdentityTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp b/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp
deleted file mode 100644
index 230be3c..0000000
--- a/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE INC. ``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 COMPUTER, INC. OR
- * 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"
-#include "Matrix3DTransformOperation.h"
-
-#include <algorithm>
-
-using namespace std;
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> Matrix3DTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- // Convert the TransformOperations into matrices
- IntSize size;
- TransformationMatrix fromT;
- TransformationMatrix toT;
- if (from)
- from->apply(fromT, size);
-
- apply(toT, size);
-
- if (blendToIdentity)
- std::swap(fromT, toT);
-
- toT.blend(fromT, progress);
- return Matrix3DTransformOperation::create(toT);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h b/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h
deleted file mode 100644
index 0a0aaf0..0000000
--- a/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE INC. ``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 COMPUTER, INC. OR
- * 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.
- */
-
-#ifndef Matrix3DTransformOperation_h
-#define Matrix3DTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class Matrix3DTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<Matrix3DTransformOperation> create(const TransformationMatrix& matrix)
- {
- return adoptRef(new Matrix3DTransformOperation(matrix));
- }
-
- TransformationMatrix matrix() const {return m_matrix; }
-
-private:
- virtual bool isIdentity() const { return m_matrix.isIdentity(); }
-
- virtual OperationType getOperationType() const { return MATRIX_3D; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == MATRIX_3D; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const Matrix3DTransformOperation* m = static_cast<const Matrix3DTransformOperation*>(&o);
- return m_matrix == m->m_matrix;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize&) const
- {
- transform.multLeft(TransformationMatrix(m_matrix));
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- Matrix3DTransformOperation(const TransformationMatrix& mat)
- {
- m_matrix = mat;
- }
-
- TransformationMatrix m_matrix;
-};
-
-} // namespace WebCore
-
-#endif // Matrix3DTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp b/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp
deleted file mode 100644
index 0eaccea..0000000
--- a/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "MatrixTransformOperation.h"
-
-#include <algorithm>
-
-using namespace std;
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> MatrixTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- // convert the TransformOperations into matrices
- IntSize size;
- TransformationMatrix fromT;
- TransformationMatrix toT(m_a, m_b, m_c, m_d, m_e, m_f);
- if (from) {
- const MatrixTransformOperation* m = static_cast<const MatrixTransformOperation*>(from);
- fromT.setMatrix(m->m_a, m->m_b, m->m_c, m->m_d, m->m_e, m->m_f);
- }
-
- if (blendToIdentity)
- std::swap(fromT, toT);
-
- toT.blend(fromT, progress);
- return MatrixTransformOperation::create(toT.a(), toT.b(), toT.c(), toT.d(), toT.e(), toT.f());
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/MatrixTransformOperation.h b/WebCore/platform/graphics/transforms/MatrixTransformOperation.h
deleted file mode 100644
index fd9b27e..0000000
--- a/WebCore/platform/graphics/transforms/MatrixTransformOperation.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef MatrixTransformOperation_h
-#define MatrixTransformOperation_h
-
-#include "TransformOperation.h"
-#include "TransformationMatrix.h"
-
-namespace WebCore {
-
-class MatrixTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<MatrixTransformOperation> create(double a, double b, double c, double d, double e, double f)
- {
- return adoptRef(new MatrixTransformOperation(a, b, c, d, e, f));
- }
-
- static PassRefPtr<MatrixTransformOperation> create(const TransformationMatrix& t)
- {
- return adoptRef(new MatrixTransformOperation(t));
- }
-
- TransformationMatrix matrix() const { return TransformationMatrix(m_a, m_b, m_c, m_d, m_e, m_f); }
-
-private:
- virtual bool isIdentity() const { return m_a == 1 && m_b == 0 && m_c == 0 && m_d == 1 && m_e == 0 && m_f == 0; }
-
- virtual OperationType getOperationType() const { return MATRIX; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == MATRIX; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
-
- const MatrixTransformOperation* m = static_cast<const MatrixTransformOperation*>(&o);
- return m_a == m->m_a && m_b == m->m_b && m_c == m->m_c && m_d == m->m_d && m_e == m->m_e && m_f == m->m_f;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize&) const
- {
- TransformationMatrix matrix(m_a, m_b, m_c, m_d, m_e, m_f);
- transform.multLeft(TransformationMatrix(matrix));
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- MatrixTransformOperation(double a, double b, double c, double d, double e, double f)
- : m_a(a)
- , m_b(b)
- , m_c(c)
- , m_d(d)
- , m_e(e)
- , m_f(f)
- {
- }
-
- MatrixTransformOperation(const TransformationMatrix& t)
- : m_a(t.a())
- , m_b(t.b())
- , m_c(t.c())
- , m_d(t.d())
- , m_e(t.e())
- , m_f(t.f())
- {
- }
-
- double m_a;
- double m_b;
- double m_c;
- double m_d;
- double m_e;
- double m_f;
-};
-
-} // namespace WebCore
-
-#endif // MatrixTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp b/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp
deleted file mode 100644
index 9fd03a1..0000000
--- a/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE INC. ``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 COMPUTER, INC. OR
- * 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"
-#include "PerspectiveTransformOperation.h"
-
-#include <algorithm>
-
-using namespace std;
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> PerspectiveTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- if (blendToIdentity)
- return PerspectiveTransformOperation::create(m_p + (1. - m_p) * progress);
-
- const PerspectiveTransformOperation* fromOp = static_cast<const PerspectiveTransformOperation*>(from);
- double fromP = fromOp ? fromOp->m_p : 0;
- double toP = m_p;
-
- TransformationMatrix fromT;
- TransformationMatrix toT;
- fromT.applyPerspective(fromP);
- toT.applyPerspective(toP);
- toT.blend(fromT, progress);
- TransformationMatrix::DecomposedType decomp;
- toT.decompose(decomp);
-
- return PerspectiveTransformOperation::create(decomp.perspectiveZ ? -1.0 / decomp.perspectiveZ : 0.0);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h b/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h
deleted file mode 100644
index 834cc83..0000000
--- a/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE INC. ``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 COMPUTER, INC. OR
- * 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.
- */
-
-#ifndef PerspectiveTransformOperation_h
-#define PerspectiveTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class PerspectiveTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<PerspectiveTransformOperation> create(double p)
- {
- return adoptRef(new PerspectiveTransformOperation(p));
- }
-
- double perspective() const { return m_p; }
-
-private:
- virtual bool isIdentity() const { return m_p == 0; }
- virtual OperationType getOperationType() const { return PERSPECTIVE; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == PERSPECTIVE; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const PerspectiveTransformOperation* p = static_cast<const PerspectiveTransformOperation*>(&o);
- return m_p == p->m_p;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize&) const
- {
- transform.applyPerspective(m_p);
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- PerspectiveTransformOperation(double p)
- : m_p(p)
- {
- }
-
- double m_p;
-};
-
-} // namespace WebCore
-
-#endif // PerspectiveTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp b/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp
deleted file mode 100644
index 919d174..0000000
--- a/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "RotateTransformOperation.h"
-
-#include <algorithm>
-#include <wtf/MathExtras.h>
-
-using namespace std;
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> RotateTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- if (blendToIdentity)
- return RotateTransformOperation::create(m_x, m_y, m_z, m_angle - m_angle * progress, m_type);
-
- const RotateTransformOperation* fromOp = static_cast<const RotateTransformOperation*>(from);
-
- // Optimize for single axis rotation
- if (!fromOp || (fromOp->m_x == 0 && fromOp->m_y == 0 && fromOp->m_z == 1) ||
- (fromOp->m_x == 0 && fromOp->m_y == 1 && fromOp->m_z == 0) ||
- (fromOp->m_x == 1 && fromOp->m_y == 0 && fromOp->m_z == 0)) {
- double fromAngle = fromOp ? fromOp->m_angle : 0;
- return RotateTransformOperation::create(fromOp ? fromOp->m_x : m_x,
- fromOp ? fromOp->m_y : m_y,
- fromOp ? fromOp->m_z : m_z,
- fromAngle + (m_angle - fromAngle) * progress, m_type);
- }
-
- const RotateTransformOperation* toOp = this;
-
- // Create the 2 rotation matrices
- TransformationMatrix fromT;
- TransformationMatrix toT;
- fromT.rotate3d((float)(fromOp ? fromOp->m_x : 0),
- (float)(fromOp ? fromOp->m_y : 0),
- (float)(fromOp ? fromOp->m_z : 1),
- (float)(fromOp ? fromOp->m_angle : 0));
-
- toT.rotate3d((float)(toOp ? toOp->m_x : 0),
- (float)(toOp ? toOp->m_y : 0),
- (float)(toOp ? toOp->m_z : 1),
- (float)(toOp ? toOp->m_angle : 0));
-
- // Blend them
- toT.blend(fromT, progress);
-
- // Extract the result as a quaternion
- TransformationMatrix::DecomposedType decomp;
- toT.decompose(decomp);
-
- // Convert that to Axis/Angle form
- double x = -decomp.quaternionX;
- double y = -decomp.quaternionY;
- double z = -decomp.quaternionZ;
- double length = sqrt(x * x + y * y + z * z);
- double angle = 0;
-
- if (length > 0.00001) {
- x /= length;
- y /= length;
- z /= length;
- angle = rad2deg(acos(decomp.quaternionW) * 2);
- } else {
- x = 0;
- y = 0;
- z = 1;
- }
- return RotateTransformOperation::create(x, y, z, angle, ROTATE_3D);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/RotateTransformOperation.h b/WebCore/platform/graphics/transforms/RotateTransformOperation.h
deleted file mode 100644
index 2acb002..0000000
--- a/WebCore/platform/graphics/transforms/RotateTransformOperation.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef RotateTransformOperation_h
-#define RotateTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class RotateTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<RotateTransformOperation> create(double angle, OperationType type)
- {
- return adoptRef(new RotateTransformOperation(0, 0, 1, angle, type));
- }
-
- static PassRefPtr<RotateTransformOperation> create(double x, double y, double z, double angle, OperationType type)
- {
- return adoptRef(new RotateTransformOperation(x, y, z, angle, type));
- }
-
- double x() const { return m_x; }
- double y() const { return m_y; }
- double z() const { return m_z; }
- double angle() const { return m_angle; }
-
-private:
- virtual bool isIdentity() const { return m_angle == 0; }
-
- virtual OperationType getOperationType() const { return m_type; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == m_type; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const RotateTransformOperation* r = static_cast<const RotateTransformOperation*>(&o);
- return m_x == r->m_x && m_y == r->m_y && m_z == r->m_z && m_angle == r->m_angle;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize& /*borderBoxSize*/) const
- {
- transform.rotate3d(m_x, m_y, m_z, m_angle);
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- RotateTransformOperation(double x, double y, double z, double angle, OperationType type)
- : m_x(x)
- , m_y(y)
- , m_z(z)
- , m_angle(angle)
- , m_type(type)
- {
- ASSERT(type == ROTATE_X || type == ROTATE_Y || type == ROTATE_Z || type == ROTATE_3D);
- }
-
- double m_x;
- double m_y;
- double m_z;
- double m_angle;
- OperationType m_type;
-};
-
-} // namespace WebCore
-
-#endif // RotateTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp b/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp
deleted file mode 100644
index 45d119c..0000000
--- a/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "ScaleTransformOperation.h"
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> ScaleTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- if (blendToIdentity)
- return ScaleTransformOperation::create(m_x + (1. - m_x) * progress,
- m_y + (1. - m_y) * progress,
- m_z + (1. - m_z) * progress, m_type);
-
- const ScaleTransformOperation* fromOp = static_cast<const ScaleTransformOperation*>(from);
- double fromX = fromOp ? fromOp->m_x : 1.;
- double fromY = fromOp ? fromOp->m_y : 1.;
- double fromZ = fromOp ? fromOp->m_z : 1.;
- return ScaleTransformOperation::create(fromX + (m_x - fromX) * progress,
- fromY + (m_y - fromY) * progress,
- fromZ + (m_z - fromZ) * progress, m_type);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/ScaleTransformOperation.h b/WebCore/platform/graphics/transforms/ScaleTransformOperation.h
deleted file mode 100644
index a87bb3b..0000000
--- a/WebCore/platform/graphics/transforms/ScaleTransformOperation.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef ScaleTransformOperation_h
-#define ScaleTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class ScaleTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<ScaleTransformOperation> create(double sx, double sy, OperationType type)
- {
- return adoptRef(new ScaleTransformOperation(sx, sy, 1, type));
- }
-
- static PassRefPtr<ScaleTransformOperation> create(double sx, double sy, double sz, OperationType type)
- {
- return adoptRef(new ScaleTransformOperation(sx, sy, sz, type));
- }
-
- double x() const { return m_x; }
- double y() const { return m_y; }
- double z() const { return m_z; }
-
-private:
- virtual bool isIdentity() const { return m_x == 1 && m_y == 1 && m_z == 1; }
-
- virtual OperationType getOperationType() const { return m_type; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == m_type; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const ScaleTransformOperation* s = static_cast<const ScaleTransformOperation*>(&o);
- return m_x == s->m_x && m_y == s->m_y && m_z == s->m_z;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize&) const
- {
- transform.scale3d(m_x, m_y, m_z);
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- ScaleTransformOperation(double sx, double sy, double sz, OperationType type)
- : m_x(sx)
- , m_y(sy)
- , m_z(sz)
- , m_type(type)
- {
- ASSERT(type == SCALE_X || type == SCALE_Y || type == SCALE_Z || type == SCALE || type == SCALE_3D);
- }
-
- double m_x;
- double m_y;
- double m_z;
- OperationType m_type;
-};
-
-} // namespace WebCore
-
-#endif // ScaleTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp b/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp
deleted file mode 100644
index 2a430e9..0000000
--- a/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "SkewTransformOperation.h"
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> SkewTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- if (blendToIdentity)
- return SkewTransformOperation::create(m_angleX - m_angleX * progress, m_angleY - m_angleY * progress, m_type);
-
- const SkewTransformOperation* fromOp = static_cast<const SkewTransformOperation*>(from);
- double fromAngleX = fromOp ? fromOp->m_angleX : 0;
- double fromAngleY = fromOp ? fromOp->m_angleY : 0;
- return SkewTransformOperation::create(fromAngleX + (m_angleX - fromAngleX) * progress, fromAngleY + (m_angleY - fromAngleY) * progress, m_type);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/SkewTransformOperation.h b/WebCore/platform/graphics/transforms/SkewTransformOperation.h
deleted file mode 100644
index afe9a7b..0000000
--- a/WebCore/platform/graphics/transforms/SkewTransformOperation.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef SkewTransformOperation_h
-#define SkewTransformOperation_h
-
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class SkewTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<SkewTransformOperation> create(double angleX, double angleY, OperationType type)
- {
- return adoptRef(new SkewTransformOperation(angleX, angleY, type));
- }
-
- double angleX() const { return m_angleX; }
- double angleY() const { return m_angleY; }
-
-private:
- virtual bool isIdentity() const { return m_angleX == 0 && m_angleY == 0; }
- virtual OperationType getOperationType() const { return m_type; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == m_type; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const SkewTransformOperation* s = static_cast<const SkewTransformOperation*>(&o);
- return m_angleX == s->m_angleX && m_angleY == s->m_angleY;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize&) const
- {
- transform.skew(m_angleX, m_angleY);
- return false;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- SkewTransformOperation(double angleX, double angleY, OperationType type)
- : m_angleX(angleX)
- , m_angleY(angleY)
- , m_type(type)
- {
- }
-
- double m_angleX;
- double m_angleY;
- OperationType m_type;
-};
-
-} // namespace WebCore
-
-#endif // SkewTransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/TransformOperation.h b/WebCore/platform/graphics/transforms/TransformOperation.h
deleted file mode 100644
index c610c4b..0000000
--- a/WebCore/platform/graphics/transforms/TransformOperation.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef TransformOperation_h
-#define TransformOperation_h
-
-#include "TransformationMatrix.h"
-#include "IntSize.h"
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
-
-namespace WebCore {
-
-// CSS Transforms (may become part of CSS3)
-
-class TransformOperation : public RefCounted<TransformOperation> {
-public:
- enum OperationType {
- SCALE_X, SCALE_Y, SCALE,
- TRANSLATE_X, TRANSLATE_Y, TRANSLATE,
- ROTATE,
- ROTATE_Z = ROTATE,
- SKEW_X, SKEW_Y, SKEW,
- MATRIX,
- SCALE_Z, SCALE_3D,
- TRANSLATE_Z, TRANSLATE_3D,
- ROTATE_X, ROTATE_Y, ROTATE_3D,
- MATRIX_3D,
- PERSPECTIVE,
- IDENTITY, NONE
- };
-
- virtual ~TransformOperation() { }
-
- virtual bool operator==(const TransformOperation&) const = 0;
- bool operator!=(const TransformOperation& o) const { return !(*this == o); }
-
- virtual bool isIdentity() const = 0;
-
- // Return true if the borderBoxSize was used in the computation, false otherwise.
- virtual bool apply(TransformationMatrix&, const IntSize& borderBoxSize) const = 0;
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false) = 0;
-
- virtual OperationType getOperationType() const = 0;
- virtual bool isSameType(const TransformOperation&) const { return false; }
-
- bool is3DOperation() const
- {
- OperationType opType = getOperationType();
- return opType == SCALE_Z ||
- opType == SCALE_3D ||
- opType == TRANSLATE_Z ||
- opType == TRANSLATE_3D ||
- opType == ROTATE_X ||
- opType == ROTATE_Y ||
- opType == ROTATE_3D ||
- opType == MATRIX_3D ||
- opType == PERSPECTIVE;
- }
-};
-
-} // namespace WebCore
-
-#endif // TransformOperation_h
diff --git a/WebCore/platform/graphics/transforms/TransformOperations.cpp b/WebCore/platform/graphics/transforms/TransformOperations.cpp
deleted file mode 100644
index 3d71480..0000000
--- a/WebCore/platform/graphics/transforms/TransformOperations.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "TransformOperations.h"
-
-#include "IdentityTransformOperation.h"
-
-namespace WebCore {
-
-TransformOperations::TransformOperations(bool makeIdentity)
-{
- if (makeIdentity)
- m_operations.append(IdentityTransformOperation::create());
-}
-
-bool TransformOperations::operator==(const TransformOperations& o) const
-{
- if (m_operations.size() != o.m_operations.size())
- return false;
-
- unsigned s = m_operations.size();
- for (unsigned i = 0; i < s; i++) {
- if (*m_operations[i] != *o.m_operations[i])
- return false;
- }
-
- return true;
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/TransformOperations.h b/WebCore/platform/graphics/transforms/TransformOperations.h
deleted file mode 100644
index c0da377..0000000
--- a/WebCore/platform/graphics/transforms/TransformOperations.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef TransformOperations_h
-#define TransformOperations_h
-
-#include "TransformOperation.h"
-#include <wtf/RefPtr.h>
-#include <wtf/Vector.h>
-
-namespace WebCore {
-
-class TransformOperations : public FastAllocBase {
-public:
- TransformOperations(bool makeIdentity = false);
-
- bool operator==(const TransformOperations& o) const;
- bool operator!=(const TransformOperations& o) const
- {
- return !(*this == o);
- }
-
- void apply(const IntSize& sz, TransformationMatrix& t) const
- {
- for (unsigned i = 0; i < m_operations.size(); ++i)
- m_operations[i]->apply(t, sz);
- }
-
- // Return true if any of the operation types are 3D operation types (even if the
- // values describe affine transforms)
- bool has3DOperation() const
- {
- for (unsigned i = 0; i < m_operations.size(); ++i)
- if (m_operations[i]->is3DOperation())
- return true;
- return false;
- }
-
- void clear()
- {
- m_operations.clear();
- }
-
- Vector<RefPtr<TransformOperation> >& operations() { return m_operations; }
- const Vector<RefPtr<TransformOperation> >& operations() const { return m_operations; }
-
- size_t size() const { return m_operations.size(); }
- const TransformOperation* at(size_t index) const { return index < m_operations.size() ? m_operations.at(index).get() : 0; }
-
-private:
- Vector<RefPtr<TransformOperation> > m_operations;
-};
-
-} // namespace WebCore
-
-#endif // TransformOperations_h
diff --git a/WebCore/platform/graphics/transforms/TransformationMatrix.cpp b/WebCore/platform/graphics/transforms/TransformationMatrix.cpp
deleted file mode 100644
index 10c7f70..0000000
--- a/WebCore/platform/graphics/transforms/TransformationMatrix.cpp
+++ /dev/null
@@ -1,1132 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2009 Torch Mobile, Inc.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR
- * 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"
-#include "TransformationMatrix.h"
-
-#include "FloatPoint3D.h"
-#include "FloatRect.h"
-#include "FloatQuad.h"
-#include "IntRect.h"
-
-#include <wtf/Assertions.h>
-#include <wtf/MathExtras.h>
-
-namespace WebCore {
-
-//
-// Supporting Math Functions
-//
-// This is a set of function from various places (attributed inline) to do things like
-// inversion and decomposition of a 4x4 matrix. They are used throughout the code
-//
-
-//
-// Adapted from Matrix Inversion by Richard Carling, Graphics Gems <http://tog.acm.org/GraphicsGems/index.html>.
-
-// EULA: The Graphics Gems code is copyright-protected. In other words, you cannot claim the text of the code
-// as your own and resell it. Using the code is permitted in any program, product, or library, non-commercial
-// or commercial. Giving credit is not required, though is a nice gesture. The code comes as-is, and if there
-// are any flaws or problems with any Gems code, nobody involved with Gems - authors, editors, publishers, or
-// webmasters - are to be held responsible. Basically, don't be a jerk, and remember that anything free comes
-// with no guarantee.
-
-// A Note About row-major vs. column major matrixes
-//
-// The clients of this class (CSSMatrix and SVGMatrix) assume a column-major ordering.
-// That means that when the matrix is initialized with 16 values, the first 4 values
-// go in the 4 rows of the first column, etc. And in the dereferencing calls, the first
-// digit is the column (e.g., m23() is column 2 row 3). Because C++ uses row-major arrays
-// the internal matrix is stored in row-major order, so m[2][0] means row 2, column 0. This
-// has no bearing on how the matrix is viewed on the outside, since all access is done
-// with function calls. But it does help make the code more clear if you know that.
-//
-// FIXME: Multiply calls are named for what they do in the internal, row-major world.
-// multLeft is actually a multRight in a column-major world, and multiply is a multLeft
-// in a column-major world. For now I've left it that way to avoid too many confusing
-// changes to the code. In particular AffineTransform uses these same terms for the
-// opposite operations. So we have to be VERY careful when we change them.
-
-typedef double Vector4[4];
-typedef double Vector3[3];
-
-const double SMALL_NUMBER = 1.e-8;
-
-// inverse(original_matrix, inverse_matrix)
-//
-// calculate the inverse of a 4x4 matrix
-//
-// -1
-// A = ___1__ adjoint A
-// det A
-
-// double = determinant2x2(double a, double b, double c, double d)
-//
-// calculate the determinant of a 2x2 matrix.
-
-static double determinant2x2(double a, double b, double c, double d)
-{
- return a * d - b * c;
-}
-
-// double = determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3)
-//
-// Calculate the determinant of a 3x3 matrix
-// in the form
-//
-// | a1, b1, c1 |
-// | a2, b2, c2 |
-// | a3, b3, c3 |
-
-static double determinant3x3(double a1, double a2, double a3, double b1, double b2, double b3, double c1, double c2, double c3)
-{
- return a1 * determinant2x2(b2, b3, c2, c3)
- - b1 * determinant2x2(a2, a3, c2, c3)
- + c1 * determinant2x2(a2, a3, b2, b3);
-}
-
-// double = determinant4x4(matrix)
-//
-// calculate the determinant of a 4x4 matrix.
-
-static double determinant4x4(const TransformationMatrix::Matrix4& m)
-{
- // Assign to individual variable names to aid selecting
- // correct elements
-
- double a1 = m[0][0];
- double b1 = m[0][1];
- double c1 = m[0][2];
- double d1 = m[0][3];
-
- double a2 = m[1][0];
- double b2 = m[1][1];
- double c2 = m[1][2];
- double d2 = m[1][3];
-
- double a3 = m[2][0];
- double b3 = m[2][1];
- double c3 = m[2][2];
- double d3 = m[2][3];
-
- double a4 = m[3][0];
- double b4 = m[3][1];
- double c4 = m[3][2];
- double d4 = m[3][3];
-
- return a1 * determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
- - b1 * determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
- + c1 * determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
- - d1 * determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
-}
-
-// adjoint( original_matrix, inverse_matrix )
-//
-// calculate the adjoint of a 4x4 matrix
-//
-// Let a denote the minor determinant of matrix A obtained by
-// ij
-//
-// deleting the ith row and jth column from A.
-//
-// i+j
-// Let b = (-1) a
-// ij ji
-//
-// The matrix B = (b ) is the adjoint of A
-// ij
-
-static void adjoint(const TransformationMatrix::Matrix4& matrix, TransformationMatrix::Matrix4& result)
-{
- // Assign to individual variable names to aid
- // selecting correct values
- double a1 = matrix[0][0];
- double b1 = matrix[0][1];
- double c1 = matrix[0][2];
- double d1 = matrix[0][3];
-
- double a2 = matrix[1][0];
- double b2 = matrix[1][1];
- double c2 = matrix[1][2];
- double d2 = matrix[1][3];
-
- double a3 = matrix[2][0];
- double b3 = matrix[2][1];
- double c3 = matrix[2][2];
- double d3 = matrix[2][3];
-
- double a4 = matrix[3][0];
- double b4 = matrix[3][1];
- double c4 = matrix[3][2];
- double d4 = matrix[3][3];
-
- // Row column labeling reversed since we transpose rows & columns
- result[0][0] = determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
- result[1][0] = - determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
- result[2][0] = determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
- result[3][0] = - determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
-
- result[0][1] = - determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
- result[1][1] = determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
- result[2][1] = - determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
- result[3][1] = determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
-
- result[0][2] = determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
- result[1][2] = - determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
- result[2][2] = determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
- result[3][2] = - determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
-
- result[0][3] = - determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
- result[1][3] = determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
- result[2][3] = - determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
- result[3][3] = determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
-}
-
-// Returns false if the matrix is not invertible
-static bool inverse(const TransformationMatrix::Matrix4& matrix, TransformationMatrix::Matrix4& result)
-{
- // Calculate the adjoint matrix
- adjoint(matrix, result);
-
- // Calculate the 4x4 determinant
- // If the determinant is zero,
- // then the inverse matrix is not unique.
- double det = determinant4x4(matrix);
-
- if (fabs(det) < SMALL_NUMBER)
- return false;
-
- // Scale the adjoint matrix to get the inverse
-
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- result[i][j] = result[i][j] / det;
-
- return true;
-}
-
-// End of code adapted from Matrix Inversion by Richard Carling
-
-// Perform a decomposition on the passed matrix, return false if unsuccessful
-// From Graphics Gems: unmatrix.c
-
-// Transpose rotation portion of matrix a, return b
-static void transposeMatrix4(const TransformationMatrix::Matrix4& a, TransformationMatrix::Matrix4& b)
-{
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- b[i][j] = a[j][i];
-}
-
-// Multiply a homogeneous point by a matrix and return the transformed point
-static void v4MulPointByMatrix(const Vector4 p, const TransformationMatrix::Matrix4& m, Vector4 result)
-{
- result[0] = (p[0] * m[0][0]) + (p[1] * m[1][0]) +
- (p[2] * m[2][0]) + (p[3] * m[3][0]);
- result[1] = (p[0] * m[0][1]) + (p[1] * m[1][1]) +
- (p[2] * m[2][1]) + (p[3] * m[3][1]);
- result[2] = (p[0] * m[0][2]) + (p[1] * m[1][2]) +
- (p[2] * m[2][2]) + (p[3] * m[3][2]);
- result[3] = (p[0] * m[0][3]) + (p[1] * m[1][3]) +
- (p[2] * m[2][3]) + (p[3] * m[3][3]);
-}
-
-static double v3Length(Vector3 a)
-{
- return sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2]));
-}
-
-static void v3Scale(Vector3 v, double desiredLength)
-{
- double len = v3Length(v);
- if (len != 0) {
- double l = desiredLength / len;
- v[0] *= l;
- v[1] *= l;
- v[2] *= l;
- }
-}
-
-static double v3Dot(const Vector3 a, const Vector3 b)
-{
- return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);
-}
-
-// Make a linear combination of two vectors and return the result.
-// result = (a * ascl) + (b * bscl)
-static void v3Combine(const Vector3 a, const Vector3 b, Vector3 result, double ascl, double bscl)
-{
- result[0] = (ascl * a[0]) + (bscl * b[0]);
- result[1] = (ascl * a[1]) + (bscl * b[1]);
- result[2] = (ascl * a[2]) + (bscl * b[2]);
-}
-
-// Return the cross product result = a cross b */
-static void v3Cross(const Vector3 a, const Vector3 b, Vector3 result)
-{
- result[0] = (a[1] * b[2]) - (a[2] * b[1]);
- result[1] = (a[2] * b[0]) - (a[0] * b[2]);
- result[2] = (a[0] * b[1]) - (a[1] * b[0]);
-}
-
-static bool decompose(const TransformationMatrix::Matrix4& mat, TransformationMatrix::DecomposedType& result)
-{
- TransformationMatrix::Matrix4 localMatrix;
- memcpy(localMatrix, mat, sizeof(TransformationMatrix::Matrix4));
-
- // Normalize the matrix.
- if (localMatrix[3][3] == 0)
- return false;
-
- int i, j;
- for (i = 0; i < 4; i++)
- for (j = 0; j < 4; j++)
- localMatrix[i][j] /= localMatrix[3][3];
-
- // perspectiveMatrix is used to solve for perspective, but it also provides
- // an easy way to test for singularity of the upper 3x3 component.
- TransformationMatrix::Matrix4 perspectiveMatrix;
- memcpy(perspectiveMatrix, localMatrix, sizeof(TransformationMatrix::Matrix4));
- for (i = 0; i < 3; i++)
- perspectiveMatrix[i][3] = 0;
- perspectiveMatrix[3][3] = 1;
-
- if (determinant4x4(perspectiveMatrix) == 0)
- return false;
-
- // First, isolate perspective. This is the messiest.
- if (localMatrix[0][3] != 0 || localMatrix[1][3] != 0 || localMatrix[2][3] != 0) {
- // rightHandSide is the right hand side of the equation.
- Vector4 rightHandSide;
- rightHandSide[0] = localMatrix[0][3];
- rightHandSide[1] = localMatrix[1][3];
- rightHandSide[2] = localMatrix[2][3];
- rightHandSide[3] = localMatrix[3][3];
-
- // Solve the equation by inverting perspectiveMatrix and multiplying
- // rightHandSide by the inverse. (This is the easiest way, not
- // necessarily the best.)
- TransformationMatrix::Matrix4 inversePerspectiveMatrix, transposedInversePerspectiveMatrix;
- inverse(perspectiveMatrix, inversePerspectiveMatrix);
- transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix);
-
- Vector4 perspectivePoint;
- v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint);
-
- result.perspectiveX = perspectivePoint[0];
- result.perspectiveY = perspectivePoint[1];
- result.perspectiveZ = perspectivePoint[2];
- result.perspectiveW = perspectivePoint[3];
-
- // Clear the perspective partition
- localMatrix[0][3] = localMatrix[1][3] = localMatrix[2][3] = 0;
- localMatrix[3][3] = 1;
- } else {
- // No perspective.
- result.perspectiveX = result.perspectiveY = result.perspectiveZ = 0;
- result.perspectiveW = 1;
- }
-
- // Next take care of translation (easy).
- result.translateX = localMatrix[3][0];
- localMatrix[3][0] = 0;
- result.translateY = localMatrix[3][1];
- localMatrix[3][1] = 0;
- result.translateZ = localMatrix[3][2];
- localMatrix[3][2] = 0;
-
- // Vector4 type and functions need to be added to the common set.
- Vector3 row[3], pdum3;
-
- // Now get scale and shear.
- for (i = 0; i < 3; i++) {
- row[i][0] = localMatrix[i][0];
- row[i][1] = localMatrix[i][1];
- row[i][2] = localMatrix[i][2];
- }
-
- // Compute X scale factor and normalize first row.
- result.scaleX = v3Length(row[0]);
- v3Scale(row[0], 1.0);
-
- // Compute XY shear factor and make 2nd row orthogonal to 1st.
- result.skewXY = v3Dot(row[0], row[1]);
- v3Combine(row[1], row[0], row[1], 1.0, -result.skewXY);
-
- // Now, compute Y scale and normalize 2nd row.
- result.scaleY = v3Length(row[1]);
- v3Scale(row[1], 1.0);
- result.skewXY /= result.scaleY;
-
- // Compute XZ and YZ shears, orthogonalize 3rd row.
- result.skewXZ = v3Dot(row[0], row[2]);
- v3Combine(row[2], row[0], row[2], 1.0, -result.skewXZ);
- result.skewYZ = v3Dot(row[1], row[2]);
- v3Combine(row[2], row[1], row[2], 1.0, -result.skewYZ);
-
- // Next, get Z scale and normalize 3rd row.
- result.scaleZ = v3Length(row[2]);
- v3Scale(row[2], 1.0);
- result.skewXZ /= result.scaleZ;
- result.skewYZ /= result.scaleZ;
-
- // At this point, the matrix (in rows[]) is orthonormal.
- // Check for a coordinate system flip. If the determinant
- // is -1, then negate the matrix and the scaling factors.
- v3Cross(row[1], row[2], pdum3);
- if (v3Dot(row[0], pdum3) < 0) {
- for (i = 0; i < 3; i++) {
- result.scaleX *= -1;
- row[i][0] *= -1;
- row[i][1] *= -1;
- row[i][2] *= -1;
- }
- }
-
- // Now, get the rotations out, as described in the gem.
-
- // FIXME - Add the ability to return either quaternions (which are
- // easier to recompose with) or Euler angles (rx, ry, rz), which
- // are easier for authors to deal with. The latter will only be useful
- // when we fix https://bugs.webkit.org/show_bug.cgi?id=23799, so I
- // will leave the Euler angle code here for now.
-
- // ret.rotateY = asin(-row[0][2]);
- // if (cos(ret.rotateY) != 0) {
- // ret.rotateX = atan2(row[1][2], row[2][2]);
- // ret.rotateZ = atan2(row[0][1], row[0][0]);
- // } else {
- // ret.rotateX = atan2(-row[2][0], row[1][1]);
- // ret.rotateZ = 0;
- // }
-
- double s, t, x, y, z, w;
-
- t = row[0][0] + row[1][1] + row[2][2] + 1.0;
-
- if (t > 1e-4) {
- s = 0.5 / sqrt(t);
- w = 0.25 / s;
- x = (row[2][1] - row[1][2]) * s;
- y = (row[0][2] - row[2][0]) * s;
- z = (row[1][0] - row[0][1]) * s;
- } else if (row[0][0] > row[1][1] && row[0][0] > row[2][2]) {
- s = sqrt (1.0 + row[0][0] - row[1][1] - row[2][2]) * 2.0; // S=4*qx
- x = 0.25 * s;
- y = (row[0][1] + row[1][0]) / s;
- z = (row[0][2] + row[2][0]) / s;
- w = (row[2][1] - row[1][2]) / s;
- } else if (row[1][1] > row[2][2]) {
- s = sqrt (1.0 + row[1][1] - row[0][0] - row[2][2]) * 2.0; // S=4*qy
- x = (row[0][1] + row[1][0]) / s;
- y = 0.25 * s;
- z = (row[1][2] + row[2][1]) / s;
- w = (row[0][2] - row[2][0]) / s;
- } else {
- s = sqrt(1.0 + row[2][2] - row[0][0] - row[1][1]) * 2.0; // S=4*qz
- x = (row[0][2] + row[2][0]) / s;
- y = (row[1][2] + row[2][1]) / s;
- z = 0.25 * s;
- w = (row[1][0] - row[0][1]) / s;
- }
-
- result.quaternionX = x;
- result.quaternionY = y;
- result.quaternionZ = z;
- result.quaternionW = w;
-
- return true;
-}
-
-// Perform a spherical linear interpolation between the two
-// passed quaternions with 0 <= t <= 1
-static void slerp(double qa[4], const double qb[4], double t)
-{
- double ax, ay, az, aw;
- double bx, by, bz, bw;
- double cx, cy, cz, cw;
- double angle;
- double th, invth, scale, invscale;
-
- ax = qa[0]; ay = qa[1]; az = qa[2]; aw = qa[3];
- bx = qb[0]; by = qb[1]; bz = qb[2]; bw = qb[3];
-
- angle = ax * bx + ay * by + az * bz + aw * bw;
-
- if (angle < 0.0) {
- ax = -ax; ay = -ay;
- az = -az; aw = -aw;
- angle = -angle;
- }
-
- if (angle + 1.0 > .05) {
- if (1.0 - angle >= .05) {
- th = acos (angle);
- invth = 1.0 / sin (th);
- scale = sin (th * (1.0 - t)) * invth;
- invscale = sin (th * t) * invth;
- } else {
- scale = 1.0 - t;
- invscale = t;
- }
- } else {
- bx = -ay;
- by = ax;
- bz = -aw;
- bw = az;
- scale = sin(piDouble * (.5 - t));
- invscale = sin (piDouble * t);
- }
-
- cx = ax * scale + bx * invscale;
- cy = ay * scale + by * invscale;
- cz = az * scale + bz * invscale;
- cw = aw * scale + bw * invscale;
-
- qa[0] = cx; qa[1] = cy; qa[2] = cz; qa[3] = cw;
-}
-
-// End of Supporting Math Functions
-
-TransformationMatrix& TransformationMatrix::scale(double s)
-{
- return scaleNonUniform(s, s);
-}
-
-TransformationMatrix& TransformationMatrix::rotateFromVector(double x, double y)
-{
- return rotate(rad2deg(atan2(y, x)));
-}
-
-TransformationMatrix& TransformationMatrix::flipX()
-{
- return scaleNonUniform(-1.0f, 1.0f);
-}
-
-TransformationMatrix& TransformationMatrix::flipY()
-{
- return scaleNonUniform(1.0f, -1.0f);
-}
-
-FloatPoint TransformationMatrix::projectPoint(const FloatPoint& p) const
-{
- // This is basically raytracing. We have a point in the destination
- // plane with z=0, and we cast a ray parallel to the z-axis from that
- // point to find the z-position at which it intersects the z=0 plane
- // with the transform applied. Once we have that point we apply the
- // inverse transform to find the corresponding point in the source
- // space.
- //
- // Given a plane with normal Pn, and a ray starting at point R0 and
- // with direction defined by the vector Rd, we can find the
- // intersection point as a distance d from R0 in units of Rd by:
- //
- // d = -dot (Pn', R0) / dot (Pn', Rd)
-
- double x = p.x();
- double y = p.y();
- double z = -(m13() * x + m23() * y + m43()) / m33();
-
- double outX = x * m11() + y * m21() + z * m31() + m41();
- double outY = x * m12() + y * m22() + z * m32() + m42();
-
- double w = x * m14() + y * m24() + z * m34() + m44();
- if (w != 1 && w != 0) {
- outX /= w;
- outY /= w;
- }
-
- return FloatPoint(static_cast<float>(outX), static_cast<float>(outY));
-}
-
-FloatQuad TransformationMatrix::projectQuad(const FloatQuad& q) const
-{
- FloatQuad projectedQuad;
- projectedQuad.setP1(projectPoint(q.p1()));
- projectedQuad.setP2(projectPoint(q.p2()));
- projectedQuad.setP3(projectPoint(q.p3()));
- projectedQuad.setP4(projectPoint(q.p4()));
- return projectedQuad;
-}
-
-FloatPoint TransformationMatrix::mapPoint(const FloatPoint& p) const
-{
- if (isIdentityOrTranslation())
- return FloatPoint(p.x() + static_cast<float>(m_matrix[3][0]), p.y() + static_cast<float>(m_matrix[3][1]));
-
- double x, y;
- multVecMatrix(p.x(), p.y(), x, y);
- return FloatPoint(static_cast<float>(x), static_cast<float>(y));
-}
-
-FloatPoint3D TransformationMatrix::mapPoint(const FloatPoint3D& p) const
-{
- if (isIdentityOrTranslation())
- return FloatPoint3D(p.x() + static_cast<float>(m_matrix[3][0]),
- p.y() + static_cast<float>(m_matrix[3][1]),
- p.z() + static_cast<float>(m_matrix[3][2]));
-
- double x, y, z;
- multVecMatrix(p.x(), p.y(), p.z(), x, y, z);
- return FloatPoint3D(static_cast<float>(x), static_cast<float>(y), static_cast<float>(z));
-}
-
-IntRect TransformationMatrix::mapRect(const IntRect &rect) const
-{
- return enclosingIntRect(mapRect(FloatRect(rect)));
-}
-
-FloatRect TransformationMatrix::mapRect(const FloatRect& r) const
-{
- if (isIdentityOrTranslation()) {
- FloatRect mappedRect(r);
- mappedRect.move(static_cast<float>(m_matrix[3][0]), static_cast<float>(m_matrix[3][1]));
- return mappedRect;
- }
-
- FloatQuad resultQuad = mapQuad(FloatQuad(r));
- return resultQuad.boundingBox();
-}
-
-FloatQuad TransformationMatrix::mapQuad(const FloatQuad& q) const
-{
- if (isIdentityOrTranslation()) {
- FloatQuad mappedQuad(q);
- mappedQuad.move(static_cast<float>(m_matrix[3][0]), static_cast<float>(m_matrix[3][1]));
- return mappedQuad;
- }
-
- FloatQuad result;
- result.setP1(mapPoint(q.p1()));
- result.setP2(mapPoint(q.p2()));
- result.setP3(mapPoint(q.p3()));
- result.setP4(mapPoint(q.p4()));
- return result;
-}
-
-TransformationMatrix& TransformationMatrix::scaleNonUniform(double sx, double sy)
-{
- TransformationMatrix mat;
- mat.m_matrix[0][0] = sx;
- mat.m_matrix[1][1] = sy;
-
- multLeft(mat);
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::scale3d(double sx, double sy, double sz)
-{
- TransformationMatrix mat;
- mat.m_matrix[0][0] = sx;
- mat.m_matrix[1][1] = sy;
- mat.m_matrix[2][2] = sz;
-
- multLeft(mat);
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::rotate3d(double x, double y, double z, double angle)
-{
- // angles are in degrees. Switch to radians
- angle = deg2rad(angle);
-
- angle /= 2.0f;
- double sinA = sin(angle);
- double cosA = cos(angle);
- double sinA2 = sinA * sinA;
-
- // normalize
- double length = sqrt(x * x + y * y + z * z);
- if (length == 0) {
- // bad vector, just use something reasonable
- x = 0;
- y = 0;
- z = 1;
- } else if (length != 1) {
- x /= length;
- y /= length;
- z /= length;
- }
-
- TransformationMatrix mat;
-
- // optimize case where axis is along major axis
- if (x == 1.0f && y == 0.0f && z == 0.0f) {
- mat.m_matrix[0][0] = 1.0f;
- mat.m_matrix[0][1] = 0.0f;
- mat.m_matrix[0][2] = 0.0f;
- mat.m_matrix[1][0] = 0.0f;
- mat.m_matrix[1][1] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[1][2] = 2.0f * sinA * cosA;
- mat.m_matrix[2][0] = 0.0f;
- mat.m_matrix[2][1] = -2.0f * sinA * cosA;
- mat.m_matrix[2][2] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
- } else if (x == 0.0f && y == 1.0f && z == 0.0f) {
- mat.m_matrix[0][0] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][1] = 0.0f;
- mat.m_matrix[0][2] = -2.0f * sinA * cosA;
- mat.m_matrix[1][0] = 0.0f;
- mat.m_matrix[1][1] = 1.0f;
- mat.m_matrix[1][2] = 0.0f;
- mat.m_matrix[2][0] = 2.0f * sinA * cosA;
- mat.m_matrix[2][1] = 0.0f;
- mat.m_matrix[2][2] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
- } else if (x == 0.0f && y == 0.0f && z == 1.0f) {
- mat.m_matrix[0][0] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][1] = 2.0f * sinA * cosA;
- mat.m_matrix[0][2] = 0.0f;
- mat.m_matrix[1][0] = -2.0f * sinA * cosA;
- mat.m_matrix[1][1] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[1][2] = 0.0f;
- mat.m_matrix[2][0] = 0.0f;
- mat.m_matrix[2][1] = 0.0f;
- mat.m_matrix[2][2] = 1.0f;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
- } else {
- double x2 = x*x;
- double y2 = y*y;
- double z2 = z*z;
-
- mat.m_matrix[0][0] = 1.0f - 2.0f * (y2 + z2) * sinA2;
- mat.m_matrix[0][1] = 2.0f * (x * y * sinA2 + z * sinA * cosA);
- mat.m_matrix[0][2] = 2.0f * (x * z * sinA2 - y * sinA * cosA);
- mat.m_matrix[1][0] = 2.0f * (y * x * sinA2 - z * sinA * cosA);
- mat.m_matrix[1][1] = 1.0f - 2.0f * (z2 + x2) * sinA2;
- mat.m_matrix[1][2] = 2.0f * (y * z * sinA2 + x * sinA * cosA);
- mat.m_matrix[2][0] = 2.0f * (z * x * sinA2 + y * sinA * cosA);
- mat.m_matrix[2][1] = 2.0f * (z * y * sinA2 - x * sinA * cosA);
- mat.m_matrix[2][2] = 1.0f - 2.0f * (x2 + y2) * sinA2;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
- }
- multLeft(mat);
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::rotate3d(double rx, double ry, double rz)
-{
- // angles are in degrees. Switch to radians
- rx = deg2rad(rx);
- ry = deg2rad(ry);
- rz = deg2rad(rz);
-
- TransformationMatrix mat;
-
- rz /= 2.0f;
- double sinA = sin(rz);
- double cosA = cos(rz);
- double sinA2 = sinA * sinA;
-
- mat.m_matrix[0][0] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][1] = 2.0f * sinA * cosA;
- mat.m_matrix[0][2] = 0.0f;
- mat.m_matrix[1][0] = -2.0f * sinA * cosA;
- mat.m_matrix[1][1] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[1][2] = 0.0f;
- mat.m_matrix[2][0] = 0.0f;
- mat.m_matrix[2][1] = 0.0f;
- mat.m_matrix[2][2] = 1.0f;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
-
- TransformationMatrix rmat(mat);
-
- ry /= 2.0f;
- sinA = sin(ry);
- cosA = cos(ry);
- sinA2 = sinA * sinA;
-
- mat.m_matrix[0][0] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][1] = 0.0f;
- mat.m_matrix[0][2] = -2.0f * sinA * cosA;
- mat.m_matrix[1][0] = 0.0f;
- mat.m_matrix[1][1] = 1.0f;
- mat.m_matrix[1][2] = 0.0f;
- mat.m_matrix[2][0] = 2.0f * sinA * cosA;
- mat.m_matrix[2][1] = 0.0f;
- mat.m_matrix[2][2] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
-
- rmat.multLeft(mat);
-
- rx /= 2.0f;
- sinA = sin(rx);
- cosA = cos(rx);
- sinA2 = sinA * sinA;
-
- mat.m_matrix[0][0] = 1.0f;
- mat.m_matrix[0][1] = 0.0f;
- mat.m_matrix[0][2] = 0.0f;
- mat.m_matrix[1][0] = 0.0f;
- mat.m_matrix[1][1] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[1][2] = 2.0f * sinA * cosA;
- mat.m_matrix[2][0] = 0.0f;
- mat.m_matrix[2][1] = -2.0f * sinA * cosA;
- mat.m_matrix[2][2] = 1.0f - 2.0f * sinA2;
- mat.m_matrix[0][3] = mat.m_matrix[1][3] = mat.m_matrix[2][3] = 0.0f;
- mat.m_matrix[3][0] = mat.m_matrix[3][1] = mat.m_matrix[3][2] = 0.0f;
- mat.m_matrix[3][3] = 1.0f;
-
- rmat.multLeft(mat);
-
- multLeft(rmat);
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::translate(double tx, double ty)
-{
- m_matrix[3][0] += tx * m_matrix[0][0] + ty * m_matrix[1][0];
- m_matrix[3][1] += tx * m_matrix[0][1] + ty * m_matrix[1][1];
- m_matrix[3][2] += tx * m_matrix[0][2] + ty * m_matrix[1][2];
- m_matrix[3][3] += tx * m_matrix[0][3] + ty * m_matrix[1][3];
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::translate3d(double tx, double ty, double tz)
-{
- m_matrix[3][0] += tx * m_matrix[0][0] + ty * m_matrix[1][0] + tz * m_matrix[2][0];
- m_matrix[3][1] += tx * m_matrix[0][1] + ty * m_matrix[1][1] + tz * m_matrix[2][1];
- m_matrix[3][2] += tx * m_matrix[0][2] + ty * m_matrix[1][2] + tz * m_matrix[2][2];
- m_matrix[3][3] += tx * m_matrix[0][3] + ty * m_matrix[1][3] + tz * m_matrix[2][3];
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::translateRight(double tx, double ty)
-{
- if (tx != 0) {
- m_matrix[0][0] += m_matrix[0][3] * tx;
- m_matrix[1][0] += m_matrix[1][3] * tx;
- m_matrix[2][0] += m_matrix[2][3] * tx;
- m_matrix[3][0] += m_matrix[3][3] * tx;
- }
-
- if (ty != 0) {
- m_matrix[0][1] += m_matrix[0][3] * ty;
- m_matrix[1][1] += m_matrix[1][3] * ty;
- m_matrix[2][1] += m_matrix[2][3] * ty;
- m_matrix[3][1] += m_matrix[3][3] * ty;
- }
-
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::translateRight3d(double tx, double ty, double tz)
-{
- translateRight(tx, ty);
- if (tz != 0) {
- m_matrix[0][2] += m_matrix[0][3] * tz;
- m_matrix[1][2] += m_matrix[1][3] * tz;
- m_matrix[2][2] += m_matrix[2][3] * tz;
- m_matrix[3][2] += m_matrix[3][3] * tz;
- }
-
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::skew(double sx, double sy)
-{
- // angles are in degrees. Switch to radians
- sx = deg2rad(sx);
- sy = deg2rad(sy);
-
- TransformationMatrix mat;
- mat.m_matrix[0][1] = tan(sy); // note that the y shear goes in the first row
- mat.m_matrix[1][0] = tan(sx); // and the x shear in the second row
-
- multLeft(mat);
- return *this;
-}
-
-TransformationMatrix& TransformationMatrix::applyPerspective(double p)
-{
- TransformationMatrix mat;
- if (p != 0)
- mat.m_matrix[2][3] = -1/p;
-
- multLeft(mat);
- return *this;
-}
-
-TransformationMatrix TransformationMatrix::rectToRect(const FloatRect& from, const FloatRect& to)
-{
- ASSERT(!from.isEmpty());
- return TransformationMatrix(to.width() / from.width(),
- 0, 0,
- to.height() / from.height(),
- to.x() - from.x(),
- to.y() - from.y());
-}
-
-//
-// *this = mat * *this
-//
-TransformationMatrix& TransformationMatrix::multLeft(const TransformationMatrix& mat)
-{
- Matrix4 tmp;
-
- tmp[0][0] = (mat.m_matrix[0][0] * m_matrix[0][0] + mat.m_matrix[0][1] * m_matrix[1][0]
- + mat.m_matrix[0][2] * m_matrix[2][0] + mat.m_matrix[0][3] * m_matrix[3][0]);
- tmp[0][1] = (mat.m_matrix[0][0] * m_matrix[0][1] + mat.m_matrix[0][1] * m_matrix[1][1]
- + mat.m_matrix[0][2] * m_matrix[2][1] + mat.m_matrix[0][3] * m_matrix[3][1]);
- tmp[0][2] = (mat.m_matrix[0][0] * m_matrix[0][2] + mat.m_matrix[0][1] * m_matrix[1][2]
- + mat.m_matrix[0][2] * m_matrix[2][2] + mat.m_matrix[0][3] * m_matrix[3][2]);
- tmp[0][3] = (mat.m_matrix[0][0] * m_matrix[0][3] + mat.m_matrix[0][1] * m_matrix[1][3]
- + mat.m_matrix[0][2] * m_matrix[2][3] + mat.m_matrix[0][3] * m_matrix[3][3]);
-
- tmp[1][0] = (mat.m_matrix[1][0] * m_matrix[0][0] + mat.m_matrix[1][1] * m_matrix[1][0]
- + mat.m_matrix[1][2] * m_matrix[2][0] + mat.m_matrix[1][3] * m_matrix[3][0]);
- tmp[1][1] = (mat.m_matrix[1][0] * m_matrix[0][1] + mat.m_matrix[1][1] * m_matrix[1][1]
- + mat.m_matrix[1][2] * m_matrix[2][1] + mat.m_matrix[1][3] * m_matrix[3][1]);
- tmp[1][2] = (mat.m_matrix[1][0] * m_matrix[0][2] + mat.m_matrix[1][1] * m_matrix[1][2]
- + mat.m_matrix[1][2] * m_matrix[2][2] + mat.m_matrix[1][3] * m_matrix[3][2]);
- tmp[1][3] = (mat.m_matrix[1][0] * m_matrix[0][3] + mat.m_matrix[1][1] * m_matrix[1][3]
- + mat.m_matrix[1][2] * m_matrix[2][3] + mat.m_matrix[1][3] * m_matrix[3][3]);
-
- tmp[2][0] = (mat.m_matrix[2][0] * m_matrix[0][0] + mat.m_matrix[2][1] * m_matrix[1][0]
- + mat.m_matrix[2][2] * m_matrix[2][0] + mat.m_matrix[2][3] * m_matrix[3][0]);
- tmp[2][1] = (mat.m_matrix[2][0] * m_matrix[0][1] + mat.m_matrix[2][1] * m_matrix[1][1]
- + mat.m_matrix[2][2] * m_matrix[2][1] + mat.m_matrix[2][3] * m_matrix[3][1]);
- tmp[2][2] = (mat.m_matrix[2][0] * m_matrix[0][2] + mat.m_matrix[2][1] * m_matrix[1][2]
- + mat.m_matrix[2][2] * m_matrix[2][2] + mat.m_matrix[2][3] * m_matrix[3][2]);
- tmp[2][3] = (mat.m_matrix[2][0] * m_matrix[0][3] + mat.m_matrix[2][1] * m_matrix[1][3]
- + mat.m_matrix[2][2] * m_matrix[2][3] + mat.m_matrix[2][3] * m_matrix[3][3]);
-
- tmp[3][0] = (mat.m_matrix[3][0] * m_matrix[0][0] + mat.m_matrix[3][1] * m_matrix[1][0]
- + mat.m_matrix[3][2] * m_matrix[2][0] + mat.m_matrix[3][3] * m_matrix[3][0]);
- tmp[3][1] = (mat.m_matrix[3][0] * m_matrix[0][1] + mat.m_matrix[3][1] * m_matrix[1][1]
- + mat.m_matrix[3][2] * m_matrix[2][1] + mat.m_matrix[3][3] * m_matrix[3][1]);
- tmp[3][2] = (mat.m_matrix[3][0] * m_matrix[0][2] + mat.m_matrix[3][1] * m_matrix[1][2]
- + mat.m_matrix[3][2] * m_matrix[2][2] + mat.m_matrix[3][3] * m_matrix[3][2]);
- tmp[3][3] = (mat.m_matrix[3][0] * m_matrix[0][3] + mat.m_matrix[3][1] * m_matrix[1][3]
- + mat.m_matrix[3][2] * m_matrix[2][3] + mat.m_matrix[3][3] * m_matrix[3][3]);
-
- setMatrix(tmp);
- return *this;
-}
-
-void TransformationMatrix::multVecMatrix(double x, double y, double& resultX, double& resultY) const
-{
- resultX = m_matrix[3][0] + x * m_matrix[0][0] + y * m_matrix[1][0];
- resultY = m_matrix[3][1] + x * m_matrix[0][1] + y * m_matrix[1][1];
- double w = m_matrix[3][3] + x * m_matrix[0][3] + y * m_matrix[1][3];
- if (w != 1 && w != 0) {
- resultX /= w;
- resultY /= w;
- }
-}
-
-void TransformationMatrix::multVecMatrix(double x, double y, double z, double& resultX, double& resultY, double& resultZ) const
-{
- resultX = m_matrix[3][0] + x * m_matrix[0][0] + y * m_matrix[1][0] + z * m_matrix[2][0];
- resultY = m_matrix[3][1] + x * m_matrix[0][1] + y * m_matrix[1][1] + z * m_matrix[2][1];
- resultZ = m_matrix[3][2] + x * m_matrix[0][2] + y * m_matrix[1][2] + z * m_matrix[2][2];
- double w = m_matrix[3][3] + x * m_matrix[0][3] + y * m_matrix[1][3] + z * m_matrix[2][3];
- if (w != 1 && w != 0) {
- resultX /= w;
- resultY /= w;
- resultZ /= w;
- }
-}
-
-bool TransformationMatrix::isInvertible() const
-{
- if (isIdentityOrTranslation())
- return true;
-
- double det = WebCore::determinant4x4(m_matrix);
-
- if (fabs(det) < SMALL_NUMBER)
- return false;
-
- return true;
-}
-
-TransformationMatrix TransformationMatrix::inverse() const
-{
- if (isIdentityOrTranslation()) {
- // identity matrix
- if (m_matrix[3][0] == 0 && m_matrix[3][1] == 0 && m_matrix[3][2] == 0)
- return TransformationMatrix();
-
- // translation
- return TransformationMatrix(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- -m_matrix[3][0], -m_matrix[3][1], -m_matrix[3][2], 1);
- }
-
- TransformationMatrix invMat;
- bool inverted = WebCore::inverse(m_matrix, invMat.m_matrix);
- if (!inverted)
- return TransformationMatrix();
-
- return invMat;
-}
-
-void TransformationMatrix::makeAffine()
-{
- m_matrix[0][2] = 0;
- m_matrix[0][3] = 0;
-
- m_matrix[1][2] = 0;
- m_matrix[1][3] = 0;
-
- m_matrix[2][0] = 0;
- m_matrix[2][1] = 0;
- m_matrix[2][2] = 1;
- m_matrix[2][3] = 0;
-
- m_matrix[3][2] = 0;
- m_matrix[3][3] = 1;
-}
-
-AffineTransform TransformationMatrix::toAffineTransform() const
-{
- return AffineTransform(m_matrix[0][0], m_matrix[0][1], m_matrix[1][0],
- m_matrix[1][1], m_matrix[3][0], m_matrix[3][1]);
-}
-
-static inline void blendFloat(double& from, double to, double progress)
-{
- if (from != to)
- from = from + (to - from) * progress;
-}
-
-void TransformationMatrix::blend(const TransformationMatrix& from, double progress)
-{
- if (from.isIdentity() && isIdentity())
- return;
-
- // decompose
- DecomposedType fromDecomp;
- DecomposedType toDecomp;
- from.decompose(fromDecomp);
- decompose(toDecomp);
-
- // interpolate
- blendFloat(fromDecomp.scaleX, toDecomp.scaleX, progress);
- blendFloat(fromDecomp.scaleY, toDecomp.scaleY, progress);
- blendFloat(fromDecomp.scaleZ, toDecomp.scaleZ, progress);
- blendFloat(fromDecomp.skewXY, toDecomp.skewXY, progress);
- blendFloat(fromDecomp.skewXZ, toDecomp.skewXZ, progress);
- blendFloat(fromDecomp.skewYZ, toDecomp.skewYZ, progress);
- blendFloat(fromDecomp.translateX, toDecomp.translateX, progress);
- blendFloat(fromDecomp.translateY, toDecomp.translateY, progress);
- blendFloat(fromDecomp.translateZ, toDecomp.translateZ, progress);
- blendFloat(fromDecomp.perspectiveX, toDecomp.perspectiveX, progress);
- blendFloat(fromDecomp.perspectiveY, toDecomp.perspectiveY, progress);
- blendFloat(fromDecomp.perspectiveZ, toDecomp.perspectiveZ, progress);
- blendFloat(fromDecomp.perspectiveW, toDecomp.perspectiveW, progress);
-
- slerp(&fromDecomp.quaternionX, &toDecomp.quaternionX, progress);
-
- // recompose
- recompose(fromDecomp);
-}
-
-bool TransformationMatrix::decompose(DecomposedType& decomp) const
-{
- if (isIdentity()) {
- memset(&decomp, 0, sizeof(decomp));
- decomp.perspectiveW = 1;
- decomp.scaleX = 1;
- decomp.scaleY = 1;
- decomp.scaleZ = 1;
- }
-
- if (!WebCore::decompose(m_matrix, decomp))
- return false;
- return true;
-}
-
-void TransformationMatrix::recompose(const DecomposedType& decomp)
-{
- makeIdentity();
-
- // first apply perspective
- m_matrix[0][3] = (float) decomp.perspectiveX;
- m_matrix[1][3] = (float) decomp.perspectiveY;
- m_matrix[2][3] = (float) decomp.perspectiveZ;
- m_matrix[3][3] = (float) decomp.perspectiveW;
-
- // now translate
- translate3d((float) decomp.translateX, (float) decomp.translateY, (float) decomp.translateZ);
-
- // apply rotation
- double xx = decomp.quaternionX * decomp.quaternionX;
- double xy = decomp.quaternionX * decomp.quaternionY;
- double xz = decomp.quaternionX * decomp.quaternionZ;
- double xw = decomp.quaternionX * decomp.quaternionW;
- double yy = decomp.quaternionY * decomp.quaternionY;
- double yz = decomp.quaternionY * decomp.quaternionZ;
- double yw = decomp.quaternionY * decomp.quaternionW;
- double zz = decomp.quaternionZ * decomp.quaternionZ;
- double zw = decomp.quaternionZ * decomp.quaternionW;
-
- // Construct a composite rotation matrix from the quaternion values
- TransformationMatrix rotationMatrix(1 - 2 * (yy + zz), 2 * (xy - zw), 2 * (xz + yw), 0,
- 2 * (xy + zw), 1 - 2 * (xx + zz), 2 * (yz - xw), 0,
- 2 * (xz - yw), 2 * (yz + xw), 1 - 2 * (xx + yy), 0,
- 0, 0, 0, 1);
-
- multLeft(rotationMatrix);
-
- // now apply skew
- if (decomp.skewYZ) {
- TransformationMatrix tmp;
- tmp.setM32((float) decomp.skewYZ);
- multLeft(tmp);
- }
-
- if (decomp.skewXZ) {
- TransformationMatrix tmp;
- tmp.setM31((float) decomp.skewXZ);
- multLeft(tmp);
- }
-
- if (decomp.skewXY) {
- TransformationMatrix tmp;
- tmp.setM21((float) decomp.skewXY);
- multLeft(tmp);
- }
-
- // finally, apply scale
- scale3d((float) decomp.scaleX, (float) decomp.scaleY, (float) decomp.scaleZ);
-}
-
-}
diff --git a/WebCore/platform/graphics/transforms/TransformationMatrix.h b/WebCore/platform/graphics/transforms/TransformationMatrix.h
deleted file mode 100644
index f13bcc1..0000000
--- a/WebCore/platform/graphics/transforms/TransformationMatrix.h
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- *
- * 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 SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR
- * 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.
- */
-
-#ifndef TransformationMatrix_h
-#define TransformationMatrix_h
-
-#include "AffineTransform.h"
-#include "FloatPoint.h"
-#include "IntPoint.h"
-#include <string.h> //for memcpy
-#include <wtf/FastAllocBase.h>
-
-#if PLATFORM(CA)
-#include <QuartzCore/CATransform3D.h>
-#endif
-#if PLATFORM(CG)
-#include <CoreGraphics/CGAffineTransform.h>
-#elif PLATFORM(CAIRO)
-#include <cairo.h>
-#elif PLATFORM(OPENVG)
-#include "VGUtils.h"
-#elif PLATFORM(QT)
-#include <QTransform>
-#elif PLATFORM(SKIA)
-#include <SkMatrix.h>
-#elif PLATFORM(WX) && USE(WXGC)
-#include <wx/graphics.h>
-#endif
-
-#if PLATFORM(WIN) || (PLATFORM(QT) && OS(WINDOWS)) || (PLATFORM(WX) && OS(WINDOWS))
-#if COMPILER(MINGW) && !COMPILER(MINGW64)
-typedef struct _XFORM XFORM;
-#else
-typedef struct tagXFORM XFORM;
-#endif
-#endif
-
-namespace WebCore {
-
-class AffineTransform;
-class IntRect;
-class FloatPoint3D;
-class FloatRect;
-class FloatQuad;
-
-class TransformationMatrix : public FastAllocBase {
-public:
- typedef double Matrix4[4][4];
-
- TransformationMatrix() { makeIdentity(); }
- TransformationMatrix(const TransformationMatrix& t) { *this = t; }
- TransformationMatrix(double a, double b, double c, double d, double e, double f) { setMatrix(a, b, c, d, e, f); }
- TransformationMatrix(double m11, double m12, double m13, double m14,
- double m21, double m22, double m23, double m24,
- double m31, double m32, double m33, double m34,
- double m41, double m42, double m43, double m44)
- {
- setMatrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);
- }
-
- void setMatrix(double a, double b, double c, double d, double e, double f)
- {
- m_matrix[0][0] = a; m_matrix[0][1] = b; m_matrix[0][2] = 0; m_matrix[0][3] = 0;
- m_matrix[1][0] = c; m_matrix[1][1] = d; m_matrix[1][2] = 0; m_matrix[1][3] = 0;
- m_matrix[2][0] = 0; m_matrix[2][1] = 0; m_matrix[2][2] = 1; m_matrix[2][3] = 0;
- m_matrix[3][0] = e; m_matrix[3][1] = f; m_matrix[3][2] = 0; m_matrix[3][3] = 1;
- }
-
- void setMatrix(double m11, double m12, double m13, double m14,
- double m21, double m22, double m23, double m24,
- double m31, double m32, double m33, double m34,
- double m41, double m42, double m43, double m44)
- {
- m_matrix[0][0] = m11; m_matrix[0][1] = m12; m_matrix[0][2] = m13; m_matrix[0][3] = m14;
- m_matrix[1][0] = m21; m_matrix[1][1] = m22; m_matrix[1][2] = m23; m_matrix[1][3] = m24;
- m_matrix[2][0] = m31; m_matrix[2][1] = m32; m_matrix[2][2] = m33; m_matrix[2][3] = m34;
- m_matrix[3][0] = m41; m_matrix[3][1] = m42; m_matrix[3][2] = m43; m_matrix[3][3] = m44;
- }
-
- TransformationMatrix& operator =(const TransformationMatrix &t)
- {
- setMatrix(t.m_matrix);
- return *this;
- }
-
- TransformationMatrix& makeIdentity()
- {
- setMatrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
- return *this;
- }
-
- bool isIdentity() const
- {
- return m_matrix[0][0] == 1 && m_matrix[0][1] == 0 && m_matrix[0][2] == 0 && m_matrix[0][3] == 0 &&
- m_matrix[1][0] == 0 && m_matrix[1][1] == 1 && m_matrix[1][2] == 0 && m_matrix[1][3] == 0 &&
- m_matrix[2][0] == 0 && m_matrix[2][1] == 0 && m_matrix[2][2] == 1 && m_matrix[2][3] == 0 &&
- m_matrix[3][0] == 0 && m_matrix[3][1] == 0 && m_matrix[3][2] == 0 && m_matrix[3][3] == 1;
- }
-
- // This form preserves the double math from input to output
- void map(double x, double y, double& x2, double& y2) const { multVecMatrix(x, y, x2, y2); }
-
- // Map a 3D point through the transform, returning a 3D point.
- FloatPoint3D mapPoint(const FloatPoint3D&) const;
-
- // Map a 2D point through the transform, returning a 2D point.
- // Note that this ignores the z component, effectively projecting the point into the z=0 plane.
- FloatPoint mapPoint(const FloatPoint&) const;
-
- // Like the version above, except that it rounds the mapped point to the nearest integer value.
- IntPoint mapPoint(const IntPoint& p) const
- {
- return roundedIntPoint(mapPoint(FloatPoint(p)));
- }
-
- // If the matrix has 3D components, the z component of the result is
- // dropped, effectively projecting the rect into the z=0 plane
- FloatRect mapRect(const FloatRect&) const;
-
- // Rounds the resulting mapped rectangle out. This is helpful for bounding
- // box computations but may not be what is wanted in other contexts.
- IntRect mapRect(const IntRect&) const;
-
- // If the matrix has 3D components, the z component of the result is
- // dropped, effectively projecting the quad into the z=0 plane
- FloatQuad mapQuad(const FloatQuad&) const;
-
- // Map a point on the z=0 plane into a point on
- // the plane with with the transform applied, by extending
- // a ray perpendicular to the source plane and computing
- // the local x,y position of the point where that ray intersects
- // with the destination plane.
- FloatPoint projectPoint(const FloatPoint&) const;
- // Projects the four corners of the quad
- FloatQuad projectQuad(const FloatQuad&) const;
-
- double m11() const { return m_matrix[0][0]; }
- void setM11(double f) { m_matrix[0][0] = f; }
- double m12() const { return m_matrix[0][1]; }
- void setM12(double f) { m_matrix[0][1] = f; }
- double m13() const { return m_matrix[0][2]; }
- void setM13(double f) { m_matrix[0][2] = f; }
- double m14() const { return m_matrix[0][3]; }
- void setM14(double f) { m_matrix[0][3] = f; }
- double m21() const { return m_matrix[1][0]; }
- void setM21(double f) { m_matrix[1][0] = f; }
- double m22() const { return m_matrix[1][1]; }
- void setM22(double f) { m_matrix[1][1] = f; }
- double m23() const { return m_matrix[1][2]; }
- void setM23(double f) { m_matrix[1][2] = f; }
- double m24() const { return m_matrix[1][3]; }
- void setM24(double f) { m_matrix[1][3] = f; }
- double m31() const { return m_matrix[2][0]; }
- void setM31(double f) { m_matrix[2][0] = f; }
- double m32() const { return m_matrix[2][1]; }
- void setM32(double f) { m_matrix[2][1] = f; }
- double m33() const { return m_matrix[2][2]; }
- void setM33(double f) { m_matrix[2][2] = f; }
- double m34() const { return m_matrix[2][3]; }
- void setM34(double f) { m_matrix[2][3] = f; }
- double m41() const { return m_matrix[3][0]; }
- void setM41(double f) { m_matrix[3][0] = f; }
- double m42() const { return m_matrix[3][1]; }
- void setM42(double f) { m_matrix[3][1] = f; }
- double m43() const { return m_matrix[3][2]; }
- void setM43(double f) { m_matrix[3][2] = f; }
- double m44() const { return m_matrix[3][3]; }
- void setM44(double f) { m_matrix[3][3] = f; }
-
- double a() const { return m_matrix[0][0]; }
- void setA(double a) { m_matrix[0][0] = a; }
-
- double b() const { return m_matrix[0][1]; }
- void setB(double b) { m_matrix[0][1] = b; }
-
- double c() const { return m_matrix[1][0]; }
- void setC(double c) { m_matrix[1][0] = c; }
-
- double d() const { return m_matrix[1][1]; }
- void setD(double d) { m_matrix[1][1] = d; }
-
- double e() const { return m_matrix[3][0]; }
- void setE(double e) { m_matrix[3][0] = e; }
-
- double f() const { return m_matrix[3][1]; }
- void setF(double f) { m_matrix[3][1] = f; }
-
- // this = this * mat
- TransformationMatrix& multiply(const TransformationMatrix& t) { return *this *= t; }
-
- // this = mat * this
- TransformationMatrix& multLeft(const TransformationMatrix& mat);
-
- TransformationMatrix& scale(double);
- TransformationMatrix& scaleNonUniform(double sx, double sy);
- TransformationMatrix& scale3d(double sx, double sy, double sz);
-
- TransformationMatrix& rotate(double d) { return rotate3d(0, 0, d); }
- TransformationMatrix& rotateFromVector(double x, double y);
- TransformationMatrix& rotate3d(double rx, double ry, double rz);
-
- // The vector (x,y,z) is normalized if it's not already. A vector of
- // (0,0,0) uses a vector of (0,0,1).
- TransformationMatrix& rotate3d(double x, double y, double z, double angle);
-
- TransformationMatrix& translate(double tx, double ty);
- TransformationMatrix& translate3d(double tx, double ty, double tz);
-
- // translation added with a post-multiply
- TransformationMatrix& translateRight(double tx, double ty);
- TransformationMatrix& translateRight3d(double tx, double ty, double tz);
-
- TransformationMatrix& flipX();
- TransformationMatrix& flipY();
- TransformationMatrix& skew(double angleX, double angleY);
- TransformationMatrix& skewX(double angle) { return skew(angle, 0); }
- TransformationMatrix& skewY(double angle) { return skew(0, angle); }
-
- TransformationMatrix& applyPerspective(double p);
- bool hasPerspective() const { return m_matrix[2][3] != 0.0f; }
-
- // returns a transformation that maps a rect to a rect
- static TransformationMatrix rectToRect(const FloatRect&, const FloatRect&);
-
- bool isInvertible() const;
-
- // This method returns the identity matrix if it is not invertible.
- // Use isInvertible() before calling this if you need to know.
- TransformationMatrix inverse() const;
-
- // decompose the matrix into its component parts
- typedef struct {
- double scaleX, scaleY, scaleZ;
- double skewXY, skewXZ, skewYZ;
- double quaternionX, quaternionY, quaternionZ, quaternionW;
- double translateX, translateY, translateZ;
- double perspectiveX, perspectiveY, perspectiveZ, perspectiveW;
- } DecomposedType;
-
- bool decompose(DecomposedType& decomp) const;
- void recompose(const DecomposedType& decomp);
-
- void blend(const TransformationMatrix& from, double progress);
-
- bool isAffine() const
- {
- return (m13() == 0 && m14() == 0 && m23() == 0 && m24() == 0 &&
- m31() == 0 && m32() == 0 && m33() == 1 && m34() == 0 && m43() == 0 && m44() == 1);
- }
-
- // Throw away the non-affine parts of the matrix (lossy!)
- void makeAffine();
-
- AffineTransform toAffineTransform() const;
-
- bool operator==(const TransformationMatrix& m2) const
- {
- return (m_matrix[0][0] == m2.m_matrix[0][0] &&
- m_matrix[0][1] == m2.m_matrix[0][1] &&
- m_matrix[0][2] == m2.m_matrix[0][2] &&
- m_matrix[0][3] == m2.m_matrix[0][3] &&
- m_matrix[1][0] == m2.m_matrix[1][0] &&
- m_matrix[1][1] == m2.m_matrix[1][1] &&
- m_matrix[1][2] == m2.m_matrix[1][2] &&
- m_matrix[1][3] == m2.m_matrix[1][3] &&
- m_matrix[2][0] == m2.m_matrix[2][0] &&
- m_matrix[2][1] == m2.m_matrix[2][1] &&
- m_matrix[2][2] == m2.m_matrix[2][2] &&
- m_matrix[2][3] == m2.m_matrix[2][3] &&
- m_matrix[3][0] == m2.m_matrix[3][0] &&
- m_matrix[3][1] == m2.m_matrix[3][1] &&
- m_matrix[3][2] == m2.m_matrix[3][2] &&
- m_matrix[3][3] == m2.m_matrix[3][3]);
- }
-
- bool operator!=(const TransformationMatrix& other) const { return !(*this == other); }
-
- // *this = *this * t (i.e., a multRight)
- TransformationMatrix& operator*=(const TransformationMatrix& t)
- {
- *this = *this * t;
- return *this;
- }
-
- // result = *this * t (i.e., a multRight)
- TransformationMatrix operator*(const TransformationMatrix& t) const
- {
- TransformationMatrix result = t;
- result.multLeft(*this);
- return result;
- }
-
-#if PLATFORM(CA)
- TransformationMatrix(const CATransform3D&);
- operator CATransform3D() const;
-#endif
-#if PLATFORM(CG)
- TransformationMatrix(const CGAffineTransform&);
- operator CGAffineTransform() const;
-#elif PLATFORM(CAIRO)
- operator cairo_matrix_t() const;
-#elif PLATFORM(OPENVG)
- operator VGMatrix() const;
-#elif PLATFORM(QT)
- operator QTransform() const;
-#elif PLATFORM(SKIA)
- operator SkMatrix() const;
-#elif PLATFORM(WX) && USE(WXGC)
- operator wxGraphicsMatrix() const;
-#endif
-
-#if PLATFORM(WIN) || (PLATFORM(QT) && OS(WINDOWS)) || (PLATFORM(WX) && OS(WINDOWS))
- operator XFORM() const;
-#endif
-
- bool isIdentityOrTranslation() const
- {
- return m_matrix[0][0] == 1 && m_matrix[0][1] == 0 && m_matrix[0][2] == 0 && m_matrix[0][3] == 0
- && m_matrix[1][0] == 0 && m_matrix[1][1] == 1 && m_matrix[1][2] == 0 && m_matrix[1][3] == 0
- && m_matrix[2][0] == 0 && m_matrix[2][1] == 0 && m_matrix[2][2] == 1 && m_matrix[2][3] == 0
- && m_matrix[3][3] == 1;
- }
-
-private:
- // multiply passed 2D point by matrix (assume z=0)
- void multVecMatrix(double x, double y, double& dstX, double& dstY) const;
-
- // multiply passed 3D point by matrix
- void multVecMatrix(double x, double y, double z, double& dstX, double& dstY, double& dstZ) const;
-
- void setMatrix(const Matrix4 m)
- {
- if (m && m != m_matrix)
- memcpy(m_matrix, m, sizeof(Matrix4));
- }
-
- Matrix4 m_matrix;
-};
-
-} // namespace WebCore
-
-#endif // TransformationMatrix_h
diff --git a/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp b/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp
deleted file mode 100644
index a8ad131..0000000
--- a/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 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.
- *
- * 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.
- *
- */
-
-#include "config.h"
-#include "TranslateTransformOperation.h"
-
-namespace WebCore {
-
-PassRefPtr<TransformOperation> TranslateTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
-{
- if (from && !from->isSameType(*this))
- return this;
-
- if (blendToIdentity)
- return TranslateTransformOperation::create(Length(m_x.type()).blend(m_x, progress),
- Length(m_y.type()).blend(m_y, progress),
- Length(m_z.type()).blend(m_z, progress), m_type);
-
- const TranslateTransformOperation* fromOp = static_cast<const TranslateTransformOperation*>(from);
- Length fromX = fromOp ? fromOp->m_x : Length(m_x.type());
- Length fromY = fromOp ? fromOp->m_y : Length(m_y.type());
- Length fromZ = fromOp ? fromOp->m_z : Length(m_z.type());
- return TranslateTransformOperation::create(m_x.blend(fromX, progress), m_y.blend(fromY, progress), m_z.blend(fromZ, progress), m_type);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/transforms/TranslateTransformOperation.h b/WebCore/platform/graphics/transforms/TranslateTransformOperation.h
deleted file mode 100644
index ea48d49..0000000
--- a/WebCore/platform/graphics/transforms/TranslateTransformOperation.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * (C) 2000 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
- *
- * 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.
- *
- * 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.
- *
- */
-
-#ifndef TranslateTransformOperation_h
-#define TranslateTransformOperation_h
-
-#include "Length.h"
-#include "TransformOperation.h"
-
-namespace WebCore {
-
-class TranslateTransformOperation : public TransformOperation {
-public:
- static PassRefPtr<TranslateTransformOperation> create(const Length& tx, const Length& ty, OperationType type)
- {
- return adoptRef(new TranslateTransformOperation(tx, ty, Length(0, Fixed), type));
- }
-
- static PassRefPtr<TranslateTransformOperation> create(const Length& tx, const Length& ty, const Length& tz, OperationType type)
- {
- return adoptRef(new TranslateTransformOperation(tx, ty, tz, type));
- }
-
- double x(const IntSize& borderBoxSize) const { return m_x.calcFloatValue(borderBoxSize.width()); }
- double y(const IntSize& borderBoxSize) const { return m_y.calcFloatValue(borderBoxSize.height()); }
- double z(const IntSize&) const { return m_z.calcFloatValue(1); }
-
- Length x() const { return m_x; }
- Length y() const { return m_y; }
- Length z() const { return m_z; }
-
-private:
- virtual bool isIdentity() const { return m_x.calcFloatValue(1) == 0 && m_y.calcFloatValue(1) == 0 && m_z.calcFloatValue(1) == 0; }
-
- virtual OperationType getOperationType() const { return m_type; }
- virtual bool isSameType(const TransformOperation& o) const { return o.getOperationType() == m_type; }
-
- virtual bool operator==(const TransformOperation& o) const
- {
- if (!isSameType(o))
- return false;
- const TranslateTransformOperation* t = static_cast<const TranslateTransformOperation*>(&o);
- return m_x == t->m_x && m_y == t->m_y && m_z == t->m_z;
- }
-
- virtual bool apply(TransformationMatrix& transform, const IntSize& borderBoxSize) const
- {
- transform.translate3d(x(borderBoxSize), y(borderBoxSize), z(borderBoxSize));
- return m_x.type() == Percent || m_y.type() == Percent;
- }
-
- virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false);
-
- TranslateTransformOperation(const Length& tx, const Length& ty, const Length& tz, OperationType type)
- : m_x(tx)
- , m_y(ty)
- , m_z(tz)
- , m_type(type)
- {
- ASSERT(type == TRANSLATE_X || type == TRANSLATE_Y || type == TRANSLATE_Z || type == TRANSLATE || type == TRANSLATE_3D);
- }
-
- Length m_x;
- Length m_y;
- Length m_z;
- OperationType m_type;
-};
-
-} // namespace WebCore
-
-#endif // TranslateTransformOperation_h