| Index: Source/core/platform/graphics/transforms/AffineTransform.cpp
|
| diff --git a/Source/core/platform/graphics/transforms/AffineTransform.cpp b/Source/core/platform/graphics/transforms/AffineTransform.cpp
|
| deleted file mode 100644
|
| index 277018f75ff1c81413aad14e656f50f3551c9517..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/graphics/transforms/AffineTransform.cpp
|
| +++ /dev/null
|
| @@ -1,425 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
|
| - * 2010 Dirk Schulze <krit@webkit.org>
|
| - * Copyright (C) 2013 Google 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.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/platform/graphics/transforms/AffineTransform.h"
|
| -
|
| -#include "core/platform/FloatConversion.h"
|
| -#include "core/platform/graphics/FloatQuad.h"
|
| -#include "core/platform/graphics/FloatRect.h"
|
| -#include "core/platform/graphics/IntRect.h"
|
| -#include "core/platform/graphics/skia/SkiaUtils.h"
|
| -
|
| -#include "wtf/MathExtras.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -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;
|
| -}
|
| -
|
| -
|
| -// Multiplies this AffineTransform by the provided AffineTransform - i.e.
|
| -// this = this * other;
|
| -AffineTransform& AffineTransform::multiply(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);
|
| -
|
| - multiply(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;
|
| -}
|
| -
|
| -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));
|
| -}
|
| -
|
| -IntSize AffineTransform::mapSize(const IntSize& size) const
|
| -{
|
| - double width2 = size.width() * xScale();
|
| - double height2 = size.height() * yScale();
|
| -
|
| - return IntSize(lround(width2), lround(height2));
|
| -}
|
| -
|
| -FloatSize AffineTransform::mapSize(const FloatSize& size) const
|
| -{
|
| - double width2 = size.width() * xScale();
|
| - double height2 = size.height() * yScale();
|
| -
|
| - return FloatSize(narrowPrecisionToFloat(width2), narrowPrecisionToFloat(height2));
|
| -}
|
| -
|
| -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.maxX(), rect.y())));
|
| - result.setP3(mapPoint(FloatPoint(rect.maxX(), rect.maxY())));
|
| - result.setP4(mapPoint(FloatPoint(rect.x(), rect.maxY())));
|
| - 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)
|
| -{
|
| - DecomposedType srA, srB;
|
| -
|
| - from.decompose(srA);
|
| - this->decompose(srB);
|
| -
|
| - // If x-axis of one is flipped, and y-axis of the other, convert to an unflipped rotation.
|
| - if ((srA.scaleX < 0 && srB.scaleY < 0) || (srA.scaleY < 0 && srB.scaleX < 0)) {
|
| - srA.scaleX = -srA.scaleX;
|
| - srA.scaleY = -srA.scaleY;
|
| - srA.angle += srA.angle < 0 ? piDouble : -piDouble;
|
| - }
|
| -
|
| - // Don't rotate the long way around.
|
| - srA.angle = fmod(srA.angle, 2 * piDouble);
|
| - srB.angle = fmod(srB.angle, 2 * piDouble);
|
| -
|
| - if (fabs(srA.angle - srB.angle) > piDouble) {
|
| - if (srA.angle > srB.angle)
|
| - srA.angle -= piDouble * 2;
|
| - else
|
| - srB.angle -= piDouble * 2;
|
| - }
|
| -
|
| - srA.scaleX += progress * (srB.scaleX - srA.scaleX);
|
| - srA.scaleY += progress * (srB.scaleY - srA.scaleY);
|
| - srA.angle += progress * (srB.angle - srA.angle);
|
| - srA.remainderA += progress * (srB.remainderA - srA.remainderA);
|
| - srA.remainderB += progress * (srB.remainderB - srA.remainderB);
|
| - srA.remainderC += progress * (srB.remainderC - srA.remainderC);
|
| - srA.remainderD += progress * (srB.remainderD - srA.remainderD);
|
| - srA.translateX += progress * (srB.translateX - srA.translateX);
|
| - srA.translateY += progress * (srB.translateY - srA.translateY);
|
| -
|
| - this->recompose(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]);
|
| -}
|
| -
|
| -AffineTransform::operator SkMatrix() const
|
| -{
|
| - SkMatrix result;
|
| -
|
| - result.setScaleX(WebCoreDoubleToSkScalar(a()));
|
| - result.setSkewX(WebCoreDoubleToSkScalar(c()));
|
| - result.setTranslateX(WebCoreDoubleToSkScalar(e()));
|
| -
|
| - result.setScaleY(WebCoreDoubleToSkScalar(d()));
|
| - result.setSkewY(WebCoreDoubleToSkScalar(b()));
|
| - result.setTranslateY(WebCoreDoubleToSkScalar(f()));
|
| -
|
| - // FIXME: Set perspective properly.
|
| - result.setPerspX(0);
|
| - result.setPerspY(0);
|
| - result.set(SkMatrix::kMPersp2, SK_Scalar1);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -bool AffineTransform::decompose(DecomposedType& decomp) const
|
| -{
|
| - AffineTransform m(*this);
|
| -
|
| - // Compute scaling factors
|
| - double sx = xScale();
|
| - double sy = yScale();
|
| -
|
| - // Compute cross product of transformed unit vectors. If negative,
|
| - // one axis was flipped.
|
| - if (m.a() * m.d() - m.c() * m.b() < 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 / sx, 1 / sy);
|
| -
|
| - // Compute rotation
|
| - double angle = atan2(m.b(), m.a());
|
| -
|
| - // Remove rotation from matrix
|
| - m.rotate(rad2deg(-angle));
|
| -
|
| - // Return results
|
| - decomp.scaleX = sx;
|
| - decomp.scaleY = sy;
|
| - decomp.angle = angle;
|
| - decomp.remainderA = m.a();
|
| - decomp.remainderB = m.b();
|
| - decomp.remainderC = m.c();
|
| - decomp.remainderD = m.d();
|
| - decomp.translateX = m.e();
|
| - decomp.translateY = m.f();
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void AffineTransform::recompose(const DecomposedType& decomp)
|
| -{
|
| - this->setA(decomp.remainderA);
|
| - this->setB(decomp.remainderB);
|
| - this->setC(decomp.remainderC);
|
| - this->setD(decomp.remainderD);
|
| - this->setE(decomp.translateX);
|
| - this->setF(decomp.translateY);
|
| - this->rotate(rad2deg(decomp.angle));
|
| - this->scale(decomp.scaleX, decomp.scaleY);
|
| -}
|
| -
|
| -}
|
|
|