PassOwnPtr<InterpolableValue> FilterInterpolationFunctions::createNoneValue(const NonInterpolableValue& untypedNonInterpolableValue) { switch (toFilterNonInterpolableValue(untypedNonInterpolableValue).type()) { case FilterOperation::GRAYSCALE: case FilterOperation::INVERT: case FilterOperation::SEPIA: case FilterOperation::HUE_ROTATE: return InterpolableNumber::create(0); case FilterOperation::BRIGHTNESS: case FilterOperation::CONTRAST: case FilterOperation::OPACITY: case FilterOperation::SATURATE: return InterpolableNumber::create(1); case FilterOperation::BLUR: return CSSLengthInterpolationType::createNeutralInterpolableValue(); case FilterOperation::DROP_SHADOW: return ShadowInterpolationFunctions::createNeutralInterpolableValue(); default: ASSERT_NOT_REACHED(); return nullptr; } }
FilterOperation* FilterInterpolationFunctions::createFilter( const InterpolableValue& interpolableValue, const NonInterpolableValue& untypedNonInterpolableValue, const StyleResolverState& state) { const FilterNonInterpolableValue& nonInterpolableValue = toFilterNonInterpolableValue(untypedNonInterpolableValue); FilterOperation::OperationType type = nonInterpolableValue.type(); switch (type) { case FilterOperation::GRAYSCALE: case FilterOperation::HUE_ROTATE: case FilterOperation::SATURATE: case FilterOperation::SEPIA: { double value = clampParameter(toInterpolableNumber(interpolableValue).value(), type); return BasicColorMatrixFilterOperation::create(value, type); } case FilterOperation::BRIGHTNESS: case FilterOperation::CONTRAST: case FilterOperation::INVERT: case FilterOperation::OPACITY: { double value = clampParameter(toInterpolableNumber(interpolableValue).value(), type); return BasicComponentTransferFilterOperation::create(value, type); } case FilterOperation::BLUR: { Length stdDeviation = LengthInterpolationFunctions::createLength( interpolableValue, nonInterpolableValue.typeNonInterpolableValue(), state.cssToLengthConversionData(), ValueRangeNonNegative); return BlurFilterOperation::create(stdDeviation); } case FilterOperation::DROP_SHADOW: { ShadowData shadowData = ShadowInterpolationFunctions::createShadowData( interpolableValue, nonInterpolableValue.typeNonInterpolableValue(), state); Color color = shadowData.color().isCurrentColor() ? Color::black : shadowData.color().getColor(); return DropShadowFilterOperation::create( IntPoint(shadowData.x(), shadowData.y()), shadowData.blur(), color); } default: NOTREACHED(); return nullptr; } }
bool FilterInterpolationFunctions::filtersAreCompatible(const NonInterpolableValue& a, const NonInterpolableValue& b) { return toFilterNonInterpolableValue(a).type() == toFilterNonInterpolableValue(b).type(); }