mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 00:01:50 +00:00
Bug 934860 - Don't paint display items that don't intersect the current invalid rects. r=roc
This commit is contained in:
parent
c0af504d85
commit
1077db1b3c
@ -3170,12 +3170,21 @@ FrameLayerBuilder::RecomputeVisibilityForItems(nsTArray<ClippedDisplayItem>& aIt
|
||||
|
||||
void
|
||||
FrameLayerBuilder::PaintItems(nsTArray<ClippedDisplayItem>& aItems,
|
||||
const nsIntRect& aRect,
|
||||
gfxContext *aContext,
|
||||
nsRenderingContext *aRC,
|
||||
nsDisplayListBuilder* aBuilder,
|
||||
nsPresContext* aPresContext,
|
||||
const nsIntPoint& aOffset,
|
||||
float aXScale, float aYScale,
|
||||
int32_t aCommonClipCount)
|
||||
{
|
||||
int32_t appUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel();
|
||||
nsRect boundRect = aRect.ToAppUnits(appUnitsPerDevPixel);
|
||||
boundRect.MoveBy(NSIntPixelsToAppUnits(aOffset.x, appUnitsPerDevPixel),
|
||||
NSIntPixelsToAppUnits(aOffset.y, appUnitsPerDevPixel));
|
||||
boundRect.ScaleInverseRoundOut(aXScale, aYScale);
|
||||
|
||||
DisplayItemClip currentClip;
|
||||
bool currentClipIsSetInContext = false;
|
||||
DisplayItemClip tmpClip;
|
||||
@ -3183,7 +3192,8 @@ FrameLayerBuilder::PaintItems(nsTArray<ClippedDisplayItem>& aItems,
|
||||
for (uint32_t i = 0; i < aItems.Length(); ++i) {
|
||||
ClippedDisplayItem* cdi = &aItems[i];
|
||||
|
||||
if (cdi->mItem->GetVisibleRect().IsEmpty())
|
||||
nsRect paintRect = cdi->mItem->GetVisibleRect().Intersect(boundRect);
|
||||
if (paintRect.IsEmpty())
|
||||
continue;
|
||||
|
||||
// If the new desired clip state is different from the current state,
|
||||
@ -3364,8 +3374,9 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer,
|
||||
aContext->Translate(aLayer->GetResidualTranslation() - gfxPoint(offset.x, offset.y));
|
||||
aContext->Scale(userData->mXScale, userData->mYScale);
|
||||
|
||||
layerBuilder->PaintItems(entry->mItems, aContext, rc,
|
||||
layerBuilder->PaintItems(entry->mItems, *iterRect, aContext, rc,
|
||||
builder, presContext,
|
||||
offset, userData->mXScale, userData->mYScale,
|
||||
entry->mCommonClipCount);
|
||||
}
|
||||
} else {
|
||||
@ -3375,8 +3386,9 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer,
|
||||
aContext->Translate(aLayer->GetResidualTranslation() - gfxPoint(offset.x, offset.y));
|
||||
aContext->Scale(userData->mXScale, userData->mYScale);
|
||||
|
||||
layerBuilder->PaintItems(entry->mItems, aContext, rc,
|
||||
layerBuilder->PaintItems(entry->mItems, aRegionToDraw.GetBounds(), aContext, rc,
|
||||
builder, presContext,
|
||||
offset, userData->mXScale, userData->mYScale,
|
||||
entry->mCommonClipCount);
|
||||
}
|
||||
|
||||
|
@ -530,10 +530,13 @@ protected:
|
||||
float aYScale);
|
||||
|
||||
void PaintItems(nsTArray<ClippedDisplayItem>& aItems,
|
||||
const nsIntRect& aRect,
|
||||
gfxContext* aContext,
|
||||
nsRenderingContext* aRC,
|
||||
nsDisplayListBuilder* aBuilder,
|
||||
nsPresContext* aPresContext,
|
||||
const nsIntPoint& aOffset,
|
||||
float aXScale, float aYScale,
|
||||
int32_t aCommonClipCount);
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user