Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/paint/PaintInvalidator.h" | 5 #include "core/paint/PaintInvalidator.h" |
| 6 | 6 |
| 7 #include "core/editing/FrameSelection.h" | 7 #include "core/editing/FrameSelection.h" |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/LocalFrame.h" | 9 #include "core/frame/LocalFrame.h" |
| 10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 } else if (object == context.paint_invalidation_container) { | 100 } else if (object == context.paint_invalidation_container) { |
| 101 result = LayoutRect(rect); | 101 result = LayoutRect(rect); |
| 102 } else { | 102 } else { |
| 103 // For non-root SVG, the input rect is in local SVG coordinates in which | 103 // For non-root SVG, the input rect is in local SVG coordinates in which |
| 104 // paint offset doesn't apply. | 104 // paint offset doesn't apply. |
| 105 if (!is_svg_child) | 105 if (!is_svg_child) |
| 106 rect.MoveBy(Point(object.PaintOffset())); | 106 rect.MoveBy(Point(object.PaintOffset())); |
| 107 | 107 |
| 108 auto container_contents_properties = | 108 auto container_contents_properties = |
| 109 context.paint_invalidation_container->ContentsProperties(); | 109 context.paint_invalidation_container->ContentsProperties(); |
| 110 if (context.tree_builder_context_->current.transform == | 110 if (context.tree_builder_context_->fragments[0].current.transform == |
|
chrishtr
2017/04/27 22:25:41
The next patch will update PaintInvalidator also.
| |
| 111 container_contents_properties.Transform() && | 111 container_contents_properties.Transform() && |
| 112 context.tree_builder_context_->current.clip == | 112 context.tree_builder_context_->fragments[0].current.clip == |
| 113 container_contents_properties.Clip()) { | 113 container_contents_properties.Clip()) { |
| 114 result = LayoutRect(rect); | 114 result = LayoutRect(rect); |
| 115 } else { | 115 } else { |
| 116 // Use enclosingIntRect to ensure the final visual rect will cover the | 116 // Use enclosingIntRect to ensure the final visual rect will cover the |
| 117 // rect in source coordinates no matter if the painting will use pixel | 117 // rect in source coordinates no matter if the painting will use pixel |
| 118 // snapping, when transforms are applied. If there is no transform, | 118 // snapping, when transforms are applied. If there is no transform, |
| 119 // enclosingIntRect is applied in the last step of paint invalidation | 119 // enclosingIntRect is applied in the last step of paint invalidation |
| 120 // (see CompositedLayerMapping::setContentsNeedDisplayInRect()). | 120 // (see CompositedLayerMapping::setContentsNeedDisplayInRect()). |
| 121 if (!is_svg_child && context.tree_builder_context_->current.transform != | 121 if (!is_svg_child && |
| 122 container_contents_properties.Transform()) | 122 context.tree_builder_context_->fragments[0].current.transform != |
| 123 container_contents_properties.Transform()) | |
| 123 rect = Rect(EnclosingIntRect(rect)); | 124 rect = Rect(EnclosingIntRect(rect)); |
| 124 | 125 |
| 125 PropertyTreeState current_tree_state( | 126 PropertyTreeState current_tree_state( |
| 126 context.tree_builder_context_->current.transform, | 127 context.tree_builder_context_->fragments[0].current.transform, |
| 127 context.tree_builder_context_->current.clip, nullptr); | 128 context.tree_builder_context_->fragments[0].current.clip, nullptr); |
| 128 | 129 |
| 129 FloatClipRect float_rect((FloatRect(rect))); | 130 FloatClipRect float_rect((FloatRect(rect))); |
| 130 GeometryMapper::SourceToDestinationVisualRect( | 131 GeometryMapper::SourceToDestinationVisualRect( |
| 131 current_tree_state, container_contents_properties, float_rect); | 132 current_tree_state, container_contents_properties, float_rect); |
| 132 result = LayoutRect(float_rect.Rect()); | 133 result = LayoutRect(float_rect.Rect()); |
| 133 } | 134 } |
| 134 | 135 |
| 135 // Convert the result to the container's contents space. | 136 // Convert the result to the container's contents space. |
| 136 result.MoveBy(-context.paint_invalidation_container->PaintOffset()); | 137 result.MoveBy(-context.paint_invalidation_container->PaintOffset()); |
| 137 } | 138 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 174 // In SPv2, locationInBacking is in the space of their local transform node. | 175 // In SPv2, locationInBacking is in the space of their local transform node. |
| 175 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 176 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| 176 return object.PaintOffset(); | 177 return object.PaintOffset(); |
| 177 | 178 |
| 178 LayoutPoint point; | 179 LayoutPoint point; |
| 179 if (object != context.paint_invalidation_container) { | 180 if (object != context.paint_invalidation_container) { |
| 180 point.MoveBy(object.PaintOffset()); | 181 point.MoveBy(object.PaintOffset()); |
| 181 | 182 |
| 182 const auto* container_transform = | 183 const auto* container_transform = |
| 183 context.paint_invalidation_container->ContentsProperties().Transform(); | 184 context.paint_invalidation_container->ContentsProperties().Transform(); |
| 184 if (context.tree_builder_context_->current.transform != | 185 if (context.tree_builder_context_->fragments[0].current.transform != |
| 185 container_transform) { | 186 container_transform) { |
| 186 FloatRect rect = FloatRect(FloatPoint(point), FloatSize()); | 187 FloatRect rect = FloatRect(FloatPoint(point), FloatSize()); |
| 187 GeometryMapper::SourceToDestinationRect( | 188 GeometryMapper::SourceToDestinationRect( |
| 188 context.tree_builder_context_->current.transform, container_transform, | 189 context.tree_builder_context_->fragments[0].current.transform, |
| 189 rect); | 190 container_transform, rect); |
| 190 point = LayoutPoint(rect.Location()); | 191 point = LayoutPoint(rect.Location()); |
| 191 } | 192 } |
| 192 | 193 |
| 193 // Convert the result to the container's contents space. | 194 // Convert the result to the container's contents space. |
| 194 point.MoveBy(-context.paint_invalidation_container->PaintOffset()); | 195 point.MoveBy(-context.paint_invalidation_container->PaintOffset()); |
| 195 } | 196 } |
| 196 | 197 |
| 197 if (context.paint_invalidation_container->Layer()->GroupedMapping()) { | 198 if (context.paint_invalidation_container->Layer()->GroupedMapping()) { |
| 198 FloatPoint float_point(point); | 199 FloatPoint float_point(point); |
| 199 PaintLayer::MapPointInPaintInvalidationContainerToBacking( | 200 PaintLayer::MapPointInPaintInvalidationContainerToBacking( |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 258 // It undoes FrameView's content clip and scroll for paint invalidation of frame | 259 // It undoes FrameView's content clip and scroll for paint invalidation of frame |
| 259 // scroll controls and the LayoutView to which the content clip and scroll don't | 260 // scroll controls and the LayoutView to which the content clip and scroll don't |
| 260 // apply. | 261 // apply. |
| 261 class ScopedUndoFrameViewContentClipAndScroll { | 262 class ScopedUndoFrameViewContentClipAndScroll { |
| 262 public: | 263 public: |
| 263 ScopedUndoFrameViewContentClipAndScroll( | 264 ScopedUndoFrameViewContentClipAndScroll( |
| 264 const FrameView& frame_view, | 265 const FrameView& frame_view, |
| 265 const PaintPropertyTreeBuilderContext& tree_builder_context) | 266 const PaintPropertyTreeBuilderContext& tree_builder_context) |
| 266 : tree_builder_context_( | 267 : tree_builder_context_( |
| 267 const_cast<PaintPropertyTreeBuilderContext&>(tree_builder_context)), | 268 const_cast<PaintPropertyTreeBuilderContext&>(tree_builder_context)), |
| 268 saved_context_(tree_builder_context_.current) { | 269 saved_context_(tree_builder_context_.fragments[0].current) { |
| 269 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 270 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
| 270 | 271 |
| 271 if (frame_view.ContentClip() == saved_context_.clip) | 272 if (frame_view.ContentClip() == saved_context_.clip) { |
| 272 tree_builder_context_.current.clip = saved_context_.clip->Parent(); | 273 tree_builder_context_.fragments[0].current.clip = |
| 274 saved_context_.clip->Parent(); | |
| 275 } | |
| 273 if (const auto* scroll_translation = frame_view.ScrollTranslation()) { | 276 if (const auto* scroll_translation = frame_view.ScrollTranslation()) { |
| 274 if (scroll_translation->ScrollNode() == saved_context_.scroll) | 277 if (scroll_translation->ScrollNode() == saved_context_.scroll) { |
| 275 tree_builder_context_.current.scroll = saved_context_.scroll->Parent(); | 278 tree_builder_context_.fragments[0].current.scroll = |
| 279 saved_context_.scroll->Parent(); | |
| 280 } | |
| 276 if (scroll_translation == saved_context_.transform) { | 281 if (scroll_translation == saved_context_.transform) { |
| 277 tree_builder_context_.current.transform = | 282 tree_builder_context_.fragments[0].current.transform = |
| 278 saved_context_.transform->Parent(); | 283 saved_context_.transform->Parent(); |
| 279 } | 284 } |
| 280 } | 285 } |
| 281 } | 286 } |
| 282 | 287 |
| 283 ~ScopedUndoFrameViewContentClipAndScroll() { | 288 ~ScopedUndoFrameViewContentClipAndScroll() { |
| 284 tree_builder_context_.current = saved_context_; | 289 tree_builder_context_.fragments[0].current = saved_context_; |
| 285 } | 290 } |
| 286 | 291 |
| 287 private: | 292 private: |
| 288 PaintPropertyTreeBuilderContext& tree_builder_context_; | 293 PaintPropertyTreeBuilderContext& tree_builder_context_; |
| 289 PaintPropertyTreeBuilderContext::ContainingBlockContext saved_context_; | 294 PaintPropertyTreeBuilderFragmentContext::ContainingBlockContext |
| 295 saved_context_; | |
| 290 }; | 296 }; |
| 291 | 297 |
| 292 } // namespace | 298 } // namespace |
| 293 | 299 |
| 294 void PaintInvalidator::UpdatePaintInvalidationContainer( | 300 void PaintInvalidator::UpdatePaintInvalidationContainer( |
| 295 const LayoutObject& object, | 301 const LayoutObject& object, |
| 296 PaintInvalidatorContext& context) { | 302 PaintInvalidatorContext& context) { |
| 297 if (object.IsPaintInvalidationContainer()) { | 303 if (object.IsPaintInvalidationContainer()) { |
| 298 context.paint_invalidation_container = ToLayoutBoxModelObject(&object); | 304 context.paint_invalidation_container = ToLayoutBoxModelObject(&object); |
| 299 if (object.StyleRef().IsStackingContext()) | 305 if (object.StyleRef().IsStackingContext()) |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 } | 376 } |
| 371 | 377 |
| 372 UpdateVisualRect(object, context); | 378 UpdateVisualRect(object, context); |
| 373 } | 379 } |
| 374 | 380 |
| 375 void PaintInvalidator::UpdateVisualRect(const LayoutObject& object, | 381 void PaintInvalidator::UpdateVisualRect(const LayoutObject& object, |
| 376 PaintInvalidatorContext& context) { | 382 PaintInvalidatorContext& context) { |
| 377 // The paint offset should already be updated through | 383 // The paint offset should already be updated through |
| 378 // PaintPropertyTreeBuilder::updatePropertiesForSelf. | 384 // PaintPropertyTreeBuilder::updatePropertiesForSelf. |
| 379 DCHECK(context.tree_builder_context_); | 385 DCHECK(context.tree_builder_context_); |
| 380 DCHECK(context.tree_builder_context_->current.paint_offset == | 386 DCHECK(context.tree_builder_context_->fragments[0].current.paint_offset == |
| 381 object.PaintOffset()); | 387 object.PaintOffset()); |
| 382 | 388 |
| 383 Optional<ScopedUndoFrameViewContentClipAndScroll> | 389 Optional<ScopedUndoFrameViewContentClipAndScroll> |
| 384 undo_frame_view_content_clip_and_scroll; | 390 undo_frame_view_content_clip_and_scroll; |
| 385 | 391 |
| 386 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() && | 392 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() && |
| 387 object.IsLayoutView() && !object.IsPaintInvalidationContainer()) { | 393 object.IsLayoutView() && !object.IsPaintInvalidationContainer()) { |
| 388 undo_frame_view_content_clip_and_scroll.emplace( | 394 undo_frame_view_content_clip_and_scroll.emplace( |
| 389 *ToLayoutView(object).GetFrameView(), *context.tree_builder_context_); | 395 *ToLayoutView(object).GetFrameView(), *context.tree_builder_context_); |
| 390 } | 396 } |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 505 } | 511 } |
| 506 | 512 |
| 507 void PaintInvalidator::ProcessPendingDelayedPaintInvalidations() { | 513 void PaintInvalidator::ProcessPendingDelayedPaintInvalidations() { |
| 508 for (auto target : pending_delayed_paint_invalidations_) { | 514 for (auto target : pending_delayed_paint_invalidations_) { |
| 509 target->GetMutableForPainting().SetShouldDoFullPaintInvalidation( | 515 target->GetMutableForPainting().SetShouldDoFullPaintInvalidation( |
| 510 kPaintInvalidationDelayedFull); | 516 kPaintInvalidationDelayedFull); |
| 511 } | 517 } |
| 512 } | 518 } |
| 513 | 519 |
| 514 } // namespace blink | 520 } // namespace blink |
| OLD | NEW |