OLD | NEW |
| (Empty) |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 | |
7 #if USE(ACCELERATED_COMPOSITING) | |
8 #include "CCDebugRectHistory.h" | |
9 | |
10 #include "CCDamageTracker.h" | |
11 #include "CCLayerImpl.h" | |
12 #include "CCLayerTreeHost.h" | |
13 #include "CCMathUtil.h" | |
14 | |
15 namespace cc { | |
16 | |
17 CCDebugRectHistory::CCDebugRectHistory() | |
18 { | |
19 } | |
20 | |
21 CCDebugRectHistory::~CCDebugRectHistory() | |
22 { | |
23 } | |
24 | |
25 void CCDebugRectHistory::saveDebugRectsForCurrentFrame(CCLayerImpl* rootLayer, c
onst std::vector<CCLayerImpl*>& renderSurfaceLayerList, const Vector<IntRect>& o
ccludingScreenSpaceRects, const CCLayerTreeSettings& settings) | |
26 { | |
27 // For now, clear all rects from previous frames. In the future we may want
to store | |
28 // all debug rects for a history of many frames. | |
29 m_debugRects.clear(); | |
30 | |
31 if (settings.showPaintRects) | |
32 savePaintRects(rootLayer); | |
33 | |
34 if (settings.showPropertyChangedRects) | |
35 savePropertyChangedRects(renderSurfaceLayerList); | |
36 | |
37 if (settings.showSurfaceDamageRects) | |
38 saveSurfaceDamageRects(renderSurfaceLayerList); | |
39 | |
40 if (settings.showScreenSpaceRects) | |
41 saveScreenSpaceRects(renderSurfaceLayerList); | |
42 | |
43 if (settings.showOccludingRects) | |
44 saveOccludingRects(occludingScreenSpaceRects); | |
45 } | |
46 | |
47 | |
48 void CCDebugRectHistory::savePaintRects(CCLayerImpl* layer) | |
49 { | |
50 // We would like to visualize where any layer's paint rect (update rect) has
changed, | |
51 // regardless of whether this layer is skipped for actual drawing or not. Th
erefore | |
52 // we traverse recursively over all layers, not just the render surface list
. | |
53 | |
54 if (!layer->updateRect().isEmpty() && layer->drawsContent()) { | |
55 FloatRect updateContentRect = layer->updateRect(); | |
56 updateContentRect.scale(layer->contentBounds().width() / static_cast<flo
at>(layer->bounds().width()), layer->contentBounds().height() / static_cast<floa
t>(layer->bounds().height())); | |
57 m_debugRects.append(CCDebugRect(PaintRectType, CCMathUtil::mapClippedRec
t(layer->screenSpaceTransform(), updateContentRect))); | |
58 } | |
59 | |
60 for (unsigned i = 0; i < layer->children().size(); ++i) | |
61 savePaintRects(layer->children()[i]); | |
62 } | |
63 | |
64 void CCDebugRectHistory::savePropertyChangedRects(const std::vector<CCLayerImpl*
>& renderSurfaceLayerList) | |
65 { | |
66 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { | |
67 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; | |
68 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); | |
69 ASSERT(renderSurface); | |
70 | |
71 const std::vector<CCLayerImpl*>& layerList = renderSurface->layerList(); | |
72 for (unsigned layerIndex = 0; layerIndex < layerList.size(); ++layerInde
x) { | |
73 CCLayerImpl* layer = layerList[layerIndex]; | |
74 | |
75 if (CCLayerTreeHostCommon::renderSurfaceContributesToTarget<CCLayerI
mpl>(layer, renderSurfaceLayer->id())) | |
76 continue; | |
77 | |
78 if (layer->layerIsAlwaysDamaged()) | |
79 continue; | |
80 | |
81 if (layer->layerPropertyChanged() || layer->layerSurfacePropertyChan
ged()) | |
82 m_debugRects.append(CCDebugRect(PropertyChangedRectType, CCMathU
til::mapClippedRect(layer->screenSpaceTransform(), FloatRect(FloatPoint::zero(),
layer->contentBounds())))); | |
83 } | |
84 } | |
85 } | |
86 | |
87 void CCDebugRectHistory::saveSurfaceDamageRects(const std::vector<CCLayerImpl* >
& renderSurfaceLayerList) | |
88 { | |
89 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { | |
90 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; | |
91 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); | |
92 ASSERT(renderSurface); | |
93 | |
94 m_debugRects.append(CCDebugRect(SurfaceDamageRectType, CCMathUtil::mapCl
ippedRect(renderSurface->screenSpaceTransform(), renderSurface->damageTracker()-
>currentDamageRect()))); | |
95 } | |
96 } | |
97 | |
98 void CCDebugRectHistory::saveScreenSpaceRects(const std::vector<CCLayerImpl* >&
renderSurfaceLayerList) | |
99 { | |
100 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { | |
101 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; | |
102 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); | |
103 ASSERT(renderSurface); | |
104 | |
105 m_debugRects.append(CCDebugRect(ScreenSpaceRectType, CCMathUtil::mapClip
pedRect(renderSurface->screenSpaceTransform(), renderSurface->contentRect()))); | |
106 | |
107 if (renderSurfaceLayer->replicaLayer()) | |
108 m_debugRects.append(CCDebugRect(ReplicaScreenSpaceRectType, CCMathUt
il::mapClippedRect(renderSurface->replicaScreenSpaceTransform(), renderSurface->
contentRect()))); | |
109 } | |
110 } | |
111 | |
112 void CCDebugRectHistory::saveOccludingRects(const Vector<IntRect>& occludingRect
s) | |
113 { | |
114 for (size_t i = 0; i < occludingRects.size(); ++i) | |
115 m_debugRects.append(CCDebugRect(OccludingRectType, occludingRects[i])); | |
116 } | |
117 | |
118 } // namespace cc | |
119 | |
120 #endif // USE(ACCELERATED_COMPOSITING) | |
OLD | NEW |