| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/damage_tracker.h" | 5 #include "cc/damage_tracker.h" |
| 6 | 6 |
| 7 #include "cc/layer_impl.h" | 7 #include "cc/layer_impl.h" |
| 8 #include "cc/layer_tree_host_common.h" | 8 #include "cc/layer_tree_host_common.h" |
| 9 #include "cc/math_util.h" | 9 #include "cc/math_util.h" |
| 10 #include "cc/render_surface_impl.h" | 10 #include "cc/render_surface_impl.h" |
| 11 #include <public/WebFilterOperations.h> | 11 #include <public/WebFilterOperations.h> |
| 12 | 12 |
| 13 using WebKit::WebTransformationMatrix; | |
| 14 | |
| 15 namespace cc { | 13 namespace cc { |
| 16 | 14 |
| 17 scoped_ptr<DamageTracker> DamageTracker::create() | 15 scoped_ptr<DamageTracker> DamageTracker::create() |
| 18 { | 16 { |
| 19 return make_scoped_ptr(new DamageTracker()); | 17 return make_scoped_ptr(new DamageTracker()); |
| 20 } | 18 } |
| 21 | 19 |
| 22 DamageTracker::DamageTracker() | 20 DamageTracker::DamageTracker() |
| 23 : m_forceFullDamageNextUpdate(false), | 21 : m_forceFullDamageNextUpdate(false), |
| 24 m_currentRectHistory(new RectMap), | 22 m_currentRectHistory(new RectMap), |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 | 297 |
| 300 // The surface's old region is now exposed on the target surface, too. | 298 // The surface's old region is now exposed on the target surface, too. |
| 301 targetDamageRect.Union(oldSurfaceRect); | 299 targetDamageRect.Union(oldSurfaceRect); |
| 302 } else { | 300 } else { |
| 303 // Only the surface's damageRect will damage the target surface. | 301 // Only the surface's damageRect will damage the target surface. |
| 304 damageRectInLocalSpace = renderSurface->damageTracker()->currentDamageRe
ct(); | 302 damageRectInLocalSpace = renderSurface->damageTracker()->currentDamageRe
ct(); |
| 305 } | 303 } |
| 306 | 304 |
| 307 // If there was damage, transform it to target space, and possibly contribut
e its reflection if needed. | 305 // If there was damage, transform it to target space, and possibly contribut
e its reflection if needed. |
| 308 if (!damageRectInLocalSpace.IsEmpty()) { | 306 if (!damageRectInLocalSpace.IsEmpty()) { |
| 309 const WebTransformationMatrix& drawTransform = renderSurface->drawTransf
orm(); | 307 const gfx::Transform& drawTransform = renderSurface->drawTransform(); |
| 310 gfx::RectF damageRectInTargetSpace = MathUtil::mapClippedRect(drawTransf
orm, damageRectInLocalSpace); | 308 gfx::RectF damageRectInTargetSpace = MathUtil::mapClippedRect(drawTransf
orm, damageRectInLocalSpace); |
| 311 targetDamageRect.Union(damageRectInTargetSpace); | 309 targetDamageRect.Union(damageRectInTargetSpace); |
| 312 | 310 |
| 313 if (layer->replicaLayer()) { | 311 if (layer->replicaLayer()) { |
| 314 const WebTransformationMatrix& replicaDrawTransform = renderSurface-
>replicaDrawTransform(); | 312 const gfx::Transform& replicaDrawTransform = renderSurface->replicaD
rawTransform(); |
| 315 targetDamageRect.Union(MathUtil::mapClippedRect(replicaDrawTransform
, damageRectInLocalSpace)); | 313 targetDamageRect.Union(MathUtil::mapClippedRect(replicaDrawTransform
, damageRectInLocalSpace)); |
| 316 } | 314 } |
| 317 } | 315 } |
| 318 | 316 |
| 319 // If there was damage on the replica's mask, then the target surface receiv
es that damage as well. | 317 // If there was damage on the replica's mask, then the target surface receiv
es that damage as well. |
| 320 if (layer->replicaLayer() && layer->replicaLayer()->maskLayer()) { | 318 if (layer->replicaLayer() && layer->replicaLayer()->maskLayer()) { |
| 321 LayerImpl* replicaMaskLayer = layer->replicaLayer()->maskLayer(); | 319 LayerImpl* replicaMaskLayer = layer->replicaLayer()->maskLayer(); |
| 322 | 320 |
| 323 bool replicaIsNew = false; | 321 bool replicaIsNew = false; |
| 324 removeRectFromCurrentFrame(replicaMaskLayer->id(), replicaIsNew); | 322 removeRectFromCurrentFrame(replicaMaskLayer->id(), replicaIsNew); |
| 325 | 323 |
| 326 const WebTransformationMatrix& replicaDrawTransform = renderSurface->rep
licaDrawTransform(); | 324 const gfx::Transform& replicaDrawTransform = renderSurface->replicaDrawT
ransform(); |
| 327 gfx::RectF replicaMaskLayerRect = MathUtil::mapClippedRect(replicaDrawTr
ansform, gfx::RectF(gfx::PointF(), replicaMaskLayer->bounds())); | 325 gfx::RectF replicaMaskLayerRect = MathUtil::mapClippedRect(replicaDrawTr
ansform, gfx::RectF(gfx::PointF(), replicaMaskLayer->bounds())); |
| 328 saveRectForNextFrame(replicaMaskLayer->id(), replicaMaskLayerRect); | 326 saveRectForNextFrame(replicaMaskLayer->id(), replicaMaskLayerRect); |
| 329 | 327 |
| 330 // In the current implementation, a change in the replica mask damages t
he entire replica region. | 328 // In the current implementation, a change in the replica mask damages t
he entire replica region. |
| 331 if (replicaIsNew || replicaMaskLayer->layerPropertyChanged() || !replica
MaskLayer->updateRect().IsEmpty()) | 329 if (replicaIsNew || replicaMaskLayer->layerPropertyChanged() || !replica
MaskLayer->updateRect().IsEmpty()) |
| 332 targetDamageRect.Union(replicaMaskLayerRect); | 330 targetDamageRect.Union(replicaMaskLayerRect); |
| 333 } | 331 } |
| 334 | 332 |
| 335 // If the layer has a background filter, this may cause pixels in our surfac
e to be expanded, so we will need to expand any damage | 333 // If the layer has a background filter, this may cause pixels in our surfac
e to be expanded, so we will need to expand any damage |
| 336 // at or below this layer. We expand the damage from this layer too, as we n
eed to readback those pixels from the surface with only | 334 // at or below this layer. We expand the damage from this layer too, as we n
eed to readback those pixels from the surface with only |
| 337 // the contents of layers below this one in them. This means we need to redr
aw any pixels in the surface being used for the blur in | 335 // the contents of layers below this one in them. This means we need to redr
aw any pixels in the surface being used for the blur in |
| 338 // this layer this frame. | 336 // this layer this frame. |
| 339 if (layer->backgroundFilters().hasFilterThatMovesPixels()) | 337 if (layer->backgroundFilters().hasFilterThatMovesPixels()) |
| 340 expandDamageRectInsideRectWithFilters(targetDamageRect, surfaceRectInTar
getSpace, layer->backgroundFilters()); | 338 expandDamageRectInsideRectWithFilters(targetDamageRect, surfaceRectInTar
getSpace, layer->backgroundFilters()); |
| 341 } | 339 } |
| 342 | 340 |
| 343 } // namespace cc | 341 } // namespace cc |
| OLD | NEW |