void nsSVGLength2::SetAnimValue(float aValue, nsSVGElement *aSVGElement) { SetAnimValueInSpecifiedUnits(aValue * GetUnitScaleFactor(aSVGElement, mSpecifiedUnitType), aSVGElement); }
float nsSVGLength2::GetUnitScaleFactor(nsIFrame *aFrame, PRUint8 aUnitType) const { nsIContent* content = aFrame->GetContent(); if (content->IsSVG()) return GetUnitScaleFactor(static_cast<nsSVGElement*>(content), aUnitType); switch (aUnitType) { case nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER: case nsIDOMSVGLength::SVG_LENGTHTYPE_PX: return 1; case nsIDOMSVGLength::SVG_LENGTHTYPE_MM: return GetMMPerPixel(); case nsIDOMSVGLength::SVG_LENGTHTYPE_CM: return GetMMPerPixel() / 10.0f; case nsIDOMSVGLength::SVG_LENGTHTYPE_IN: return GetMMPerPixel() / MM_PER_INCH_FLOAT; case nsIDOMSVGLength::SVG_LENGTHTYPE_PT: return GetMMPerPixel() * POINTS_PER_INCH_FLOAT / MM_PER_INCH_FLOAT; case nsIDOMSVGLength::SVG_LENGTHTYPE_PC: return GetMMPerPixel() * POINTS_PER_INCH_FLOAT / MM_PER_INCH_FLOAT / 12.0f; case nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE: return 100.0f / GetAxisLength(aFrame); case nsIDOMSVGLength::SVG_LENGTHTYPE_EMS: return 1 / GetEmLength(aFrame); case nsIDOMSVGLength::SVG_LENGTHTYPE_EXS: return 1 / GetExLength(aFrame); default: NS_NOTREACHED("Unknown unit type"); return 0; } }
void nsSVGLength2::SetAnimValue(float aValue, nsSVGElement *aSVGElement) { mAnimVal = aValue * GetUnitScaleFactor(aSVGElement, mSpecifiedUnitType); mIsAnimated = PR_TRUE; aSVGElement->DidAnimateLength(mAttrEnum); }
void nsSVGLength2::ConvertToSpecifiedUnits(PRUint16 unitType, nsSVGElement *aSVGElement) { if (!IsValidUnitType(unitType)) return; float valueInUserUnits = mBaseVal / GetUnitScaleFactor(aSVGElement); mSpecifiedUnitType = PRUint8(unitType); SetBaseValue(valueInUserUnits, aSVGElement); }
void nsSVGLength2::SetBaseValue(float aValue, nsSVGElement *aSVGElement) { mAnimVal = mBaseVal = aValue * GetUnitScaleFactor(aSVGElement, mSpecifiedUnitType); aSVGElement->DidChangeLength(mAttrEnum, PR_TRUE); #ifdef MOZ_SMIL if (mIsAnimated) { aSVGElement->AnimationNeedsResample(); } #endif }
nsresult nsSVGLength2::ConvertToSpecifiedUnits(PRUint16 unitType, nsSVGElement *aSVGElement) { if (!IsValidUnitType(unitType)) return NS_ERROR_DOM_NOT_SUPPORTED_ERR; float valueInUserUnits = mBaseVal / GetUnitScaleFactor(aSVGElement, mSpecifiedUnitType); mSpecifiedUnitType = PRUint8(unitType); SetBaseValue(valueInUserUnits, aSVGElement); return NS_OK; }
float nsSVGLength2::GetUnitScaleFactor(nsSVGElement *aSVGElement) const { switch (mSpecifiedUnitType) { case nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER: case nsIDOMSVGLength::SVG_LENGTHTYPE_PX: return 1; case nsIDOMSVGLength::SVG_LENGTHTYPE_EMS: return 1 / GetEmLength(aSVGElement); case nsIDOMSVGLength::SVG_LENGTHTYPE_EXS: return 1 / GetExLength(aSVGElement); } return GetUnitScaleFactor(aSVGElement->GetCtx()); }
void nsSVGLength2::SetBaseValue(float aValue, nsSVGElement *aSVGElement) { mAnimVal = mBaseVal = aValue * GetUnitScaleFactor(aSVGElement); aSVGElement->DidChangeLength(mAttrEnum, PR_TRUE); }