Bug 1396776 - Move mCanvasTM from the sub classes of nsSVGDisplayContainerFrame to nsSVGDisplayContainerFrame.
All classes which have mCanvasTM declared as a member object are inherited from
nsSVGDisplayContainerFrame. We should just declare a protected member in the
base class and then remove mCanvasTM and duplicated implementaion of
GetCanvasTM & NotifySVGChanged in those derived classes.
MozReview-Commit-ID: 8f8EgFNEXHJ
--- a/layout/svg/SVGTextFrame.cpp
+++ b/layout/svg/SVGTextFrame.cpp
@@ -3909,37 +3909,16 @@ SVGTextFrame::GetBBoxContribution(const
run.GetUserSpaceRect(presContext, flags, &m);
bbox.UnionEdges(bboxForRun);
}
return bbox;
}
//----------------------------------------------------------------------
-// nsSVGContainerFrame methods
-
-gfxMatrix
-SVGTextFrame::GetCanvasTM()
-{
- if (!mCanvasTM) {
- NS_ASSERTION(GetParent(), "null parent");
- NS_ASSERTION(!(GetStateBits() & NS_FRAME_IS_NONDISPLAY),
- "should not call GetCanvasTM() when we are non-display");
-
- nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(GetParent());
- dom::SVGTextContentElement *content = static_cast<dom::SVGTextContentElement*>(GetContent());
-
- gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM());
-
- mCanvasTM = new gfxMatrix(tm);
- }
- return *mCanvasTM;
-}
-
-//----------------------------------------------------------------------
// SVGTextFrame SVG DOM methods
/**
* Returns whether the specified node has any non-empty nsTextNodes
* beneath it.
*/
static bool
HasTextContent(nsIContent* aContent)
--- a/layout/svg/SVGTextFrame.h
+++ b/layout/svg/SVGTextFrame.h
@@ -252,19 +252,16 @@ public:
const gfxMatrix& aTransform,
imgDrawingParams& aImgParams,
const nsIntRect* aDirtyRect = nullptr) override;
virtual nsIFrame* GetFrameForPoint(const gfxPoint& aPoint) override;
virtual void ReflowSVG() override;
virtual SVGBBox GetBBoxContribution(const Matrix& aToBBoxUserspace,
uint32_t aFlags) override;
- // nsSVGContainerFrame methods:
- virtual gfxMatrix GetCanvasTM() override;
-
// SVG DOM text methods:
uint32_t GetNumberOfChars(nsIContent* aContent);
float GetComputedTextLength(nsIContent* aContent);
nsresult SelectSubString(nsIContent* aContent, uint32_t charnum, uint32_t nchars);
nsresult GetSubStringLength(nsIContent* aContent, uint32_t charnum,
uint32_t nchars, float* aResult);
int32_t GetCharNumAtPosition(nsIContent* aContent, mozilla::nsISVGPoint* point);
@@ -529,21 +526,16 @@ private:
gfxFloat GetStartOffset(nsIFrame* aTextPathFrame);
/**
* The MutationObserver we have registered for the <text> element subtree.
*/
RefPtr<MutationObserver> mMutationObserver;
/**
- * Cached canvasTM value.
- */
- nsAutoPtr<gfxMatrix> mCanvasTM;
-
- /**
* The number of characters in the DOM after the final nsTextFrame. For
* example, with
*
* <text>abcd<tspan display="none">ef</tspan></text>
*
* mTrailingUndisplayedCharacters would be 2.
*/
uint32_t mTrailingUndisplayedCharacters;
--- a/layout/svg/nsSVGAFrame.cpp
+++ b/layout/svg/nsSVGAFrame.cpp
@@ -39,24 +39,16 @@ public:
int32_t aModType) override;
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override
{
return MakeFrameName(NS_LITERAL_STRING("SVGA"), aResult);
}
#endif
- // nsSVGDisplayableFrame interface:
- virtual void NotifySVGChanged(uint32_t aFlags) override;
-
- // nsSVGContainerFrame methods:
- virtual gfxMatrix GetCanvasTM() override;
-
-private:
- nsAutoPtr<gfxMatrix> mCanvasTM;
};
//----------------------------------------------------------------------
// Implementation
nsIFrame*
NS_NewSVGAFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
{
@@ -106,46 +98,9 @@ nsSVGAFrame::AttributeChanged(int32_t
dom::SVGAElement* content = static_cast<dom::SVGAElement*>(GetContent());
// SMIL may change whether an <a> element is a link, in which case we will
// need to update the link state.
content->ResetLinkState(true, content->ElementHasHref());
}
return NS_OK;
-}
-
-//----------------------------------------------------------------------
-// nsSVGDisplayableFrame methods
-
-void
-nsSVGAFrame::NotifySVGChanged(uint32_t aFlags)
-{
- MOZ_ASSERT(aFlags & (TRANSFORM_CHANGED | COORD_CONTEXT_CHANGED),
- "Invalidation logic may need adjusting");
-
- if (aFlags & TRANSFORM_CHANGED) {
- // make sure our cached transform matrix gets (lazily) updated
- mCanvasTM = nullptr;
- }
-
- nsSVGDisplayContainerFrame::NotifySVGChanged(aFlags);
-}
-
-//----------------------------------------------------------------------
-// nsSVGContainerFrame methods:
-
-gfxMatrix
-nsSVGAFrame::GetCanvasTM()
-{
- if (!mCanvasTM) {
- NS_ASSERTION(GetParent(), "null parent");
-
- nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(GetParent());
- dom::SVGAElement *content = static_cast<dom::SVGAElement*>(GetContent());
-
- gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM());
-
- mCanvasTM = new gfxMatrix(tm);
- }
-
- return *mCanvasTM;
-}
+}
\ No newline at end of file
--- a/layout/svg/nsSVGContainerFrame.cpp
+++ b/layout/svg/nsSVGContainerFrame.cpp
@@ -396,16 +396,21 @@ nsSVGDisplayContainerFrame::ReflowSVG()
}
void
nsSVGDisplayContainerFrame::NotifySVGChanged(uint32_t aFlags)
{
MOZ_ASSERT(aFlags & (TRANSFORM_CHANGED | COORD_CONTEXT_CHANGED),
"Invalidation logic may need adjusting");
+ if (aFlags & TRANSFORM_CHANGED) {
+ // make sure our cached transform matrix gets (lazily) updated
+ mCanvasTM = nullptr;
+ }
+
nsSVGUtils::NotifyChildrenOfSVGChange(this, aFlags);
}
SVGBBox
nsSVGDisplayContainerFrame::GetBBoxContribution(
const Matrix &aToBBoxUserspace,
uint32_t aFlags)
{
@@ -428,8 +433,25 @@ nsSVGDisplayContainerFrame::GetBBoxContr
// to use UnionEdges.
bboxUnion.UnionEdges(svgKid->GetBBoxContribution(gfx::ToMatrix(transform), aFlags));
}
kid = kid->GetNextSibling();
}
return bboxUnion;
}
+
+gfxMatrix
+nsSVGDisplayContainerFrame::GetCanvasTM()
+{
+ if (!mCanvasTM) {
+ NS_ASSERTION(GetParent(), "null parent");
+
+ nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(GetParent());
+ nsSVGElement *content = static_cast<nsSVGElement*>(GetContent());
+
+ gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM());
+
+ mCanvasTM = new gfxMatrix(tm);
+ }
+
+ return *mCanvasTM;
+}
--- a/layout/svg/nsSVGContainerFrame.h
+++ b/layout/svg/nsSVGContainerFrame.h
@@ -142,11 +142,18 @@ public:
imgDrawingParams& aImgParams,
const nsIntRect* aDirtyRect = nullptr) override;
virtual nsIFrame* GetFrameForPoint(const gfxPoint& aPoint) override;
virtual void ReflowSVG() override;
virtual void NotifySVGChanged(uint32_t aFlags) override;
virtual SVGBBox GetBBoxContribution(const Matrix &aToBBoxUserspace,
uint32_t aFlags) override;
virtual bool IsDisplayContainer() override { return true; }
+ virtual gfxMatrix GetCanvasTM() override;
+
+protected:
+ /**
+ * Cached canvasTM value.
+ */
+ nsAutoPtr<gfxMatrix> mCanvasTM;
};
#endif
--- a/layout/svg/nsSVGGFrame.cpp
+++ b/layout/svg/nsSVGGFrame.cpp
@@ -39,46 +39,16 @@ nsSVGGFrame::Init(nsIContent* aCon
nsSVGDisplayContainerFrame::Init(aContent, aParent, aPrevInFlow);
}
#endif /* DEBUG */
//----------------------------------------------------------------------
// nsSVGDisplayableFrame methods
-void
-nsSVGGFrame::NotifySVGChanged(uint32_t aFlags)
-{
- MOZ_ASSERT(aFlags & (TRANSFORM_CHANGED | COORD_CONTEXT_CHANGED),
- "Invalidation logic may need adjusting");
-
- if (aFlags & TRANSFORM_CHANGED) {
- // make sure our cached transform matrix gets (lazily) updated
- mCanvasTM = nullptr;
- }
-
- nsSVGDisplayContainerFrame::NotifySVGChanged(aFlags);
-}
-
-gfxMatrix
-nsSVGGFrame::GetCanvasTM()
-{
- if (!mCanvasTM) {
- NS_ASSERTION(GetParent(), "null parent");
-
- nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(GetParent());
- SVGGraphicsElement *content = static_cast<SVGGraphicsElement*>(GetContent());
-
- gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM());
-
- mCanvasTM = new gfxMatrix(tm);
- }
- return *mCanvasTM;
-}
-
nsresult
nsSVGGFrame::AttributeChanged(int32_t aNameSpaceID,
nsIAtom* aAttribute,
int32_t aModType)
{
if (aNameSpaceID == kNameSpaceID_None &&
aAttribute == nsGkAtoms::transform) {
// We don't invalidate for transform changes (the layers code does that).
--- a/layout/svg/nsSVGGFrame.h
+++ b/layout/svg/nsSVGGFrame.h
@@ -38,19 +38,11 @@ public:
return MakeFrameName(NS_LITERAL_STRING("SVGG"), aResult);
}
#endif
// nsIFrame interface:
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
nsIAtom* aAttribute,
int32_t aModType) override;
-
- // nsSVGDisplayableFrame interface:
- virtual void NotifySVGChanged(uint32_t aFlags) override;
-
- // nsSVGContainerFrame methods:
- virtual gfxMatrix GetCanvasTM() override;
-
- nsAutoPtr<gfxMatrix> mCanvasTM;
};
#endif
--- a/layout/svg/nsSVGOuterSVGFrame.h
+++ b/layout/svg/nsSVGOuterSVGFrame.h
@@ -182,18 +182,16 @@ protected:
// This is temporary until display list based invalidation is implemented for
// SVG.
// A hash-set containing our nsSVGForeignObjectFrame descendants. Note we use
// a hash-set to avoid the O(N^2) behavior we'd get tearing down an SVG frame
// subtree if we were to use a list (see bug 381285 comment 20).
nsAutoPtr<nsTHashtable<nsPtrHashKey<nsSVGForeignObjectFrame> > > mForeignObjectHash;
- nsAutoPtr<gfxMatrix> mCanvasTM;
-
nsRegion mInvalidRegion;
float mFullZoom;
bool mViewportInitialized;
bool mIsRootContent;
};
--- a/layout/svg/nsSVGViewportFrame.cpp
+++ b/layout/svg/nsSVGViewportFrame.cpp
@@ -120,21 +120,16 @@ nsSVGViewportFrame::NotifySVGChanged(uin
aFlags &= ~COORD_CONTEXT_CHANGED;
if (!aFlags) {
return; // No notification flags left
}
}
}
- if (aFlags & TRANSFORM_CHANGED) {
- // make sure our cached transform matrix gets (lazily) updated
- mCanvasTM = nullptr;
- }
-
nsSVGDisplayContainerFrame::NotifySVGChanged(aFlags);
}
SVGBBox
nsSVGViewportFrame::GetBBoxContribution(const Matrix &aToBBoxUserspace,
uint32_t aFlags)
{
// XXXjwatt It seems like authors would want the result to be clipped by the
@@ -272,32 +267,16 @@ nsSVGViewportFrame::NotifyViewportOrTran
// attributes. Changes to all of these attributes are handled in
// AttributeChanged(), so we should never be called.
NS_ERROR("Not called for nsSVGViewportFrame");
}
//----------------------------------------------------------------------
// nsSVGContainerFrame methods:
-gfxMatrix
-nsSVGViewportFrame::GetCanvasTM()
-{
- if (!mCanvasTM) {
- NS_ASSERTION(GetParent(), "null parent");
-
- nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(GetParent());
- SVGViewportElement *content = static_cast<SVGViewportElement*>(GetContent());
-
- gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM());
-
- mCanvasTM = new gfxMatrix(tm);
- }
- return *mCanvasTM;
-}
-
bool
nsSVGViewportFrame::HasChildrenOnlyTransform(gfx::Matrix *aTransform) const
{
SVGViewportElement *content = static_cast<SVGViewportElement*>(GetContent());
if (content->HasViewBoxOrSyntheticViewBox()) {
// XXX Maybe return false if the transform is the identity transform?
if (aTransform) {
--- a/layout/svg/nsSVGViewportFrame.h
+++ b/layout/svg/nsSVGViewportFrame.h
@@ -38,22 +38,16 @@ public:
const nsIntRect* aDirtyRect = nullptr) override;
virtual void ReflowSVG() override;
virtual void NotifySVGChanged(uint32_t aFlags) override;
SVGBBox GetBBoxContribution(const Matrix &aToBBoxUserspace,
uint32_t aFlags) override;
virtual nsIFrame* GetFrameForPoint(const gfxPoint& aPoint) override;
// nsSVGContainerFrame methods:
- virtual gfxMatrix GetCanvasTM() override;
-
virtual bool HasChildrenOnlyTransform(Matrix *aTransform) const override;
// nsISVGSVGFrame interface:
virtual void NotifyViewportOrTransformChanged(uint32_t aFlags) override;
-
-protected:
-
- nsAutoPtr<gfxMatrix> mCanvasTM;
};
#endif // __NS_SVGVIEWPORTFRAME_H__