| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/PaintLayerPainter.h" | 5 #include "core/paint/PaintLayerPainter.h" |
| 6 | 6 |
| 7 #include "core/frame/LocalFrame.h" | 7 #include "core/frame/LocalFrame.h" |
| 8 #include "core/layout/LayoutView.h" | 8 #include "core/layout/LayoutView.h" |
| 9 #include "core/paint/ClipPathClipper.h" | 9 #include "core/paint/ClipPathClipper.h" |
| 10 #include "core/paint/FilterPainter.h" | 10 #include "core/paint/FilterPainter.h" |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 local_painting_info.sub_pixel_accumulation); | 463 local_painting_info.sub_pixel_accumulation); |
| 464 RepeatFixedPositionObjectInPages(single_fragment[0], painting_info, | 464 RepeatFixedPositionObjectInPages(single_fragment[0], painting_info, |
| 465 layer_fragments); | 465 layer_fragments); |
| 466 } else { | 466 } else { |
| 467 paint_layer_for_fragments->CollectFragments( | 467 paint_layer_for_fragments->CollectFragments( |
| 468 layer_fragments, local_painting_info.root_layer, | 468 layer_fragments, local_painting_info.root_layer, |
| 469 local_painting_info.paint_dirty_rect, cache_slot, | 469 local_painting_info.paint_dirty_rect, cache_slot, |
| 470 geometry_mapper_option, kIgnorePlatformOverlayScrollbarSize, | 470 geometry_mapper_option, kIgnorePlatformOverlayScrollbarSize, |
| 471 respect_overflow_clip, &offset_from_root, | 471 respect_overflow_clip, &offset_from_root, |
| 472 local_painting_info.sub_pixel_accumulation); | 472 local_painting_info.sub_pixel_accumulation); |
| 473 // PaintLayer::collectFragments depends on the paint dirty rect in |
| 474 // complicated ways. For now, always assume a partially painted output |
| 475 // for fragmented content. |
| 476 if (layer_fragments.size() > 1) |
| 477 result = kMayBeClippedByPaintDirtyRect; |
| 473 } | 478 } |
| 474 | 479 |
| 475 if (paint_flags & kPaintLayerPaintingAncestorClippingMaskPhase) { | 480 if (paint_flags & kPaintLayerPaintingAncestorClippingMaskPhase) { |
| 476 // Fragment offsets have been computed in the clipping container's | 481 // Fragment offsets have been computed in the clipping container's |
| 477 // layer's coordinate system, but for the rest of painting we need | 482 // layer's coordinate system, but for the rest of painting we need |
| 478 // them in the layer coordinate. So move them and the foreground rect | 483 // them in the layer coordinate. So move them and the foreground rect |
| 479 // that is also in the clipper's space. | 484 // that is also in the clipper's space. |
| 480 LayoutSize negative_offset(-offset_to_clipper.X(), | 485 LayoutSize negative_offset(-offset_to_clipper.X(), |
| 481 -offset_to_clipper.Y()); | 486 -offset_to_clipper.Y()); |
| 482 for (auto& fragment : layer_fragments) { | 487 for (auto& fragment : layer_fragments) { |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer | 695 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer |
| 691 // here. m_paintLayer may be the "root", and then we should avoid looking at | 696 // here. m_paintLayer may be the "root", and then we should avoid looking at |
| 692 // its parent. | 697 // its parent. |
| 693 PaintLayer* parent_layer = paint_layer_.Parent(); | 698 PaintLayer* parent_layer = paint_layer_.Parent(); |
| 694 | 699 |
| 695 PaintLayer::GeometryMapperOption geometry_mapper_option = | 700 PaintLayer::GeometryMapperOption geometry_mapper_option = |
| 696 PaintLayer::kDoNotUseGeometryMapper; | 701 PaintLayer::kDoNotUseGeometryMapper; |
| 697 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) | 702 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) |
| 698 geometry_mapper_option = PaintLayer::kUseGeometryMapper; | 703 geometry_mapper_option = PaintLayer::kUseGeometryMapper; |
| 699 | 704 |
| 705 PaintResult result = kFullyPainted; |
| 700 PaintLayer* pagination_layer = paint_layer_.EnclosingPaginationLayer(); | 706 PaintLayer* pagination_layer = paint_layer_.EnclosingPaginationLayer(); |
| 701 PaintLayerFragments layer_fragments; | 707 PaintLayerFragments layer_fragments; |
| 702 bool is_fixed_position_object_in_paged_media = | 708 bool is_fixed_position_object_in_paged_media = |
| 703 this->IsFixedPositionObjectInPagedMedia(); | 709 this->IsFixedPositionObjectInPagedMedia(); |
| 704 if (!pagination_layer || is_fixed_position_object_in_paged_media) { | 710 if (!pagination_layer || is_fixed_position_object_in_paged_media) { |
| 705 // We don't need to collect any fragments in the regular way here. We have | 711 // We don't need to collect any fragments in the regular way here. We have |
| 706 // already calculated a clip rectangle for the ancestry if it was needed, | 712 // already calculated a clip rectangle for the ancestry if it was needed, |
| 707 // and clipping this layer is something that can be done further down the | 713 // and clipping this layer is something that can be done further down the |
| 708 // path, when the transform has been applied. | 714 // path, when the transform has been applied. |
| 709 PaintLayerFragment fragment; | 715 PaintLayerFragment fragment; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 732 painting_info.GetGlobalPaintFlags()); | 738 painting_info.GetGlobalPaintFlags()); |
| 733 | 739 |
| 734 // FIXME: we don't check if paginationLayer is within | 740 // FIXME: we don't check if paginationLayer is within |
| 735 // paintingInfo.rootLayer | 741 // paintingInfo.rootLayer |
| 736 // here. | 742 // here. |
| 737 pagination_layer->CollectFragments( | 743 pagination_layer->CollectFragments( |
| 738 layer_fragments, painting_info.root_layer, | 744 layer_fragments, painting_info.root_layer, |
| 739 painting_info.paint_dirty_rect, cache_slot, geometry_mapper_option, | 745 painting_info.paint_dirty_rect, cache_slot, geometry_mapper_option, |
| 740 kIgnorePlatformOverlayScrollbarSize, respect_overflow_clip, nullptr, | 746 kIgnorePlatformOverlayScrollbarSize, respect_overflow_clip, nullptr, |
| 741 painting_info.sub_pixel_accumulation, &transformed_extent); | 747 painting_info.sub_pixel_accumulation, &transformed_extent); |
| 748 // PaintLayer::collectFragments depends on the paint dirty rect in |
| 749 // complicated ways. For now, always assume a partially painted output |
| 750 // for fragmented content. |
| 751 if (layer_fragments.size() > 1) |
| 752 result = kMayBeClippedByPaintDirtyRect; |
| 742 } | 753 } |
| 743 | 754 |
| 744 Optional<DisplayItemCacheSkipper> cache_skipper; | 755 Optional<DisplayItemCacheSkipper> cache_skipper; |
| 745 if (layer_fragments.size() > 1) | 756 if (layer_fragments.size() > 1) |
| 746 cache_skipper.emplace(context); | 757 cache_skipper.emplace(context); |
| 747 | 758 |
| 748 ClipRect ancestor_background_clip_rect; | 759 ClipRect ancestor_background_clip_rect; |
| 749 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 760 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
| 750 if (parent_layer) { | 761 if (parent_layer) { |
| 751 // Calculate the clip rectangle that the ancestors establish. | 762 // Calculate the clip rectangle that the ancestors establish. |
| 752 ClipRectsContext clip_rects_context( | 763 ClipRectsContext clip_rects_context( |
| 753 painting_info.root_layer, | 764 painting_info.root_layer, |
| 754 (paint_flags & kPaintLayerUncachedClipRects) ? kUncachedClipRects | 765 (paint_flags & kPaintLayerUncachedClipRects) ? kUncachedClipRects |
| 755 : kPaintingClipRects, | 766 : kPaintingClipRects, |
| 756 kIgnorePlatformOverlayScrollbarSize); | 767 kIgnorePlatformOverlayScrollbarSize); |
| 757 if (ShouldRespectOverflowClip(paint_flags, | 768 if (ShouldRespectOverflowClip(paint_flags, |
| 758 paint_layer_.GetLayoutObject()) == | 769 paint_layer_.GetLayoutObject()) == |
| 759 kIgnoreOverflowClip) | 770 kIgnoreOverflowClip) |
| 760 clip_rects_context.SetIgnoreOverflowClip(); | 771 clip_rects_context.SetIgnoreOverflowClip(); |
| 761 paint_layer_.Clipper(geometry_mapper_option) | 772 paint_layer_.Clipper(geometry_mapper_option) |
| 762 .CalculateBackgroundClipRect(clip_rects_context, | 773 .CalculateBackgroundClipRect(clip_rects_context, |
| 763 ancestor_background_clip_rect); | 774 ancestor_background_clip_rect); |
| 764 } | 775 } |
| 765 } | 776 } |
| 766 | 777 |
| 767 PaintResult result = kFullyPainted; | |
| 768 for (const auto& fragment : layer_fragments) { | 778 for (const auto& fragment : layer_fragments) { |
| 769 Optional<LayerClipRecorder> clip_recorder; | 779 Optional<LayerClipRecorder> clip_recorder; |
| 770 if (parent_layer && !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 780 if (parent_layer && !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
| 771 ClipRect clip_rect_for_fragment(ancestor_background_clip_rect); | 781 ClipRect clip_rect_for_fragment(ancestor_background_clip_rect); |
| 772 // A fixed-position object is repeated on every page instead of paginated, | 782 // A fixed-position object is repeated on every page instead of paginated, |
| 773 // so we should apply the original ancestor clip rect. | 783 // so we should apply the original ancestor clip rect. |
| 774 if (!is_fixed_position_object_in_paged_media) | 784 if (!is_fixed_position_object_in_paged_media) |
| 775 clip_rect_for_fragment.MoveBy(fragment.pagination_offset); | 785 clip_rect_for_fragment.MoveBy(fragment.pagination_offset); |
| 776 clip_rect_for_fragment.Intersect(fragment.background_rect); | 786 clip_rect_for_fragment.Intersect(fragment.background_rect); |
| 777 if (clip_rect_for_fragment.IsEmpty()) | 787 if (clip_rect_for_fragment.IsEmpty()) |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1218 context, layout_object, kPaintPhaseClippingMask)) | 1228 context, layout_object, kPaintPhaseClippingMask)) |
| 1219 return; | 1229 return; |
| 1220 | 1230 |
| 1221 IntRect snapped_clip_rect = PixelSnappedIntRect(clip_rect.Rect()); | 1231 IntRect snapped_clip_rect = PixelSnappedIntRect(clip_rect.Rect()); |
| 1222 LayoutObjectDrawingRecorder drawing_recorder( | 1232 LayoutObjectDrawingRecorder drawing_recorder( |
| 1223 context, layout_object, kPaintPhaseClippingMask, snapped_clip_rect); | 1233 context, layout_object, kPaintPhaseClippingMask, snapped_clip_rect); |
| 1224 context.FillRect(snapped_clip_rect, Color::kBlack); | 1234 context.FillRect(snapped_clip_rect, Color::kBlack); |
| 1225 } | 1235 } |
| 1226 | 1236 |
| 1227 } // namespace blink | 1237 } // namespace blink |
| OLD | NEW |