diff options
Diffstat (limited to 'layout/svg/nsSVGContainerFrame.h')
-rw-r--r-- | layout/svg/nsSVGContainerFrame.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/layout/svg/nsSVGContainerFrame.h b/layout/svg/nsSVGContainerFrame.h new file mode 100644 index 000000000..f4a01e155 --- /dev/null +++ b/layout/svg/nsSVGContainerFrame.h @@ -0,0 +1,155 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef NS_SVGCONTAINERFRAME_H +#define NS_SVGCONTAINERFRAME_H + +#include "mozilla/Attributes.h" +#include "nsContainerFrame.h" +#include "nsFrame.h" +#include "nsIFrame.h" +#include "nsISVGChildFrame.h" +#include "nsQueryFrame.h" +#include "nsRect.h" +#include "nsSVGUtils.h" + +class gfxContext; +class nsFrameList; +class nsIContent; +class nsIPresShell; +class nsStyleContext; + +struct nsRect; + +/** + * Base class for SVG container frames. Frame sub-classes that do not + * display their contents directly (such as the frames for <marker> or + * <pattern>) just inherit this class. Frame sub-classes that do or can + * display their contents directly (such as the frames for inner-<svg> or + * <g>) inherit our nsDisplayContainerFrame sub-class. + * + * *** WARNING *** + * + * Do *not* blindly cast to SVG element types in this class's methods (see the + * warning comment for nsSVGDisplayContainerFrame below). + */ +class nsSVGContainerFrame : public nsContainerFrame +{ + friend nsIFrame* NS_NewSVGContainerFrame(nsIPresShell* aPresShell, + nsStyleContext* aContext); +protected: + explicit nsSVGContainerFrame(nsStyleContext* aContext) + : nsContainerFrame(aContext) + { + AddStateBits(NS_FRAME_SVG_LAYOUT); + } + +public: + NS_DECL_QUERYFRAME_TARGET(nsSVGContainerFrame) + NS_DECL_QUERYFRAME + NS_DECL_FRAMEARENA_HELPERS + + // Returns the transform to our gfxContext (to device pixels, not CSS px) + virtual gfxMatrix GetCanvasTM() { + return gfxMatrix(); + } + + /** + * Returns true if the frame's content has a transform that applies only to + * its children, and not to the frame itself. For example, an implicit + * transform introduced by a 'viewBox' attribute, or an explicit transform + * due to a root-<svg> having its currentScale/currentTransform properties + * set. If aTransform is non-null, then it will be set to the transform. + */ + virtual bool HasChildrenOnlyTransform(Matrix *aTransform) const { + return false; + } + + // nsIFrame: + virtual void AppendFrames(ChildListID aListID, + nsFrameList& aFrameList) override; + virtual void InsertFrames(ChildListID aListID, + nsIFrame* aPrevFrame, + nsFrameList& aFrameList) override; + virtual void RemoveFrame(ChildListID aListID, + nsIFrame* aOldFrame) override; + + virtual bool IsFrameOfType(uint32_t aFlags) const override + { + return nsContainerFrame::IsFrameOfType( + aFlags & ~(nsIFrame::eSVG | nsIFrame::eSVGContainer)); + } + + virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override {} + + virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override; + +protected: + /** + * Traverses a frame tree, marking any SVGTextFrame frames as dirty + * and calling InvalidateRenderingObservers() on it. + */ + static void ReflowSVGNonDisplayText(nsIFrame* aContainer); +}; + +/** + * Frame class or base-class for SVG containers that can or do display their + * contents directly. + * + * *** WARNING *** + * + * This class's methods can *not* assume that mContent points to an instance of + * an SVG element class since this class is inherited by + * nsSVGGenericContainerFrame which is used for unrecognized elements in the + * SVG namespace. Do *not* blindly cast to SVG element types. + */ +class nsSVGDisplayContainerFrame : public nsSVGContainerFrame, + public nsISVGChildFrame +{ +protected: + explicit nsSVGDisplayContainerFrame(nsStyleContext* aContext) + : nsSVGContainerFrame(aContext) + { + AddStateBits(NS_FRAME_MAY_BE_TRANSFORMED); + } + +public: + NS_DECL_QUERYFRAME_TARGET(nsSVGDisplayContainerFrame) + NS_DECL_QUERYFRAME + NS_DECL_FRAMEARENA_HELPERS + + // nsIFrame: + virtual void InsertFrames(ChildListID aListID, + nsIFrame* aPrevFrame, + nsFrameList& aFrameList) override; + virtual void RemoveFrame(ChildListID aListID, + nsIFrame* aOldFrame) override; + virtual void Init(nsIContent* aContent, + nsContainerFrame* aParent, + nsIFrame* aPrevInFlow) override; + + virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; + + virtual bool IsSVGTransformed(Matrix *aOwnTransform = nullptr, + Matrix *aFromParentTransform = nullptr) const override; + + // nsISVGChildFrame interface: + virtual DrawResult PaintSVG(gfxContext& aContext, + const gfxMatrix& aTransform, + const nsIntRect *aDirtyRect = nullptr) override; + virtual nsIFrame* GetFrameForPoint(const gfxPoint& aPoint) override; + virtual nsRect GetCoveredRegion() 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; } +}; + +#endif |