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

Side by Side Diff: cc/scrollbar_layer.cc

Issue 11609002: cc: Create a cc::ScrollbarThemePainter and an adapter class in compositor bindings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: notry Created 8 years 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
« no previous file with comments | « cc/scrollbar_layer.h ('k') | cc/scrollbar_layer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 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 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 "cc/scrollbar_layer.h" 5 #include "cc/scrollbar_layer.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "cc/layer_painter.h" 9 #include "cc/layer_painter.h"
10 #include "cc/layer_tree_host.h" 10 #include "cc/layer_tree_host.h"
11 #include "cc/resource_update_queue.h" 11 #include "cc/resource_update_queue.h"
12 #include "cc/scrollbar_layer_impl.h" 12 #include "cc/scrollbar_layer_impl.h"
13 #include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h"
13 #include "ui/gfx/rect_conversions.h" 14 #include "ui/gfx/rect_conversions.h"
14 #include <public/WebRect.h>
15
16 using WebKit::WebRect;
17 15
18 namespace cc { 16 namespace cc {
19 17
20 scoped_ptr<LayerImpl> ScrollbarLayer::createLayerImpl(LayerTreeImpl* treeImpl) 18 scoped_ptr<LayerImpl> ScrollbarLayer::createLayerImpl(LayerTreeImpl* treeImpl)
21 { 19 {
22 return ScrollbarLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>(); 20 return ScrollbarLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>();
23 } 21 }
24 22
25 scoped_refptr<ScrollbarLayer> ScrollbarLayer::create(scoped_ptr<WebKit::WebScrol lbar> scrollbar, WebKit::WebScrollbarThemePainter painter, scoped_ptr<WebKit::We bScrollbarThemeGeometry> geometry, int scrollLayerId) 23 scoped_refptr<ScrollbarLayer> ScrollbarLayer::create(
24 scoped_ptr<WebKit::WebScrollbar> scrollbar,
25 scoped_ptr<ScrollbarThemePainter> painter,
26 scoped_ptr<WebKit::WebScrollbarThemeGeometry> geometry,
27 int scrollLayerId)
26 { 28 {
27 return make_scoped_refptr(new ScrollbarLayer(scrollbar.Pass(), painter, geom etry.Pass(), scrollLayerId)); 29 return make_scoped_refptr(new ScrollbarLayer(scrollbar.Pass(), painter.Pass( ), geometry.Pass(), scrollLayerId));
28 } 30 }
29 31
30 ScrollbarLayer::ScrollbarLayer(scoped_ptr<WebKit::WebScrollbar> scrollbar, WebKi t::WebScrollbarThemePainter painter, scoped_ptr<WebKit::WebScrollbarThemeGeometr y> geometry, int scrollLayerId) 32 ScrollbarLayer::ScrollbarLayer(
33 scoped_ptr<WebKit::WebScrollbar> scrollbar,
34 scoped_ptr<ScrollbarThemePainter> painter,
35 scoped_ptr<WebKit::WebScrollbarThemeGeometry> geometry,
36 int scrollLayerId)
31 : m_scrollbar(scrollbar.Pass()) 37 : m_scrollbar(scrollbar.Pass())
32 , m_painter(painter) 38 , m_painter(painter.Pass())
33 , m_geometry(geometry.Pass()) 39 , m_geometry(geometry.Pass())
34 , m_scrollLayerId(scrollLayerId) 40 , m_scrollLayerId(scrollLayerId)
35 , m_textureFormat(GL_INVALID_ENUM) 41 , m_textureFormat(GL_INVALID_ENUM)
36 { 42 {
37 } 43 }
38 44
39 ScrollbarLayer::~ScrollbarLayer() 45 ScrollbarLayer::~ScrollbarLayer()
40 { 46 {
41 } 47 }
42 48
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 scrollbarLayer->setThumbResourceId(0); 116 scrollbarLayer->setThumbResourceId(0);
111 } 117 }
112 118
113 ScrollbarLayer* ScrollbarLayer::toScrollbarLayer() 119 ScrollbarLayer* ScrollbarLayer::toScrollbarLayer()
114 { 120 {
115 return this; 121 return this;
116 } 122 }
117 123
118 class ScrollbarBackgroundPainter : public LayerPainter { 124 class ScrollbarBackgroundPainter : public LayerPainter {
119 public: 125 public:
120 static scoped_ptr<ScrollbarBackgroundPainter> create(WebKit::WebScrollbar* s crollbar, WebKit::WebScrollbarThemePainter painter, WebKit::WebScrollbarThemeGeo metry* geometry, WebKit::WebScrollbar::ScrollbarPart trackPart) 126 static scoped_ptr<ScrollbarBackgroundPainter> create(WebKit::WebScrollbar* s crollbar, ScrollbarThemePainter *painter, WebKit::WebScrollbarThemeGeometry* geo metry, WebKit::WebScrollbar::ScrollbarPart trackPart)
121 { 127 {
122 return make_scoped_ptr(new ScrollbarBackgroundPainter(scrollbar, painter , geometry, trackPart)); 128 return make_scoped_ptr(new ScrollbarBackgroundPainter(scrollbar, painter , geometry, trackPart));
123 } 129 }
124 130
125 virtual void paint(SkCanvas* skCanvas, const gfx::Rect& contentRect, gfx::Re ctF&) OVERRIDE 131 virtual void paint(SkCanvas* canvas, gfx::Rect contentRect, gfx::RectF&) OVE RRIDE
126 { 132 {
127 WebKit::WebCanvas* canvas = skCanvas;
128 // The following is a simplification of ScrollbarThemeComposite::paint. 133 // The following is a simplification of ScrollbarThemeComposite::paint.
129 m_painter.paintScrollbarBackground(canvas, contentRect); 134 m_painter->PaintScrollbarBackground(canvas, contentRect);
130 135
131 if (m_geometry->hasButtons(m_scrollbar)) { 136 if (m_geometry->hasButtons(m_scrollbar)) {
132 WebRect backButtonStartPaintRect = m_geometry->backButtonStartRect(m _scrollbar); 137 gfx::Rect backButtonStartPaintRect = m_geometry->backButtonStartRect (m_scrollbar);
133 m_painter.paintBackButtonStart(canvas, backButtonStartPaintRect); 138 m_painter->PaintBackButtonStart(canvas, backButtonStartPaintRect);
134 139
135 WebRect backButtonEndPaintRect = m_geometry->backButtonEndRect(m_scr ollbar); 140 gfx::Rect backButtonEndPaintRect = m_geometry->backButtonEndRect(m_s crollbar);
136 m_painter.paintBackButtonEnd(canvas, backButtonEndPaintRect); 141 m_painter->PaintBackButtonEnd(canvas, backButtonEndPaintRect);
137 142
138 WebRect forwardButtonStartPaintRect = m_geometry->forwardButtonStart Rect(m_scrollbar); 143 gfx::Rect forwardButtonStartPaintRect = m_geometry->forwardButtonSta rtRect(m_scrollbar);
139 m_painter.paintForwardButtonStart(canvas, forwardButtonStartPaintRec t); 144 m_painter->PaintForwardButtonStart(canvas, forwardButtonStartPaintRe ct);
140 145
141 WebRect forwardButtonEndPaintRect = m_geometry->forwardButtonEndRect (m_scrollbar); 146 gfx::Rect forwardButtonEndPaintRect = m_geometry->forwardButtonEndRe ct(m_scrollbar);
142 m_painter.paintForwardButtonEnd(canvas, forwardButtonEndPaintRect); 147 m_painter->PaintForwardButtonEnd(canvas, forwardButtonEndPaintRect);
143 } 148 }
144 149
145 WebRect trackPaintRect = m_geometry->trackRect(m_scrollbar); 150 gfx::Rect trackPaintRect = m_geometry->trackRect(m_scrollbar);
146 m_painter.paintTrackBackground(canvas, trackPaintRect); 151 m_painter->PaintTrackBackground(canvas, trackPaintRect);
147 152
148 bool thumbPresent = m_geometry->hasThumb(m_scrollbar); 153 bool thumbPresent = m_geometry->hasThumb(m_scrollbar);
149 if (thumbPresent) { 154 if (thumbPresent) {
150 if (m_trackPart == WebKit::WebScrollbar::ForwardTrackPart) 155 if (m_trackPart == WebKit::WebScrollbar::ForwardTrackPart)
151 m_painter.paintForwardTrackPart(canvas, trackPaintRect); 156 m_painter->PaintForwardTrackPart(canvas, trackPaintRect);
152 else 157 else
153 m_painter.paintBackTrackPart(canvas, trackPaintRect); 158 m_painter->PaintBackTrackPart(canvas, trackPaintRect);
154 } 159 }
155 160
156 m_painter.paintTickmarks(canvas, trackPaintRect); 161 m_painter->PaintTickmarks(canvas, trackPaintRect);
157 } 162 }
158 private: 163 private:
159 ScrollbarBackgroundPainter(WebKit::WebScrollbar* scrollbar, WebKit::WebScrol lbarThemePainter painter, WebKit::WebScrollbarThemeGeometry* geometry, WebKit::W ebScrollbar::ScrollbarPart trackPart) 164 ScrollbarBackgroundPainter(WebKit::WebScrollbar* scrollbar, ScrollbarThemePa inter *painter, WebKit::WebScrollbarThemeGeometry* geometry, WebKit::WebScrollba r::ScrollbarPart trackPart)
160 : m_scrollbar(scrollbar) 165 : m_scrollbar(scrollbar)
161 , m_painter(painter) 166 , m_painter(painter)
162 , m_geometry(geometry) 167 , m_geometry(geometry)
163 , m_trackPart(trackPart) 168 , m_trackPart(trackPart)
164 { 169 {
165 } 170 }
166 171
167 WebKit::WebScrollbar* m_scrollbar; 172 WebKit::WebScrollbar* m_scrollbar;
168 WebKit::WebScrollbarThemePainter m_painter; 173 ScrollbarThemePainter* m_painter;
169 WebKit::WebScrollbarThemeGeometry* m_geometry; 174 WebKit::WebScrollbarThemeGeometry* m_geometry;
170 WebKit::WebScrollbar::ScrollbarPart m_trackPart; 175 WebKit::WebScrollbar::ScrollbarPart m_trackPart;
171 176
172 DISALLOW_COPY_AND_ASSIGN(ScrollbarBackgroundPainter); 177 DISALLOW_COPY_AND_ASSIGN(ScrollbarBackgroundPainter);
173 }; 178 };
174 179
175 class ScrollbarThumbPainter : public LayerPainter { 180 class ScrollbarThumbPainter : public LayerPainter {
176 public: 181 public:
177 static scoped_ptr<ScrollbarThumbPainter> create(WebKit::WebScrollbar* scroll bar, WebKit::WebScrollbarThemePainter painter, WebKit::WebScrollbarThemeGeometry * geometry) 182 static scoped_ptr<ScrollbarThumbPainter> create(WebKit::WebScrollbar* scroll bar, ScrollbarThemePainter* painter, WebKit::WebScrollbarThemeGeometry* geometry )
178 { 183 {
179 return make_scoped_ptr(new ScrollbarThumbPainter(scrollbar, painter, geo metry)); 184 return make_scoped_ptr(new ScrollbarThumbPainter(scrollbar, painter, geo metry));
180 } 185 }
181 186
182 virtual void paint(SkCanvas* skCanvas, const gfx::Rect& contentRect, gfx::Re ctF& opaque) OVERRIDE 187 virtual void paint(SkCanvas* canvas, gfx::Rect contentRect, gfx::RectF& opaq ue) OVERRIDE
183 { 188 {
184 WebKit::WebCanvas* canvas = skCanvas;
185
186 // Consider the thumb to be at the origin when painting. 189 // Consider the thumb to be at the origin when painting.
187 WebRect thumbRect = m_geometry->thumbRect(m_scrollbar); 190 gfx::Rect thumbRect = m_geometry->thumbRect(m_scrollbar);
188 thumbRect.x = 0; 191 m_painter->PaintThumb(canvas, gfx::Rect(thumbRect.size()));
189 thumbRect.y = 0;
190 m_painter.paintThumb(canvas, thumbRect);
191 } 192 }
192 193
193 private: 194 private:
194 ScrollbarThumbPainter(WebKit::WebScrollbar* scrollbar, WebKit::WebScrollbarT hemePainter painter, WebKit::WebScrollbarThemeGeometry* geometry) 195 ScrollbarThumbPainter(WebKit::WebScrollbar* scrollbar, ScrollbarThemePainter * painter, WebKit::WebScrollbarThemeGeometry* geometry)
195 : m_scrollbar(scrollbar) 196 : m_scrollbar(scrollbar)
196 , m_painter(painter) 197 , m_painter(painter)
197 , m_geometry(geometry) 198 , m_geometry(geometry)
198 { 199 {
199 } 200 }
200 201
201 WebKit::WebScrollbar* m_scrollbar; 202 WebKit::WebScrollbar* m_scrollbar;
202 WebKit::WebScrollbarThemePainter m_painter; 203 ScrollbarThemePainter* m_painter;
203 WebKit::WebScrollbarThemeGeometry* m_geometry; 204 WebKit::WebScrollbarThemeGeometry* m_geometry;
204 205
205 DISALLOW_COPY_AND_ASSIGN(ScrollbarThumbPainter); 206 DISALLOW_COPY_AND_ASSIGN(ScrollbarThumbPainter);
206 }; 207 };
207 208
208 void ScrollbarLayer::setLayerTreeHost(LayerTreeHost* host) 209 void ScrollbarLayer::setLayerTreeHost(LayerTreeHost* host)
209 { 210 {
210 if (!host || host != layerTreeHost()) { 211 if (!host || host != layerTreeHost()) {
211 m_backTrackUpdater = NULL; 212 m_backTrackUpdater = NULL;
212 m_backTrack.reset(); 213 m_backTrack.reset();
213 m_thumbUpdater = NULL; 214 m_thumbUpdater = NULL;
214 m_thumb.reset(); 215 m_thumb.reset();
215 } 216 }
216 217
217 ContentsScalingLayer::setLayerTreeHost(host); 218 ContentsScalingLayer::setLayerTreeHost(host);
218 } 219 }
219 220
220 void ScrollbarLayer::createUpdaterIfNeeded() 221 void ScrollbarLayer::createUpdaterIfNeeded()
221 { 222 {
222 m_textureFormat = layerTreeHost()->rendererCapabilities().bestTextureFormat; 223 m_textureFormat = layerTreeHost()->rendererCapabilities().bestTextureFormat;
223 224
224 if (!m_backTrackUpdater) 225 if (!m_backTrackUpdater)
225 m_backTrackUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarB ackgroundPainter::create(m_scrollbar.get(), m_painter, m_geometry.get(), WebKit: :WebScrollbar::BackTrackPart).PassAs<LayerPainter>()); 226 m_backTrackUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarB ackgroundPainter::create(m_scrollbar.get(), m_painter.get(), m_geometry.get(), W ebKit::WebScrollbar::BackTrackPart).PassAs<LayerPainter>());
226 if (!m_backTrack) 227 if (!m_backTrack)
227 m_backTrack = m_backTrackUpdater->createResource(layerTreeHost()->conten tsTextureManager()); 228 m_backTrack = m_backTrackUpdater->createResource(layerTreeHost()->conten tsTextureManager());
228 229
229 // Only create two-part track if we think the two parts could be different i n appearance. 230 // Only create two-part track if we think the two parts could be different i n appearance.
230 if (m_scrollbar->isCustomScrollbar()) { 231 if (m_scrollbar->isCustomScrollbar()) {
231 if (!m_foreTrackUpdater) 232 if (!m_foreTrackUpdater)
232 m_foreTrackUpdater = CachingBitmapContentLayerUpdater::Create(Scroll barBackgroundPainter::create(m_scrollbar.get(), m_painter, m_geometry.get(), Web Kit::WebScrollbar::ForwardTrackPart).PassAs<LayerPainter>()); 233 m_foreTrackUpdater = CachingBitmapContentLayerUpdater::Create(Scroll barBackgroundPainter::create(m_scrollbar.get(), m_painter.get(), m_geometry.get( ), WebKit::WebScrollbar::ForwardTrackPart).PassAs<LayerPainter>());
233 if (!m_foreTrack) 234 if (!m_foreTrack)
234 m_foreTrack = m_foreTrackUpdater->createResource(layerTreeHost()->co ntentsTextureManager()); 235 m_foreTrack = m_foreTrackUpdater->createResource(layerTreeHost()->co ntentsTextureManager());
235 } 236 }
236 237
237 if (!m_thumbUpdater) 238 if (!m_thumbUpdater)
238 m_thumbUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarThumb Painter::create(m_scrollbar.get(), m_painter, m_geometry.get()).PassAs<LayerPain ter>()); 239 m_thumbUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarThumb Painter::create(m_scrollbar.get(), m_painter.get(), m_geometry.get()).PassAs<Lay erPainter>());
239 if (!m_thumb) 240 if (!m_thumb)
240 m_thumb = m_thumbUpdater->createResource(layerTreeHost()->contentsTextur eManager()); 241 m_thumb = m_thumbUpdater->createResource(layerTreeHost()->contentsTextur eManager());
241 } 242 }
242 243
243 void ScrollbarLayer::updatePart(CachingBitmapContentLayerUpdater* painter, Layer Updater::Resource* texture, const gfx::Rect& rect, ResourceUpdateQueue& queue, R enderingStats& stats) 244 void ScrollbarLayer::updatePart(CachingBitmapContentLayerUpdater* painter, Layer Updater::Resource* resource, const gfx::Rect& rect, ResourceUpdateQueue& queue, RenderingStats& stats)
244 { 245 {
245 // Skip painting and uploading if there are no invalidations and 246 // Skip painting and uploading if there are no invalidations and
246 // we already have valid texture data. 247 // we already have valid texture data.
247 if (texture->texture()->haveBackingTexture() 248 if (resource->texture()->haveBackingTexture() &&
248 && texture->texture()->size() == rect.size() 249 resource->texture()->size() == rect.size() &&
249 && m_updateRect.IsEmpty()) 250 m_updateRect.IsEmpty())
250 return; 251 return;
251 252
252 // We should always have enough memory for UI. 253 // We should always have enough memory for UI.
253 DCHECK(texture->texture()->canAcquireBackingTexture()); 254 DCHECK(resource->texture()->canAcquireBackingTexture());
254 if (!texture->texture()->canAcquireBackingTexture()) 255 if (!resource->texture()->canAcquireBackingTexture())
255 return; 256 return;
256 257
257 // Paint and upload the entire part. 258 // Paint and upload the entire part.
258 gfx::Rect paintedOpaqueRect; 259 gfx::Rect paintedOpaqueRect;
259 painter->prepareToUpdate(rect, rect.size(), contentsScaleX(), contentsScaleY (), paintedOpaqueRect, stats); 260 painter->prepareToUpdate(rect, rect.size(), contentsScaleX(), contentsScaleY (), paintedOpaqueRect, stats);
260 if (!painter->pixelsDidChange() && texture->texture()->haveBackingTexture()) { 261 if (!painter->pixelsDidChange() && resource->texture()->haveBackingTexture() ) {
261 TRACE_EVENT_INSTANT0("cc","ScrollbarLayer::updatePart no texture upload needed"); 262 TRACE_EVENT_INSTANT0("cc","ScrollbarLayer::updatePart no texture upload needed");
262 return; 263 return;
263 } 264 }
264 265
265 gfx::Vector2d destOffset(0, 0); 266 gfx::Vector2d destOffset(0, 0);
266 texture->update(queue, rect, destOffset, false, stats); 267 resource->update(queue, rect, destOffset, false, stats);
267 } 268 }
268 269
269 gfx::Rect ScrollbarLayer::scrollbarLayerRectToContentRect(const gfx::Rect& layer Rect) const 270 gfx::Rect ScrollbarLayer::scrollbarLayerRectToContentRect(const gfx::Rect& layer Rect) const
270 { 271 {
271 // Don't intersect with the bounds as in layerRectToContentRect() because 272 // Don't intersect with the bounds as in layerRectToContentRect() because
272 // layerRect here might be in coordinates of the containing layer. 273 // layerRect here might be in coordinates of the containing layer.
273 gfx::RectF contentRect = gfx::ScaleRect(layerRect, contentsScaleX(), content sScaleY()); 274 gfx::RectF contentRect = gfx::ScaleRect(layerRect, contentsScaleX(), content sScaleY());
274 return gfx::ToEnclosingRect(contentRect); 275 return gfx::ToEnclosingRect(contentRect);
275 } 276 }
276 277
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 updatePart(m_foreTrackUpdater.get(), m_foreTrack.get(), contentRect, que ue, stats); 313 updatePart(m_foreTrackUpdater.get(), m_foreTrack.get(), contentRect, que ue, stats);
313 314
314 // Consider the thumb to be at the origin when painting. 315 // Consider the thumb to be at the origin when painting.
315 WebKit::WebRect thumbRect = m_geometry->thumbRect(m_scrollbar.get()); 316 WebKit::WebRect thumbRect = m_geometry->thumbRect(m_scrollbar.get());
316 gfx::Rect originThumbRect = scrollbarLayerRectToContentRect(gfx::Rect(0, 0, thumbRect.width, thumbRect.height)); 317 gfx::Rect originThumbRect = scrollbarLayerRectToContentRect(gfx::Rect(0, 0, thumbRect.width, thumbRect.height));
317 if (!originThumbRect.IsEmpty()) 318 if (!originThumbRect.IsEmpty())
318 updatePart(m_thumbUpdater.get(), m_thumb.get(), originThumbRect, queue, stats); 319 updatePart(m_thumbUpdater.get(), m_thumb.get(), originThumbRect, queue, stats);
319 } 320 }
320 321
321 } // namespace cc 322 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scrollbar_layer.h ('k') | cc/scrollbar_layer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698