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/BoxPainter.h" | 5 #include "core/paint/BoxPainter.h" |
6 | 6 |
7 #include "core/HTMLNames.h" | 7 #include "core/HTMLNames.h" |
8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
9 #include "core/frame/LocalFrameView.h" | 9 #include "core/frame/LocalFrameView.h" |
10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" |
11 #include "core/html/HTMLFrameOwnerElement.h" | 11 #include "core/html/HTMLFrameOwnerElement.h" |
12 #include "core/layout/BackgroundBleedAvoidance.h" | 12 #include "core/layout/BackgroundBleedAvoidance.h" |
13 #include "core/layout/ImageQualityController.h" | 13 #include "core/layout/ImageQualityController.h" |
14 #include "core/layout/LayoutBox.h" | 14 #include "core/layout/LayoutBox.h" |
15 #include "core/layout/LayoutBoxModelObject.h" | 15 #include "core/layout/LayoutBoxModelObject.h" |
16 #include "core/layout/LayoutObject.h" | 16 #include "core/layout/LayoutObject.h" |
17 #include "core/layout/LayoutTable.h" | 17 #include "core/layout/LayoutTable.h" |
18 #include "core/layout/LayoutTheme.h" | 18 #include "core/layout/LayoutTheme.h" |
19 #include "core/layout/compositing/CompositedLayerMapping.h" | 19 #include "core/layout/compositing/CompositedLayerMapping.h" |
20 #include "core/layout/line/RootInlineBox.h" | 20 #include "core/layout/line/RootInlineBox.h" |
21 #include "core/page/ChromeClient.h" | 21 #include "core/page/ChromeClient.h" |
22 #include "core/page/Page.h" | 22 #include "core/page/Page.h" |
23 #include "core/paint/BackgroundImageGeometry.h" | 23 #include "core/paint/BackgroundImageGeometry.h" |
24 #include "core/paint/BoxBorderPainter.h" | |
25 #include "core/paint/BoxDecorationData.h" | 24 #include "core/paint/BoxDecorationData.h" |
26 #include "core/paint/LayoutObjectDrawingRecorder.h" | 25 #include "core/paint/LayoutObjectDrawingRecorder.h" |
27 #include "core/paint/NinePieceImagePainter.h" | 26 #include "core/paint/NinePieceImagePainter.h" |
28 #include "core/paint/ObjectPainter.h" | 27 #include "core/paint/ObjectPainter.h" |
29 #include "core/paint/PaintInfo.h" | 28 #include "core/paint/PaintInfo.h" |
30 #include "core/paint/PaintLayer.h" | 29 #include "core/paint/PaintLayer.h" |
31 #include "core/paint/ScrollRecorder.h" | 30 #include "core/paint/ScrollRecorder.h" |
32 #include "core/paint/ThemePainter.h" | 31 #include "core/paint/ThemePainter.h" |
33 #include "core/style/ShadowList.h" | 32 #include "core/style/ShadowList.h" |
34 #include "platform/LengthFunctions.h" | 33 #include "platform/LengthFunctions.h" |
35 #include "platform/geometry/LayoutPoint.h" | 34 #include "platform/geometry/LayoutPoint.h" |
36 #include "platform/geometry/LayoutRectOutsets.h" | 35 #include "platform/geometry/LayoutRectOutsets.h" |
37 #include "platform/graphics/GraphicsContextStateSaver.h" | 36 #include "platform/graphics/GraphicsContextStateSaver.h" |
38 #include "platform/graphics/paint/CompositingDisplayItem.h" | 37 #include "platform/graphics/paint/CompositingDisplayItem.h" |
| 38 #include "platform/wtf/Optional.h" |
39 | 39 |
40 namespace blink { | 40 namespace blink { |
41 | 41 |
42 bool BoxPainter::IsPaintingBackgroundOfPaintContainerIntoScrollingContentsLayer( | 42 bool BoxPainter::IsPaintingBackgroundOfPaintContainerIntoScrollingContentsLayer( |
43 const LayoutBoxModelObject* obj, | 43 const LayoutBoxModelObject* obj, |
44 const PaintInfo& paint_info) { | 44 const PaintInfo& paint_info) { |
45 return paint_info.PaintFlags() & kPaintLayerPaintingOverflowContents && | 45 return paint_info.PaintFlags() & kPaintLayerPaintingOverflowContents && |
46 !(paint_info.PaintFlags() & | 46 !(paint_info.PaintFlags() & |
47 kPaintLayerPaintingCompositingBackgroundPhase) && | 47 kPaintLayerPaintingCompositingBackgroundPhase) && |
48 obj == paint_info.PaintContainer(); | 48 obj == paint_info.PaintContainer(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 184 |
185 // The theme will tell us whether or not we should also paint the CSS | 185 // The theme will tell us whether or not we should also paint the CSS |
186 // border. | 186 // border. |
187 if (box_decoration_data.has_border_decoration && | 187 if (box_decoration_data.has_border_decoration && |
188 (!box_decoration_data.has_appearance || | 188 (!box_decoration_data.has_appearance || |
189 (!theme_painted && | 189 (!theme_painted && |
190 LayoutTheme::GetTheme().Painter().PaintBorderOnly( | 190 LayoutTheme::GetTheme().Painter().PaintBorderOnly( |
191 layout_box_, paint_info, snapped_paint_rect))) && | 191 layout_box_, paint_info, snapped_paint_rect))) && |
192 !(layout_box_.IsTable() && | 192 !(layout_box_.IsTable() && |
193 ToLayoutTable(&layout_box_)->ShouldCollapseBorders())) { | 193 ToLayoutTable(&layout_box_)->ShouldCollapseBorders())) { |
194 PaintBorder(layout_box_, paint_info, paint_rect, style, | 194 PaintBorder(layout_box_, layout_box_.GetDocument(), GetNode(), paint_info, |
195 box_decoration_data.bleed_avoidance); | 195 paint_rect, style, box_decoration_data.bleed_avoidance); |
196 } | 196 } |
197 } | 197 } |
198 | 198 |
199 if (box_decoration_data.bleed_avoidance == kBackgroundBleedClipLayer) | 199 if (box_decoration_data.bleed_avoidance == kBackgroundBleedClipLayer) |
200 paint_info.context.EndLayer(); | 200 paint_info.context.EndLayer(); |
201 } | 201 } |
202 | 202 |
203 void BoxPainter::PaintBackground(const PaintInfo& paint_info, | 203 void BoxPainter::PaintBackground(const PaintInfo& paint_info, |
204 const LayoutRect& paint_rect, | 204 const LayoutRect& paint_rect, |
205 const Color& background_color, | 205 const Color& background_color, |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 all_mask_images_loaded &= mask_box_image->IsLoaded(); | 636 all_mask_images_loaded &= mask_box_image->IsLoaded(); |
637 | 637 |
638 all_mask_images_loaded &= mask_layers.ImagesAreLoaded(); | 638 all_mask_images_loaded &= mask_layers.ImagesAreLoaded(); |
639 | 639 |
640 paint_info.context.BeginLayer(1, SkBlendMode::kDstIn); | 640 paint_info.context.BeginLayer(1, SkBlendMode::kDstIn); |
641 } | 641 } |
642 | 642 |
643 if (all_mask_images_loaded) { | 643 if (all_mask_images_loaded) { |
644 PaintFillLayers(paint_info, Color::kTransparent, | 644 PaintFillLayers(paint_info, Color::kTransparent, |
645 layout_box_.Style()->MaskLayers(), paint_rect); | 645 layout_box_.Style()->MaskLayers(), paint_rect); |
646 PaintNinePieceImage(layout_box_, paint_info.context, paint_rect, | 646 NinePieceImagePainter::Paint(paint_info.context, layout_box_, |
647 layout_box_.StyleRef(), | 647 layout_box_.GetDocument(), GetNode(), |
648 layout_box_.Style()->MaskBoxImage()); | 648 paint_rect, layout_box_.StyleRef(), |
| 649 layout_box_.StyleRef().MaskBoxImage()); |
649 } | 650 } |
650 | 651 |
651 if (push_transparency_layer) | 652 if (push_transparency_layer) |
652 paint_info.context.EndLayer(); | 653 paint_info.context.EndLayer(); |
653 } | 654 } |
654 | 655 |
655 void BoxPainter::PaintClippingMask(const PaintInfo& paint_info, | 656 void BoxPainter::PaintClippingMask(const PaintInfo& paint_info, |
656 const LayoutPoint& paint_offset) { | 657 const LayoutPoint& paint_offset) { |
657 DCHECK(paint_info.phase == kPaintPhaseClippingMask); | 658 DCHECK(paint_info.phase == kPaintPhaseClippingMask); |
658 | 659 |
659 if (layout_box_.Style()->Visibility() != EVisibility::kVisible) | 660 if (layout_box_.Style()->Visibility() != EVisibility::kVisible) |
660 return; | 661 return; |
661 | 662 |
662 if (!layout_box_.Layer() || | 663 if (!layout_box_.Layer() || |
663 layout_box_.Layer()->GetCompositingState() != kPaintsIntoOwnBacking) | 664 layout_box_.Layer()->GetCompositingState() != kPaintsIntoOwnBacking) |
664 return; | 665 return; |
665 | 666 |
666 if (LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible( | 667 if (LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible( |
667 paint_info.context, layout_box_, paint_info.phase)) | 668 paint_info.context, layout_box_, paint_info.phase)) |
668 return; | 669 return; |
669 | 670 |
670 IntRect paint_rect = | 671 IntRect paint_rect = |
671 PixelSnappedIntRect(LayoutRect(paint_offset, layout_box_.Size())); | 672 PixelSnappedIntRect(LayoutRect(paint_offset, layout_box_.Size())); |
672 LayoutObjectDrawingRecorder drawing_recorder(paint_info.context, layout_box_, | 673 LayoutObjectDrawingRecorder drawing_recorder(paint_info.context, layout_box_, |
673 paint_info.phase, paint_rect); | 674 paint_info.phase, paint_rect); |
674 paint_info.context.FillRect(paint_rect, Color::kBlack); | 675 paint_info.context.FillRect(paint_rect, Color::kBlack); |
675 } | 676 } |
676 | 677 |
677 bool BoxPainter::PaintNinePieceImage(const LayoutBoxModelObject& obj, | 678 Node* BoxPainter::GetNode() { |
678 GraphicsContext& graphics_context, | 679 Node* node = nullptr; |
679 const LayoutRect& rect, | 680 const LayoutObject* layout_object = &layout_box_; |
680 const ComputedStyle& style, | 681 for (; layout_object && !node; layout_object = layout_object->Parent()) { |
681 const NinePieceImage& nine_piece_image, | 682 node = layout_object->GeneratingNode(); |
682 SkBlendMode op) { | 683 } |
683 return NinePieceImagePainter().Paint(graphics_context, obj, rect, style, | 684 return node; |
684 nine_piece_image, op); | |
685 } | |
686 | |
687 void BoxPainter::PaintBorder(const LayoutBoxModelObject& obj, | |
688 const PaintInfo& info, | |
689 const LayoutRect& rect, | |
690 const ComputedStyle& style, | |
691 BackgroundBleedAvoidance bleed_avoidance, | |
692 bool include_logical_left_edge, | |
693 bool include_logical_right_edge) { | |
694 // border-image is not affected by border-radius. | |
695 if (PaintNinePieceImage(obj, info.context, rect, style, style.BorderImage())) | |
696 return; | |
697 | |
698 const BoxBorderPainter border_painter(rect, style, bleed_avoidance, | |
699 include_logical_left_edge, | |
700 include_logical_right_edge); | |
701 border_painter.PaintBorder(info, rect); | |
702 } | 685 } |
703 | 686 |
704 } // namespace blink | 687 } // namespace blink |
OLD | NEW |