diff --git a/mozilla/content/svg/content/src/nsSVGAngle.cpp b/mozilla/content/svg/content/src/nsSVGAngle.cpp index bc238119c43..93a19c627b5 100644 --- a/mozilla/content/svg/content/src/nsSVGAngle.cpp +++ b/mozilla/content/svg/content/src/nsSVGAngle.cpp @@ -98,7 +98,8 @@ protected: PRBool IsValidUnitType(PRUint16 unit); float mValueInSpecifiedUnits; - PRUint16 mSpecifiedUnitType; + PRUint8 mSpecifiedUnitType : 3; + PRPackedBool mIsAuto : 1; }; @@ -137,8 +138,10 @@ NS_NewSVGAngle(nsIDOMSVGAngle** result, nsSVGAngle::nsSVGAngle(float value, PRUint16 unit) : mValueInSpecifiedUnits(value), - mSpecifiedUnitType(unit) + mIsAuto(PR_FALSE) { + NS_ASSERTION(unit == SVG_ANGLETYPE_UNKNOWN || IsValidUnitType(unit), "unknown unit"); + mSpecifiedUnitType = unit; } nsSVGAngle::nsSVGAngle() @@ -268,6 +271,7 @@ NS_IMETHODIMP nsSVGAngle::SetValueInSpecifiedUnits(float aValueInSpecifiedUnits) { WillModify(); + mIsAuto = PR_FALSE; mValueInSpecifiedUnits = aValueInSpecifiedUnits; DidModify(); return NS_OK; @@ -277,6 +281,10 @@ nsSVGAngle::SetValueInSpecifiedUnits(float aValueInSpecifiedUnits) NS_IMETHODIMP nsSVGAngle::GetValueAsString(nsAString & aValueAsString) { + if (mIsAuto) { + aValueAsString.AssignLiteral("auto"); + return NS_OK; + } aValueAsString.Truncate(); PRUnichar buf[24]; @@ -295,6 +303,12 @@ nsSVGAngle::GetValueAsString(nsAString & aValueAsString) NS_IMETHODIMP nsSVGAngle::SetValueAsString(const nsAString & aValueAsString) { + if (aValueAsString.EqualsLiteral("auto")) { + WillModify(); + mIsAuto = PR_TRUE; + DidModify(); + return NS_OK; + } nsresult rv = NS_OK; char *str = ToNewCString(aValueAsString); @@ -331,6 +345,7 @@ nsSVGAngle::NewValueSpecifiedUnits(PRUint16 unitType, float valueInSpecifiedUnit if (!IsValidUnitType(unitType)) return NS_ERROR_FAILURE; WillModify(); + mIsAuto = PR_FALSE; mValueInSpecifiedUnits = valueInSpecifiedUnits; mSpecifiedUnitType = unitType; DidModify(); diff --git a/mozilla/content/svg/content/src/nsSVGMarkerElement.cpp b/mozilla/content/svg/content/src/nsSVGMarkerElement.cpp index dd582053f85..427a8468c33 100644 --- a/mozilla/content/svg/content/src/nsSVGMarkerElement.cpp +++ b/mozilla/content/svg/content/src/nsSVGMarkerElement.cpp @@ -96,8 +96,7 @@ protected: nsCOMPtr mMarkerUnits; nsCOMPtr mMarkerWidth; nsCOMPtr mMarkerHeight; - nsCOMPtr mOrientType; - nsCOMPtr mOrientAngle; + nsCOMPtr mOrient; nsCOMPtr mViewBox; nsCOMPtr mPreserveAspectRatio; @@ -132,15 +131,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGMarkerElementBase) nsSVGMarkerElement::~nsSVGMarkerElement() { - if (mPreserveAspectRatio) { - NS_REMOVE_SVGVALUE_OBSERVER(mPreserveAspectRatio); - } - if (mViewBox) { - NS_REMOVE_SVGVALUE_OBSERVER(mViewBox); - } - if (mOrientType) { - NS_REMOVE_SVGVALUE_OBSERVER(mOrientType); - } } nsresult @@ -156,11 +146,6 @@ nsSVGMarkerElement::Init() {nsnull, 0} }; - static struct nsSVGEnumMapping gOrientType[] = { - {&nsSVGAtoms::_auto, SVG_MARKER_ORIENT_AUTO}, - {nsnull, 0} - }; - // Create mapped properties: // DOM property: refX @@ -218,26 +203,15 @@ nsSVGMarkerElement::Init() NS_ENSURE_SUCCESS(rv,rv); } - // DOM property: orient (enum) - { - nsCOMPtr orient; - rv = NS_NewSVGEnum(getter_AddRefs(orient), SVG_MARKER_ORIENT_ANGLE, gOrientType); - NS_ENSURE_SUCCESS(rv,rv); - rv = NS_NewSVGAnimatedEnumeration(getter_AddRefs(mOrientType), orient); - NS_ENSURE_SUCCESS(rv,rv); - rv = AddMappedSVGValue(nsSVGAtoms::orient, mOrientType); - NS_ENSURE_SUCCESS(rv,rv); - } - - // DOM property: orient (angle) + // DOM property: orient { nsCOMPtr angle; rv = NS_NewSVGAngle(getter_AddRefs(angle), 0.0f); NS_ENSURE_SUCCESS(rv,rv); - rv = NS_NewSVGAnimatedAngle(getter_AddRefs(mOrientAngle), angle); + rv = NS_NewSVGAnimatedAngle(getter_AddRefs(mOrient), angle); + NS_ENSURE_SUCCESS(rv,rv); + rv = AddMappedSVGValue(nsSVGAtoms::orient, mOrient); NS_ENSURE_SUCCESS(rv,rv); - // Can't map two values to the same attribute, so we take care - // of keeping mOrientAngle updated in DidModifySVGObservable } // DOM property: viewBox @@ -270,11 +244,6 @@ nsSVGMarkerElement::Init() NS_ENSURE_SUCCESS(rv,rv); } - // add observers -------------------------- : - NS_ADD_SVGVALUE_OBSERVER(mViewBox); - NS_ADD_SVGVALUE_OBSERVER(mPreserveAspectRatio); - NS_ADD_SVGVALUE_OBSERVER(mOrientType); - return NS_OK; } @@ -349,7 +318,30 @@ NS_IMETHODIMP nsSVGMarkerElement::GetMarkerHeight(nsIDOMSVGAnimatedLength * *aMa /* readonly attribute nsIDOMSVGAnimatedEnumeration orientType; */ NS_IMETHODIMP nsSVGMarkerElement::GetOrientType(nsIDOMSVGAnimatedEnumeration * *aOrientType) { - *aOrientType = mOrientType; + static struct nsSVGEnumMapping gOrientType[] = { + {&nsSVGAtoms::_auto, SVG_MARKER_ORIENT_AUTO}, + {nsnull, 0} + }; + + nsresult rv; + nsCOMPtr orient; + rv = NS_NewSVGEnum(getter_AddRefs(orient), SVG_MARKER_ORIENT_ANGLE, gOrientType); + NS_ENSURE_SUCCESS(rv,rv); + nsCOMPtr orientType; + rv = NS_NewSVGAnimatedEnumeration(getter_AddRefs(orientType), orient); + NS_ENSURE_SUCCESS(rv,rv); + + nsIDOMSVGAngle *a; + mOrient->GetBaseVal(&a); + nsAutoString value; + a->GetValueAsString(value); + if (value.EqualsLiteral("auto")) { + orientType->SetBaseVal(SVG_MARKER_ORIENT_AUTO); + } else { + orientType->SetBaseVal(SVG_MARKER_ORIENT_ANGLE); + } + + *aOrientType = orientType; NS_IF_ADDREF(*aOrientType); return NS_OK; } @@ -357,7 +349,7 @@ NS_IMETHODIMP nsSVGMarkerElement::GetOrientType(nsIDOMSVGAnimatedEnumeration * * /* readonly attribute nsIDOMSVGAnimatedLength orientAngle; */ NS_IMETHODIMP nsSVGMarkerElement::GetOrientAngle(nsIDOMSVGAnimatedAngle * *aOrientAngle) { - *aOrientAngle = mOrientAngle; + *aOrientAngle = mOrient; NS_IF_ADDREF(*aOrientAngle); return NS_OK; } @@ -365,7 +357,9 @@ NS_IMETHODIMP nsSVGMarkerElement::GetOrientAngle(nsIDOMSVGAnimatedAngle * *aOrie /* void setOrientToAuto (); */ NS_IMETHODIMP nsSVGMarkerElement::SetOrientToAuto() { - mOrientType->SetBaseVal(SVG_MARKER_ORIENT_AUTO); + nsIDOMSVGAngle *a; + mOrient->GetBaseVal(&a); + a->SetValueAsString(NS_LITERAL_STRING("auto")); return NS_OK; } @@ -375,10 +369,8 @@ NS_IMETHODIMP nsSVGMarkerElement::SetOrientToAngle(nsIDOMSVGAngle *angle) if (!angle) return NS_ERROR_DOM_SVG_WRONG_TYPE_ERR; - mOrientType->SetBaseVal(SVG_MARKER_ORIENT_ANGLE); - nsIDOMSVGAngle *a; - mOrientAngle->GetBaseVal(&a); + mOrient->GetBaseVal(&a); float f; angle->GetValue(&f); a->SetValue(f); @@ -396,12 +388,12 @@ nsSVGMarkerElement::GetMarkerTransform(float aStrokeWidth, if (val == SVG_MARKERUNITS_STROKEWIDTH) scale = aStrokeWidth; - mOrientType->GetAnimVal(&val); - if (val == SVG_MARKER_ORIENT_ANGLE) { - nsCOMPtr a; - mOrientAngle->GetAnimVal(getter_AddRefs(a)); - a->GetValue(&aAngle); - } + nsCOMPtr a; + mOrient->GetAnimVal(getter_AddRefs(a)); + nsAutoString value; + a->GetValueAsString(value); + if (!value.EqualsLiteral("auto")) + a->GetValue(&aAngle); nsCOMPtr matrix; NS_NewSVGMatrix(getter_AddRefs(matrix), @@ -535,29 +527,23 @@ NS_IMETHODIMP nsSVGMarkerElement::WillModifySVGObservable(nsISVGValue* observable, nsISVGValue::modificationType aModType) { -#ifdef DEBUG - printf("markerelement - viewport/viewbox/preserveAspectRatio will be changed\n"); -#endif return NS_OK; } NS_IMETHODIMP -nsSVGMarkerElement::DidModifySVGObservable (nsISVGValue* observable, - nsISVGValue::modificationType aModType) +nsSVGMarkerElement::DidModifySVGObservable(nsISVGValue* observable, + nsISVGValue::modificationType aModType) { -#ifdef DEBUG - printf("markerelement - viewport/viewbox/preserveAspectRatio have been changed\n"); -#endif - mViewBoxToViewportTransform = nsnull; - // need to sync mOrientAngle - nsAutoString value; - nsresult rv = GetAttribute(NS_LITERAL_STRING("orient"), value); - if (NS_SUCCEEDED(rv)) { - nsCOMPtr target = do_QueryInterface(mOrientAngle); - target->SetValueString(value); + nsCOMPtr l = do_QueryInterface(observable); + nsCOMPtr r = do_QueryInterface(observable); + if ((l && (l == mMarkerWidth || l == mMarkerHeight)) || (r && (r == mViewBox))) { + // sync coordinate context with viewbox: + nsIDOMSVGRect *viewbox; + mViewBox->GetBaseVal(&viewbox); + SetCoordCtxRect(viewbox); } return NS_OK; diff --git a/mozilla/content/svg/content/src/nsSVGSVGElement.cpp b/mozilla/content/svg/content/src/nsSVGSVGElement.cpp index 1a4b5569258..74b7bf68db9 100644 --- a/mozilla/content/svg/content/src/nsSVGSVGElement.cpp +++ b/mozilla/content/svg/content/src/nsSVGSVGElement.cpp @@ -1452,10 +1452,6 @@ NS_IMETHODIMP nsSVGSVGElement::WillModifySVGObservable(nsISVGValue* observable, nsISVGValue::modificationType aModType) { -#ifdef DEBUG - printf("viewport/viewbox/preserveAspectRatio will be changed\n"); -#endif - if (mDispatchEvent) { // Modification isn't due to calling SetCurrent[Scale]Translate, so if // currentScale or currentTranslate is about to change we must record their @@ -1537,10 +1533,6 @@ nsSVGSVGElement::DidModifySVGObservable (nsISVGValue* observable, #endif } - -#ifdef DEBUG - printf("viewport/viewbox/preserveAspectRatio have been changed\n"); -#endif return NS_OK; }