virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder, bool* aSnap) override { *aSnap = false; nsHTMLCanvasFrame* f = static_cast<nsHTMLCanvasFrame*>(Frame()); HTMLCanvasElement* canvas = HTMLCanvasElement::FromContent(f->GetContent()); nsRegion result; if (canvas->GetIsOpaque()) { // OK, the entire region painted by the canvas is opaque. But what is // that region? It's the canvas's "dest rect" (controlled by the // object-fit/object-position CSS properties), clipped to the container's // content box (which is what GetBounds() returns). So, we grab those // rects and intersect them. nsRect constraintRect = GetBounds(aBuilder, aSnap); // Need intrinsic size & ratio, for ComputeObjectDestRect: nsIntSize canvasSize = f->GetCanvasSize(); IntrinsicSize intrinsicSize = IntrinsicSizeFromCanvasSize(canvasSize); nsSize intrinsicRatio = IntrinsicRatioFromCanvasSize(canvasSize); const nsRect destRect = nsLayoutUtils::ComputeObjectDestRect(constraintRect, intrinsicSize, intrinsicRatio, f->StylePosition()); return nsRegion(destRect.Intersect(constraintRect)); } return result; }
nsRect DisplayItemClip::ApplyNonRoundedIntersection(const nsRect& aRect) const { if (!mHaveClipRect) { return aRect; } nsRect result = aRect.Intersect(mClipRect); for (uint32_t i = 0, iEnd = mRoundedClipRects.Length(); i < iEnd; ++i) { result = result.Intersect(mRoundedClipRects[i].mRect); } return result; }
void nsSVGForeignObjectFrame::InvalidateDirtyRect(const nsRect& aRect, PRUint32 aFlags, bool aDuringReflowSVG) { if (aRect.IsEmpty()) return; // Don't invalidate areas outside our bounds: nsRect rect = aRect.Intersect(nsRect(nsPoint(0,0), mRect.Size())); if (rect.IsEmpty()) return; nsSVGUtils::InvalidateBounds(this, aDuringReflowSVG, &rect, aFlags); }
bool DisplayItemClip::MayIntersect(const nsRect& aRect) const { if (!mHaveClipRect) { return !aRect.IsEmpty(); } nsRect r = aRect.Intersect(mClipRect); if (r.IsEmpty()) { return false; } for (uint32_t i = 0; i < mRoundedClipRects.Length(); ++i) { const RoundedRect& rr = mRoundedClipRects[i]; if (!nsLayoutUtils::RoundedRectIntersectsRect(rr.mRect, rr.mRadii, r)) { return false; } } return true; }
void DisplayListClipState::ClipContentDescendants(const nsRect& aRect, const nsRect& aRoundedRect, const nscoord* aRadii, DisplayItemClip& aClipOnStack) { if (aRadii) { aClipOnStack.SetTo(aRect, aRoundedRect, aRadii); } else { nsRect intersect = aRect.Intersect(aRoundedRect); aClipOnStack.SetTo(intersect); } if (mClipContentDescendants) { aClipOnStack.IntersectWith(*mClipContentDescendants); } mClipContentDescendants = &aClipOnStack; mCurrentCombinedClip = nullptr; }
void nsRootBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (mContent && mContent->GetProperty(nsGkAtoms::DisplayPortMargins)) { // The XUL document's root element may have displayport margins set in // ChromeProcessController::InitializeRoot, and we should to supply the // base rect. nsRect displayPortBase = aDirtyRect.Intersect(nsRect(nsPoint(0, 0), GetSize())); nsLayoutUtils::SetDisplayPortBase(mContent, displayPortBase); } // root boxes don't need a debug border/outline or a selection overlay... // They *may* have a background propagated to them, so force creation // of a background display list element. DisplayBorderBackgroundOutline(aBuilder, aLists, true); BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); }
void nsSVGForeignObjectFrame::InvalidateDirtyRect(nsSVGOuterSVGFrame* aOuter, const nsRect& aRect, PRUint32 aFlags) { if (aRect.IsEmpty()) return; // Don't invalidate areas outside our bounds: nsRect rect = aRect.Intersect(mRect); if (rect.IsEmpty()) return; // The areas dirtied by children are in app units, relative to this frame. // We need to convert the rect from app units in our userspace to app units // relative to our nsSVGOuterSVGFrame's content rect. gfxRect r(aRect.x, aRect.y, aRect.width, aRect.height); r.Scale(1.0 / nsPresContext::AppUnitsPerCSSPixel()); rect = ToCanvasBounds(r, GetCanvasTM(), PresContext()); rect = nsSVGUtils::FindFilterInvalidation(this, rect); aOuter->InvalidateWithFlags(rect, aFlags); }