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

Unified Diff: Source/core/platform/animation/AnimationTranslationUtil.cpp

Issue 112463008: Move core/platform/animation files (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add comments and platform tests Created 6 years, 11 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/animation/AnimationTranslationUtil.cpp
diff --git a/Source/core/platform/animation/AnimationTranslationUtil.cpp b/Source/core/platform/animation/AnimationTranslationUtil.cpp
deleted file mode 100644
index b54f2f554831e3e0a20299cac248736535412673..0000000000000000000000000000000000000000
--- a/Source/core/platform/animation/AnimationTranslationUtil.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 2012 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 INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include "core/platform/animation/AnimationTranslationUtil.h"
-
-#include "core/platform/animation/CSSAnimationData.h"
-#include "core/platform/animation/KeyframeValueList.h"
-#include "platform/LengthFunctions.h"
-#include "platform/geometry/FloatSize.h"
-#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
-#include "platform/transforms/InterpolatedTransformOperation.h"
-#include "platform/transforms/Matrix3DTransformOperation.h"
-#include "platform/transforms/MatrixTransformOperation.h"
-#include "platform/transforms/PerspectiveTransformOperation.h"
-#include "platform/transforms/RotateTransformOperation.h"
-#include "platform/transforms/ScaleTransformOperation.h"
-#include "platform/transforms/SkewTransformOperation.h"
-#include "platform/transforms/TransformationMatrix.h"
-#include "platform/transforms/TranslateTransformOperation.h"
-
-#include "public/platform/Platform.h"
-#include "public/platform/WebAnimation.h"
-#include "public/platform/WebAnimationCurve.h"
-#include "public/platform/WebCompositorSupport.h"
-#include "public/platform/WebFilterAnimationCurve.h"
-#include "public/platform/WebFloatAnimationCurve.h"
-#include "public/platform/WebTransformAnimationCurve.h"
-
-#include "wtf/OwnPtr.h"
-#include "wtf/text/CString.h"
-
-using namespace std;
-using namespace blink;
-
-namespace WebCore {
-
-void toWebTransformOperations(const TransformOperations& transformOperations, const FloatSize& boxSize, WebTransformOperations* webTransformOperations)
-{
- // We need to do a deep copy the transformOperations may contain ref pointers to TransformOperation objects.
- for (size_t j = 0; j < transformOperations.size(); ++j) {
- switch (transformOperations.operations()[j]->type()) {
- case TransformOperation::ScaleX:
- case TransformOperation::ScaleY:
- case TransformOperation::ScaleZ:
- case TransformOperation::Scale3D:
- case TransformOperation::Scale: {
- ScaleTransformOperation* transform = static_cast<ScaleTransformOperation*>(transformOperations.operations()[j].get());
- webTransformOperations->appendScale(transform->x(), transform->y(), transform->z());
- break;
- }
- case TransformOperation::TranslateX:
- case TransformOperation::TranslateY:
- case TransformOperation::TranslateZ:
- case TransformOperation::Translate3D:
- case TransformOperation::Translate: {
- TranslateTransformOperation* transform = static_cast<TranslateTransformOperation*>(transformOperations.operations()[j].get());
- webTransformOperations->appendTranslate(floatValueForLength(transform->x(), boxSize.width()), floatValueForLength(transform->y(), boxSize.height()), transform->z());
- break;
- }
- case TransformOperation::RotateX:
- case TransformOperation::RotateY:
- case TransformOperation::Rotate3D:
- case TransformOperation::Rotate: {
- RotateTransformOperation* transform = static_cast<RotateTransformOperation*>(transformOperations.operations()[j].get());
- webTransformOperations->appendRotate(transform->x(), transform->y(), transform->z(), transform->angle());
- break;
- }
- case TransformOperation::SkewX:
- case TransformOperation::SkewY:
- case TransformOperation::Skew: {
- SkewTransformOperation* transform = static_cast<SkewTransformOperation*>(transformOperations.operations()[j].get());
- webTransformOperations->appendSkew(transform->angleX(), transform->angleY());
- break;
- }
- case TransformOperation::Matrix: {
- MatrixTransformOperation* transform = static_cast<MatrixTransformOperation*>(transformOperations.operations()[j].get());
- TransformationMatrix m = transform->matrix();
- webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m));
- break;
- }
- case TransformOperation::Matrix3D: {
- Matrix3DTransformOperation* transform = static_cast<Matrix3DTransformOperation*>(transformOperations.operations()[j].get());
- TransformationMatrix m = transform->matrix();
- webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m));
- break;
- }
- case TransformOperation::Perspective: {
- PerspectiveTransformOperation* transform = static_cast<PerspectiveTransformOperation*>(transformOperations.operations()[j].get());
- webTransformOperations->appendPerspective(transform->perspective());
- break;
- }
- case TransformOperation::Interpolated: {
- TransformationMatrix m;
- transformOperations.operations()[j]->apply(m, boxSize);
- webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m));
- break;
- }
- case TransformOperation::Identity:
- webTransformOperations->appendIdentity();
- break;
- case TransformOperation::None:
- // Do nothing.
- break;
- } // switch
- } // for each operation
-}
-
-template <class Value, class Keyframe, class Curve>
-bool appendKeyframeWithStandardTimingFunction(Curve* curve, double keyTime, const Value* value, const Value* lastValue, blink::WebAnimationCurve::TimingFunctionType timingFunctionType, const FloatSize&)
-{
- curve->add(Keyframe(keyTime, value->value()), timingFunctionType);
- return true;
-}
-
-template <class Value, class Keyframe, class Curve>
-bool appendKeyframeWithCustomBezierTimingFunction(Curve* curve, double keyTime, const Value* value, const Value* lastValue, double x1, double y1, double x2, double y2, const FloatSize&)
-{
- curve->add(Keyframe(keyTime, value->value()), x1, y1, x2, y2);
- return true;
-}
-
-template <>
-bool appendKeyframeWithStandardTimingFunction<TransformAnimationValue, WebTransformKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, double keyTime, const TransformAnimationValue* value, const TransformAnimationValue* lastValue, blink::WebAnimationCurve::TimingFunctionType timingFunctionType, const FloatSize& boxSize)
-{
- bool canBlend = !lastValue;
- OwnPtr<WebTransformOperations> operations = adoptPtr(Platform::current()->compositorSupport()->createTransformOperations());
- if (!operations)
- return false;
- toWebTransformOperations(*value->value(), boxSize, operations.get());
- if (!canBlend) {
- OwnPtr<WebTransformOperations> lastOperations = adoptPtr(Platform::current()->compositorSupport()->createTransformOperations());
- if (!lastOperations)
- return false;
- toWebTransformOperations(*lastValue->value(), boxSize, lastOperations.get());
- canBlend = lastOperations->canBlendWith(*operations);
- }
- if (canBlend) {
- curve->add(WebTransformKeyframe(keyTime, operations.release()), timingFunctionType);
- return true;
- }
- return false;
-}
-
-template <>
-bool appendKeyframeWithCustomBezierTimingFunction<TransformAnimationValue, WebTransformKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, double keyTime, const TransformAnimationValue* value, const TransformAnimationValue* lastValue, double x1, double y1, double x2, double y2, const FloatSize& boxSize)
-{
- bool canBlend = !lastValue;
- OwnPtr<WebTransformOperations> operations = adoptPtr(Platform::current()->compositorSupport()->createTransformOperations());
- if (!operations)
- return false;
- toWebTransformOperations(*value->value(), boxSize, operations.get());
- if (!canBlend) {
- OwnPtr<WebTransformOperations> lastOperations = adoptPtr(Platform::current()->compositorSupport()->createTransformOperations());
- if (!lastOperations)
- return false;
- toWebTransformOperations(*lastValue->value(), boxSize, lastOperations.get());
- canBlend = lastOperations->canBlendWith(*operations);
- }
- if (canBlend) {
- curve->add(WebTransformKeyframe(keyTime, operations.release()), x1, y1, x2, y2);
- return true;
- }
- return false;
-}
-
-bool toWebFilterOperations(const FilterOperations& inOperations, WebFilterOperations* outOperations)
-{
- SkiaImageFilterBuilder builder;
- FilterOutsets outsets = inOperations.outsets();
- builder.setCropOffset(FloatSize(outsets.left(), outsets.top()));
- return builder.buildFilterOperations(inOperations, outOperations);
-}
-
-template <>
-bool appendKeyframeWithStandardTimingFunction<FilterAnimationValue, WebFilterKeyframe, WebFilterAnimationCurve>(WebFilterAnimationCurve* curve, double keyTime, const FilterAnimationValue* value, const FilterAnimationValue* lastValue, blink::WebAnimationCurve::TimingFunctionType timingFunctionType, const FloatSize& boxSize)
-{
- // FIXME(ajuma): In order to animate pixel-moving filters on the compositor thread, we need
- // to update overlap testing to take into account the bounds within which the animation
- // will be contained, and we need the compositor to update layer bounds as the animation
- // progresses.
- if (value->value()->hasFilterThatMovesPixels())
- return false;
- OwnPtr<WebFilterOperations> operations = adoptPtr(Platform::current()->compositorSupport()->createFilterOperations());
- if (!toWebFilterOperations(*(value->value()), operations.get()))
- return false;
- curve->add(WebFilterKeyframe(keyTime, operations.release()), timingFunctionType);
- return true;
-}
-
-template <>
-bool appendKeyframeWithCustomBezierTimingFunction<FilterAnimationValue, WebFilterKeyframe, WebFilterAnimationCurve>(WebFilterAnimationCurve* curve, double keyTime, const FilterAnimationValue* value, const FilterAnimationValue* lastValue, double x1, double y1, double x2, double y2, const FloatSize& boxSize)
-{
- // FIXME(ajuma): In order to animate pixel-moving filters on the compositor thread, we need
- // to update overlap testing to take into account the bounds within which the animation
- // will be contained, and we need the compositor to update layer bounds as the animation
- // progresses.
- if (value->value()->hasFilterThatMovesPixels())
- return false;
-
- OwnPtr<WebFilterOperations> operations = adoptPtr(Platform::current()->compositorSupport()->createFilterOperations());
- if (!toWebFilterOperations(*(value->value()), operations.get()))
- return false;
- curve->add(WebFilterKeyframe(keyTime, operations.release()), x1, y1, x2, y2);
- return true;
-}
-
-template <class Value, class Keyframe, class Curve>
-PassOwnPtr<blink::WebAnimation> createWebAnimation(const KeyframeValueList& valueList, const CSSAnimationData* animation, int animationId, double timeOffset, Curve* curve, blink::WebAnimation::TargetProperty targetProperty, const FloatSize& boxSize)
-{
- bool alternate = false;
- bool reverse = false;
- if (animation && animation->isDirectionSet()) {
- CSSAnimationData::AnimationDirection direction = animation->direction();
- if (direction == CSSAnimationData::AnimationDirectionAlternate || direction == CSSAnimationData::AnimationDirectionAlternateReverse)
- alternate = true;
- if (direction == CSSAnimationData::AnimationDirectionReverse || direction == CSSAnimationData::AnimationDirectionAlternateReverse)
- reverse = true;
- }
-
- for (size_t i = 0; i < valueList.size(); i++) {
- size_t index = reverse ? valueList.size() - i - 1 : i;
- const Value* originalValue = static_cast<const Value*>(valueList.at(index));
- const Value* lastOriginalValue = 0;
- if (valueList.size() > 1 && ((reverse && index + 1 < valueList.size()) || (!reverse && index > 0)))
- lastOriginalValue = static_cast<const Value*>(valueList.at(reverse ? index + 1 : index - 1));
-
- const TimingFunction* originalTimingFunction = originalValue->timingFunction();
-
- // If there hasn't been a timing function associated with this keyframe, use the
- // animation's timing function, if we have one.
- if (!originalTimingFunction && animation->isTimingFunctionSet())
- originalTimingFunction = animation->timingFunction();
-
- // Ease is the default timing function.
- blink::WebAnimationCurve::TimingFunctionType timingFunctionType = blink::WebAnimationCurve::TimingFunctionTypeEase;
-
- bool isUsingCustomBezierTimingFunction = false;
- double x1 = 0;
- double y1 = 0;
- double x2 = 1;
- double y2 = 1;
-
- if (originalTimingFunction) {
- switch (originalTimingFunction->type()) {
- case TimingFunction::StepsFunction:
- // FIXME: add support for steps timing function.
- return nullptr;
- case TimingFunction::LinearFunction:
- // This doesn't need to be flipped when the animation is reversed.
- timingFunctionType = blink::WebAnimationCurve::TimingFunctionTypeLinear;
- break;
- case TimingFunction::CubicBezierFunction:
- {
- const CubicBezierTimingFunction* originalBezierTimingFunction = toCubicBezierTimingFunction(originalTimingFunction);
- isUsingCustomBezierTimingFunction = true;
- x1 = originalBezierTimingFunction->x1();
- y1 = originalBezierTimingFunction->y1();
- x2 = originalBezierTimingFunction->x2();
- y2 = originalBezierTimingFunction->y2();
- if (reverse) {
- // When the animation is reversed, we need to swap the
- // start and end keyframes, and flip the timing
- // function in both x and y.
- double x1Old = x1;
- double y1Old = y1;
- x1 = 1 - x2;
- y1 = 1 - y2;
- x2 = 1 - x1Old;
- y2 = 1 - y1Old;
- }
- break;
- }
- default:
- ASSERT_NOT_REACHED();
- } // switch
- }
-
- double duration = (animation && animation->isDurationSet()) ? animation->duration() : 1;
- double keyTime = originalValue->keyTime() * duration;
-
- if (reverse)
- keyTime = duration - keyTime;
-
- bool addedKeyframe = false;
- if (isUsingCustomBezierTimingFunction)
- addedKeyframe = appendKeyframeWithCustomBezierTimingFunction<Value, Keyframe, Curve>(curve, keyTime, originalValue, lastOriginalValue, x1, y1, x2, y2, boxSize);
- else
- addedKeyframe = appendKeyframeWithStandardTimingFunction<Value, Keyframe, Curve>(curve, keyTime, originalValue, lastOriginalValue, timingFunctionType, boxSize);
-
- if (!addedKeyframe)
- return nullptr;
- }
-
- OwnPtr<blink::WebAnimation> webAnimation = adoptPtr(Platform::current()->compositorSupport()->createAnimation(*curve, targetProperty, animationId));
-
- int iterations = (animation && animation->isIterationCountSet()) ? animation->iterationCount() : 1;
- webAnimation->setIterations(iterations);
- webAnimation->setAlternatesDirection(alternate);
-
- // If timeOffset > 0, then the animation has started in the past.
- webAnimation->setTimeOffset(timeOffset);
-
- return webAnimation.release();
-}
-
-PassOwnPtr<blink::WebAnimation> createWebAnimation(const KeyframeValueList& values, const CSSAnimationData* animation, int animationId, double timeOffset, const FloatSize& boxSize)
-{
- switch (values.property()) {
- case AnimatedPropertyWebkitTransform: {
- OwnPtr<WebTransformAnimationCurve> curve = adoptPtr(Platform::current()->compositorSupport()->createTransformAnimationCurve());
- return createWebAnimation<TransformAnimationValue, WebTransformKeyframe, WebTransformAnimationCurve>(values, animation, animationId, timeOffset, curve.get(), blink::WebAnimation::TargetPropertyTransform, FloatSize(boxSize));
- }
-
- case AnimatedPropertyOpacity: {
- OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(Platform::current()->compositorSupport()->createFloatAnimationCurve());
- return createWebAnimation<FloatAnimationValue, WebFloatKeyframe, WebFloatAnimationCurve>(values, animation, animationId, timeOffset, curve.get(), blink::WebAnimation::TargetPropertyOpacity, FloatSize());
- }
-
- case AnimatedPropertyWebkitFilter: {
- OwnPtr<WebFilterAnimationCurve> curve = adoptPtr(Platform::current()->compositorSupport()->createFilterAnimationCurve());
- return createWebAnimation<FilterAnimationValue, WebFilterKeyframe, WebFilterAnimationCurve>(values, animation, animationId, timeOffset, curve.get(), blink::WebAnimation::TargetPropertyFilter, FloatSize(boxSize));
- }
-
- case AnimatedPropertyBackgroundColor:
- case AnimatedPropertyInvalid:
- return nullptr;
- }
-
- return nullptr;
-}
-
-} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698