Index: Source/platform/transforms/RotateTransformOperation.cpp |
diff --git a/Source/platform/transforms/RotateTransformOperation.cpp b/Source/platform/transforms/RotateTransformOperation.cpp |
index 94ab0d431f5be5ec2bcb002444378bc5d9ad49c0..6f500cb15b651b60a64f1b0315f33616c41cfef3 100644 |
--- a/Source/platform/transforms/RotateTransformOperation.cpp |
+++ b/Source/platform/transforms/RotateTransformOperation.cpp |
@@ -23,6 +23,7 @@ |
#include "platform/transforms/RotateTransformOperation.h" |
#include "platform/animation/AnimationUtilities.h" |
+#include "platform/geometry/FloatPoint3D.h" |
#include "wtf/MathExtras.h" |
#include <algorithm> |
@@ -30,6 +31,57 @@ using namespace std; |
namespace WebCore { |
+static const double angleEpsilon = 1e-4; |
+ |
+FloatPoint3D RotateTransformOperation::axis() const |
+{ |
+ return FloatPoint3D(x(), y(), z()); |
+} |
+ |
+bool RotateTransformOperation::shareSameAxis(const RotateTransformOperation* from, const RotateTransformOperation* to, FloatPoint3D* axis, double* fromAngle, double* toAngle) |
+{ |
+ *axis = FloatPoint3D(0, 0, 1); |
+ *fromAngle = 0; |
+ *toAngle = 0; |
+ |
+ if (!from && !to) |
+ return true; |
+ |
+ bool fromZero = !from || from->axis().isZero(); |
+ bool toZero = !to || to->axis().isZero(); |
+ |
+ if (fromZero && toZero) |
+ return true; |
+ |
+ if (fromZero) { |
+ *axis = to->axis(); |
+ *toAngle = to->angle(); |
+ return true; |
+ } |
+ |
+ if (toZero) { |
+ *axis = from->axis(); |
+ *fromAngle = from->angle(); |
+ return true; |
+ } |
+ |
+ FloatPoint3D fromAxis = from->axis(); |
+ FloatPoint3D toAxis = to->axis(); |
+ |
+ double fromSquared = fromAxis.lengthSquared(); |
+ double toSquared = toAxis.lengthSquared(); |
+ |
+ double dot = fromAxis.dot(toAxis); |
+ double error = std::abs(1 - (dot * dot) / (fromSquared * toSquared)); |
+ |
+ if (error > angleEpsilon) |
+ return false; |
+ *axis = from->axis(); |
+ *fromAngle = from->angle(); |
+ *toAngle = to->angle(); |
+ return true; |
+} |
+ |
PassRefPtr<TransformOperation> RotateTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity) |
{ |
if (from && !from->isSameType(*this)) |
@@ -50,6 +102,12 @@ PassRefPtr<TransformOperation> RotateTransformOperation::blend(const TransformOp |
fromOp ? fromOp->m_z : m_z, |
WebCore::blend(fromAngle, m_angle, progress), m_type); |
} |
+ double fromAngle; |
+ double toAngle; |
+ FloatPoint3D axis; |
+ |
+ if (shareSameAxis(fromOp, this, &axis, &fromAngle, &toAngle)) |
+ return RotateTransformOperation::create(axis.x(), axis.y(), axis.z(), WebCore::blend(fromAngle, toAngle, progress), m_type); |
const RotateTransformOperation* toOp = this; |
@@ -93,4 +151,9 @@ PassRefPtr<TransformOperation> RotateTransformOperation::blend(const TransformOp |
return RotateTransformOperation::create(x, y, z, angle, Rotate3D); |
} |
+bool RotateTransformOperation::canBlendWith(const TransformOperation& other) const |
+{ |
+ return other.isSameType(*this); |
+} |
+ |
} // namespace WebCore |