--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -2305,33 +2305,34 @@ RegisterThemeGeometry(nsDisplayListBuild
borderBox.ToNearestPixels(
aFrame->PresContext()->AppUnitsPerDevPixel())));
}
}
nsDisplayBackgroundImage::nsDisplayBackgroundImage(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
uint32_t aLayer,
+ const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle)
: nsDisplayImageContainer(aBuilder, aFrame)
, mBackgroundStyle(aBackgroundStyle)
+ , mBackgroundRect(aBackgroundRect)
, mLayer(aLayer)
, mIsRasterImage(false)
{
MOZ_COUNT_CTOR(nsDisplayBackgroundImage);
nsPresContext* presContext = mFrame->PresContext();
uint32_t flags = aBuilder->GetBackgroundPaintFlags();
- nsRect borderArea = nsRect(ToReferenceFrame(), mFrame->GetSize());
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->mImage.mLayers[mLayer];
bool isTransformedFixed;
nsBackgroundLayerState state =
nsCSSRendering::PrepareImageLayer(presContext, mFrame, flags,
- borderArea, borderArea, layer,
+ mBackgroundRect, mBackgroundRect, layer,
&isTransformedFixed);
mShouldTreatAsFixed = ComputeShouldTreatAsFixed(isTransformedFixed);
mBounds = GetBoundsInternal(aBuilder);
if (ShouldFixToViewport(aBuilder)) {
mAnimatedGeometryRoot = aBuilder->FindAnimatedGeometryRootFor(this);
}
@@ -2375,42 +2376,43 @@ static nsStyleContext* GetBackgroundStyl
}
return sc;
}
/* static */ void
SetBackgroundClipRegion(DisplayListClipState::AutoSaveRestore& aClipState,
nsIFrame* aFrame, const nsPoint& aToReferenceFrame,
const nsStyleImageLayers::Layer& aLayer,
+ const nsRect& aBackgroundRect,
bool aWillPaintBorder)
{
- nsRect borderBox = nsRect(aToReferenceFrame, aFrame->GetSize());
-
nsCSSRendering::ImageLayerClipState clip;
nsCSSRendering::GetImageLayerClip(aLayer, aFrame, *aFrame->StyleBorder(),
- borderBox, borderBox, aWillPaintBorder,
+ aBackgroundRect, aBackgroundRect, aWillPaintBorder,
aFrame->PresContext()->AppUnitsPerDevPixel(),
&clip);
if (clip.mHasAdditionalBGClipArea) {
aClipState.ClipContentDescendants(clip.mAdditionalBGClipArea, clip.mBGClipArea,
clip.mHasRoundedCorners ? clip.mRadii : nullptr);
} else {
aClipState.ClipContentDescendants(clip.mBGClipArea, clip.mHasRoundedCorners ? clip.mRadii : nullptr);
}
}
/*static*/ bool
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
+ const nsRect& aBackgroundRect,
nsDisplayList* aList)
{
nsStyleContext* bgSC = nullptr;
const nsStyleBackground* bg = nullptr;
+ nsRect bgRect = aBackgroundRect + aBuilder->ToReferenceFrame(aFrame);
nsPresContext* presContext = aFrame->PresContext();
bool isThemed = aFrame->IsThemed();
if (!isThemed) {
bgSC = GetBackgroundStyleContext(aFrame);
if (bgSC) {
bg = bgSC->StyleBackground();
}
}
@@ -2450,33 +2452,33 @@ nsDisplayBackgroundImage::AppendBackgrou
// doesn't help much (there are no tiling issues) and clipping the
// background breaks detection of the element's border-box being
// opaque. For nonzero border-radius we still need it because we
// want to inset the background if possible to avoid antialiasing
// artifacts along the rounded corners.
bool useWillPaintBorderOptimization = willPaintBorder &&
nsLayoutUtils::HasNonZeroCorner(borderStyle->mBorderRadius);
SetBackgroundClipRegion(clipState, aFrame, toRef,
- bg->BottomLayer(),
+ bg->BottomLayer(), bgRect,
useWillPaintBorderOptimization);
}
bgItemList.AppendNewToTop(
- new (aBuilder) nsDisplayBackgroundColor(aBuilder, aFrame, bg,
+ new (aBuilder) nsDisplayBackgroundColor(aBuilder, aFrame, bgRect, bg,
drawBackgroundColor ? color : NS_RGBA(0, 0, 0, 0)));
}
if (isThemed) {
nsITheme* theme = presContext->GetTheme();
if (theme->NeedToClearBackgroundBehindWidget(aFrame, aFrame->StyleDisplay()->mAppearance) &&
aBuilder->IsInRootChromeDocumentOrPopup() && !aBuilder->IsInTransform()) {
bgItemList.AppendNewToTop(
new (aBuilder) nsDisplayClearBackground(aBuilder, aFrame));
}
nsDisplayThemedBackground* bgItem =
- new (aBuilder) nsDisplayThemedBackground(aBuilder, aFrame);
+ new (aBuilder) nsDisplayThemedBackground(aBuilder, aFrame, bgRect);
bgItemList.AppendNewToTop(bgItem);
aList->AppendToTop(&bgItemList);
return true;
}
if (!bg) {
aList->AppendToTop(&bgItemList);
return false;
@@ -2497,22 +2499,22 @@ nsDisplayBackgroundImage::AppendBackgrou
if (bg->mImage.mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) {
needBlendContainer = true;
}
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
if (!aBuilder->IsForEventDelivery()) {
const nsStyleImageLayers::Layer& layer = bg->mImage.mLayers[i];
SetBackgroundClipRegion(clipState, aFrame, toRef,
- layer, willPaintBorder);
+ layer, bgRect, willPaintBorder);
}
nsDisplayList thisItemList;
nsDisplayBackgroundImage* bgItem =
- new (aBuilder) nsDisplayBackgroundImage(aBuilder, aFrame, i, bg);
+ new (aBuilder) nsDisplayBackgroundImage(aBuilder, aFrame, i, bgRect, bg);
if (bgItem->ShouldFixToViewport(aBuilder)) {
thisItemList.AppendNewToTop(
nsDisplayFixedPosition::CreateForFixedBackground(aBuilder, aFrame, bgItem, i));
} else {
thisItemList.AppendNewToTop(bgItem);
}
@@ -2769,44 +2771,37 @@ nsDisplayBackgroundImage::ComputeVisibil
// frame. We don't want this display item to show up and confuse
// anything.
return mBackgroundStyle;
}
/* static */ nsRegion
nsDisplayBackgroundImage::GetInsideClipRegion(nsDisplayItem* aItem,
uint8_t aClip,
- const nsRect& aRect)
+ const nsRect& aRect,
+ const nsRect& aBackgroundRect)
{
nsRegion result;
if (aRect.IsEmpty())
return result;
nsIFrame *frame = aItem->Frame();
- nsRect clipRect;
+ nsRect clipRect = aBackgroundRect;
if (frame->GetType() == nsGkAtoms::canvasFrame) {
nsCanvasFrame* canvasFrame = static_cast<nsCanvasFrame*>(frame);
clipRect = canvasFrame->CanvasArea() + aItem->ToReferenceFrame();
- } else {
- switch (aClip) {
- case NS_STYLE_IMAGELAYER_CLIP_BORDER:
- case NS_STYLE_IMAGELAYER_CLIP_TEXT:
- clipRect = nsRect(aItem->ToReferenceFrame(), frame->GetSize());
- break;
- case NS_STYLE_IMAGELAYER_CLIP_PADDING:
- clipRect = frame->GetPaddingRect() - frame->GetPosition() + aItem->ToReferenceFrame();
- break;
- case NS_STYLE_IMAGELAYER_CLIP_CONTENT:
- clipRect = frame->GetContentRectRelativeToSelf() + aItem->ToReferenceFrame();
- break;
- default:
- NS_NOTREACHED("Unknown clip type");
- return result;
+ } else if (aClip == NS_STYLE_IMAGELAYER_CLIP_PADDING ||
+ aClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT) {
+ nsMargin border = frame->GetUsedBorder();
+ if (aClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT) {
+ border += frame->GetUsedPadding();
}
+ border.ApplySkipSides(frame->GetSkipSides());
+ clipRect.Deflate(border);
}
return clipRect.Intersect(aRect);
}
nsRegion
nsDisplayBackgroundImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) {
@@ -2824,17 +2819,17 @@ nsDisplayBackgroundImage::GetOpaqueRegio
// content order which we'll produce here.
// Of course, if there's only one frame in the flow, it doesn't matter.
if (mFrame->StyleBorder()->mBoxDecorationBreak ==
NS_STYLE_BOX_DECORATION_BREAK_CLONE ||
(!mFrame->GetPrevContinuation() && !mFrame->GetNextContinuation())) {
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->mImage.mLayers[mLayer];
if (layer.mImage.IsOpaque() && layer.mBlendMode == NS_STYLE_BLEND_NORMAL &&
layer.mClip != NS_STYLE_IMAGELAYER_CLIP_TEXT) {
- result = GetInsideClipRegion(this, layer.mClip, mBounds);
+ result = GetInsideClipRegion(this, layer.mClip, mBounds, mBackgroundRect);
}
}
return result;
}
bool
nsDisplayBackgroundImage::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) {
@@ -2850,17 +2845,17 @@ nsDisplayBackgroundImage::GetPositioning
{
if (!mBackgroundStyle) {
return nsRect();
}
nsIFrame* attachedToFrame;
bool transformedFixed;
return nsCSSRendering::ComputeImageLayerPositioningArea(
mFrame->PresContext(), mFrame,
- nsRect(ToReferenceFrame(), mFrame->GetSize()),
+ mBackgroundRect,
mBackgroundStyle->mImage.mLayers[mLayer],
&attachedToFrame,
&transformedFixed) + ToReferenceFrame();
}
bool
nsDisplayBackgroundImage::RenderingMightDependOnPositioningAreaSizeChange()
{
@@ -2902,29 +2897,28 @@ nsDisplayBackgroundImage::Paint(nsDispla
void
nsDisplayBackgroundImage::PaintInternal(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx, const nsRect& aBounds,
nsRect* aClipRect) {
uint32_t flags = aBuilder->GetBackgroundPaintFlags();
CheckForBorderItem(this, flags);
- nsRect borderBox = nsRect(ToReferenceFrame(), mFrame->GetSize());
gfxContext* ctx = aCtx->ThebesContext();
uint8_t clip = mBackgroundStyle->mImage.mLayers[mLayer].mClip;
if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
ctx->Save();
- ClipBackgroundByText(mFrame, aCtx, borderBox);
+ ClipBackgroundByText(mFrame, aCtx, mBackgroundRect);
}
image::DrawResult result =
nsCSSRendering::PaintBackground(mFrame->PresContext(), *aCtx, mFrame,
aBounds,
- borderBox,
+ mBackgroundRect,
flags, aClipRect, mLayer,
CompositionOp::OP_OVER);
if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
ctx->Restore();
}
nsDisplayBackgroundGeometry::UpdateDrawResult(this, result);
@@ -2989,47 +2983,48 @@ nsDisplayBackgroundImage::GetBounds(nsDi
nsRect
nsDisplayBackgroundImage::GetBoundsInternal(nsDisplayListBuilder* aBuilder) {
nsPresContext* presContext = mFrame->PresContext();
if (!mBackgroundStyle) {
return nsRect();
}
- nsRect borderBox = nsRect(ToReferenceFrame(), mFrame->GetSize());
- nsRect clipRect = borderBox;
+ nsRect clipRect = mBackgroundRect;
if (mFrame->GetType() == nsGkAtoms::canvasFrame) {
nsCanvasFrame* frame = static_cast<nsCanvasFrame*>(mFrame);
clipRect = frame->CanvasArea() + ToReferenceFrame();
} else if (nsLayoutUtils::UsesAsyncScrolling(mFrame) && IsNonEmptyFixedImage()) {
// If this is a background-attachment:fixed image, and APZ is enabled,
// async scrolling could reveal additional areas of the image, so don't
// clip it beyond clipping to the document's viewport.
nsIFrame* rootFrame = presContext->PresShell()->GetRootFrame();
nsRect rootRect = rootFrame->GetRectRelativeToSelf();
if (nsLayoutUtils::TransformRect(rootFrame, mFrame, rootRect) == nsLayoutUtils::TRANSFORM_SUCCEEDED) {
clipRect = clipRect.Union(rootRect + aBuilder->ToReferenceFrame(mFrame));
}
}
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->mImage.mLayers[mLayer];
return nsCSSRendering::GetBackgroundLayerRect(presContext, mFrame,
- borderBox, clipRect, layer,
+ mBackgroundRect, clipRect, layer,
aBuilder->GetBackgroundPaintFlags());
}
uint32_t
nsDisplayBackgroundImage::GetPerFrameKey()
{
return (mLayer << nsDisplayItem::TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
nsDisplayThemedBackground::nsDisplayThemedBackground(nsDisplayListBuilder* aBuilder,
- nsIFrame* aFrame)
+ nsIFrame* aFrame,
+ const nsRect& aBackgroundRect)
: nsDisplayItem(aBuilder, aFrame)
+ , mBackgroundRect(aBackgroundRect)
{
MOZ_COUNT_CTOR(nsDisplayThemedBackground);
const nsStyleDisplay* disp = mFrame->StyleDisplay();
mAppearance = disp->mAppearance;
mFrame->IsThemed(disp, &mThemeTransparency);
// Perform necessary RegisterThemeGeometry
@@ -3062,30 +3057,30 @@ nsDisplayThemedBackground::WriteDebugInf
}
void
nsDisplayThemedBackground::HitTest(nsDisplayListBuilder* aBuilder,
const nsRect& aRect,
HitTestState* aState,
nsTArray<nsIFrame*> *aOutFrames)
{
- // Assume that any point in our border rect is a hit.
- if (nsRect(ToReferenceFrame(), mFrame->GetSize()).Intersects(aRect)) {
+ // Assume that any point in our background rect is a hit.
+ if (mBackgroundRect.Intersects(aRect)) {
aOutFrames->AppendElement(mFrame);
}
}
nsRegion
nsDisplayThemedBackground::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) {
nsRegion result;
*aSnap = false;
if (mThemeTransparency == nsITheme::eOpaque) {
- result = nsRect(ToReferenceFrame(), mFrame->GetSize());
+ result = mBackgroundRect;
}
return result;
}
bool
nsDisplayThemedBackground::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) {
if (mAppearance == NS_THEME_WIN_BORDERLESS_GLASS ||
mAppearance == NS_THEME_WIN_GLASS) {
@@ -3100,17 +3095,17 @@ nsDisplayThemedBackground::ProvidesFontS
{
nsITheme* theme = mFrame->PresContext()->GetTheme();
return theme->WidgetProvidesFontSmoothingBackgroundColor(mFrame, mAppearance, aColor);
}
nsRect
nsDisplayThemedBackground::GetPositioningArea()
{
- return nsRect(ToReferenceFrame(), mFrame->GetSize());
+ return mBackgroundRect;
}
void
nsDisplayThemedBackground::Paint(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx)
{
PaintInternal(aBuilder, aCtx, mVisibleRect, nullptr);
}
@@ -3119,22 +3114,21 @@ nsDisplayThemedBackground::Paint(nsDispl
void
nsDisplayThemedBackground::PaintInternal(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx, const nsRect& aBounds,
nsRect* aClipRect)
{
// XXXzw this ignores aClipRect.
nsPresContext* presContext = mFrame->PresContext();
nsITheme *theme = presContext->GetTheme();
- nsRect borderArea(ToReferenceFrame(), mFrame->GetSize());
- nsRect drawing(borderArea);
+ nsRect drawing(mBackgroundRect);
theme->GetWidgetOverflow(presContext->DeviceContext(), mFrame, mAppearance,
&drawing);
drawing.IntersectRect(drawing, aBounds);
- theme->DrawWidgetBackground(aCtx, mFrame, mAppearance, borderArea, drawing);
+ theme->DrawWidgetBackground(aCtx, mFrame, mAppearance, mBackgroundRect, drawing);
}
bool nsDisplayThemedBackground::IsWindowActive()
{
EventStates docState = mFrame->GetContent()->OwnerDoc()->GetDocumentState();
return !docState.HasState(NS_DOCUMENT_STATE_WINDOW_INACTIVE);
}
@@ -3169,17 +3163,17 @@ nsDisplayThemedBackground::GetBounds(nsD
*aSnap = true;
return mBounds;
}
nsRect
nsDisplayThemedBackground::GetBoundsInternal() {
nsPresContext* presContext = mFrame->PresContext();
- nsRect r(nsPoint(0,0), mFrame->GetSize());
+ nsRect r = mBackgroundRect - ToReferenceFrame();
presContext->GetTheme()->
GetWidgetOverflow(presContext->DeviceContext(), mFrame,
mFrame->StyleDisplay()->mAppearance, &r);
return r + ToReferenceFrame();
}
void
nsDisplayImageContainer::ConfigureLayer(ImageLayer* aLayer,
@@ -3314,52 +3308,50 @@ nsDisplayBackgroundColor::CanApplyOpacit
void
nsDisplayBackgroundColor::Paint(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx)
{
if (mColor == Color()) {
return;
}
- nsRect borderBox = nsRect(ToReferenceFrame(), mFrame->GetSize());
-
#if 0
// See https://bugzilla.mozilla.org/show_bug.cgi?id=1148418#c21 for why this
// results in a precision induced rounding issue that makes the rect one
// pixel shorter in rare cases. Disabled in favor of the old code for now.
// Note that the pref layout.css.devPixelsPerPx needs to be set to 1 to
// reproduce the bug.
//
// TODO:
// This new path does not include support for background-clip:text; need to
// be fixed if/when we switch to this new code path.
DrawTarget& aDrawTarget = *aCtx->GetDrawTarget();
- Rect rect = NSRectToSnappedRect(borderBox,
+ Rect rect = NSRectToSnappedRect(mBackgroundRect,
mFrame->PresContext()->AppUnitsPerDevPixel(),
aDrawTarget);
ColorPattern color(ToDeviceColor(mColor));
aDrawTarget.FillRect(rect, color);
#else
gfxContext* ctx = aCtx->ThebesContext();
uint8_t clip = mBackgroundStyle->mImage.mLayers[0].mClip;
if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
gfxContextAutoSaveRestore save(ctx);
- ClipBackgroundByText(mFrame, aCtx, borderBox);
+ ClipBackgroundByText(mFrame, aCtx, mBackgroundRect);
ctx->SetColor(mColor);
ctx->Fill();
return;
}
gfxRect bounds =
- nsLayoutUtils::RectToGfxRect(borderBox, mFrame->PresContext()->AppUnitsPerDevPixel());
+ nsLayoutUtils::RectToGfxRect(mBackgroundRect, mFrame->PresContext()->AppUnitsPerDevPixel());
ctx->SetColor(mColor);
ctx->NewPath();
ctx->Rectangle(bounds, true);
ctx->Fill();
#endif
}
@@ -3374,19 +3366,18 @@ nsDisplayBackgroundColor::GetOpaqueRegio
}
if (!mBackgroundStyle)
return nsRegion();
*aSnap = true;
const nsStyleImageLayers::Layer& bottomLayer = mBackgroundStyle->BottomLayer();
- nsRect borderBox = nsRect(ToReferenceFrame(), mFrame->GetSize());
return nsDisplayBackgroundImage::GetInsideClipRegion(this, bottomLayer.mClip,
- borderBox);
+ mBackgroundRect, mBackgroundRect);
}
bool
nsDisplayBackgroundColor::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor)
{
*aColor = mColor.ToABGR();
return true;
}
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -2656,26 +2656,28 @@ private:
*/
class nsDisplayBackgroundImage : public nsDisplayImageContainer {
public:
/**
* aLayer signifies which background layer this item represents.
* aIsThemed should be the value of aFrame->IsThemed.
* aBackgroundStyle should be the result of
* nsCSSRendering::FindBackground, or null if FindBackground returned false.
+ * aBackgroundRect is relative to aFrame.
*/
nsDisplayBackgroundImage(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
- uint32_t aLayer,
+ uint32_t aLayer, const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle);
virtual ~nsDisplayBackgroundImage();
// This will create and append new items for all the layers of the
// background. Returns whether we appended a themed background.
static bool AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
+ const nsRect& aBackgroundRect,
nsDisplayList* aList);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters) override;
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
@@ -2722,17 +2724,17 @@ public:
nsRegion* aInvalidRegion) override;
virtual bool CanOptimizeToImageLayer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder) override;
virtual already_AddRefed<imgIContainer> GetImage() override;
virtual nsRect GetDestRect() override;
static nsRegion GetInsideClipRegion(nsDisplayItem* aItem, uint8_t aClip,
- const nsRect& aRect);
+ const nsRect& aRect, const nsRect& aBackgroundRect);
virtual bool ShouldFixToViewport(nsDisplayListBuilder* aBuilder) override;
protected:
typedef class mozilla::layers::ImageContainer ImageContainer;
typedef class mozilla::layers::ImageLayer ImageLayer;
bool TryOptimizeToImageLayer(LayerManager* aManager, nsDisplayListBuilder* aBuilder);
@@ -2753,33 +2755,35 @@ protected:
};
ImageLayerization ShouldCreateOwnLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
// Cache the result of nsCSSRendering::FindBackground. Always null if
// mIsThemed is true or if FindBackground returned false.
const nsStyleBackground* mBackgroundStyle;
nsCOMPtr<imgIContainer> mImage;
+ nsRect mBackgroundRect; // relative to the reference frame
nsRect mFillRect;
nsRect mDestRect;
/* Bounds of this display item */
nsRect mBounds;
uint32_t mLayer;
bool mIsRasterImage;
/* Whether the image should be treated as fixed to the viewport. */
bool mShouldTreatAsFixed;
};
/**
* A display item to paint the native theme background for a frame.
*/
class nsDisplayThemedBackground : public nsDisplayItem {
public:
- nsDisplayThemedBackground(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame);
+ nsDisplayThemedBackground(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
+ const nsRect& aBackgroundRect);
virtual ~nsDisplayThemedBackground();
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) override;
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) override;
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override;
virtual bool ProvidesFontSmoothingBackgroundColor(nscolor* aColor) override;
@@ -2815,30 +2819,33 @@ public:
virtual void WriteDebugInfo(std::stringstream& aStream) override;
protected:
nsRect GetBoundsInternal();
void PaintInternal(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx,
const nsRect& aBounds, nsRect* aClipRect);
+ nsRect mBackgroundRect;
nsRect mBounds;
nsITheme::Transparency mThemeTransparency;
uint8_t mAppearance;
};
class nsDisplayBackgroundColor : public nsDisplayItem
{
typedef mozilla::gfx::Color Color;
public:
nsDisplayBackgroundColor(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
+ const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle,
nscolor aColor)
: nsDisplayItem(aBuilder, aFrame)
+ , mBackgroundRect(aBackgroundRect)
, mBackgroundStyle(aBackgroundStyle)
, mColor(Color::FromABGR(aColor))
{ }
virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) override;
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) override;
@@ -2849,17 +2856,17 @@ public:
virtual void ApplyOpacity(nsDisplayListBuilder* aBuilder,
float aOpacity,
const DisplayItemClip* aClip) override;
virtual bool CanApplyOpacity() const override;
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) override
{
*aSnap = true;
- return nsRect(ToReferenceFrame(), Frame()->GetSize());
+ return mBackgroundRect;
}
virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
{
return new nsDisplaySolidColorGeometry(this, aBuilder, mColor.ToABGR());
}
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
@@ -2874,16 +2881,17 @@ public:
}
ComputeInvalidationRegionDifference(aBuilder, geometry, aInvalidRegion);
}
NS_DISPLAY_DECL_NAME("BackgroundColor", TYPE_BACKGROUND_COLOR)
virtual void WriteDebugInfo(std::stringstream& aStream) override;
protected:
+ const nsRect mBackgroundRect;
const nsStyleBackground* mBackgroundStyle;
mozilla::gfx::Color mColor;
};
class nsDisplayClearBackground : public nsDisplayItem
{
public:
nsDisplayClearBackground(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)