Loading layout/generic/nsIFrame.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -9462,7 +9462,7 @@ static void ComputeAndIncludeOutlineArea(nsIFrame* aFrame, } } // Keep this code in sync with nsDisplayOutline::GetInnerRect. // Keep this code in sync with GetOutlineInnerRect in nsCSSRendering.cpp. SetOrUpdateRectValuedProperty(aFrame, nsIFrame::OutlineInnerRectProperty(), innerRect); const nscoord offset = outline->mOutlineOffset.ToAppUnits(); Loading layout/mathml/nsMathMLChar.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -1798,8 +1798,8 @@ void nsDisplayMathMLCharDebug::Paint(nsDisplayListBuilder* aBuilder, GetPaintRect(), rect, computedStyle, flags, skipSides); nsCSSRendering::PaintNonThemedOutline(presContext, *aCtx, mFrame, GetPaintRect(), rect, computedStyle); nsCSSRendering::PaintOutline(presContext, *aCtx, mFrame, GetPaintRect(), rect, computedStyle); } #endif Loading layout/painting/nsCSSRendering.cpp +56 −25 Original line number Diff line number Diff line Loading @@ -940,34 +940,65 @@ nsCSSRendering::CreateNullBorderRendererWithStyleBorder( return Some(br); } Maybe<nsCSSBorderRenderer> nsCSSRendering::CreateBorderRendererForNonThemedOutline( nsPresContext* aPresContext, DrawTarget* aDrawTarget, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, ComputedStyle* aStyle) { static nsRect GetOutlineInnerRect(nsIFrame* aFrame) { nsRect* savedOutlineInnerRect = aFrame->GetProperty(nsIFrame::OutlineInnerRectProperty()); if (savedOutlineInnerRect) { return *savedOutlineInnerRect; } // FIXME bug 1221888 NS_ERROR("we should have saved a frame property"); return nsRect(nsPoint(0, 0), aFrame->GetSize()); } Maybe<nsCSSBorderRenderer> nsCSSRendering::CreateBorderRendererForOutline( nsPresContext* aPresContext, gfxContext* aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, ComputedStyle* aStyle) { // Get our ComputedStyle's color struct. const nsStyleOutline* ourOutline = aStyle->StyleOutline(); if (!ourOutline->ShouldPaintOutline()) { // Empty outline return Nothing(); } nsRect innerRect; if ( #ifdef MOZ_XUL aStyle->GetPseudoType() == PseudoStyleType::XULTree #else false #endif ) { innerRect = aBorderArea; } else { innerRect = GetOutlineInnerRect(aForFrame) + aBorderArea.TopLeft(); } nscoord offset = ourOutline->mOutlineOffset.ToAppUnits(); innerRect.Inflate(offset); // If the dirty rect is completely inside the border area (e.g., only the // content is being painted), then we can skip out now // XXX this isn't exactly true for rounded borders, where the inside curves // may encroach into the content area. A safer calculation would be to // shorten insideRect by the radius one each side before performing this test. if (aInnerRect.Contains(aDirtyRect)) { return Nothing(); } if (innerRect.Contains(aDirtyRect)) return Nothing(); const nscoord offset = ourOutline->mOutlineOffset.ToAppUnits(); nsRect innerRect = aInnerRect; innerRect.Inflate(offset); nscoord width = ourOutline->GetOutlineWidth(); StyleBorderStyle outlineStyle; // Themed outlines are handled by our callers, if supported. if (ourOutline->mOutlineStyle.IsAuto()) { if (StaticPrefs::layout_css_outline_style_auto_enabled()) { nsITheme* theme = aPresContext->Theme(); if (theme->ThemeSupportsWidget(aPresContext, aForFrame, StyleAppearance::FocusOutline)) { theme->DrawWidgetBackground(aRenderingContext, aForFrame, StyleAppearance::FocusOutline, innerRect, aDirtyRect); return Nothing(); } } if (width == 0) { return Nothing(); // empty outline } Loading @@ -979,7 +1010,7 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( } RectCornerRadii outlineRadii; nsRect outerRect = aInnerRect; nsRect outerRect = innerRect; outerRect.Inflate(width); const nscoord oneDevPixel = aPresContext->AppUnitsPerDevPixel(); Loading @@ -1005,9 +1036,8 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( nsCSSBorderRenderer::ComputeOuterRadii(innerRadii, widths, &outlineRadii); } } else { nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aForFrame->GetSize(), outerRect.Size(), Sides(), twipsRadii); nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aBorderArea.Size(), outerRect.Size(), Sides(), twipsRadii); ComputePixelRadii(twipsRadii, oneDevPixel, &outlineRadii); } Loading @@ -1023,20 +1053,21 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( Rect dirtyRect = NSRectToRect(aDirtyRect, oneDevPixel); DrawTarget* dt = aRenderingContext ? aRenderingContext->GetDrawTarget() : nullptr; return Some(nsCSSBorderRenderer( aPresContext, aDrawTarget, dirtyRect, oRect, outlineStyles, outlineWidths, aPresContext, dt, dirtyRect, oRect, outlineStyles, outlineWidths, outlineRadii, outlineColors, !aForFrame->BackfaceIsHidden(), Nothing())); } void nsCSSRendering::PaintNonThemedOutline(nsPresContext* aPresContext, void nsCSSRendering::PaintOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, ComputedStyle* aStyle) { Maybe<nsCSSBorderRenderer> br = CreateBorderRendererForNonThemedOutline( aPresContext, aRenderingContext.GetDrawTarget(), aForFrame, aDirtyRect, aInnerRect, aStyle); Maybe<nsCSSBorderRenderer> br = CreateBorderRendererForOutline( aPresContext, &aRenderingContext, aForFrame, aDirtyRect, aBorderArea, aStyle); if (!br) { return; } Loading layout/painting/nsCSSRendering.h +10 −14 Original line number Diff line number Diff line Loading @@ -199,12 +199,9 @@ struct nsCSSRendering { const nsStyleBorder& aBorderStyle, mozilla::ComputedStyle* aStyle, bool* aOutBorderIsEmpty, Sides aSkipSides = Sides()); static mozilla::Maybe<nsCSSBorderRenderer> CreateBorderRendererForNonThemedOutline(nsPresContext* aPresContext, DrawTarget* aDrawTarget, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, static mozilla::Maybe<nsCSSBorderRenderer> CreateBorderRendererForOutline( nsPresContext* aPresContext, gfxContext* aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, mozilla::ComputedStyle* aStyle); static ImgDrawResult CreateWebRenderCommandsForBorder( Loading Loading @@ -232,13 +229,12 @@ struct nsCSSRendering { const nsStyleBorder& aStyleBorder); /** * Render the outline for an element using css rendering rules for borders. * Render the outline for an element using css rendering rules * for borders. */ static void PaintNonThemedOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, static void PaintOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, mozilla::ComputedStyle* aStyle); /** Loading layout/painting/nsDisplayList.cpp +11 −33 Original line number Diff line number Diff line Loading @@ -4768,34 +4768,15 @@ nsRect nsDisplayOutline::GetBounds(nsDisplayListBuilder* aBuilder, return mFrame->InkOverflowRectRelativeToSelf() + ToReferenceFrame(); } nsRect nsDisplayOutline::GetInnerRect() const { nsRect* savedOutlineInnerRect = mFrame->GetProperty(nsIFrame::OutlineInnerRectProperty()); if (savedOutlineInnerRect) { return *savedOutlineInnerRect; } // FIXME bug 1221888 NS_ERROR("we should have saved a frame property"); return nsRect(nsPoint(), mFrame->GetSize()); } void nsDisplayOutline::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { // TODO join outlines together MOZ_ASSERT(mFrame->StyleOutline()->ShouldPaintOutline(), "Should have not created a nsDisplayOutline!"); nsRect rect = GetInnerRect() + ToReferenceFrame(); nsPresContext* pc = mFrame->PresContext(); if (IsThemedOutline()) { rect.Inflate(mFrame->StyleOutline()->mOutlineOffset.ToAppUnits()); pc->Theme()->DrawWidgetBackground( aCtx, mFrame, StyleAppearance::FocusOutline, rect, GetPaintRect()); return; } nsCSSRendering::PaintNonThemedOutline(pc, *aCtx, mFrame, GetPaintRect(), rect, mFrame->Style()); nsPoint offset = ToReferenceFrame(); nsCSSRendering::PaintOutline( mFrame->PresContext(), *aCtx, mFrame, GetPaintRect(), nsRect(offset, mFrame->GetSize()), mFrame->Style()); } bool nsDisplayOutline::IsThemedOutline() const { Loading @@ -4816,19 +4797,16 @@ bool nsDisplayOutline::CreateWebRenderCommands( const StackingContextHelper& aSc, mozilla::layers::RenderRootStateManager* aManager, nsDisplayListBuilder* aDisplayListBuilder) { nsPresContext* pc = mFrame->PresContext(); nsRect rect = GetInnerRect() + ToReferenceFrame(); if (IsThemedOutline()) { rect.Inflate(mFrame->StyleOutline()->mOutlineOffset.ToAppUnits()); return pc->Theme()->CreateWebRenderCommandsForWidget( aBuilder, aResources, aSc, aManager, mFrame, StyleAppearance::FocusOutline, rect); return false; } Maybe<nsCSSBorderRenderer> borderRenderer = nsCSSRendering::CreateBorderRendererForNonThemedOutline( pc, /* aDrawTarget = */ nullptr, mFrame, GetPaintRect(), rect, mFrame->Style()); nsPoint offset = ToReferenceFrame(); mozilla::Maybe<nsCSSBorderRenderer> borderRenderer = nsCSSRendering::CreateBorderRendererForOutline( mFrame->PresContext(), nullptr, mFrame, GetPaintRect(), nsRect(offset, mFrame->GetSize()), mFrame->Style()); if (!borderRenderer) { // No border renderer means "there is no outline". Loading Loading
layout/generic/nsIFrame.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -9462,7 +9462,7 @@ static void ComputeAndIncludeOutlineArea(nsIFrame* aFrame, } } // Keep this code in sync with nsDisplayOutline::GetInnerRect. // Keep this code in sync with GetOutlineInnerRect in nsCSSRendering.cpp. SetOrUpdateRectValuedProperty(aFrame, nsIFrame::OutlineInnerRectProperty(), innerRect); const nscoord offset = outline->mOutlineOffset.ToAppUnits(); Loading
layout/mathml/nsMathMLChar.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -1798,8 +1798,8 @@ void nsDisplayMathMLCharDebug::Paint(nsDisplayListBuilder* aBuilder, GetPaintRect(), rect, computedStyle, flags, skipSides); nsCSSRendering::PaintNonThemedOutline(presContext, *aCtx, mFrame, GetPaintRect(), rect, computedStyle); nsCSSRendering::PaintOutline(presContext, *aCtx, mFrame, GetPaintRect(), rect, computedStyle); } #endif Loading
layout/painting/nsCSSRendering.cpp +56 −25 Original line number Diff line number Diff line Loading @@ -940,34 +940,65 @@ nsCSSRendering::CreateNullBorderRendererWithStyleBorder( return Some(br); } Maybe<nsCSSBorderRenderer> nsCSSRendering::CreateBorderRendererForNonThemedOutline( nsPresContext* aPresContext, DrawTarget* aDrawTarget, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, ComputedStyle* aStyle) { static nsRect GetOutlineInnerRect(nsIFrame* aFrame) { nsRect* savedOutlineInnerRect = aFrame->GetProperty(nsIFrame::OutlineInnerRectProperty()); if (savedOutlineInnerRect) { return *savedOutlineInnerRect; } // FIXME bug 1221888 NS_ERROR("we should have saved a frame property"); return nsRect(nsPoint(0, 0), aFrame->GetSize()); } Maybe<nsCSSBorderRenderer> nsCSSRendering::CreateBorderRendererForOutline( nsPresContext* aPresContext, gfxContext* aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, ComputedStyle* aStyle) { // Get our ComputedStyle's color struct. const nsStyleOutline* ourOutline = aStyle->StyleOutline(); if (!ourOutline->ShouldPaintOutline()) { // Empty outline return Nothing(); } nsRect innerRect; if ( #ifdef MOZ_XUL aStyle->GetPseudoType() == PseudoStyleType::XULTree #else false #endif ) { innerRect = aBorderArea; } else { innerRect = GetOutlineInnerRect(aForFrame) + aBorderArea.TopLeft(); } nscoord offset = ourOutline->mOutlineOffset.ToAppUnits(); innerRect.Inflate(offset); // If the dirty rect is completely inside the border area (e.g., only the // content is being painted), then we can skip out now // XXX this isn't exactly true for rounded borders, where the inside curves // may encroach into the content area. A safer calculation would be to // shorten insideRect by the radius one each side before performing this test. if (aInnerRect.Contains(aDirtyRect)) { return Nothing(); } if (innerRect.Contains(aDirtyRect)) return Nothing(); const nscoord offset = ourOutline->mOutlineOffset.ToAppUnits(); nsRect innerRect = aInnerRect; innerRect.Inflate(offset); nscoord width = ourOutline->GetOutlineWidth(); StyleBorderStyle outlineStyle; // Themed outlines are handled by our callers, if supported. if (ourOutline->mOutlineStyle.IsAuto()) { if (StaticPrefs::layout_css_outline_style_auto_enabled()) { nsITheme* theme = aPresContext->Theme(); if (theme->ThemeSupportsWidget(aPresContext, aForFrame, StyleAppearance::FocusOutline)) { theme->DrawWidgetBackground(aRenderingContext, aForFrame, StyleAppearance::FocusOutline, innerRect, aDirtyRect); return Nothing(); } } if (width == 0) { return Nothing(); // empty outline } Loading @@ -979,7 +1010,7 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( } RectCornerRadii outlineRadii; nsRect outerRect = aInnerRect; nsRect outerRect = innerRect; outerRect.Inflate(width); const nscoord oneDevPixel = aPresContext->AppUnitsPerDevPixel(); Loading @@ -1005,9 +1036,8 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( nsCSSBorderRenderer::ComputeOuterRadii(innerRadii, widths, &outlineRadii); } } else { nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aForFrame->GetSize(), outerRect.Size(), Sides(), twipsRadii); nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aBorderArea.Size(), outerRect.Size(), Sides(), twipsRadii); ComputePixelRadii(twipsRadii, oneDevPixel, &outlineRadii); } Loading @@ -1023,20 +1053,21 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline( Rect dirtyRect = NSRectToRect(aDirtyRect, oneDevPixel); DrawTarget* dt = aRenderingContext ? aRenderingContext->GetDrawTarget() : nullptr; return Some(nsCSSBorderRenderer( aPresContext, aDrawTarget, dirtyRect, oRect, outlineStyles, outlineWidths, aPresContext, dt, dirtyRect, oRect, outlineStyles, outlineWidths, outlineRadii, outlineColors, !aForFrame->BackfaceIsHidden(), Nothing())); } void nsCSSRendering::PaintNonThemedOutline(nsPresContext* aPresContext, void nsCSSRendering::PaintOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, ComputedStyle* aStyle) { Maybe<nsCSSBorderRenderer> br = CreateBorderRendererForNonThemedOutline( aPresContext, aRenderingContext.GetDrawTarget(), aForFrame, aDirtyRect, aInnerRect, aStyle); Maybe<nsCSSBorderRenderer> br = CreateBorderRendererForOutline( aPresContext, &aRenderingContext, aForFrame, aDirtyRect, aBorderArea, aStyle); if (!br) { return; } Loading
layout/painting/nsCSSRendering.h +10 −14 Original line number Diff line number Diff line Loading @@ -199,12 +199,9 @@ struct nsCSSRendering { const nsStyleBorder& aBorderStyle, mozilla::ComputedStyle* aStyle, bool* aOutBorderIsEmpty, Sides aSkipSides = Sides()); static mozilla::Maybe<nsCSSBorderRenderer> CreateBorderRendererForNonThemedOutline(nsPresContext* aPresContext, DrawTarget* aDrawTarget, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, static mozilla::Maybe<nsCSSBorderRenderer> CreateBorderRendererForOutline( nsPresContext* aPresContext, gfxContext* aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, mozilla::ComputedStyle* aStyle); static ImgDrawResult CreateWebRenderCommandsForBorder( Loading Loading @@ -232,13 +229,12 @@ struct nsCSSRendering { const nsStyleBorder& aStyleBorder); /** * Render the outline for an element using css rendering rules for borders. * Render the outline for an element using css rendering rules * for borders. */ static void PaintNonThemedOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aInnerRect, static void PaintOutline(nsPresContext* aPresContext, gfxContext& aRenderingContext, nsIFrame* aForFrame, const nsRect& aDirtyRect, const nsRect& aBorderArea, mozilla::ComputedStyle* aStyle); /** Loading
layout/painting/nsDisplayList.cpp +11 −33 Original line number Diff line number Diff line Loading @@ -4768,34 +4768,15 @@ nsRect nsDisplayOutline::GetBounds(nsDisplayListBuilder* aBuilder, return mFrame->InkOverflowRectRelativeToSelf() + ToReferenceFrame(); } nsRect nsDisplayOutline::GetInnerRect() const { nsRect* savedOutlineInnerRect = mFrame->GetProperty(nsIFrame::OutlineInnerRectProperty()); if (savedOutlineInnerRect) { return *savedOutlineInnerRect; } // FIXME bug 1221888 NS_ERROR("we should have saved a frame property"); return nsRect(nsPoint(), mFrame->GetSize()); } void nsDisplayOutline::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { // TODO join outlines together MOZ_ASSERT(mFrame->StyleOutline()->ShouldPaintOutline(), "Should have not created a nsDisplayOutline!"); nsRect rect = GetInnerRect() + ToReferenceFrame(); nsPresContext* pc = mFrame->PresContext(); if (IsThemedOutline()) { rect.Inflate(mFrame->StyleOutline()->mOutlineOffset.ToAppUnits()); pc->Theme()->DrawWidgetBackground( aCtx, mFrame, StyleAppearance::FocusOutline, rect, GetPaintRect()); return; } nsCSSRendering::PaintNonThemedOutline(pc, *aCtx, mFrame, GetPaintRect(), rect, mFrame->Style()); nsPoint offset = ToReferenceFrame(); nsCSSRendering::PaintOutline( mFrame->PresContext(), *aCtx, mFrame, GetPaintRect(), nsRect(offset, mFrame->GetSize()), mFrame->Style()); } bool nsDisplayOutline::IsThemedOutline() const { Loading @@ -4816,19 +4797,16 @@ bool nsDisplayOutline::CreateWebRenderCommands( const StackingContextHelper& aSc, mozilla::layers::RenderRootStateManager* aManager, nsDisplayListBuilder* aDisplayListBuilder) { nsPresContext* pc = mFrame->PresContext(); nsRect rect = GetInnerRect() + ToReferenceFrame(); if (IsThemedOutline()) { rect.Inflate(mFrame->StyleOutline()->mOutlineOffset.ToAppUnits()); return pc->Theme()->CreateWebRenderCommandsForWidget( aBuilder, aResources, aSc, aManager, mFrame, StyleAppearance::FocusOutline, rect); return false; } Maybe<nsCSSBorderRenderer> borderRenderer = nsCSSRendering::CreateBorderRendererForNonThemedOutline( pc, /* aDrawTarget = */ nullptr, mFrame, GetPaintRect(), rect, mFrame->Style()); nsPoint offset = ToReferenceFrame(); mozilla::Maybe<nsCSSBorderRenderer> borderRenderer = nsCSSRendering::CreateBorderRendererForOutline( mFrame->PresContext(), nullptr, mFrame, GetPaintRect(), nsRect(offset, mFrame->GetSize()), mFrame->Style()); if (!borderRenderer) { // No border renderer means "there is no outline". Loading