// Helper function to parse a string into a nsStyleAnimation::Value static bool ValueFromStringHelper(nsCSSProperty aPropID, Element* aTargetElement, nsPresContext* aPresContext, const nsAString& aString, nsStyleAnimation::Value& 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; PRUint32 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) { PRInt32 absValuePos = nsSMILParserUtils::CheckForNegativeNumber(aString); if (absValuePos > 0) { isNegative = true; subStringBegin = (PRUint32)absValuePos; // Start parsing after '-' sign } } nsDependentSubstring subString(aString, subStringBegin); if (!nsStyleAnimation::ComputeValue(aPropID, aTargetElement, 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 NS_ABORT_IF_FALSE(aStyleAnimValue.GetUnit() == nsStyleAnimation::eUnit_Coord, "'font-size' value with unexpected style unit"); aStyleAnimValue.SetCoordValue(aStyleAnimValue.GetCoordValue() / aPresContext->TextZoom()); } return true; }
static void InvertSign(nsStyleAnimation::Value& aValue) { switch (aValue.GetUnit()) { case nsStyleAnimation::eUnit_Coord: aValue.SetCoordValue(-aValue.GetCoordValue()); break; case nsStyleAnimation::eUnit_Percent: aValue.SetPercentValue(-aValue.GetPercentValue()); break; case nsStyleAnimation::eUnit_Float: aValue.SetFloatValue(-aValue.GetFloatValue()); break; default: NS_NOTREACHED("Calling InvertSign with an unsupported unit"); break; } }
// Helper function to parse a string into a nsStyleAnimation::Value static PRBool ValueFromStringHelper(nsCSSProperty aPropID, nsIContent* aTargetElement, nsPresContext* aPresContext, const nsAString& aString, nsStyleAnimation::Value& aStyleAnimValue) { // 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.) PRBool isNegative = PR_FALSE; PRUint32 subStringBegin = 0; PRInt32 absValuePos = nsSMILParserUtils::CheckForNegativeNumber(aString); if (absValuePos > 0) { isNegative = PR_TRUE; subStringBegin = (PRUint32)absValuePos; // Start parsing after '-' sign } nsDependentSubstring subString(aString, subStringBegin); if (!nsStyleAnimation::ComputeValue(aPropID, aTargetElement, subString, PR_TRUE, aStyleAnimValue)) { return PR_FALSE; } if (isNegative) { InvertSign(aStyleAnimValue); } if (aPropID == eCSSProperty_font_size) { // Divide out text-zoom, since SVG is supposed to ignore it NS_ABORT_IF_FALSE(aStyleAnimValue.GetUnit() == nsStyleAnimation::eUnit_Coord, "'font-size' value with unexpected style unit"); aStyleAnimValue.SetCoordValue(aStyleAnimValue.GetCoordValue() / aPresContext->TextZoom()); } return PR_TRUE; }