mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1271931 - Make DisplayItem::IsUniform to return Maybe<nscolor>. r=tnikkel
Maybe<nscolor> ensures that correct value is returned and also makes the error checking clearer than using a out param. MozReview-Commit-ID: 39uHIFCZzqn --HG-- extra : rebase_source : 1885906646ebc9739c86aecb2b8e4bd0ee02e97f
This commit is contained in:
parent
d076cfb561
commit
d5a5ebb1c5
@ -2512,9 +2512,9 @@ ContainerState::FindOpaqueBackgroundColorInLayer(const PaintedLayerData* aData,
|
||||
return NS_RGBA(0,0,0,0);
|
||||
}
|
||||
|
||||
nscolor color;
|
||||
if (item->IsUniform(mBuilder, &color) && NS_GET_A(color) == 255)
|
||||
return color;
|
||||
Maybe<nscolor> color = item->IsUniform(mBuilder);
|
||||
if (color && NS_GET_A(*color) == 255)
|
||||
return *color;
|
||||
|
||||
return NS_RGBA(0,0,0,0);
|
||||
}
|
||||
@ -3422,34 +3422,33 @@ PaintedLayerData::Accumulate(ContainerState* aState,
|
||||
}
|
||||
}
|
||||
|
||||
nscolor uniformColor;
|
||||
bool isUniform = aItem->IsUniform(aState->mBuilder, &uniformColor);
|
||||
Maybe<nscolor> uniformColor = aItem->IsUniform(aState->mBuilder);
|
||||
|
||||
// Some display items have to exist (so they can set forceTransparentSurface
|
||||
// below) but don't draw anything. They'll return true for isUniform but
|
||||
// a color with opacity 0.
|
||||
if (!isUniform || NS_GET_A(uniformColor) > 0) {
|
||||
if (!uniformColor || NS_GET_A(*uniformColor) > 0) {
|
||||
// Make sure that the visible area is covered by uniform pixels. In
|
||||
// particular this excludes cases where the edges of the item are not
|
||||
// pixel-aligned (thus the item will not be truly uniform).
|
||||
if (isUniform) {
|
||||
if (uniformColor) {
|
||||
bool snap;
|
||||
nsRect bounds = aItem->GetBounds(aState->mBuilder, &snap);
|
||||
if (!aState->ScaleToInsidePixels(bounds, snap).Contains(aVisibleRect)) {
|
||||
isUniform = false;
|
||||
uniformColor = Nothing();
|
||||
FLB_LOG_PAINTED_LAYER_DECISION(this, " Display item does not cover the visible rect\n");
|
||||
}
|
||||
}
|
||||
if (isUniform) {
|
||||
if (uniformColor) {
|
||||
if (isFirstVisibleItem) {
|
||||
// This color is all we have
|
||||
mSolidColor = uniformColor;
|
||||
mSolidColor = *uniformColor;
|
||||
mIsSolidColorInVisibleRegion = true;
|
||||
} else if (mIsSolidColorInVisibleRegion &&
|
||||
mVisibleRegion.IsEqual(nsIntRegion(aVisibleRect)) &&
|
||||
clipMatches) {
|
||||
// we can just blend the colors together
|
||||
mSolidColor = NS_ComposeColors(mSolidColor, uniformColor);
|
||||
mSolidColor = NS_ComposeColors(mSolidColor, *uniformColor);
|
||||
} else {
|
||||
FLB_LOG_PAINTED_LAYER_DECISION(this, " Layer not a solid color: Can't blend colors togethers\n");
|
||||
mIsSolidColorInVisibleRegion = false;
|
||||
|
@ -2883,13 +2883,12 @@ nsDisplayBackgroundImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
nsDisplayBackgroundImage::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) {
|
||||
Maybe<nscolor>
|
||||
nsDisplayBackgroundImage::IsUniform(nsDisplayListBuilder* aBuilder) {
|
||||
if (!mBackgroundStyle) {
|
||||
*aColor = NS_RGBA(0,0,0,0);
|
||||
return true;
|
||||
return Some(NS_RGBA(0,0,0,0));
|
||||
}
|
||||
return false;
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
nsRect
|
||||
@ -3134,14 +3133,13 @@ nsDisplayThemedBackground::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
nsDisplayThemedBackground::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) {
|
||||
Maybe<nscolor>
|
||||
nsDisplayThemedBackground::IsUniform(nsDisplayListBuilder* aBuilder) {
|
||||
if (mAppearance == NS_THEME_WIN_BORDERLESS_GLASS ||
|
||||
mAppearance == NS_THEME_WIN_GLASS) {
|
||||
*aColor = NS_RGBA(0,0,0,0);
|
||||
return true;
|
||||
return Some(NS_RGBA(0,0,0,0));
|
||||
}
|
||||
return false;
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
bool
|
||||
@ -3432,11 +3430,10 @@ nsDisplayBackgroundColor::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
mBackgroundRect, mBackgroundRect);
|
||||
}
|
||||
|
||||
bool
|
||||
nsDisplayBackgroundColor::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor)
|
||||
Maybe<nscolor>
|
||||
nsDisplayBackgroundColor::IsUniform(nsDisplayListBuilder* aBuilder)
|
||||
{
|
||||
*aColor = mColor.ToABGR();
|
||||
return true;
|
||||
return Some(mColor.ToABGR());
|
||||
}
|
||||
|
||||
void
|
||||
@ -4096,9 +4093,10 @@ nsDisplayWrapList::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
return result;
|
||||
}
|
||||
|
||||
bool nsDisplayWrapList::IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) {
|
||||
// We could try to do something but let's conservatively just return false.
|
||||
return false;
|
||||
Maybe<nscolor>
|
||||
nsDisplayWrapList::IsUniform(nsDisplayListBuilder* aBuilder) {
|
||||
// We could try to do something but let's conservatively just return Nothing.
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
void nsDisplayWrapList::Paint(nsDisplayListBuilder* aBuilder,
|
||||
@ -6272,19 +6270,23 @@ nsRegion nsDisplayTransform::GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
|
||||
* wrapped list is uniform. See GetOpaqueRegion for discussion of why this
|
||||
* works.
|
||||
*/
|
||||
bool nsDisplayTransform::IsUniform(nsDisplayListBuilder *aBuilder, nscolor* aColor)
|
||||
Maybe<nscolor>
|
||||
nsDisplayTransform::IsUniform(nsDisplayListBuilder *aBuilder)
|
||||
{
|
||||
nsRect untransformedVisible;
|
||||
if (!UntransformVisibleRect(aBuilder, &untransformedVisible)) {
|
||||
return false;
|
||||
return Nothing();
|
||||
}
|
||||
const Matrix4x4& matrix = GetTransform();
|
||||
|
||||
Matrix matrix2d;
|
||||
return matrix.Is2D(&matrix2d) &&
|
||||
matrix2d.PreservesAxisAlignedRectangles() &&
|
||||
mStoredList.GetVisibleRect().Contains(untransformedVisible) &&
|
||||
mStoredList.IsUniform(aBuilder, aColor);
|
||||
if (matrix.Is2D(&matrix2d) &&
|
||||
matrix2d.PreservesAxisAlignedRectangles() &&
|
||||
mStoredList.GetVisibleRect().Contains(untransformedVisible)) {
|
||||
return mStoredList.IsUniform(aBuilder);
|
||||
}
|
||||
|
||||
return Nothing();
|
||||
}
|
||||
|
||||
/* If UNIFIED_CONTINUATIONS is defined, we can merge two display lists that
|
||||
|
@ -1559,11 +1559,11 @@ public:
|
||||
return nsRegion();
|
||||
}
|
||||
/**
|
||||
* If this returns true, then aColor is set to the uniform color
|
||||
* @return true if the item is guaranteed to paint every pixel in its
|
||||
* @return Some(nscolor) if the item is guaranteed to paint every pixel in its
|
||||
* bounds with the same (possibly translucent) color
|
||||
*/
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) { return false; }
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder)
|
||||
{ return mozilla::Nothing(); }
|
||||
/**
|
||||
* @return true if the contents of this item are rendered fixed relative
|
||||
* to the nearest viewport.
|
||||
@ -2621,10 +2621,9 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override
|
||||
{
|
||||
*aColor = mColor;
|
||||
return true;
|
||||
return mozilla::Some(mColor);
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -2701,7 +2700,7 @@ public:
|
||||
nsRegion* aVisibleRegion) override;
|
||||
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
bool* aSnap) override;
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override;
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override;
|
||||
/**
|
||||
* GetBounds() returns the background painting area.
|
||||
*/
|
||||
@ -2797,7 +2796,7 @@ public:
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) override;
|
||||
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
bool* aSnap) override;
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override;
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override;
|
||||
virtual bool ProvidesFontSmoothingBackgroundColor(nscolor* aColor) override;
|
||||
|
||||
/**
|
||||
@ -2861,7 +2860,7 @@ public:
|
||||
|
||||
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
bool* aSnap) override;
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override;
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override;
|
||||
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) override;
|
||||
|
||||
@ -2922,10 +2921,9 @@ public:
|
||||
return GetBounds(aBuilder, aSnap);
|
||||
}
|
||||
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override
|
||||
{
|
||||
*aColor = NS_RGBA(0, 0, 0, 0);
|
||||
return true;
|
||||
return mozilla::Some(NS_RGBA(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
virtual bool ClearsBackground() override
|
||||
@ -3233,7 +3231,7 @@ public:
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) override;
|
||||
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
|
||||
bool* aSnap) override;
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override;
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override;
|
||||
virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) override;
|
||||
virtual bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
nsRegion* aVisibleRegion) override;
|
||||
@ -3934,7 +3932,7 @@ public:
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder *aBuilder, bool* aSnap) override;
|
||||
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
|
||||
bool* aSnap) override;
|
||||
virtual bool IsUniform(nsDisplayListBuilder *aBuilder, nscolor* aColor) override;
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder *aBuilder) override;
|
||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aParameters) override;
|
||||
@ -4258,9 +4256,9 @@ public:
|
||||
return mList.GetOpaqueRegion(aBuilder, aSnap);
|
||||
}
|
||||
|
||||
virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) override
|
||||
virtual mozilla::Maybe<nscolor> IsUniform(nsDisplayListBuilder* aBuilder) override
|
||||
{
|
||||
return mList.IsUniform(aBuilder, aColor);
|
||||
return mList.IsUniform(aBuilder);
|
||||
}
|
||||
|
||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
|
@ -134,7 +134,6 @@ PrintDisplayItemTo(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem,
|
||||
bool snap;
|
||||
nsRect rect = aItem->GetBounds(aBuilder, &snap);
|
||||
nsRect layerRect = rect - (*aItem->GetAnimatedGeometryRoot())->GetOffsetToCrossDoc(aItem->ReferenceFrame());
|
||||
nscolor color;
|
||||
nsRect vis = aItem->GetVisibleRect();
|
||||
nsRect component = aItem->GetComponentAlphaBounds(aBuilder);
|
||||
nsDisplayList* list = aItem->GetChildren();
|
||||
@ -159,7 +158,7 @@ PrintDisplayItemTo(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem,
|
||||
component.x, component.y, component.width, component.height,
|
||||
clip.ToString().get(),
|
||||
DisplayItemScrollClip::ToString(aItem->ScrollClip()).get(),
|
||||
aItem->IsUniform(aBuilder, &color) ? " uniform" : "",
|
||||
aItem->IsUniform(aBuilder) ? " uniform" : "",
|
||||
aItem->ReferenceFrame(), aItem->GetAnimatedGeometryRoot()->mFrame);
|
||||
|
||||
for (auto iter = opaque.RectIter(); !iter.Done(); iter.Next()) {
|
||||
|
Loading…
Reference in New Issue
Block a user