Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/PaintArtifact.cpp

Issue 1632263002: Calculate and track display item opaqueness (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "platform/graphics/paint/PaintArtifact.h" 5 #include "platform/graphics/paint/PaintArtifact.h"
6 6
7 #include "platform/TraceEvent.h" 7 #include "platform/TraceEvent.h"
8 #include "platform/geometry/IntRect.h" 8 #include "platform/geometry/IntRect.h"
9 #include "platform/graphics/paint/DrawingDisplayItem.h" 9 #include "platform/graphics/paint/DrawingDisplayItem.h"
10 10
11 namespace blink { 11 namespace blink {
12 12
13 namespace { 13 namespace {
14 14
15 void computeChunkBounds(const DisplayItemList& displayItems, Vector<PaintChunk>& paintChunks) 15 void computeChunkBoundsAndOpaqueness(const DisplayItemList& displayItems, Vector <PaintChunk>& paintChunks)
16 { 16 {
17 for (PaintChunk& chunk : paintChunks) { 17 for (PaintChunk& chunk : paintChunks) {
18 FloatRect bounds; 18 FloatRect bounds;
19 bool knownToBeOpaqueItems = false;
19 for (const DisplayItem& item : displayItems.itemsInPaintChunk(chunk)) { 20 for (const DisplayItem& item : displayItems.itemsInPaintChunk(chunk)) {
20 if (!item.isDrawing()) 21 if (!item.isDrawing())
21 continue; 22 continue;
22 const auto& drawing = static_cast<const DrawingDisplayItem&>(item); 23 const auto& drawing = static_cast<const DrawingDisplayItem&>(item);
23 if (const SkPicture* picture = drawing.picture()) 24 if (const SkPicture* picture = drawing.picture())
24 bounds.unite(picture->cullRect()); 25 bounds.unite(picture->cullRect());
26 if (drawing.knownToBeOpaque())
27 knownToBeOpaqueItems = true;
25 } 28 }
26 chunk.bounds = bounds; 29 chunk.bounds = bounds;
30
31 // TODO(pdr): This should be optimized to not require a second walk of
32 // the items. It's not yet clear what the best approach is (regions,
33 // largest rects, first-N-rects, etc).
34 if (!knownToBeOpaqueItems)
jbroman 2016/01/26 17:50:14 I'd think SkRegion is both simple and reasonably e
pdr. 2016/01/26 23:38:08 Heck yeah, done.
35 return;
36 for (const DisplayItem& item : displayItems.itemsInPaintChunk(chunk)) {
37 if (!item.isDrawing())
38 continue;
39 const auto& drawing = static_cast<const DrawingDisplayItem&>(item);
40 if (!drawing.knownToBeOpaque())
41 continue;
42 if (const SkPicture* picture = drawing.picture()) {
43 if (bounds.contains(picture->cullRect())) {
44 chunk.knownToBeOpaque = true;
45 break;
46 }
47 }
48 }
27 } 49 }
28 } 50 }
29 51
30 } // namespace 52 } // namespace
31 53
32 PaintArtifact::PaintArtifact() 54 PaintArtifact::PaintArtifact()
33 : m_displayItemList(0) 55 : m_displayItemList(0)
34 { 56 {
35 } 57 }
36 58
37 PaintArtifact::PaintArtifact(DisplayItemList displayItems, Vector<PaintChunk> pa intChunks) 59 PaintArtifact::PaintArtifact(DisplayItemList displayItems, Vector<PaintChunk> pa intChunks)
38 : m_displayItemList(std::move(displayItems)) 60 : m_displayItemList(std::move(displayItems))
39 , m_paintChunks(std::move(paintChunks)) 61 , m_paintChunks(std::move(paintChunks))
40 { 62 {
41 computeChunkBounds(m_displayItemList, m_paintChunks); 63 computeChunkBoundsAndOpaqueness(m_displayItemList, m_paintChunks);
42 } 64 }
43 65
44 PaintArtifact::PaintArtifact(PaintArtifact&& source) 66 PaintArtifact::PaintArtifact(PaintArtifact&& source)
45 : m_displayItemList(std::move(source.m_displayItemList)) 67 : m_displayItemList(std::move(source.m_displayItemList))
46 , m_paintChunks(std::move(source.m_paintChunks)) 68 , m_paintChunks(std::move(source.m_paintChunks))
47 { 69 {
48 } 70 }
49 71
50 PaintArtifact::~PaintArtifact() 72 PaintArtifact::~PaintArtifact()
51 { 73 {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 #if ENABLE(ASSERT) 105 #if ENABLE(ASSERT)
84 m_displayItemList.assertDisplayItemClientsAreAlive(); 106 m_displayItemList.assertDisplayItemClientsAreAlive();
85 #endif 107 #endif
86 for (const DisplayItem& displayItem : m_displayItemList) { 108 for (const DisplayItem& displayItem : m_displayItemList) {
87 // TODO(wkorman): Pass the actual visual rect for the display item. 109 // TODO(wkorman): Pass the actual visual rect for the display item.
88 displayItem.appendToWebDisplayItemList(IntRect(), list); 110 displayItem.appendToWebDisplayItemList(IntRect(), list);
89 } 111 }
90 } 112 }
91 113
92 } // namespace blink 114 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698