Bug 602759 part 10 - Update SVG elements to use new SVG transform types; r=longsonr, r=jwatt

This commit is contained in:
Brian Birtles 2011-09-25 22:04:31 +01:00
parent 2800e76c9c
commit 23a09913b7
12 changed files with 151 additions and 224 deletions

View File

@ -79,24 +79,15 @@
#include "SVGAnimatedLengthList.h"
#include "SVGAnimatedPointList.h"
#include "SVGAnimatedPathSegList.h"
#include "SVGAnimatedTransformList.h"
#include "nsIDOMSVGUnitTypes.h"
#include "nsIDOMSVGPointList.h"
#include "nsIDOMSVGAnimatedPoints.h"
#include "nsIDOMSVGTransformList.h"
#include "nsIDOMSVGAnimTransformList.h"
#include "nsIDOMSVGAnimatedRect.h"
#include "nsIDOMSVGGradientElement.h"
#include "nsIDOMSVGPatternElement.h"
#include "nsSVGRect.h"
#include "nsIFrame.h"
#include "prdtoa.h"
#include <stdarg.h>
#ifdef MOZ_SMIL
#include "nsSMILMappedAttribute.h"
#include "nsSVGTransformSMILAttr.h"
#include "nsSVGAnimatedTransformList.h"
#include "SVGMotionSMILAttr.h"
#include "nsIDOMSVGTransformable.h"
#endif // MOZ_SMIL
using namespace mozilla;
@ -352,7 +343,6 @@ nsSVGElement::ParseAttribute(PRInt32 aNamespaceID,
NS_ENSURE_SUCCESS(rv, PR_FALSE);
svg_value->RemoveObserver(this);
ResetOldStyleBaseType(svg_value);
proxy->SetValueString(aValue);
proxy->AddObserver(this);
aResult.SetTo(proxy);
@ -574,6 +564,16 @@ nsSVGElement::ParseAttribute(PRInt32 aNamespaceID,
}
foundMatch = PR_TRUE;
}
// Check for SVGAnimatedTransformList attribute
} else if (GetTransformListAttrName() == aAttribute) {
SVGAnimatedTransformList *transformList = GetAnimatedTransformList();
if (transformList) {
rv = transformList->SetBaseValueString(aValue);
if (NS_FAILED(rv)) {
transformList->ClearBaseValue();
}
foundMatch = PR_TRUE;
}
// Check for class attribute
} else if (aAttribute == nsGkAtoms::_class) {
nsSVGClass *svgClass = GetClass();
@ -783,6 +783,17 @@ nsSVGElement::UnsetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
return rv;
}
}
// Check if this is a transform list attribute going away
if (GetTransformListAttrName() == aName) {
SVGAnimatedTransformList *transformList = GetAnimatedTransformList();
if (transformList) {
transformList->ClearBaseValue();
DidChangeTransformList(PR_FALSE);
return rv;
}
}
// Check if this is a class attribute going away
if (aName == nsGkAtoms::_class) {
nsSVGClass *svgClass = GetClass();
@ -806,29 +817,9 @@ nsSVGElement::UnsetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
}
}
// Now check for one of the old style basetypes going away
nsCOMPtr<nsISVGValue> svg_value = GetMappedAttribute(aNamespaceID, aName);
if (svg_value) {
mSuppressNotification = PR_TRUE;
ResetOldStyleBaseType(svg_value);
mSuppressNotification = PR_FALSE;
}
return rv;
}
void
nsSVGElement::ResetOldStyleBaseType(nsISVGValue *svg_value)
{
nsCOMPtr<nsIDOMSVGAnimatedTransformList> tl = do_QueryInterface(svg_value);
if (tl) {
nsCOMPtr<nsIDOMSVGTransformList> transform;
tl->GetBaseVal(getter_AddRefs(transform));
transform->Clear();
}
}
nsChangeHint
nsSVGElement::GetAttributeChangeHint(const nsIAtom* aAttribute,
PRInt32 aModType) const
@ -2221,13 +2212,34 @@ nsSVGElement::DidAnimatePreserveAspectRatio()
}
void
nsSVGElement::DidAnimateTransform()
nsSVGElement::DidChangeTransformList(PRBool aDoSetAttr)
{
if (!aDoSetAttr)
return;
SVGAnimatedTransformList* transformList = GetAnimatedTransformList();
NS_ABORT_IF_FALSE(transformList,
"DidChangeTransformList on element with no transform list");
nsAutoString serializedValue;
transformList->GetBaseValue().GetValueAsString(serializedValue);
nsAttrValue attrValue(serializedValue);
SetParsedAttr(kNameSpaceID_None, GetTransformListAttrName(), nsnull,
attrValue, PR_TRUE);
}
void
nsSVGElement::DidAnimateTransformList()
{
NS_ABORT_IF_FALSE(GetTransformListAttrName(),
"Animating non-existent transform data?");
nsIFrame* frame = GetPrimaryFrame();
if (frame) {
frame->AttributeChanged(kNameSpaceID_None,
nsGkAtoms::transform,
GetTransformListAttrName(),
nsIDOMMutationEvent::MODIFICATION);
}
}
@ -2341,36 +2353,9 @@ nsSVGElement::GetAnimatedAttr(PRInt32 aNamespaceID, nsIAtom* aName)
{
if (aNamespaceID == kNameSpaceID_None) {
// Transforms:
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transformList;
if (aName == nsGkAtoms::transform) {
nsCOMPtr<nsIDOMSVGTransformable> transformable(do_QueryObject(this));
if (!transformable)
return nsnull;
nsresult rv = transformable->GetTransform(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, nsnull);
}
if (aName == nsGkAtoms::gradientTransform) {
nsCOMPtr<nsIDOMSVGGradientElement> gradientElement(do_QueryObject(this));
if (!gradientElement)
return nsnull;
nsresult rv = gradientElement->GetGradientTransform(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, nsnull);
}
if (aName == nsGkAtoms::patternTransform) {
nsCOMPtr<nsIDOMSVGPatternElement> patternElement(do_QueryObject(this));
if (!patternElement)
return nsnull;
nsresult rv = patternElement->GetPatternTransform(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, nsnull);
}
if (transformList) {
nsSVGAnimatedTransformList* list
= static_cast<nsSVGAnimatedTransformList*>(transformList.get());
NS_ENSURE_TRUE(list, nsnull);
return new nsSVGTransformSMILAttr(list, this);
if (GetTransformListAttrName() == aName) {
SVGAnimatedTransformList* transformList = GetAnimatedTransformList();
return transformList ? transformList->ToSMILAttr(this) : nsnull;
}
// Motion (fake 'attribute' for animateMotion)

View File

@ -80,6 +80,7 @@ class SVGUserUnitList;
class SVGAnimatedPointList;
class SVGAnimatedPathSegList;
class SVGAnimatedPreserveAspectRatio;
class SVGAnimatedTransformList;
}
typedef nsStyledElementNotElementCSSInlineStyle nsSVGElementBase;
@ -100,6 +101,7 @@ public:
typedef mozilla::SVGAnimatedPointList SVGAnimatedPointList;
typedef mozilla::SVGAnimatedPathSegList SVGAnimatedPathSegList;
typedef mozilla::SVGAnimatedPreserveAspectRatio SVGAnimatedPreserveAspectRatio;
typedef mozilla::SVGAnimatedTransformList SVGAnimatedTransformList;
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
@ -188,6 +190,7 @@ public:
virtual void DidChangeLengthList(PRUint8 aAttrEnum, PRBool aDoSetAttr);
virtual void DidChangePointList(PRBool aDoSetAttr);
virtual void DidChangePathSegList(PRBool aDoSetAttr);
virtual void DidChangeTransformList(PRBool aDoSetAttr);
virtual void DidChangeString(PRUint8 aAttrEnum) {}
virtual void DidAnimateLength(PRUint8 aAttrEnum);
@ -204,7 +207,7 @@ public:
virtual void DidAnimateLengthList(PRUint8 aAttrEnum);
virtual void DidAnimatePointList();
virtual void DidAnimatePathSegList();
virtual void DidAnimateTransform();
virtual void DidAnimateTransformList();
virtual void DidAnimateString(PRUint8 aAttrEnum);
virtual void DidAnimateClass();
@ -225,6 +228,11 @@ public:
// NS_DECL_NSIDOMSVGANIMATEDPATHDATA.
return nsnull;
}
// Despite the fact that animated transform lists are used for a variety of
// attributes, no SVG element uses more than one.
virtual SVGAnimatedTransformList* GetAnimatedTransformList() {
return nsnull;
}
#ifdef MOZ_SMIL
virtual nsISMILAttr* GetAnimatedAttr(PRInt32 aNamespaceID, nsIAtom* aName);
@ -246,6 +254,9 @@ public:
virtual nsIAtom* GetPathDataAttrName() const {
return nsnull;
}
virtual nsIAtom* GetTransformListAttrName() const {
return nsnull;
}
protected:
virtual nsresult AfterSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
@ -524,8 +535,6 @@ protected:
static nsSVGEnumMapping sSVGUnitTypesMap[];
private:
void ResetOldStyleBaseType(nsISVGValue *svg_value);
struct ObservableModificationData {
// Only to be used if |name| is non-null. Otherwise, modType will
// be 0 to indicate NS_OK should be returned and 1 to indicate

View File

@ -38,7 +38,6 @@
#include "nsCOMPtr.h"
#include "nsSVGForeignObjectElement.h"
#include "nsSVGMatrix.h"
nsSVGElement::LengthInfo nsSVGForeignObjectElement::sLengthInfo[4] =
{

View File

@ -36,8 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsSVGTransformList.h"
#include "nsSVGAnimatedTransformList.h"
#include "DOMSVGAnimatedTransformList.h"
#include "nsIDOMSVGAnimatedEnum.h"
#include "nsIDOMSVGURIReference.h"
#include "nsIDOMSVGGradientElement.h"
@ -48,6 +47,8 @@
#include "nsSVGGradientElement.h"
#include "nsIFrame.h"
using namespace mozilla;
//--------------------- Gradients------------------------
nsSVGEnumMapping nsSVGGradientElement::sSpreadMethodMap[] = {
@ -93,27 +94,6 @@ nsSVGGradientElement::nsSVGGradientElement(already_AddRefed<nsINodeInfo> aNodeIn
{
}
nsresult
nsSVGGradientElement::CreateTransformList()
{
nsresult rv;
// DOM property: transform, #IMPLIED attrib: transform
nsCOMPtr<nsIDOMSVGTransformList> transformList;
rv = nsSVGTransformList::Create(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewSVGAnimatedTransformList(getter_AddRefs(mGradientTransform),
transformList);
NS_ENSURE_SUCCESS(rv, rv);
rv = AddMappedSVGValue(nsGkAtoms::gradientTransform, mGradientTransform);
if (NS_FAILED(rv)) {
mGradientTransform = nsnull;
return rv;
}
return NS_OK;
}
nsresult
nsSVGGradientElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
const nsAString* aValue, PRBool aNotify)
@ -121,7 +101,7 @@ nsSVGGradientElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
if (aNamespaceID == kNameSpaceID_None &&
aName == nsGkAtoms::gradientTransform &&
!mGradientTransform &&
NS_FAILED(CreateTransformList()))
!(mGradientTransform = new SVGAnimatedTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
return nsSVGGradientElementBase::BeforeSetAttr(aNamespaceID, aName,
@ -131,18 +111,6 @@ nsSVGGradientElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
//----------------------------------------------------------------------
// nsSVGElement methods
void
nsSVGGradientElement::DidAnimateTransform()
{
nsIFrame* frame = GetPrimaryFrame();
if (frame) {
frame->AttributeChanged(kNameSpaceID_None,
nsGkAtoms::gradientTransform,
nsIDOMMutationEvent::MODIFICATION);
}
}
nsSVGElement::EnumAttributesInfo
nsSVGGradientElement::GetEnumInfo()
{
@ -169,11 +137,9 @@ NS_IMETHODIMP nsSVGGradientElement::GetGradientUnits(nsIDOMSVGAnimatedEnumeratio
/* readonly attribute nsIDOMSVGAnimatedTransformList gradientTransform; */
NS_IMETHODIMP nsSVGGradientElement::GetGradientTransform(nsIDOMSVGAnimatedTransformList * *aGradientTransform)
{
if (!mGradientTransform && NS_FAILED(CreateTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
*aGradientTransform = mGradientTransform;
NS_IF_ADDREF(*aGradientTransform);
*aGradientTransform =
DOMSVGAnimatedTransformList::GetDOMWrapper(GetAnimatedTransformList(), this)
.get();
return NS_OK;
}
@ -280,6 +246,15 @@ NS_IMETHODIMP nsSVGLinearGradientElement::GetY2(nsIDOMSVGAnimatedLength * *aY2)
//----------------------------------------------------------------------
// nsSVGElement methods
SVGAnimatedTransformList*
nsSVGGradientElement::GetAnimatedTransformList()
{
if (!mGradientTransform) {
mGradientTransform = new SVGAnimatedTransformList();
}
return mGradientTransform;
}
nsSVGElement::LengthAttributesInfo
nsSVGLinearGradientElement::GetLengthInfo()
{

View File

@ -46,6 +46,7 @@
#include "nsSVGLength2.h"
#include "nsSVGEnum.h"
#include "nsSVGString.h"
#include "SVGAnimatedTransformList.h"
//--------------------- Gradients------------------------
@ -73,12 +74,15 @@ public:
// nsIContent
NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom* aAttribute) const;
virtual mozilla::SVGAnimatedTransformList* GetAnimatedTransformList();
virtual nsIAtom* GetTransformListAttrName() const {
return nsGkAtoms::gradientTransform;
}
protected:
virtual EnumAttributesInfo GetEnumInfo();
virtual StringAttributesInfo GetStringInfo();
virtual void DidAnimateTransform();
enum { GRADIENTUNITS, SPREADMETHOD };
nsSVGEnum mEnumAttributes[2];
static nsSVGEnumMapping sSpreadMethodMap[];
@ -92,10 +96,7 @@ protected:
const nsAString* aValue, PRBool aNotify);
// nsIDOMSVGGradientElement values
nsCOMPtr<nsIDOMSVGAnimatedTransformList> mGradientTransform;
// helper
nsresult CreateTransformList();
nsAutoPtr<mozilla::SVGAnimatedTransformList> mGradientTransform;
};
//---------------------Linear Gradients------------------------

View File

@ -39,10 +39,9 @@
#include "nsSVGGraphicElement.h"
#include "nsSVGSVGElement.h"
#include "nsSVGTransformList.h"
#include "nsSVGAnimatedTransformList.h"
#include "DOMSVGAnimatedTransformList.h"
#include "DOMSVGMatrix.h"
#include "nsGkAtoms.h"
#include "nsSVGMatrix.h"
#include "nsIDOMEventTarget.h"
#include "nsIFrame.h"
#include "nsISVGChildFrame.h"
@ -52,6 +51,8 @@
#include "nsSVGRect.h"
#include "nsContentUtils.h"
using namespace mozilla;
//----------------------------------------------------------------------
// nsISupports methods
@ -109,7 +110,8 @@ NS_IMETHODIMP nsSVGGraphicElement::GetBBox(nsIDOMSVGRect **_retval)
NS_IMETHODIMP nsSVGGraphicElement::GetCTM(nsIDOMSVGMatrix * *aCTM)
{
gfxMatrix m = nsSVGUtils::GetCTM(this, PR_FALSE);
*aCTM = m.IsSingular() ? nsnull : NS_NewSVGMatrix(m).get();
*aCTM = m.IsSingular() ? nsnull : new DOMSVGMatrix(m);
NS_IF_ADDREF(*aCTM);
return NS_OK;
}
@ -117,7 +119,8 @@ NS_IMETHODIMP nsSVGGraphicElement::GetCTM(nsIDOMSVGMatrix * *aCTM)
NS_IMETHODIMP nsSVGGraphicElement::GetScreenCTM(nsIDOMSVGMatrix * *aCTM)
{
gfxMatrix m = nsSVGUtils::GetCTM(this, PR_TRUE);
*aCTM = m.IsSingular() ? nsnull : NS_NewSVGMatrix(m).get();
*aCTM = m.IsSingular() ? nsnull : new DOMSVGMatrix(m);
NS_IF_ADDREF(*aCTM);
return NS_OK;
}
@ -149,13 +152,12 @@ NS_IMETHODIMP nsSVGGraphicElement::GetTransformToElement(nsIDOMSVGElement *eleme
// nsIDOMSVGTransformable methods
/* readonly attribute nsIDOMSVGAnimatedTransformList transform; */
NS_IMETHODIMP nsSVGGraphicElement::GetTransform(nsIDOMSVGAnimatedTransformList * *aTransform)
NS_IMETHODIMP nsSVGGraphicElement::GetTransform(
nsIDOMSVGAnimatedTransformList **aTransform)
{
if (!mTransforms && NS_FAILED(CreateTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
*aTransform = mTransforms;
NS_ADDREF(*aTransform);
*aTransform =
DOMSVGAnimatedTransformList::GetDOMWrapper(GetAnimatedTransformList(), this)
.get();
return NS_OK;
}
@ -197,17 +199,7 @@ nsSVGGraphicElement::PrependLocalTransformTo(const gfxMatrix &aMatrix) const
}
if (mTransforms) {
nsresult rv;
nsCOMPtr<nsIDOMSVGTransformList> transforms;
rv = mTransforms->GetAnimVal(getter_AddRefs(transforms));
NS_ENSURE_SUCCESS(rv, aMatrix);
PRUint32 count;
transforms->GetNumberOfItems(&count);
if (count > 0) {
nsCOMPtr<nsIDOMSVGMatrix> matrix =
nsSVGTransformList::GetConsolidationMatrix(transforms);
result.PreMultiply(nsSVGUtils::ConvertSVGMatrixToThebes(matrix));
}
result.PreMultiply(mTransforms->GetAnimValue().GetConsolidationMatrix());
}
return result;
@ -217,7 +209,16 @@ void
nsSVGGraphicElement::SetAnimateMotionTransform(const gfxMatrix* aMatrix)
{
mAnimateMotionTransform = aMatrix ? new gfxMatrix(*aMatrix) : nsnull;
DidAnimateTransform();
DidAnimateTransformList();
}
SVGAnimatedTransformList*
nsSVGGraphicElement::GetAnimatedTransformList()
{
if (!mTransforms) {
mTransforms = new SVGAnimatedTransformList();
}
return mTransforms;
}
nsresult
@ -227,30 +228,9 @@ nsSVGGraphicElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
if (aNamespaceID == kNameSpaceID_None &&
aName == nsGkAtoms::transform &&
!mTransforms &&
NS_FAILED(CreateTransformList()))
!(mTransforms = new SVGAnimatedTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
return nsSVGGraphicElementBase::BeforeSetAttr(aNamespaceID, aName,
aValue, aNotify);
}
nsresult
nsSVGGraphicElement::CreateTransformList()
{
nsresult rv;
// DOM property: transform, #IMPLIED attrib: transform
nsCOMPtr<nsIDOMSVGTransformList> transformList;
rv = nsSVGTransformList::Create(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewSVGAnimatedTransformList(getter_AddRefs(mTransforms),
transformList);
NS_ENSURE_SUCCESS(rv, rv);
rv = AddMappedSVGValue(nsGkAtoms::transform, mTransforms);
if (NS_FAILED(rv)) {
mTransforms = nsnull;
return rv;
}
return NS_OK;
}

View File

@ -42,7 +42,7 @@
#include "nsSVGStylableElement.h"
#include "nsIDOMSVGLocatable.h"
#include "nsIDOMSVGTransformable.h"
#include "nsIDOMSVGAnimTransformList.h"
#include "SVGAnimatedTransformList.h"
#include "gfxMatrix.h"
typedef nsSVGStylableElement nsSVGGraphicElementBase;
@ -65,6 +65,11 @@ public:
virtual gfxMatrix PrependLocalTransformTo(const gfxMatrix &aMatrix) const;
virtual void SetAnimateMotionTransform(const gfxMatrix* aMatrix);
virtual mozilla::SVGAnimatedTransformList* GetAnimatedTransformList();
virtual nsIAtom* GetTransformListAttrName() const {
return nsGkAtoms::transform;
}
protected:
// nsSVGElement overrides
virtual PRBool IsEventName(nsIAtom* aName);
@ -72,13 +77,10 @@ protected:
virtual nsresult BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
const nsAString* aValue, PRBool aNotify);
nsCOMPtr<nsIDOMSVGAnimatedTransformList> mTransforms;
nsAutoPtr<mozilla::SVGAnimatedTransformList> mTransforms;
// XXX maybe move this to property table, to save space on un-animated elems?
nsAutoPtr<gfxMatrix> mAnimateMotionTransform;
// helper
nsresult CreateTransformList();
};
#endif // __NS_SVGGRAPHICELEMENT_H__

View File

@ -38,7 +38,6 @@
#include "nsCOMPtr.h"
#include "nsISVGValueUtils.h"
#include "SVGAnimatedPreserveAspectRatio.h"
#include "nsSVGMatrix.h"
#include "nsDOMError.h"
#include "nsSVGUtils.h"
#include "nsSVGMarkerElement.h"
@ -398,10 +397,10 @@ nsSVGMarkerElement::GetViewBoxTransform()
gfxMatrix TM = viewBoxTM * gfxMatrix().Translate(gfxPoint(-ref.x, -ref.y));
mViewBoxToViewportTransform = NS_NewSVGMatrix(TM);
mViewBoxToViewportTransform = new gfxMatrix(TM);
}
return nsSVGUtils::ConvertSVGMatrixToThebes(mViewBoxToViewportTransform);
return *mViewBoxToViewportTransform;
}

View File

@ -45,6 +45,7 @@
#include "nsSVGAngle.h"
#include "nsSVGViewBox.h"
#include "SVGAnimatedPreserveAspectRatio.h"
#include "gfxMatrix.h"
class nsSVGOrientType
{
@ -177,7 +178,7 @@ protected:
nsSVGOrientType mOrientType;
nsSVGSVGElement *mCoordCtx;
nsCOMPtr<nsIDOMSVGMatrix> mViewBoxToViewportTransform;
nsAutoPtr<gfxMatrix> mViewBoxToViewportTransform;
};
#endif

View File

@ -36,8 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsSVGTransformList.h"
#include "nsSVGAnimatedTransformList.h"
#include "DOMSVGAnimatedTransformList.h"
#include "nsIDOMMutationEvent.h"
#include "nsCOMPtr.h"
#include "nsGkAtoms.h"
@ -99,27 +98,6 @@ nsSVGPatternElement::nsSVGPatternElement(already_AddRefed<nsINodeInfo> aNodeInfo
{
}
nsresult
nsSVGPatternElement::CreateTransformList()
{
nsresult rv;
// DOM property: transform, #IMPLIED attrib: transform
nsCOMPtr<nsIDOMSVGTransformList> transformList;
rv = nsSVGTransformList::Create(getter_AddRefs(transformList));
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewSVGAnimatedTransformList(getter_AddRefs(mPatternTransform),
transformList);
NS_ENSURE_SUCCESS(rv, rv);
rv = AddMappedSVGValue(nsGkAtoms::patternTransform, mPatternTransform);
if (NS_FAILED(rv)) {
mPatternTransform = nsnull;
return rv;
}
return NS_OK;
}
nsresult
nsSVGPatternElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
const nsAString* aValue, PRBool aNotify)
@ -127,7 +105,7 @@ nsSVGPatternElement::BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
if (aNamespaceID == kNameSpaceID_None &&
aName == nsGkAtoms::patternTransform &&
!mPatternTransform &&
NS_FAILED(CreateTransformList()))
!(mPatternTransform = new SVGAnimatedTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
return nsSVGPatternElementBase::BeforeSetAttr(aNamespaceID, aName,
@ -174,11 +152,9 @@ NS_IMETHODIMP nsSVGPatternElement::GetPatternContentUnits(nsIDOMSVGAnimatedEnume
/* readonly attribute nsIDOMSVGAnimatedTransformList patternTransform; */
NS_IMETHODIMP nsSVGPatternElement::GetPatternTransform(nsIDOMSVGAnimatedTransformList * *aPatternTransform)
{
if (!mPatternTransform && NS_FAILED(CreateTransformList()))
return NS_ERROR_OUT_OF_MEMORY;
*aPatternTransform = mPatternTransform;
NS_IF_ADDREF(*aPatternTransform);
*aPatternTransform =
DOMSVGAnimatedTransformList::GetDOMWrapper(GetAnimatedTransformList(), this)
.get();
return NS_OK;
}
@ -241,16 +217,13 @@ nsSVGPatternElement::IsAttributeMapped(const nsIAtom* name) const
//----------------------------------------------------------------------
// nsSVGElement methods
void
nsSVGPatternElement::DidAnimateTransform()
SVGAnimatedTransformList*
nsSVGPatternElement::GetAnimatedTransformList()
{
nsIFrame* frame = GetPrimaryFrame();
if (frame) {
frame->AttributeChanged(kNameSpaceID_None,
nsGkAtoms::patternTransform,
nsIDOMMutationEvent::MODIFICATION);
if (!mPatternTransform) {
mPatternTransform = new SVGAnimatedTransformList();
}
return mPatternTransform;
}
nsSVGElement::LengthAttributesInfo

View File

@ -49,6 +49,7 @@
#include "nsSVGString.h"
#include "nsSVGViewBox.h"
#include "SVGAnimatedPreserveAspectRatio.h"
#include "SVGAnimatedTransformList.h"
//--------------------- Patterns ------------------------
@ -92,6 +93,11 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual nsXPCClassInfo* GetClassInfo();
virtual mozilla::SVGAnimatedTransformList* GetAnimatedTransformList();
virtual nsIAtom* GetTransformListAttrName() const {
return nsGkAtoms::patternTransform;
}
protected:
virtual nsresult BeforeSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
@ -103,8 +109,6 @@ protected:
virtual SVGAnimatedPreserveAspectRatio *GetPreserveAspectRatio();
virtual StringAttributesInfo GetStringInfo();
virtual void DidAnimateTransform();
// nsIDOMSVGPatternElement values
enum { X, Y, WIDTH, HEIGHT };
nsSVGLength2 mLengthAttributes[4];
@ -114,7 +118,7 @@ protected:
nsSVGEnum mEnumAttributes[2];
static EnumInfo sEnumInfo[2];
nsCOMPtr<nsIDOMSVGAnimatedTransformList> mPatternTransform;
nsAutoPtr<mozilla::SVGAnimatedTransformList> mPatternTransform;
// nsIDOMSVGURIReference properties
enum { HREF };
@ -124,9 +128,6 @@ protected:
// nsIDOMSVGFitToViewbox properties
nsSVGViewBox mViewBox;
SVGAnimatedPreserveAspectRatio mPreserveAspectRatio;
// helper
nsresult CreateTransformList();
};
#endif

View File

@ -47,9 +47,8 @@
#include "nsContentUtils.h"
#include "nsIDocument.h"
#include "nsPresContext.h"
#include "nsSVGMatrix.h"
#include "DOMSVGMatrix.h"
#include "DOMSVGPoint.h"
#include "nsSVGTransform.h"
#include "nsIDOMEventTarget.h"
#include "nsIFrame.h"
#include "nsISVGSVGFrame.h" //XXX
@ -649,7 +648,8 @@ nsSVGSVGElement::CreateSVGPoint(nsIDOMSVGPoint **_retval)
NS_IMETHODIMP
nsSVGSVGElement::CreateSVGMatrix(nsIDOMSVGMatrix **_retval)
{
return NS_NewSVGMatrix(_retval);
NS_ADDREF(*_retval = new DOMSVGMatrix());
return NS_OK;
}
/* nsIDOMSVGRect createSVGRect (); */
@ -663,7 +663,8 @@ nsSVGSVGElement::CreateSVGRect(nsIDOMSVGRect **_retval)
NS_IMETHODIMP
nsSVGSVGElement::CreateSVGTransform(nsIDOMSVGTransform **_retval)
{
return NS_NewSVGTransform(_retval);
NS_ADDREF(*_retval = new DOMSVGTransform());
return NS_OK;
}
/* nsIDOMSVGTransform createSVGTransformFromMatrix (in nsIDOMSVGMatrix matrix); */
@ -671,13 +672,12 @@ NS_IMETHODIMP
nsSVGSVGElement::CreateSVGTransformFromMatrix(nsIDOMSVGMatrix *matrix,
nsIDOMSVGTransform **_retval)
{
NS_ENSURE_NATIVE_MATRIX(matrix, _retval);
nsCOMPtr<DOMSVGMatrix> domItem = do_QueryInterface(matrix);
if (!domItem) {
return NS_ERROR_DOM_SVG_WRONG_TYPE_ERR;
}
nsresult rv = NS_NewSVGTransform(_retval);
if (NS_FAILED(rv))
return rv;
(*_retval)->SetMatrix(matrix);
NS_ADDREF(*_retval = new DOMSVGTransform(domItem->Matrix()));
return NS_OK;
}
@ -748,7 +748,8 @@ NS_IMETHODIMP
nsSVGSVGElement::GetCTM(nsIDOMSVGMatrix * *aCTM)
{
gfxMatrix m = nsSVGUtils::GetCTM(this, PR_FALSE);
*aCTM = m.IsSingular() ? nsnull : NS_NewSVGMatrix(m).get();
*aCTM = m.IsSingular() ? nsnull : new DOMSVGMatrix(m);
NS_IF_ADDREF(*aCTM);
return NS_OK;
}
@ -757,7 +758,8 @@ NS_IMETHODIMP
nsSVGSVGElement::GetScreenCTM(nsIDOMSVGMatrix **aCTM)
{
gfxMatrix m = nsSVGUtils::GetCTM(this, PR_TRUE);
*aCTM = m.IsSingular() ? nsnull : NS_NewSVGMatrix(m).get();
*aCTM = m.IsSingular() ? nsnull : new DOMSVGMatrix(m);
NS_IF_ADDREF(*aCTM);
return NS_OK;
}