TEST_F(KeyframeEffectModelTest, EvenlyDistributed2) { KeyframeVector keyframes(6); keyframes[0] = AnimatableValueKeyframe::create(); keyframes[1] = AnimatableValueKeyframe::create(); keyframes[2] = AnimatableValueKeyframe::create(); keyframes[3] = AnimatableValueKeyframe::create(); keyframes[3]->setOffset(0.75); keyframes[4] = AnimatableValueKeyframe::create(); keyframes[5] = AnimatableValueKeyframe::create(); const KeyframeVector result = normalizedKeyframes(keyframes); EXPECT_EQ(6U, result.size()); EXPECT_DOUBLE_EQ(0.0, result[0]->offset()); EXPECT_DOUBLE_EQ(0.25, result[1]->offset()); EXPECT_DOUBLE_EQ(0.5, result[2]->offset()); EXPECT_DOUBLE_EQ(0.75, result[3]->offset()); EXPECT_DOUBLE_EQ(0.875, result[4]->offset()); EXPECT_DOUBLE_EQ(1.0, result[5]->offset()); }
TEST(AnimationKeyframeEffectModel, SampleOnKeyframe) { AnimatableValueKeyframeVector keyframes(3); keyframes[0] = AnimatableValueKeyframe::create(); keyframes[0]->setOffset(0.0); keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); keyframes[1] = AnimatableValueKeyframe::create(); keyframes[1]->setOffset(0.5); keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); keyframes[2] = AnimatableValueKeyframe::create(); keyframes[2]->setOffset(1.0); keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); AnimatableValueKeyframeEffectModel* effect = AnimatableValueKeyframeEffectModel::create(keyframes); Vector<RefPtr<Interpolation>> values; effect->sample(0, 0.0, duration, values); expectDoubleValue(3.0, values.at(0)); effect->sample(0, 0.5, duration, values); expectDoubleValue(4.0, values.at(0)); effect->sample(0, 1.0, duration, values); expectDoubleValue(5.0, values.at(0)); }
TEST(AnimationKeyframeEffectModel, MultipleProperties) { AnimatableValueKeyframeVector keyframes(2); keyframes[0] = AnimatableValueKeyframe::create(); keyframes[0]->setOffset(0.0); keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); keyframes[0]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(4.0).get()); keyframes[1] = AnimatableValueKeyframe::create(); keyframes[1]->setOffset(1.0); keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); keyframes[1]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(6.0).get()); AnimatableValueKeyframeEffectModel* effect = AnimatableValueKeyframeEffectModel::create(keyframes); Vector<RefPtr<Interpolation>> values; effect->sample(0, 0.6, duration, values); EXPECT_EQ(2UL, values.size()); Interpolation* leftValue = findValue(values, CSSPropertyLeft); ASSERT_TRUE(leftValue); expectDoubleValue(5.0, leftValue); Interpolation* rightValue = findValue(values, CSSPropertyRight); ASSERT_TRUE(rightValue); expectDoubleValue(6.0, rightValue); }
bool ArgumentCoder<GraphicsLayerAnimation>::decode(ArgumentDecoder* decoder, GraphicsLayerAnimation& animation) { String name; IntSize boxSize; GraphicsLayerAnimation::AnimationState state; double startTime; double pauseTime; bool listsMatch; Animation::AnimationDirection direction; unsigned fillMode; double duration; double iterationCount; RefPtr<TimingFunction> timingFunction; RefPtr<Animation> animationObject; if (!decoder->decode(name)) return false; if (!decoder->decode(boxSize)) return false; if (!decoder->decodeEnum(state)) return false; if (!decoder->decodeDouble(startTime)) return false; if (!decoder->decodeDouble(pauseTime)) return false; if (!decoder->decodeBool(listsMatch)) return false; if (!decoder->decodeEnum(direction)) return false; if (!decoder->decodeUInt32(fillMode)) return false; if (!decoder->decodeDouble(duration)) return false; if (!decoder->decodeDouble(iterationCount)) return false; if (!decodeTimingFunction(decoder, timingFunction)) return false; animationObject = Animation::create(); animationObject->setDirection(direction); animationObject->setFillMode(fillMode); animationObject->setDuration(duration); animationObject->setIterationCount(iterationCount); if (timingFunction) animationObject->setTimingFunction(timingFunction); AnimatedPropertyID property; if (!decoder->decodeEnum(property)) return false; KeyframeValueList keyframes(property); unsigned keyframesSize; if (!decoder->decodeUInt32(keyframesSize)) return false; for (unsigned i = 0; i < keyframesSize; ++i) { float keyTime; RefPtr<TimingFunction> timingFunction; if (!decoder->decode(keyTime)) return false; if (!decodeTimingFunction(decoder, timingFunction)) return false; switch (property) { case AnimatedPropertyOpacity: { float value; if (!decoder->decodeFloat(value)) return false; keyframes.insert(new FloatAnimationValue(keyTime, value, timingFunction)); break; } case AnimatedPropertyWebkitTransform: { TransformOperations transform; if (!decoder->decode(transform)) return false; keyframes.insert(new TransformAnimationValue(keyTime, &transform, timingFunction)); break; } #if ENABLE(CSS_FILTERS) case AnimatedPropertyWebkitFilter: { FilterOperations filter; if (!decoder->decode(filter)) return false; keyframes.insert(new FilterAnimationValue(keyTime, &filter, timingFunction)); break; } #endif default: break; } } animation = GraphicsLayerAnimation(name, keyframes, boxSize, animationObject.get(), startTime, listsMatch); animation.setState(state, pauseTime); return true; }