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; }
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; } }