diff --git a/dom/base/DocumentOrShadowRoot.cpp b/dom/base/DocumentOrShadowRoot.cpp index 44551b4dfdc7..fe93b1a61e27 100644 --- a/dom/base/DocumentOrShadowRoot.cpp +++ b/dom/base/DocumentOrShadowRoot.cpp @@ -10,7 +10,6 @@ #include "mozilla/PointerLockManager.h" #include "mozilla/PresShell.h" #include "mozilla/StyleSheet.h" -#include "mozilla/SVGUtils.h" #include "mozilla/dom/AnimatableBinding.h" #include "mozilla/dom/Document.h" #include "mozilla/dom/HTMLInputElement.h" @@ -414,7 +413,7 @@ static void QueryNodesFromRect(DocumentOrShadowRoot& aRoot, const nsRect& aRect, // SVG 'text' element's SVGTextFrame doesn't respond to hit-testing, so // if 'content' is a child of such an element then we need to manually // defer to the parent here. - if (aMultiple == Multiple::Yes && !SVGUtils::IsInSVGTextSubtree(frame)) { + if (aMultiple == Multiple::Yes && !frame->IsInSVGTextSubtree()) { continue; } diff --git a/dom/svg/SVGGraphicsElement.cpp b/dom/svg/SVGGraphicsElement.cpp index c1b4620d95e4..91ee7cdea059 100644 --- a/dom/svg/SVGGraphicsElement.cpp +++ b/dom/svg/SVGGraphicsElement.cpp @@ -61,7 +61,7 @@ already_AddRefed SVGGraphicsElement::GetBBox( ISVGDisplayableFrame* svgframe = do_QueryFrame(frame); if (!svgframe) { - if (!SVGUtils::IsInSVGTextSubtree(frame)) { + if (!frame->IsInSVGTextSubtree()) { return ZeroBBox(*this); } diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index c323f53506fe..42adbc621261 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -991,7 +991,7 @@ static bool ContainingBlockChangeAffectsDescendants( nsIFrame* outOfFlow = nsPlaceholderFrame::GetRealFrameForPlaceholder(f); // If SVG text frames could appear here, they could confuse us since // they ignore their position style ... but they can't. - NS_ASSERTION(!SVGUtils::IsInSVGTextSubtree(outOfFlow), + NS_ASSERTION(!outOfFlow->IsInSVGTextSubtree(), "SVG text frames can't be out of flow"); // Top-layer frames don't change containing block based on direct // ancestors. diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 839e65fdaab9..dd9b4b165b06 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -119,7 +119,6 @@ #include "mozilla/dom/SVGFilters.h" #include "mozilla/dom/SVGTests.h" #include "mozilla/SVGGradientFrame.h" -#include "mozilla/SVGUtils.h" #include "nsRefreshDriver.h" #include "nsTextNode.h" @@ -286,8 +285,7 @@ static inline bool IsDisplayContents(const nsIContent* aContent) { * frame being used for SVG text. */ static bool IsFrameForSVG(const nsIFrame* aFrame) { - return aFrame->IsFrameOfType(nsIFrame::eSVG) || - SVGUtils::IsInSVGTextSubtree(aFrame); + return aFrame->IsFrameOfType(nsIFrame::eSVG) || aFrame->IsInSVGTextSubtree(); } static bool IsLastContinuationForColumnContent(const nsIFrame* aFrame) { @@ -935,8 +933,7 @@ nsContainerFrame* nsFrameConstructorState::GetGeometricParent( // XXXbz couldn't we just force position to "static" on roots and // float to "none"? That's OK per CSS 2.1, as far as I can tell. - if (aContentParentFrame && - SVGUtils::IsInSVGTextSubtree(aContentParentFrame)) { + if (aContentParentFrame && aContentParentFrame->IsInSVGTextSubtree()) { return aContentParentFrame; } @@ -3338,7 +3335,7 @@ const nsCSSFrameConstructor::FrameConstructionData* nsCSSFrameConstructor::FindTextData(const Text& aTextContent, nsIFrame* aParentFrame) { if (aParentFrame && IsFrameForSVG(aParentFrame)) { - if (!SVGUtils::IsInSVGTextSubtree(aParentFrame)) { + if (!aParentFrame->IsInSVGTextSubtree()) { return nullptr; } @@ -4578,7 +4575,7 @@ nsIFrame* nsCSSFrameConstructor::ConstructNonScrollableBlock( if ((aDisplay->IsAbsolutelyPositionedStyle() || aDisplay->IsFloatingStyle() || aDisplay->DisplayInside() == StyleDisplayInside::FlowRoot || clipPaginatedOverflow) && - !SVGUtils::IsInSVGTextSubtree(aParentFrame)) { + !aParentFrame->IsInSVGTextSubtree()) { flags = NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS; if (clipPaginatedOverflow) { flags |= NS_BLOCK_CLIP_PAGINATED_OVERFLOW; @@ -5151,7 +5148,7 @@ void nsCSSFrameConstructor::AddFrameConstructionItems( RefPtr computedStyle = ResolveComputedStyle(aContent); auto flags = aFlags + ItemFlag::AllowPageBreak; if (parentFrame) { - if (SVGUtils::IsInSVGTextSubtree(parentFrame)) { + if (parentFrame->IsInSVGTextSubtree()) { flags += ItemFlag::IsWithinSVGText; } if (parentFrame->IsBlockFrame() && parentFrame->GetParent() && @@ -10134,8 +10131,7 @@ void nsCSSFrameConstructor::CreateLetterFrame( // Create the right type of first-letter frame const nsStyleDisplay* display = sc->StyleDisplay(); nsFirstLetterFrame* letterFrame; - if (display->IsFloatingStyle() && - !SVGUtils::IsInSVGTextSubtree(aParentFrame)) { + if (display->IsFloatingStyle() && !aParentFrame->IsInSVGTextSubtree()) { // Make a floating first-letter frame letterFrame = CreateFloatingLetterFrame(state, aTextContent, textFrame, aParentFrame, parentComputedStyle, diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index b7690007cba4..b9313dd45cd9 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -1714,7 +1714,7 @@ nsPoint GetEventCoordinatesRelativeTo(nsIWidget* aWidget, /* If we encountered a transform, we can't do simple arithmetic to figure * out how to convert back to aFrame's coordinates and must use the CTM. */ - if (transformFound || SVGUtils::IsInSVGTextSubtree(frame)) { + if (transformFound || frame->IsInSVGTextSubtree()) { return nsLayoutUtils::TransformRootPointToFrame(ViewportType::Visual, aFrame, widgetToView); } @@ -2254,7 +2254,7 @@ bool nsLayoutUtils::AuthorSpecifiedBorderBackgroundDisablesTheming( } static SVGTextFrame* GetContainingSVGTextFrame(const nsIFrame* aFrame) { - if (!SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (!aFrame->IsInSVGTextSubtree()) { return nullptr; } @@ -8050,7 +8050,7 @@ nscoord nsLayoutUtils::InflationMinFontSizeFor(const nsIFrame* aFrame) { } float nsLayoutUtils::FontSizeInflationFor(const nsIFrame* aFrame) { - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { const nsIFrame* container = aFrame; while (!container->IsSVGTextFrame()) { container = container->GetParent(); diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp index 300597ed3845..3325c14f60aa 100644 --- a/layout/generic/ReflowInput.cpp +++ b/layout/generic/ReflowInput.cpp @@ -14,7 +14,6 @@ #include "LayoutLogging.h" #include "mozilla/dom/HTMLInputElement.h" #include "mozilla/StaticPrefs_layout.h" -#include "mozilla/SVGUtils.h" #include "mozilla/WritingModes.h" #include "nsBlockFrame.h" #include "nsCSSAnonBoxes.h" @@ -2494,7 +2493,7 @@ void SizeComputationInput::InitOffsets(WritingMode aCBWM, nscoord aPercentBasis, widgetPadding, presContext->AppUnitsPerDevPixel()); SetComputedLogicalPadding(wm, LogicalMargin(wm, padding)); needPaddingProp = false; - } else if (SVGUtils::IsInSVGTextSubtree(mFrame)) { + } else if (mFrame->IsInSVGTextSubtree()) { SetComputedLogicalPadding(wm, LogicalMargin(wm)); needPaddingProp = false; } else if (aPadding) { // padding is an input arg @@ -2548,7 +2547,7 @@ void SizeComputationInput::InitOffsets(WritingMode aCBWM, nscoord aPercentBasis, border = LogicalMargin( wm, LayoutDevicePixel::ToAppUnits(widgetBorder, presContext->AppUnitsPerDevPixel())); - } else if (SVGUtils::IsInSVGTextSubtree(mFrame)) { + } else if (mFrame->IsInSVGTextSubtree()) { // Do nothing since the border local variable is initialized all zero. } else if (aBorder) { // border is an input arg border = *aBorder; @@ -2835,7 +2834,7 @@ bool SizeComputationInput::ComputeMargin(WritingMode aCBWM, nscoord aPercentBasis, LayoutFrameType aFrameType) { // SVG text frames have no margin. - if (SVGUtils::IsInSVGTextSubtree(mFrame)) { + if (mFrame->IsInSVGTextSubtree()) { return false; } diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index 3006ea6307fd..61c265708edc 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -21,7 +21,6 @@ #include "mozilla/PresShell.h" #include "mozilla/StaticPrefs_browser.h" #include "mozilla/StaticPrefs_layout.h" -#include "mozilla/SVGUtils.h" #include "mozilla/ToString.h" #include "mozilla/UniquePtr.h" @@ -577,7 +576,7 @@ nsresult nsBlockFrame::GetFrameName(nsAString& aResult) const { void nsBlockFrame::InvalidateFrame(uint32_t aDisplayItemKey, bool aRebuildDisplayItems) { - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { NS_ASSERTION(GetParent()->IsSVGTextFrame(), "unexpected block frame in SVG text"); GetParent()->InvalidateFrame(); @@ -589,7 +588,7 @@ void nsBlockFrame::InvalidateFrame(uint32_t aDisplayItemKey, void nsBlockFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey, bool aRebuildDisplayItems) { - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { NS_ASSERTION(GetParent()->IsSVGTextFrame(), "unexpected block frame in SVG text"); GetParent()->InvalidateFrame(); @@ -2359,8 +2358,7 @@ static inline bool IsAlignedLeft(StyleTextAlign aAlignment, StyleDirection aDirection, StyleUnicodeBidi aUnicodeBidi, nsIFrame* aFrame) { - return SVGUtils::IsInSVGTextSubtree(aFrame) || - StyleTextAlign::Left == aAlignment || + return aFrame->IsInSVGTextSubtree() || StyleTextAlign::Left == aAlignment || (((StyleTextAlign::Start == aAlignment && StyleDirection::Ltr == aDirection) || (StyleTextAlign::End == aAlignment && @@ -5172,7 +5170,7 @@ bool nsBlockFrame::PlaceLine(BlockReflowState& aState, * In other words, isLastLine really means isLastLineAndWeCare. */ const bool isLastLine = - !SVGUtils::IsInSVGTextSubtree(this) && + !IsInSVGTextSubtree() && styleText->TextAlignForLastLine() != styleText->mTextAlign && (aLineLayout.GetLineEndsInBR() || IsLastLine(aState, aLine)); @@ -5764,7 +5762,7 @@ void nsBlockFrame::AppendFrames(ChildListID aListID, nsFrameList&& aFrameList) { printf("\n"); #endif - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { MOZ_ASSERT(GetParent()->IsSVGTextFrame(), "unexpected block frame in SVG text"); // Workaround for bug 1399425 in case this bit has been removed from the diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp index 91350f162ad4..e74eebc1f506 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp @@ -543,7 +543,7 @@ static bool IsFontSizeInflationContainer(nsIFrame* aFrame, } static void MaybeScheduleReflowSVGNonDisplayText(nsIFrame* aFrame) { - if (!SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (!aFrame->IsInSVGTextSubtree()) { return; } @@ -1570,7 +1570,7 @@ void nsIFrame::CreateView() { nsMargin nsIFrame::GetUsedMargin() const { nsMargin margin(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - SVGUtils::IsInSVGTextSubtree(this)) + IsInSVGTextSubtree()) return margin; nsMargin* m = GetProperty(UsedMarginProperty()); @@ -1591,7 +1591,7 @@ nsMargin nsIFrame::GetUsedMargin() const { nsMargin nsIFrame::GetUsedBorder() const { nsMargin border(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - SVGUtils::IsInSVGTextSubtree(this)) + IsInSVGTextSubtree()) return border; // Theme methods don't use const-ness. @@ -1620,7 +1620,7 @@ nsMargin nsIFrame::GetUsedBorder() const { nsMargin nsIFrame::GetUsedPadding() const { nsMargin padding(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - SVGUtils::IsInSVGTextSubtree(this)) + IsInSVGTextSubtree()) return padding; // Theme methods don't use const-ness. @@ -5637,7 +5637,7 @@ static FrameTarget GetSelectionClosestFrame(nsIFrame* aFrame, kid->FindCloserFrameForSelection(aPoint, &closest); } if (closest.mFrame) { - if (SVGUtils::IsInSVGTextSubtree(closest.mFrame)) + if (closest.mFrame->IsInSVGTextSubtree()) return FrameTarget{closest.mFrame, false, false}; return GetSelectionClosestFrameForChild(closest.mFrame, aPoint, aFlags); } @@ -5754,7 +5754,7 @@ nsIFrame::ContentOffsets nsIFrame::GetContentOffsetsFromPoint( nsPoint pt; if (closest.frame != this) { - if (SVGUtils::IsInSVGTextSubtree(closest.frame)) { + if (closest.frame->IsInSVGTextSubtree()) { pt = nsLayoutUtils::TransformAncestorPointToFrame( RelativeTo{closest.frame}, aPoint, RelativeTo{this}); } else { @@ -10622,7 +10622,7 @@ static StyleVerticalAlignKeyword ConvertSVGDominantBaselineToVerticalAlign( } Maybe nsIFrame::VerticalAlignEnum() const { - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { StyleDominantBaseline dominantBaseline = StyleSVG()->mDominantBaseline; return Some(ConvertSVGDominantBaselineToVerticalAlign(dominantBaseline)); } diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index bb86580154c1..318c37e3f456 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -4513,6 +4513,13 @@ class nsIFrame : public nsQueryFrame { return HasAnyStateBits(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN); } + /** + * Returns true if the frame is an SVGTextFrame or one of its descendants. + */ + bool IsInSVGTextSubtree() const { + return HasAnyStateBits(NS_FRAME_IS_SVG_TEXT); + } + /** * Return whether this frame keeps track of overflow areas. (Frames for * non-display SVG elements -- e.g. -- do not maintain overflow diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp index 4c03d8fca031..ec5ea2068fab 100644 --- a/layout/generic/nsInlineFrame.cpp +++ b/layout/generic/nsInlineFrame.cpp @@ -15,7 +15,6 @@ #include "mozilla/RestyleManager.h" #include "mozilla/ServoStyleSet.h" #include "mozilla/SVGTextFrame.h" -#include "mozilla/SVGUtils.h" #include "nsLineLayout.h" #include "nsBlockFrame.h" #include "nsLayoutUtils.h" @@ -56,7 +55,7 @@ nsresult nsInlineFrame::GetFrameName(nsAString& aResult) const { void nsInlineFrame::InvalidateFrame(uint32_t aDisplayItemKey, bool aRebuildDisplayItems) { - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType( GetParent(), LayoutFrameType::SVGText); svgTextFrame->InvalidateFrame(); @@ -68,7 +67,7 @@ void nsInlineFrame::InvalidateFrame(uint32_t aDisplayItemKey, void nsInlineFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey, bool aRebuildDisplayItems) { - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType( GetParent(), LayoutFrameType::SVGText); svgTextFrame->InvalidateFrame(); @@ -373,7 +372,7 @@ nsresult nsInlineFrame::AttributeChanged(int32_t aNameSpaceID, return rv; } - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { SVGTextFrame* f = static_cast( nsLayoutUtils::GetClosestFrameOfType(this, LayoutFrameType::SVGText)); f->HandleAttributeChangeInDescendant(mContent->AsElement(), aNameSpaceID, diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index f67d03e2e4f0..84e512267c5c 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -10,7 +10,6 @@ #include "mozilla/ComputedStyle.h" #include "mozilla/SVGTextFrame.h" -#include "mozilla/SVGUtils.h" #include "LayoutLogging.h" #include "nsBlockFrame.h" @@ -79,7 +78,7 @@ nsLineLayout::nsLineLayout(nsPresContext* aPresContext, mDirtyNextLine(false), mLineAtStart(false), mHasRuby(false), - mSuppressLineWrap(SVGUtils::IsInSVGTextSubtree(LineContainerFrame())) + mSuppressLineWrap(LineContainerFrame()->IsInSVGTextSubtree()) #ifdef DEBUG , mSpansAllocated(0), @@ -1702,7 +1701,7 @@ void nsLineLayout::AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, static float GetInflationForBlockDirAlignment(nsIFrame* aFrame, nscoord aInflationMinFontSize) { - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { const nsIFrame* container = nsLayoutUtils::GetClosestFrameOfType(aFrame, LayoutFrameType::SVGText); NS_ASSERTION(container, "expected to find an ancestor SVGTextFrame"); @@ -3050,7 +3049,7 @@ void nsLineLayout::TextAlignLine(nsLineBox* aLine, bool aIsLastLine) { StyleTextAlign textAlign = aIsLastLine ? mStyleText->TextAlignForLastLine() : mStyleText->mTextAlign; - bool isSVG = SVGUtils::IsInSVGTextSubtree(LineContainerFrame()); + bool isSVG = LineContainerFrame()->IsInSVGTextSubtree(); bool doTextAlign = remainingISize > 0; int32_t additionalGaps = 0; diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 1100e66fe0b6..34da4d9ced98 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -21,7 +21,6 @@ #include "mozilla/StaticPrefs_layout.h" #include "mozilla/StaticPresData.h" #include "mozilla/SVGTextFrame.h" -#include "mozilla/SVGUtils.h" #include "mozilla/TextEditor.h" #include "mozilla/TextEvents.h" #include "mozilla/BinarySearch.h" @@ -608,8 +607,7 @@ static void InvalidateFrameDueToGlyphsChanged(nsIFrame* aFrame) { // to reflow the SVGTextFrame. (This is similar to reflowing the // SVGTextFrame in response to style changes, in // SVGTextFrame::DidSetComputedStyle.) - if (SVGUtils::IsInSVGTextSubtree(f) && - f->HasAnyStateBits(NS_FRAME_IS_NONDISPLAY)) { + if (f->IsInSVGTextSubtree() && f->HasAnyStateBits(NS_FRAME_IS_NONDISPLAY)) { auto* svgTextFrame = static_cast( nsLayoutUtils::GetClosestFrameOfType(f, LayoutFrameType::SVGText)); svgTextFrame->ScheduleReflowSVGNonDisplayText(IntrinsicDirty::None); @@ -1405,7 +1403,7 @@ static void BuildTextRuns(DrawTarget* aDrawTarget, nsTextFrame* aForFrame, } nsPresContext* presContext = aLineContainer->PresContext(); - bool doLineBreaking = !SVGUtils::IsInSVGTextSubtree(aForFrame); + bool doLineBreaking = !aForFrame->IsInSVGTextSubtree(); BuildTextRunsScanner scanner(presContext, aDrawTarget, aLineContainer, aWhichTextRun, doLineBreaking); @@ -1748,7 +1746,7 @@ static gfxFloat GetMinTabAdvanceAppUnits(const gfxTextRun* aTextRun) { } static float GetSVGFontSizeScaleFactor(nsIFrame* aFrame) { - if (!SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (!aFrame->IsInSVGTextSubtree()) { return 1.0f; } auto* container = @@ -1758,7 +1756,7 @@ static float GetSVGFontSizeScaleFactor(nsIFrame* aFrame) { } static nscoord LetterSpacing(nsIFrame* aFrame, const nsStyleText& aStyleText) { - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { // SVG text can have a scaling factor applied so that very small or very // large font-sizes don't suffer from poor glyph placement due to app unit // rounding. The used letter-spacing value must be scaled by the same @@ -1774,7 +1772,7 @@ static nscoord LetterSpacing(nsIFrame* aFrame, const nsStyleText& aStyleText) { // This function converts non-coord values (e.g. percentages) to nscoord. static nscoord WordSpacing(nsIFrame* aFrame, const gfxTextRun* aTextRun, const nsStyleText& aStyleText) { - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { // SVG text can have a scaling factor applied so that very small or very // large font-sizes don't suffer from poor glyph placement due to app unit // rounding. The used word-spacing value must be scaled by the same @@ -1913,7 +1911,7 @@ bool BuildTextRunsScanner::ContinueTextRunAcrossFrames(nsTextFrame* aFrame1, // as there are too many things SVG might be doing (like applying per- // element positioning) that wouldn't make sense with shaping across // the boundary. - if (SVGUtils::IsInSVGTextSubtree(ancestor)) { + if (ancestor->IsInSVGTextSubtree()) { return false; } @@ -2200,7 +2198,7 @@ already_AddRefed BuildTextRunsScanner::BuildTextRunForFrames( uint32_t nextBreakIndex = 0; nsTextFrame* nextBreakBeforeFrame = GetNextBreakBeforeFrame(&nextBreakIndex); - bool isSVG = SVGUtils::IsInSVGTextSubtree(mLineContainer); + bool isSVG = mLineContainer->IsInSVGTextSubtree(); bool enabledJustification = (mLineContainer->StyleText()->mTextAlign == StyleTextAlign::Justify || mLineContainer->StyleText()->mTextAlignLast == @@ -4235,7 +4233,7 @@ void nsTextFrame::InvalidateFrame(uint32_t aDisplayItemKey, bool aRebuildDisplayItems) { InvalidateSelectionState(); - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType( GetParent(), LayoutFrameType::SVGText); svgTextFrame->InvalidateFrame(); @@ -4249,7 +4247,7 @@ void nsTextFrame::InvalidateFrameWithRect(const nsRect& aRect, bool aRebuildDisplayItems) { InvalidateSelectionState(); - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType( GetParent(), LayoutFrameType::SVGText); svgTextFrame->InvalidateFrame(); @@ -4488,7 +4486,7 @@ void nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, NS_GET_A(st->mWebkitTextStrokeColor.CalcColor(this)) == 0; if ((HasAnyStateBits(TEXT_NO_RENDERED_GLYPHS) || (isTextTransparent && !StyleText()->HasTextShadow())) && - aBuilder->IsForPainting() && !SVGUtils::IsInSVGTextSubtree(this)) { + aBuilder->IsForPainting() && !IsInSVGTextSubtree()) { if (!IsSelected()) { TextDecorations textDecs; GetTextDecorations(PresContext(), eResolvedColors, textDecs); @@ -4680,7 +4678,7 @@ void nsTextFrame::GetTextDecorations( nscolor color; if (useOverride) { color = overrideColor; - } else if (SVGUtils::IsInSVGTextSubtree(this)) { + } else if (IsInSVGTextSubtree()) { // XXX We might want to do something with text-decoration-color when // painting SVG text, but it's not clear what we should do. We // at least need SVG text decorations to paint with 'fill' if @@ -4760,7 +4758,7 @@ void nsTextFrame::GetTextDecorations( static float GetInflationForTextDecorations(nsIFrame* aFrame, nscoord aInflationMinFontSize) { - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { auto* container = nsLayoutUtils::GetClosestFrameOfType(aFrame, LayoutFrameType::SVGText); MOZ_ASSERT(container); @@ -6192,7 +6190,7 @@ nscolor nsTextFrame::GetCaretColorAt(int32_t aOffset) { } bool isSolidTextColor = true; - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { const nsStyleSVG* style = StyleSVG(); if (!style->mFill.kind.IsNone() && !style->mFill.kind.IsColor()) { isSolidTextColor = false; @@ -6383,7 +6381,7 @@ void nsTextFrame::PaintText(const PaintTextParams& aParams, const bool aIsSelected, float aOpacity /* = 1.0f */) { #ifdef DEBUG - if (SVGUtils::IsInSVGTextSubtree(this)) { + if (IsInSVGTextSubtree()) { auto* container = nsLayoutUtils::GetClosestFrameOfType(this, LayoutFrameType::SVGText); MOZ_ASSERT(container); @@ -9473,7 +9471,7 @@ void nsTextFrame::ReflowText(nsLineLayout& aLineLayout, nscoord aAvailableWidth, lineContainer->StyleText()->mTextAlignLast == StyleTextAlignLast::Justify || shouldSuppressLineBreak) && - !SVGUtils::IsInSVGTextSubtree(lineContainer)) { + !lineContainer->IsInSVGTextSubtree()) { AddStateBits(TEXT_JUSTIFICATION_ENABLED); Range range(uint32_t(offset), uint32_t(offset + charsFit)); aLineLayout.SetJustificationInfo(provider.ComputeJustification(range)); diff --git a/layout/generic/nsTextPaintStyle.cpp b/layout/generic/nsTextPaintStyle.cpp index cf34225ad976..61934e1bfe20 100644 --- a/layout/generic/nsTextPaintStyle.cpp +++ b/layout/generic/nsTextPaintStyle.cpp @@ -88,7 +88,7 @@ bool nsTextPaintStyle::EnsureSufficientContrast(nscolor* aForeColor, } nscolor nsTextPaintStyle::GetTextColor() { - if (SVGUtils::IsInSVGTextSubtree(mFrame)) { + if (mFrame->IsInSVGTextSubtree()) { if (!mResolveColors) { return NS_SAME_AS_FOREGROUND_COLOR; } @@ -559,14 +559,14 @@ nscolor nsTextPaintStyle::GetResolvedForeColor(nscolor aColor, } nscolor nsTextPaintStyle::GetWebkitTextStrokeColor() { - if (mozilla::SVGUtils::IsInSVGTextSubtree(mFrame)) { + if (mFrame->IsInSVGTextSubtree()) { return 0; } return mFrame->StyleText()->mWebkitTextStrokeColor.CalcColor(mFrame); } float nsTextPaintStyle::GetWebkitTextStrokeWidth() { - if (mozilla::SVGUtils::IsInSVGTextSubtree(mFrame)) { + if (mFrame->IsInSVGTextSubtree()) { return 0.0f; } nscoord coord = mFrame->StyleText()->mWebkitTextStrokeWidth; diff --git a/layout/style/ComputedStyleInlines.h b/layout/style/ComputedStyleInlines.h index e208ce033c55..5fa74c747109 100644 --- a/layout/style/ComputedStyleInlines.h +++ b/layout/style/ComputedStyleInlines.h @@ -88,7 +88,7 @@ bool ComputedStyle::IsFixedPosContainingBlock( const nsIFrame* aContextFrame) const { // NOTE: Any CSS properties that influence the output of this function // should also handle will-change appropriately. - if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + if (aContextFrame->IsInSVGTextSubtree()) { return false; } if (IsFixedPosContainingBlockForNonSVGTextFrames()) { @@ -114,7 +114,7 @@ bool ComputedStyle::IsAbsPosContainingBlock( // NOTE: Any CSS properties that influence the output of this function // should also handle will-change appropriately. return StyleDisplay()->IsPositionedStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + !aContextFrame->IsInSVGTextSubtree(); } } // namespace mozilla diff --git a/layout/style/nsFontFaceUtils.cpp b/layout/style/nsFontFaceUtils.cpp index ea608ee2c055..060dbe7ed0a8 100644 --- a/layout/style/nsFontFaceUtils.cpp +++ b/layout/style/nsFontFaceUtils.cpp @@ -10,7 +10,6 @@ #include "gfxUserFontSet.h" #include "mozilla/PresShell.h" #include "mozilla/RestyleManager.h" -#include "mozilla/SVGUtils.h" #include "nsFontMetrics.h" #include "nsIFrame.h" #include "nsLayoutUtils.h" @@ -125,7 +124,7 @@ static FontUsageKind FrameFontUsage(nsIFrame* aFrame, // TODO(emilio): Can we use the restyle-hint machinery instead of this? static void ScheduleReflow(PresShell* aPresShell, nsIFrame* aFrame) { nsIFrame* f = aFrame; - if (f->IsFrameOfType(nsIFrame::eSVG) || SVGUtils::IsInSVGTextSubtree(f)) { + if (f->IsFrameOfType(nsIFrame::eSVG) || f->IsInSVGTextSubtree()) { // SVG frames (and the non-SVG descendants of an SVGTextFrame) need special // reflow handling. We need to search upwards for the first displayed // SVGOuterSVGFrame or non-SVG frame, which is the frame we can call @@ -142,7 +141,7 @@ static void ScheduleReflow(PresShell* aPresShell, nsIFrame* aFrame) { return; } if (!f->HasAnyStateBits(NS_FRAME_SVG_LAYOUT) || - !SVGUtils::IsInSVGTextSubtree(f)) { + !f->IsInSVGTextSubtree()) { break; } f->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); diff --git a/layout/style/nsStyleStructInlines.h b/layout/style/nsStyleStructInlines.h index a15298a83de6..cd2265c4b92b 100644 --- a/layout/style/nsStyleStructInlines.h +++ b/layout/style/nsStyleStructInlines.h @@ -14,9 +14,8 @@ #include "nsIFrame.h" #include "nsStyleStruct.h" -#include "nsIContent.h" // for GetParent() -#include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak -#include "mozilla/SVGUtils.h" // for SVGUtils::IsInSVGTextSubtree +#include "nsIContent.h" // for GetParent() +#include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak bool nsStyleText::NewlineIsSignificant(const nsTextFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); @@ -27,21 +26,19 @@ bool nsStyleText::NewlineIsSignificant(const nsTextFrame* aContextFrame) const { bool nsStyleText::WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); - return WhiteSpaceCanWrapStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame) && + return WhiteSpaceCanWrapStyle() && !aContextFrame->IsInSVGTextSubtree() && !aContextFrame->Style()->IsTextCombined(); } bool nsStyleText::WordCanWrap(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); - return WordCanWrapStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + return WordCanWrapStyle() && !aContextFrame->IsInSVGTextSubtree(); } bool nsStyleDisplay::IsBlockOutside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + if (aContextFrame->IsInSVGTextSubtree()) { return aContextFrame->IsBlockFrame(); } return IsBlockOutsideStyle(); @@ -50,7 +47,7 @@ bool nsStyleDisplay::IsBlockOutside(const nsIFrame* aContextFrame) const { bool nsStyleDisplay::IsInlineOutside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + if (aContextFrame->IsInSVGTextSubtree()) { return !aContextFrame->IsBlockFrame(); } return IsInlineOutsideStyle(); @@ -60,7 +57,7 @@ mozilla::StyleDisplay nsStyleDisplay::GetDisplay( const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame) && + if (aContextFrame->IsInSVGTextSubtree() && mDisplay != mozilla::StyleDisplay::None) { return aContextFrame->IsBlockFrame() ? mozilla::StyleDisplay::Block : mozilla::StyleDisplay::Inline; @@ -71,8 +68,7 @@ mozilla::StyleDisplay nsStyleDisplay::GetDisplay( bool nsStyleDisplay::IsFloating(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsFloatingStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + return IsFloatingStyle() && !aContextFrame->IsInSVGTextSubtree(); } // If you change this function, also change the corresponding block in @@ -110,30 +106,27 @@ bool nsStyleDisplay::IsRelativelyOrStickyPositioned( NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); return IsRelativelyOrStickyPositionedStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + !aContextFrame->IsInSVGTextSubtree(); } bool nsStyleDisplay::IsRelativelyPositioned( const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsRelativelyPositionedStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + return IsRelativelyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree(); } bool nsStyleDisplay::IsStickyPositioned(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsStickyPositionedStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + return IsStickyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree(); } bool nsStyleDisplay::IsAbsolutelyPositioned( const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsAbsolutelyPositionedStyle() && - !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); + return IsAbsolutelyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree(); } bool nsStyleBackground::HasLocalBackground() const { diff --git a/layout/svg/SVGObserverUtils.cpp b/layout/svg/SVGObserverUtils.cpp index 0df0d76e39e1..7108999f8bd7 100644 --- a/layout/svg/SVGObserverUtils.cpp +++ b/layout/svg/SVGObserverUtils.cpp @@ -494,9 +494,9 @@ void SVGTextPathObserver::OnRenderingChange() { return; } - MOZ_ASSERT(frame->IsFrameOfType(nsIFrame::eSVG) || - SVGUtils::IsInSVGTextSubtree(frame), - "SVG frame expected"); + MOZ_ASSERT( + frame->IsFrameOfType(nsIFrame::eSVG) || frame->IsInSVGTextSubtree(), + "SVG frame expected"); MOZ_ASSERT(frame->GetContent()->IsSVGElement(nsGkAtoms::textPath), "expected frame for a element"); diff --git a/layout/svg/SVGUtils.cpp b/layout/svg/SVGUtils.cpp index 6c6a33c3a3c9..3bf7e0bd5716 100644 --- a/layout/svg/SVGUtils.cpp +++ b/layout/svg/SVGUtils.cpp @@ -105,7 +105,7 @@ bool SVGAutoRenderState::IsPaintingToWindow(DrawTarget* aDrawTarget) { // GetCanvasTM(). static bool FrameDoesNotIncludePositionInTM(const nsIFrame* aFrame) { return aFrame->IsSVGGeometryFrame() || aFrame->IsSVGImageFrame() || - SVGUtils::IsInSVGTextSubtree(aFrame); + aFrame->IsInSVGTextSubtree(); } nsRect SVGUtils::GetPostFilterInkOverflowRect(nsIFrame* aFrame, @@ -394,9 +394,9 @@ void SVGUtils::NotifyChildrenOfSVGChange(nsIFrame* aFrame, uint32_t aFlags) { if (SVGFrame) { SVGFrame->NotifySVGChanged(aFlags); } else { - NS_ASSERTION(kid->IsFrameOfType(nsIFrame::eSVG) || - SVGUtils::IsInSVGTextSubtree(kid), - "SVG frame expected"); + NS_ASSERTION( + kid->IsFrameOfType(nsIFrame::eSVG) || kid->IsInSVGTextSubtree(), + "SVG frame expected"); // recurse into the children of container frames e.g. , // in case they have child frames with transformation matrices if (kid->IsFrameOfType(nsIFrame::eSVG)) { @@ -985,7 +985,7 @@ gfxRect SVGUtils::GetBBox(nsIFrame* aFrame, uint32_t aFlags, aFrame = aFrame->GetParent(); } - if (SVGUtils::IsInSVGTextSubtree(aFrame)) { + if (aFrame->IsInSVGTextSubtree()) { // It is possible to apply a gradient, pattern, clipping path, mask or // filter to text. When one of these facilities is applied to text // the bounding box is the entire text element in all cases. @@ -1263,7 +1263,7 @@ static gfxRect PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents, gfxRect SVGUtils::PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents, const nsTextFrame* aFrame, const gfxMatrix& aMatrix) { - NS_ASSERTION(SVGUtils::IsInSVGTextSubtree(aFrame), + NS_ASSERTION(aFrame->IsInSVGTextSubtree(), "expected an nsTextFrame for SVG text"); return mozilla::PathExtentsToMaxStrokeExtents(aPathExtents, aFrame, 0.5, aMatrix); diff --git a/layout/svg/SVGUtils.h b/layout/svg/SVGUtils.h index 6f9924cd4253..2458d0a538f4 100644 --- a/layout/svg/SVGUtils.h +++ b/layout/svg/SVGUtils.h @@ -588,11 +588,6 @@ class SVGUtils final { */ static gfxMatrix GetCSSPxToDevPxMatrix(const nsIFrame* aNonSVGFrame); - static bool IsInSVGTextSubtree(const nsIFrame* aFrame) { - // Returns true if the frame is an SVGTextFrame or one of its descendants. - return aFrame->HasAnyStateBits(NS_FRAME_IS_SVG_TEXT); - } - /** * It is a replacement of * SVGElement::PrependLocalTransformsTo(eUserSpaceToParent).