Chromium Code Reviews| Index: cc/trees/damage_tracker.cc |
| diff --git a/cc/trees/damage_tracker.cc b/cc/trees/damage_tracker.cc |
| index 5dff7581824556b505863ed27ef94bdcee526699..aa738a389863b600ae7714dce41105a949c9d265 100644 |
| --- a/cc/trees/damage_tracker.cc |
| +++ b/cc/trees/damage_tracker.cc |
| @@ -25,8 +25,7 @@ std::unique_ptr<DamageTracker> DamageTracker::Create() { |
| return base::WrapUnique(new DamageTracker()); |
| } |
| -DamageTracker::DamageTracker() |
| - : mailboxId_(0) {} |
| +DamageTracker::DamageTracker() : mailboxId_(0) {} |
| DamageTracker::~DamageTracker() {} |
| @@ -364,7 +363,6 @@ void DamageTracker::AccumulateDamageFromLayer(LayerImpl* layer) { |
| // its target RenderSurface, even if that layer owns the target RenderSurface |
| // itself. To consider how a layer's target surface contributes to the |
| // ancestor surface, ExtendDamageForRenderSurface() must be called instead. |
| - |
| bool layer_is_new = false; |
| LayerRectMapData& data = RectDataForLayer(layer->id(), &layer_is_new); |
| gfx::Rect old_rect_in_target_space = data.rect_; |
| @@ -380,19 +378,21 @@ void DamageTracker::AccumulateDamageFromLayer(LayerImpl* layer) { |
| // The layer's old region is now exposed on the target surface, too. |
| // Note old_rect_in_target_space is already in target space. |
| damage_for_this_update_.Union(old_rect_in_target_space); |
| - return; |
| + } else { |
| + // If the layer properties haven't changed, then the the target surface is |
| + // only affected by the layer's damaged area, which could be empty. |
| + gfx::Rect damage_rect = |
| + gfx::UnionRects(layer->update_rect(), layer->damage_rect()); |
| + damage_rect.Intersect(gfx::Rect(layer->bounds())); |
| + if (!damage_rect.IsEmpty()) { |
| + gfx::Rect damage_rect_in_target_space = MathUtil::MapEnclosingClippedRect( |
| + layer->DrawTransform(), damage_rect); |
| + damage_for_this_update_.Union(damage_rect_in_target_space); |
| + } |
| } |
| - // If the layer properties haven't changed, then the the target surface is |
| - // only affected by the layer's damaged area, which could be empty. |
| - gfx::Rect damage_rect = |
| - gfx::UnionRects(layer->update_rect(), layer->damage_rect()); |
| - damage_rect.Intersect(gfx::Rect(layer->bounds())); |
| - if (!damage_rect.IsEmpty()) { |
| - gfx::Rect damage_rect_in_target_space = |
| - MathUtil::MapEnclosingClippedRect(layer->DrawTransform(), damage_rect); |
| - damage_for_this_update_.Union(damage_rect_in_target_space); |
| - } |
| + if (layer_is_new || !layer->LayerPropertyChanged()) |
|
wutao
2017/06/09 19:19:10
This might need special check:
If the layer is the
|
| + has_damage_from_contributing_content_ |= !damage_for_this_update_.IsEmpty(); |
| } |
| void DamageTracker::AccumulateDamageFromRenderSurface( |
| @@ -456,6 +456,9 @@ void DamageTracker::AccumulateDamageFromRenderSurface( |
| ExpandDamageInsideRectWithFilters(surface_rect_in_target_space, |
| background_filters); |
| } |
| + |
| + if (surface_is_new || !render_surface->SurfacePropertyChanged()) |
| + has_damage_from_contributing_content_ |= !damage_for_this_update_.IsEmpty(); |
| } |
| bool DamageTracker::DamageAccumulator::GetAsRect(gfx::Rect* rect) { |