mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
Bug 602759 part 10 - Update SVG elements to use new SVG transform types; r=longsonr, r=jwatt
This commit is contained in:
parent
2800e76c9c
commit
23a09913b7
@ -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)
|
||||
|
@ -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
|
||||
|
@ -38,7 +38,6 @@
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsSVGForeignObjectElement.h"
|
||||
#include "nsSVGMatrix.h"
|
||||
|
||||
nsSVGElement::LengthInfo nsSVGForeignObjectElement::sLengthInfo[4] =
|
||||
{
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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------------------------
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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__
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user