| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/animation/LengthSVGInterpolation.h" | 6 #include "core/animation/LengthSVGInterpolation.h" |
| 7 | 7 |
| 8 #include "core/css/CSSHelper.h" | 8 #include "core/css/CSSHelper.h" |
| 9 #include "core/svg/SVGAnimatedLength.h" | 9 #include "core/svg/SVGAnimatedLength.h" |
| 10 #include "core/svg/SVGAnimatedLengthList.h" | 10 #include "core/svg/SVGAnimatedLengthList.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 } | 30 } |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 void populateModeData(const SVGAnimatedPropertyBase* attribute, LengthSVGInterpo
lation::NonInterpolableType* ptrModeData) | 34 void populateModeData(const SVGAnimatedPropertyBase* attribute, LengthSVGInterpo
lation::NonInterpolableType* ptrModeData) |
| 35 { | 35 { |
| 36 switch (attribute->type()) { | 36 switch (attribute->type()) { |
| 37 case AnimatedLength: { | 37 case AnimatedLength: { |
| 38 const SVGAnimatedLength& animatedLength = static_cast<const SVGAnimatedL
ength&>(*attribute); | 38 const SVGAnimatedLength& animatedLength = static_cast<const SVGAnimatedL
ength&>(*attribute); |
| 39 ptrModeData->unitMode = animatedLength.currentValue()->unitMode(); | 39 ptrModeData->unitMode = animatedLength.currentValue()->unitMode(); |
| 40 ptrModeData->negativeValuesMode = animatedLength.negativeValuesMode(); | |
| 41 break; | 40 break; |
| 42 } | 41 } |
| 43 case AnimatedLengthList: { | 42 case AnimatedLengthList: { |
| 44 const SVGAnimatedLengthList& animatedLengthList = static_cast<const SVGA
nimatedLengthList&>(*attribute); | 43 const SVGAnimatedLengthList& animatedLengthList = static_cast<const SVGA
nimatedLengthList&>(*attribute); |
| 45 ptrModeData->unitMode = animatedLengthList.currentValue()->unitMode(); | 44 ptrModeData->unitMode = animatedLengthList.currentValue()->unitMode(); |
| 46 ptrModeData->negativeValuesMode = AllowNegativeLengths; | |
| 47 break; | 45 break; |
| 48 } | 46 } |
| 49 default: | 47 default: |
| 50 ASSERT_NOT_REACHED(); | 48 ASSERT_NOT_REACHED(); |
| 51 } | 49 } |
| 52 } | 50 } |
| 53 | 51 |
| 54 enum LengthInterpolatedUnit { | 52 enum LengthInterpolatedUnit { |
| 55 LengthInterpolatedNumber, | 53 LengthInterpolatedNumber, |
| 56 LengthInterpolatedPercentage, | 54 LengthInterpolatedPercentage, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 120 |
| 123 double values[numLengthInterpolatedUnits] = { }; | 121 double values[numLengthInterpolatedUnits] = { }; |
| 124 values[unitType] = value; | 122 values[unitType] = value; |
| 125 | 123 |
| 126 OwnPtr<InterpolableList> listOfValues = InterpolableList::create(numLengthIn
terpolatedUnits); | 124 OwnPtr<InterpolableList> listOfValues = InterpolableList::create(numLengthIn
terpolatedUnits); |
| 127 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i) | 125 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i) |
| 128 listOfValues->set(i, InterpolableNumber::create(values[i])); | 126 listOfValues->set(i, InterpolableNumber::create(values[i])); |
| 129 return listOfValues.release(); | 127 return listOfValues.release(); |
| 130 } | 128 } |
| 131 | 129 |
| 132 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue(
const InterpolableValue& interpolableValue, const NonInterpolableType& modeData,
const SVGElement* element) | 130 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue(
const InterpolableValue& interpolableValue, const NonInterpolableType& modeData,
const SVGElement* element, const QualifiedName& attributeName) |
| 133 { | 131 { |
| 134 const InterpolableList& listOfValues = toInterpolableList(interpolableValue)
; | 132 const InterpolableList& listOfValues = toInterpolableList(interpolableValue)
; |
| 135 ASSERT(element); | 133 ASSERT(element); |
| 136 | 134 |
| 137 double value = 0; | 135 double value = 0; |
| 138 CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::UnitType::UserUnit
s; | 136 CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::UnitType::UserUnit
s; |
| 139 unsigned unitTypeCount = 0; | 137 unsigned unitTypeCount = 0; |
| 140 // We optimise for the common case where only one unit type is involved. | 138 // We optimise for the common case where only one unit type is involved. |
| 141 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { | 139 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { |
| 142 double entry = toInterpolableNumber(listOfValues.get(i))->value(); | 140 double entry = toInterpolableNumber(listOfValues.get(i))->value(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 156 | 154 |
| 157 // SVGLength does not support calc expressions, so we convert to canonic
al units. | 155 // SVGLength does not support calc expressions, so we convert to canonic
al units. |
| 158 SVGLengthContext lengthContext(element); | 156 SVGLengthContext lengthContext(element); |
| 159 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { | 157 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { |
| 160 double entry = toInterpolableNumber(listOfValues.get(i))->value(); | 158 double entry = toInterpolableNumber(listOfValues.get(i))->value(); |
| 161 if (entry) | 159 if (entry) |
| 162 value += lengthContext.convertValueToUserUnits(entry, modeData.u
nitMode, unitTypes[i]); | 160 value += lengthContext.convertValueToUserUnits(entry, modeData.u
nitMode, unitTypes[i]); |
| 163 } | 161 } |
| 164 } | 162 } |
| 165 | 163 |
| 166 if (modeData.negativeValuesMode == ForbidNegativeLengths && value < 0) | 164 if (SVGLength::negativeValuesModeForAnimatedLengthAttribute(attributeName) =
= ForbidNegativeLengths && value < 0) |
| 167 value = 0; | 165 value = 0; |
| 168 | 166 |
| 169 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode);
// defaults to the length 0 | 167 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode);
// defaults to the length 0 |
| 170 result->newValueSpecifiedUnits(unitType, value); | 168 result->newValueSpecifiedUnits(unitType, value); |
| 171 return result.release(); | 169 return result.release(); |
| 172 } | 170 } |
| 173 | 171 |
| 174 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu
e(SVGElement& targetElement) const | 172 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu
e(SVGElement& targetElement) const |
| 175 { | 173 { |
| 176 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement); | 174 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement, att
ributeName()); |
| 177 } | 175 } |
| 178 | 176 |
| 179 } | 177 } |
| OLD | NEW |