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:
Kan-Ru Chen 2016-05-19 16:07:52 +08:00
parent d076cfb561
commit d5a5ebb1c5
4 changed files with 50 additions and 52 deletions

View File

@ -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;

View File

@ -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

View File

@ -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,

View File

@ -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()) {