Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1433)

Unified Diff: Source/core/platform/graphics/transforms/AffineTransform.cpp

Issue 25494003: Move geometry classes from core/platform/graphics to platform/geometry (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
-}
-
-}

Powered by Google App Engine
This is Rietveld 408576698