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:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user