| OLD | NEW |
| 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/scrollbar_layer.h" | 7 #include "cc/scrollbar_layer.h" |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "cc/layer_painter.h" | 11 #include "cc/layer_painter.h" |
| 12 #include "cc/layer_tree_host.h" | 12 #include "cc/layer_tree_host.h" |
| 13 #include "cc/resource_update_queue.h" | 13 #include "cc/resource_update_queue.h" |
| 14 #include "cc/scrollbar_layer_impl.h" | 14 #include "cc/scrollbar_layer_impl.h" |
| 15 #include "ui/gfx/rect_conversions.h" |
| 15 #include <public/WebRect.h> | 16 #include <public/WebRect.h> |
| 16 | 17 |
| 17 using WebKit::WebRect; | 18 using WebKit::WebRect; |
| 18 | 19 |
| 19 namespace cc { | 20 namespace cc { |
| 20 | 21 |
| 21 scoped_ptr<LayerImpl> ScrollbarLayer::createLayerImpl() | 22 scoped_ptr<LayerImpl> ScrollbarLayer::createLayerImpl() |
| 22 { | 23 { |
| 23 return ScrollbarLayerImpl::create(id()).PassAs<LayerImpl>(); | 24 return ScrollbarLayerImpl::create(id()).PassAs<LayerImpl>(); |
| 24 } | 25 } |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 if (!m_foreTrack) | 192 if (!m_foreTrack) |
| 192 m_foreTrack = m_foreTrackUpdater->createResource(layerTreeHost()->co
ntentsTextureManager()); | 193 m_foreTrack = m_foreTrackUpdater->createResource(layerTreeHost()->co
ntentsTextureManager()); |
| 193 } | 194 } |
| 194 | 195 |
| 195 if (!m_thumbUpdater) | 196 if (!m_thumbUpdater) |
| 196 m_thumbUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarThumb
Painter::create(m_scrollbar.get(), m_painter, m_geometry.get()).PassAs<LayerPain
ter>()); | 197 m_thumbUpdater = CachingBitmapContentLayerUpdater::Create(ScrollbarThumb
Painter::create(m_scrollbar.get(), m_painter, m_geometry.get()).PassAs<LayerPain
ter>()); |
| 197 if (!m_thumb) | 198 if (!m_thumb) |
| 198 m_thumb = m_thumbUpdater->createResource(layerTreeHost()->contentsTextur
eManager()); | 199 m_thumb = m_thumbUpdater->createResource(layerTreeHost()->contentsTextur
eManager()); |
| 199 } | 200 } |
| 200 | 201 |
| 201 void ScrollbarLayer::updatePart(CachingBitmapContentLayerUpdater* painter, Layer
Updater::Resource* texture, const IntRect& rect, ResourceUpdateQueue& queue, Ren
deringStats& stats) | 202 void ScrollbarLayer::updatePart(CachingBitmapContentLayerUpdater* painter, Layer
Updater::Resource* texture, const gfx::Rect& rect, ResourceUpdateQueue& queue, R
enderingStats& stats) |
| 202 { | 203 { |
| 203 // Skip painting and uploading if there are no invalidations and | 204 // Skip painting and uploading if there are no invalidations and |
| 204 // we already have valid texture data. | 205 // we already have valid texture data. |
| 205 if (texture->texture()->haveBackingTexture() | 206 if (texture->texture()->haveBackingTexture() |
| 206 && texture->texture()->size() == rect.size() | 207 && texture->texture()->size() == rect.size() |
| 207 && m_updateRect.isEmpty()) | 208 && m_updateRect.IsEmpty()) |
| 208 return; | 209 return; |
| 209 | 210 |
| 210 // We should always have enough memory for UI. | 211 // We should always have enough memory for UI. |
| 211 DCHECK(texture->texture()->canAcquireBackingTexture()); | 212 DCHECK(texture->texture()->canAcquireBackingTexture()); |
| 212 if (!texture->texture()->canAcquireBackingTexture()) | 213 if (!texture->texture()->canAcquireBackingTexture()) |
| 213 return; | 214 return; |
| 214 | 215 |
| 215 // Paint and upload the entire part. | 216 // Paint and upload the entire part. |
| 216 gfx::Rect paintedOpaqueRect; | 217 gfx::Rect paintedOpaqueRect; |
| 217 painter->prepareToUpdate(rect, rect.size(), contentsScaleX(), contentsScaleY
(), paintedOpaqueRect, stats); | 218 painter->prepareToUpdate(rect, rect.size(), contentsScaleX(), contentsScaleY
(), paintedOpaqueRect, stats); |
| 218 if (!painter->pixelsDidChange() && texture->texture()->haveBackingTexture())
{ | 219 if (!painter->pixelsDidChange() && texture->texture()->haveBackingTexture())
{ |
| 219 TRACE_EVENT_INSTANT0("cc","ScrollbarLayer::updatePart no texture upload
needed"); | 220 TRACE_EVENT_INSTANT0("cc","ScrollbarLayer::updatePart no texture upload
needed"); |
| 220 return; | 221 return; |
| 221 } | 222 } |
| 222 | 223 |
| 223 gfx::Vector2d destOffset(0, 0); | 224 gfx::Vector2d destOffset(0, 0); |
| 224 texture->update(queue, rect, destOffset, false, stats); | 225 texture->update(queue, rect, destOffset, false, stats); |
| 225 } | 226 } |
| 226 | 227 |
| 227 IntRect ScrollbarLayer::scrollbarLayerRectToContentRect(const WebRect& layerRect
) const | 228 gfx::Rect ScrollbarLayer::scrollbarLayerRectToContentRect(const gfx::Rect& layer
Rect) const |
| 228 { | 229 { |
| 229 // Don't intersect with the bounds as in layerRectToContentRect() because | 230 // Don't intersect with the bounds as in layerRectToContentRect() because |
| 230 // layerRect here might be in coordinates of the containing layer. | 231 // layerRect here might be in coordinates of the containing layer. |
| 231 FloatRect contentRect(layerRect.x, layerRect.y, layerRect.width, layerRect.h
eight); | 232 gfx::RectF contentRect = gfx::ScaleRect(layerRect, contentsScaleX(), content
sScaleY()); |
| 232 contentRect.scale(contentsScaleX(), contentsScaleY()); | 233 return gfx::ToEnclosingRect(contentRect); |
| 233 return enclosingIntRect(contentRect); | |
| 234 } | 234 } |
| 235 | 235 |
| 236 void ScrollbarLayer::setTexturePriorities(const PriorityCalculator&) | 236 void ScrollbarLayer::setTexturePriorities(const PriorityCalculator&) |
| 237 { | 237 { |
| 238 if (contentBounds().isEmpty()) | 238 if (contentBounds().IsEmpty()) |
| 239 return; | 239 return; |
| 240 | 240 |
| 241 createUpdaterIfNeeded(); | 241 createUpdaterIfNeeded(); |
| 242 | 242 |
| 243 bool drawsToRoot = !renderTarget()->parent(); | 243 bool drawsToRoot = !renderTarget()->parent(); |
| 244 if (m_backTrack) { | 244 if (m_backTrack) { |
| 245 m_backTrack->texture()->setDimensions(contentBounds(), m_textureFormat); | 245 m_backTrack->texture()->setDimensions(contentBounds(), m_textureFormat); |
| 246 m_backTrack->texture()->setRequestPriority(PriorityCalculator::uiPriorit
y(drawsToRoot)); | 246 m_backTrack->texture()->setRequestPriority(PriorityCalculator::uiPriorit
y(drawsToRoot)); |
| 247 } | 247 } |
| 248 if (m_foreTrack) { | 248 if (m_foreTrack) { |
| 249 m_foreTrack->texture()->setDimensions(contentBounds(), m_textureFormat); | 249 m_foreTrack->texture()->setDimensions(contentBounds(), m_textureFormat); |
| 250 m_foreTrack->texture()->setRequestPriority(PriorityCalculator::uiPriorit
y(drawsToRoot)); | 250 m_foreTrack->texture()->setRequestPriority(PriorityCalculator::uiPriorit
y(drawsToRoot)); |
| 251 } | 251 } |
| 252 if (m_thumb) { | 252 if (m_thumb) { |
| 253 IntSize thumbSize = scrollbarLayerRectToContentRect(m_geometry->thumbRec
t(m_scrollbar.get())).size(); | 253 gfx::Size thumbSize = scrollbarLayerRectToContentRect(m_geometry->thumbR
ect(m_scrollbar.get())).size(); |
| 254 m_thumb->texture()->setDimensions(thumbSize, m_textureFormat); | 254 m_thumb->texture()->setDimensions(thumbSize, m_textureFormat); |
| 255 m_thumb->texture()->setRequestPriority(PriorityCalculator::uiPriority(dr
awsToRoot)); | 255 m_thumb->texture()->setRequestPriority(PriorityCalculator::uiPriority(dr
awsToRoot)); |
| 256 } | 256 } |
| 257 } | 257 } |
| 258 | 258 |
| 259 void ScrollbarLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker*,
RenderingStats& stats) | 259 void ScrollbarLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker*,
RenderingStats& stats) |
| 260 { | 260 { |
| 261 if (contentBounds().isEmpty()) | 261 if (contentBounds().IsEmpty()) |
| 262 return; | 262 return; |
| 263 | 263 |
| 264 createUpdaterIfNeeded(); | 264 createUpdaterIfNeeded(); |
| 265 | 265 |
| 266 IntRect contentRect = scrollbarLayerRectToContentRect(WebRect(m_scrollbar->l
ocation().x, m_scrollbar->location().y, bounds().width(), bounds().height())); | 266 gfx::Rect contentRect = scrollbarLayerRectToContentRect(gfx::Rect(m_scrollba
r->location(), bounds())); |
| 267 updatePart(m_backTrackUpdater.get(), m_backTrack.get(), contentRect, queue,
stats); | 267 updatePart(m_backTrackUpdater.get(), m_backTrack.get(), contentRect, queue,
stats); |
| 268 if (m_foreTrack && m_foreTrackUpdater) | 268 if (m_foreTrack && m_foreTrackUpdater) |
| 269 updatePart(m_foreTrackUpdater.get(), m_foreTrack.get(), contentRect, que
ue, stats); | 269 updatePart(m_foreTrackUpdater.get(), m_foreTrack.get(), contentRect, que
ue, stats); |
| 270 | 270 |
| 271 // Consider the thumb to be at the origin when painting. | 271 // Consider the thumb to be at the origin when painting. |
| 272 WebKit::WebRect thumbRect = m_geometry->thumbRect(m_scrollbar.get()); | 272 WebKit::WebRect thumbRect = m_geometry->thumbRect(m_scrollbar.get()); |
| 273 IntRect originThumbRect = scrollbarLayerRectToContentRect(WebRect(0, 0, thum
bRect.width, thumbRect.height)); | 273 gfx::Rect originThumbRect = scrollbarLayerRectToContentRect(gfx::Rect(0, 0,
thumbRect.width, thumbRect.height)); |
| 274 if (!originThumbRect.isEmpty()) | 274 if (!originThumbRect.IsEmpty()) |
| 275 updatePart(m_thumbUpdater.get(), m_thumb.get(), originThumbRect, queue,
stats); | 275 updatePart(m_thumbUpdater.get(), m_thumb.get(), originThumbRect, queue,
stats); |
| 276 } | 276 } |
| 277 | 277 |
| 278 } | 278 } |
| OLD | NEW |