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