339220 (325728) - a=darin - changes to markerWidth/markerHeight and orient not handled properly

git-svn-id: svn://10.0.0.236/branches/MOZILLA_1_8_BRANCH@200943 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
mkaply%us.ibm.com
2006-06-26 21:26:53 +00:00
parent 4241c987a7
commit b303c2fe06
3 changed files with 66 additions and 73 deletions

View File

@@ -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();

View File

@@ -96,8 +96,7 @@ protected:
nsCOMPtr<nsIDOMSVGAnimatedEnumeration> mMarkerUnits;
nsCOMPtr<nsIDOMSVGAnimatedLength> mMarkerWidth;
nsCOMPtr<nsIDOMSVGAnimatedLength> mMarkerHeight;
nsCOMPtr<nsIDOMSVGAnimatedEnumeration> mOrientType;
nsCOMPtr<nsIDOMSVGAnimatedAngle> mOrientAngle;
nsCOMPtr<nsIDOMSVGAnimatedAngle> mOrient;
nsCOMPtr<nsIDOMSVGAnimatedRect> mViewBox;
nsCOMPtr<nsIDOMSVGAnimatedPreserveAspectRatio> 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<nsISVGEnum> 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<nsIDOMSVGAngle> 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<nsISVGEnum> orient;
rv = NS_NewSVGEnum(getter_AddRefs(orient), SVG_MARKER_ORIENT_ANGLE, gOrientType);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIDOMSVGAnimatedEnumeration> 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<nsIDOMSVGAngle> a;
mOrientAngle->GetAnimVal(getter_AddRefs(a));
a->GetValue(&aAngle);
}
nsCOMPtr<nsIDOMSVGAngle> a;
mOrient->GetAnimVal(getter_AddRefs(a));
nsAutoString value;
a->GetValueAsString(value);
if (!value.EqualsLiteral("auto"))
a->GetValue(&aAngle);
nsCOMPtr<nsIDOMSVGMatrix> 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<nsISVGValue> target = do_QueryInterface(mOrientAngle);
target->SetValueString(value);
nsCOMPtr<nsIDOMSVGAnimatedLength> l = do_QueryInterface(observable);
nsCOMPtr<nsIDOMSVGAnimatedRect> 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;

View File

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