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

Side by Side Diff: Source/web/PageOverlayList.cpp

Issue 867063004: [Slimming Paint] Paint the inspector overlay with GraphicsLayer DisplayList. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 10 *
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 : m_viewImpl(viewImpl) 44 : m_viewImpl(viewImpl)
45 { 45 {
46 } 46 }
47 47
48 PageOverlayList::~PageOverlayList() 48 PageOverlayList::~PageOverlayList()
49 { 49 {
50 } 50 }
51 51
52 bool PageOverlayList::add(WebPageOverlay* overlay, int zOrder) 52 bool PageOverlayList::add(WebPageOverlay* overlay, int zOrder)
53 { 53 {
54 bool added = false; 54 bool added;
55 size_t index = find(overlay); 55 size_t index = findOrAdd(overlay, added);
56 if (index == WTF::kNotFound) { 56 m_pageOverlays[index]->setZOrder(zOrder);
57 OwnPtr<PageOverlay> pageOverlay = PageOverlay::create(m_viewImpl, overla y); 57 updateForZOrder(index);
58 m_pageOverlays.append(pageOverlay.release());
59 index = m_pageOverlays.size() - 1;
60 added = true;
61 }
62
63 PageOverlay* pageOverlay = m_pageOverlays[index].get();
64 pageOverlay->setZOrder(zOrder);
65
66 // Adjust page overlay list order based on their z-order numbers. We first
67 // check if we need to move the overlay up and do so if needed. Otherwise,
68 // check if we need to move it down.
69 bool zOrderChanged = false;
70 for (size_t i = index; i + 1 < m_pageOverlays.size(); ++i) {
71 if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) {
72 m_pageOverlays[i].swap(m_pageOverlays[i + 1]);
73 zOrderChanged = true;
74 }
75 }
76
77 if (!zOrderChanged) {
78 for (size_t i = index; i >= 1; --i) {
79 if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) {
80 m_pageOverlays[i].swap(m_pageOverlays[i - 1]);
81 zOrderChanged = true;
82 }
83 }
84 }
85
86 // If we did move the overlay, that means z-order is changed and we need to
87 // update overlay layers' z-order. Otherwise, just update current overlay.
88 if (zOrderChanged) {
89 for (size_t i = 0; i < m_pageOverlays.size(); ++i)
90 m_pageOverlays[i]->clear();
91 update();
92 } else
93 pageOverlay->update();
94
95 return added; 58 return added;
96 } 59 }
97 60
61 bool PageOverlayList::add(PageOverlay::Painter* overlayPainter, int zOrder)
62 {
63 bool added;
64 size_t index = findOrAdd(overlayPainter, added);
65 m_pageOverlays[index]->setZOrder(zOrder);
66 updateForZOrder(index);
67 return added;
68 }
69
98 bool PageOverlayList::remove(WebPageOverlay* overlay) 70 bool PageOverlayList::remove(WebPageOverlay* overlay)
99 { 71 {
100 size_t index = find(overlay); 72 size_t index = find(overlay);
101 if (index == WTF::kNotFound) 73 if (index == WTF::kNotFound)
102 return false; 74 return false;
103 75
104 m_pageOverlays[index]->clear(); 76 m_pageOverlays[index]->clear();
105 m_pageOverlays.remove(index); 77 m_pageOverlays.remove(index);
106 return true; 78 return true;
107 } 79 }
108 80
81 bool PageOverlayList::remove(PageOverlay::Painter* overlayPainter)
82 {
83 size_t index = find(overlayPainter);
84 if (index == WTF::kNotFound)
85 return false;
86
87 m_pageOverlays[index]->clear();
88 m_pageOverlays.remove(index);
89 return true;
90 }
91
109 void PageOverlayList::update() 92 void PageOverlayList::update()
110 { 93 {
111 for (size_t i = 0; i < m_pageOverlays.size(); ++i) 94 for (size_t i = 0; i < m_pageOverlays.size(); ++i)
112 m_pageOverlays[i]->update(); 95 m_pageOverlays[i]->update();
113 } 96 }
114 97
115 void PageOverlayList::paintWebFrame(GraphicsContext& gc) 98 void PageOverlayList::paintWebFrame(GraphicsContext& gc)
116 { 99 {
100 // If accelerated compositing is active, page overlays are painted through
101 // their corresponding GraphicsLayer.
102 ASSERT(!m_viewImpl->isAcceleratedCompositingActive());
103
117 for (size_t i = 0; i < m_pageOverlays.size(); ++i) 104 for (size_t i = 0; i < m_pageOverlays.size(); ++i)
118 m_pageOverlays[i]->paintWebFrame(gc); 105 m_pageOverlays[i]->paintWebFrame(gc);
119 } 106 }
120 107
121 size_t PageOverlayList::find(WebPageOverlay* overlay) 108 size_t PageOverlayList::find(WebPageOverlay* overlay)
122 { 109 {
110 if (!overlay)
111 return WTF::kNotFound;
123 for (size_t i = 0; i < m_pageOverlays.size(); ++i) { 112 for (size_t i = 0; i < m_pageOverlays.size(); ++i) {
124 if (m_pageOverlays[i]->overlay() == overlay) 113 if (m_pageOverlays[i]->overlay() == overlay)
125 return i; 114 return i;
126 } 115 }
127 return WTF::kNotFound; 116 return WTF::kNotFound;
128 } 117 }
129 118
119 size_t PageOverlayList::find(PageOverlay::Painter* overlayPainter)
120 {
121 if (!overlayPainter)
122 return WTF::kNotFound;
123 for (size_t i = 0; i < m_pageOverlays.size(); ++i) {
124 if (m_pageOverlays[i]->overlayPainter() == overlayPainter)
125 return i;
126 }
127 return WTF::kNotFound;
128 }
129
130 size_t PageOverlayList::findGraphicsLayer(GraphicsLayer* layer) 130 size_t PageOverlayList::findGraphicsLayer(GraphicsLayer* layer)
131 { 131 {
132 for (size_t i = 0; i < m_pageOverlays.size(); ++i) { 132 for (size_t i = 0; i < m_pageOverlays.size(); ++i) {
133 if (m_pageOverlays[i]->graphicsLayer() == layer) 133 if (m_pageOverlays[i]->graphicsLayer() == layer)
134 return i; 134 return i;
135 } 135 }
136 return WTF::kNotFound; 136 return WTF::kNotFound;
137 } 137 }
138 138
139 GraphicsLayer* PageOverlayList::graphicsLayerForTesting() const
140 {
141 return m_pageOverlays.isEmpty() ? nullptr : m_pageOverlays[0]->graphicsLayer ();
142 }
143
144 template <typename T>
145 size_t PageOverlayList::findOrAdd(T* client, bool& added)
146 {
147 size_t index = find(client);
148 if (index != WTF::kNotFound) {
149 added = false;
150 return index;
151 }
152 m_pageOverlays.append(PageOverlay::create(m_viewImpl, client));
153 added = true;
154 return m_pageOverlays.size() - 1;
155 }
156
157 void PageOverlayList::updateForZOrder(size_t indexOfChangedOverlay)
158 {
159 // Adjust page overlay list order based on their z-order numbers. We first
160 // check if we need to move the overlay up and do so if needed. Otherwise,
161 // check if we need to move it down.
162 bool zOrderChanged = false;
163 for (size_t i = indexOfChangedOverlay; i + 1 < m_pageOverlays.size(); ++i) {
164 if (m_pageOverlays[i]->zOrder() >= m_pageOverlays[i + 1]->zOrder()) {
165 m_pageOverlays[i].swap(m_pageOverlays[i + 1]);
166 zOrderChanged = true;
167 }
168 }
169
170 if (!zOrderChanged) {
171 for (size_t i = indexOfChangedOverlay; i >= 1; --i) {
172 if (m_pageOverlays[i]->zOrder() < m_pageOverlays[i - 1]->zOrder()) {
173 m_pageOverlays[i].swap(m_pageOverlays[i - 1]);
174 zOrderChanged = true;
175 }
176 }
177 }
178
179 // If we did move the overlay, that means z-order is changed and we need to
180 // update overlay layers' z-order. Otherwise, just update current overlay.
181 if (zOrderChanged) {
182 for (size_t i = 0; i < m_pageOverlays.size(); ++i)
183 m_pageOverlays[i]->clear();
184 update();
185 } else {
186 m_pageOverlays[indexOfChangedOverlay]->update();
187 }
188 }
189
139 } // namespace blink 190 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698