static void SampleValue(float aPortion, Animation& aAnimation, StyleAnimationValue& aStart, StyleAnimationValue& aEnd, Animatable* aValue) { StyleAnimationValue interpolatedValue; NS_ASSERTION(aStart.GetUnit() == aEnd.GetUnit() || aStart.GetUnit() == StyleAnimationValue::eUnit_None || aEnd.GetUnit() == StyleAnimationValue::eUnit_None, "Must have same unit"); StyleAnimationValue::Interpolate(aAnimation.property(), aStart, aEnd, aPortion, interpolatedValue); if (aAnimation.property() == eCSSProperty_opacity) { *aValue = interpolatedValue.GetFloatValue(); return; } nsCSSValueSharedList* interpolatedList = interpolatedValue.GetCSSValueSharedListValue(); TransformData& data = aAnimation.data().get_TransformData(); nsPoint origin = data.origin(); // we expect all our transform data to arrive in css pixels, so here we must // adjust to dev pixels. double cssPerDev = double(nsDeviceContext::AppUnitsPerCSSPixel()) / double(data.appUnitsPerDevPixel()); gfxPoint3D transformOrigin = data.transformOrigin(); transformOrigin.x = transformOrigin.x * cssPerDev; transformOrigin.y = transformOrigin.y * cssPerDev; gfxPoint3D perspectiveOrigin = data.perspectiveOrigin(); perspectiveOrigin.x = perspectiveOrigin.x * cssPerDev; perspectiveOrigin.y = perspectiveOrigin.y * cssPerDev; nsDisplayTransform::FrameTransformProperties props(interpolatedList, transformOrigin, perspectiveOrigin, data.perspective()); gfx3DMatrix transform = nsDisplayTransform::GetResultingTransformMatrix(props, origin, data.appUnitsPerDevPixel(), &data.bounds()); gfxPoint3D scaledOrigin = gfxPoint3D(NS_round(NSAppUnitsToFloatPixels(origin.x, data.appUnitsPerDevPixel())), NS_round(NSAppUnitsToFloatPixels(origin.y, data.appUnitsPerDevPixel())), 0.0f); transform.Translate(scaledOrigin); InfallibleTArray<TransformFunction> functions; functions.AppendElement(TransformMatrix(ToMatrix4x4(transform))); *aValue = functions; }
// Helper function to parse a string into a StyleAnimationValue static bool ValueFromStringHelper(nsCSSPropertyID aPropID, Element* aTargetElement, nsPresContext* aPresContext, mozilla::GeckoStyleContext* aStyleContext, const nsAString& aString, StyleAnimationValue& aStyleAnimValue, bool* aIsContextSensitive) { bool isNegative = false; const nsDependentSubstring subString = GetNonNegativePropValue(aString, aPropID, isNegative); if (!StyleAnimationValue::ComputeValue(aPropID, aTargetElement, aStyleContext, subString, true, aStyleAnimValue, aIsContextSensitive)) { return false; } if (isNegative) { InvertSign(aStyleAnimValue); } if (aPropID == eCSSProperty_font_size) { // Divide out text-zoom, since SVG is supposed to ignore it MOZ_ASSERT(aStyleAnimValue.GetUnit() == StyleAnimationValue::eUnit_Coord, "'font-size' value with unexpected style unit"); aStyleAnimValue.SetCoordValue(aStyleAnimValue.GetCoordValue() / aPresContext->EffectiveTextZoom()); } return true; }
// Helper function to parse a string into a StyleAnimationValue static bool ValueFromStringHelper(nsCSSPropertyID aPropID, Element* aTargetElement, nsPresContext* aPresContext, const nsAString& aString, StyleAnimationValue& aStyleAnimValue, bool* aIsContextSensitive) { // If value is negative, we'll strip off the "-" so the CSS parser won't // barf, and then manually make the parsed value negative. // (This is a partial solution to let us accept some otherwise out-of-bounds // CSS values. Bug 501188 will provide a more complete fix.) bool isNegative = false; uint32_t subStringBegin = 0; // NOTE: We need to opt-out 'stroke-dasharray' from the negative-number // check. Its values might look negative (e.g. by starting with "-1"), but // they're more complicated than our simple negation logic here can handle. if (aPropID != eCSSProperty_stroke_dasharray) { int32_t absValuePos = nsSMILParserUtils::CheckForNegativeNumber(aString); if (absValuePos > 0) { isNegative = true; subStringBegin = (uint32_t)absValuePos; // Start parsing after '-' sign } } RefPtr<nsStyleContext> styleContext = nsComputedDOMStyle::GetStyleContextForElement(aTargetElement, nullptr, aPresContext->PresShell()); if (!styleContext) { return false; } nsDependentSubstring subString(aString, subStringBegin); if (!StyleAnimationValue::ComputeValue(aPropID, aTargetElement, styleContext, subString, true, aStyleAnimValue, aIsContextSensitive)) { return false; } if (isNegative) { InvertSign(aStyleAnimValue); } if (aPropID == eCSSProperty_font_size) { // Divide out text-zoom, since SVG is supposed to ignore it MOZ_ASSERT(aStyleAnimValue.GetUnit() == StyleAnimationValue::eUnit_Coord, "'font-size' value with unexpected style unit"); aStyleAnimValue.SetCoordValue(aStyleAnimValue.GetCoordValue() / aPresContext->TextZoom()); } return true; }
/* static */ bool CommonAnimationManager::ExtractComputedValueForTransition( nsCSSProperty aProperty, nsStyleContext* aStyleContext, StyleAnimationValue& aComputedValue) { bool result = StyleAnimationValue::ExtractComputedValue(aProperty, aStyleContext, aComputedValue); if (aProperty == eCSSProperty_visibility) { MOZ_ASSERT(aComputedValue.GetUnit() == StyleAnimationValue::eUnit_Enumerated, "unexpected unit"); aComputedValue.SetIntValue(aComputedValue.GetIntValue(), StyleAnimationValue::eUnit_Visibility); } return result; }
static void InvertSign(StyleAnimationValue& aValue) { switch (aValue.GetUnit()) { case StyleAnimationValue::eUnit_Coord: aValue.SetCoordValue(-aValue.GetCoordValue()); break; case StyleAnimationValue::eUnit_Percent: aValue.SetPercentValue(-aValue.GetPercentValue()); break; case StyleAnimationValue::eUnit_Float: aValue.SetFloatValue(-aValue.GetFloatValue()); break; default: NS_NOTREACHED("Calling InvertSign with an unsupported unit"); break; } }