TEST(AnimationAnimatableLengthTest, Zoom) { EXPECT_EQ(Length(4, Fixed), create(Length(10, Fixed), 5)->length(2, ValueRangeAll)); EXPECT_EQ(Length(10, Percent), create(Length(10, Percent), 5)->length(2, ValueRangeAll)); Length calc = Length(CalculationValue::create(PixelsAndPercent(5, 10), ValueRangeAll)); Length result = Length(CalculationValue::create(PixelsAndPercent(2, 10), ValueRangeAll)); EXPECT_TRUE(result == create(calc, 5)->length(2, ValueRangeAll)); }
TEST(AnimationAnimatableLengthTest, Interpolate) { EXPECT_TRUE(AnimatableValue::interpolate(create(Length(10, Fixed)).get(), create(Length(0, Fixed)).get(), 0.2)->equals(create(Length(8, Fixed)).get())); EXPECT_TRUE(AnimatableValue::interpolate(create(Length(4, Percent)).get(), create(Length(12, Percent)).get(), 0.25)->equals(create(Length(6, Percent)).get())); Length calc = Length(CalculationValue::create(PixelsAndPercent(12, 4), ValueRangeAll)); EXPECT_TRUE(AnimatableValue::interpolate(create(Length(20, Fixed)).get(), create(Length(10, Percent)).get(), 0.4)->equals(create(calc).get())); }
Length AnimatableLength::length(float zoom, ValueRange range) const { if (!m_hasPercent) return Length(clampNumber(m_pixels, range) * zoom, Fixed); if (!m_hasPixels) return Length(clampNumber(m_percent, range), Percent); return Length(CalculationValue::create(PixelsAndPercent(m_pixels * zoom, m_percent), range)); }
static Length createLength(double pixels, double percentage, bool hasPercentage, ValueRange range) { ASSERT(hasPercentage || percentage == 0); if (pixels && hasPercentage) return Length(CalculationValue::create(PixelsAndPercent(pixels, percentage), range)); if (hasPercentage) return Length(clampToRange(percentage, range), Percent); return Length(CSSPrimitiveValue::clampToCSSLengthRange(clampToRange(pixels, range)), Fixed); }
TEST(AnimationAnimatableLengthTest, ValueRangeNonNegative) { EXPECT_EQ(Length(10, Fixed), create(Length(10, Fixed))->length(1, ValueRangeNonNegative)); EXPECT_EQ(Length(10, Percent), create(Length(10, Percent))->length(1, ValueRangeNonNegative)); EXPECT_EQ(Length(0, Fixed), create(Length(-10, Fixed))->length(1, ValueRangeNonNegative)); EXPECT_EQ(Length(0, Percent), create(Length(-10, Percent))->length(1, ValueRangeNonNegative)); Length calc = Length(CalculationValue::create(PixelsAndPercent(-5, -10), ValueRangeNonNegative)); EXPECT_TRUE(calc == create(calc)->length(1, ValueRangeNonNegative)); }
TEST(AnimationAnimatableLengthTest, Equals) { EXPECT_TRUE(create(Length(10, Fixed))->equals(create(Length(10, Fixed)).get())); EXPECT_TRUE(create(Length(20, Percent))->equals(create(Length(20, Percent)).get())); EXPECT_FALSE(create(Length(10, Fixed))->equals(create(Length(10, Percent)).get())); EXPECT_FALSE(create(Length(0, Percent))->equals(create(Length(0, Fixed)).get())); Length calc = Length(CalculationValue::create(PixelsAndPercent(5, 10), ValueRangeAll)); EXPECT_TRUE(create(calc)->equals(create(calc).get())); EXPECT_FALSE(create(calc)->equals(create(Length(10, Percent)).get())); }
TEST(AnimationAnimatableLengthTest, RoundTripConversion) { EXPECT_EQ(Length(0, Fixed), create(Length(0, Fixed))->length(1, ValueRangeAll)); EXPECT_EQ(Length(0, Percent), create(Length(0, Percent))->length(1, ValueRangeAll)); EXPECT_EQ(Length(10, Fixed), create(Length(10, Fixed))->length(1, ValueRangeAll)); EXPECT_EQ(Length(10, Percent), create(Length(10, Percent))->length(1, ValueRangeAll)); EXPECT_EQ(Length(-10, Fixed), create(Length(-10, Fixed))->length(1, ValueRangeAll)); EXPECT_EQ(Length(-10, Percent), create(Length(-10, Percent))->length(1, ValueRangeAll)); Length calc = Length(CalculationValue::create(PixelsAndPercent(5, 10), ValueRangeAll)); EXPECT_EQ(calc, create(calc)->length(1, ValueRangeAll)); }
Length LengthInterpolationFunctions::createLength( const InterpolableValue& interpolableValue, const NonInterpolableValue* nonInterpolableValue, const CSSToLengthConversionData& conversionData, ValueRange range) { const InterpolableList& interpolableList = toInterpolableList(interpolableValue); bool hasPercentage = CSSLengthNonInterpolableValue::hasPercentage(nonInterpolableValue); double pixels = 0; double percentage = 0; for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) { double value = toInterpolableNumber(*interpolableList.get(i)).value(); if (value == 0) continue; if (i == CSSPrimitiveValue::UnitTypePercentage) { percentage = value; } else { CSSPrimitiveValue::UnitType type = CSSPrimitiveValue::lengthUnitTypeToUnitType( static_cast<CSSPrimitiveValue::LengthUnitType>(i)); pixels += conversionData.zoomedComputedPixels(value, type); } } if (percentage != 0) hasPercentage = true; if (pixels != 0 && hasPercentage) return Length( CalculationValue::create(PixelsAndPercent(pixels, percentage), range)); if (hasPercentage) return Length(clampToRange(percentage, range), Percent); return Length( CSSPrimitiveValue::clampToCSSLengthRange(clampToRange(pixels, range)), Fixed); }