123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /* -*- 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/. */
- // Keep in (case-insensitive) order:
- #include "nsContainerFrame.h"
- #include "nsFrame.h"
- #include "nsGkAtoms.h"
- #include "nsStyleContext.h"
- #include "nsSVGEffects.h"
- // This is a very simple frame whose only purpose is to capture style change
- // events and propagate them to the parent. Most of the heavy lifting is done
- // within the nsSVGGradientFrame, which is the parent for this frame
- class nsSVGStopFrame : public nsFrame
- {
- friend nsIFrame*
- NS_NewSVGStopFrame(nsIPresShell* aPresShell, nsStyleContext* aContext);
- protected:
- explicit nsSVGStopFrame(nsStyleContext* aContext)
- : nsFrame(aContext)
- {
- AddStateBits(NS_FRAME_IS_NONDISPLAY);
- }
- public:
- NS_DECL_FRAMEARENA_HELPERS
- // nsIFrame interface:
- #ifdef DEBUG
- virtual void Init(nsIContent* aContent,
- nsContainerFrame* aParent,
- nsIFrame* aPrevInFlow) override;
- #endif
- void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsDisplayListSet& aLists) override {}
- virtual nsresult AttributeChanged(int32_t aNameSpaceID,
- nsIAtom* aAttribute,
- int32_t aModType) override;
- /**
- * Get the "type" of the frame
- *
- * @see nsGkAtoms::svgStopFrame
- */
- virtual nsIAtom* GetType() const override;
- virtual bool IsFrameOfType(uint32_t aFlags) const override
- {
- return nsFrame::IsFrameOfType(aFlags & ~(nsIFrame::eSVG));
- }
- #ifdef DEBUG_FRAME_DUMP
- virtual nsresult GetFrameName(nsAString& aResult) const override
- {
- return MakeFrameName(NS_LITERAL_STRING("SVGStop"), aResult);
- }
- #endif
- };
- //----------------------------------------------------------------------
- // Implementation
- NS_IMPL_FRAMEARENA_HELPERS(nsSVGStopFrame)
- //----------------------------------------------------------------------
- // nsIFrame methods:
- #ifdef DEBUG
- void
- nsSVGStopFrame::Init(nsIContent* aContent,
- nsContainerFrame* aParent,
- nsIFrame* aPrevInFlow)
- {
- NS_ASSERTION(aContent->IsSVGElement(nsGkAtoms::stop), "Content is not a stop element");
- nsFrame::Init(aContent, aParent, aPrevInFlow);
- }
- #endif /* DEBUG */
- nsIAtom *
- nsSVGStopFrame::GetType() const
- {
- return nsGkAtoms::svgStopFrame;
- }
- nsresult
- nsSVGStopFrame::AttributeChanged(int32_t aNameSpaceID,
- nsIAtom* aAttribute,
- int32_t aModType)
- {
- if (aNameSpaceID == kNameSpaceID_None &&
- aAttribute == nsGkAtoms::offset) {
- MOZ_ASSERT(GetParent()->GetType() == nsGkAtoms::svgLinearGradientFrame ||
- GetParent()->GetType() == nsGkAtoms::svgRadialGradientFrame,
- "Observers observe the gradient, so that's what we must invalidate");
- nsSVGEffects::InvalidateDirectRenderingObservers(GetParent());
- }
- return nsFrame::AttributeChanged(aNameSpaceID, aAttribute, aModType);
- }
- // -------------------------------------------------------------------------
- // Public functions
- // -------------------------------------------------------------------------
- nsIFrame* NS_NewSVGStopFrame(nsIPresShell* aPresShell,
- nsStyleContext* aContext)
- {
- return new (aPresShell) nsSVGStopFrame(aContext);
- }
|