Index: cc/layers/painted_scrollbar_layer.cc |
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc |
index 8f4d675bdb0a3ca49a76335faef2bfba10b7fde4..36c9f82f5a810e0bb424d64258462d313e49b6ee 100644 |
--- a/cc/layers/painted_scrollbar_layer.cc |
+++ b/cc/layers/painted_scrollbar_layer.cc |
@@ -4,9 +4,12 @@ |
#include "cc/layers/painted_scrollbar_layer.h" |
+#include <algorithm> |
+ |
#include "base/auto_reset.h" |
#include "base/basictypes.h" |
#include "base/trace_event/trace_event.h" |
+#include "cc/base/math_util.h" |
#include "cc/layers/painted_scrollbar_layer_impl.h" |
#include "cc/resources/ui_resource_bitmap.h" |
#include "cc/trees/layer_tree_host.h" |
@@ -16,6 +19,7 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkSize.h" |
+#include "ui/gfx/geometry/size_conversions.h" |
#include "ui/gfx/skia_util.h" |
namespace cc { |
@@ -38,6 +42,7 @@ PaintedScrollbarLayer::PaintedScrollbarLayer(scoped_ptr<Scrollbar> scrollbar, |
: scrollbar_(scrollbar.Pass()), |
scroll_layer_id_(scroll_layer_id), |
clip_layer_id_(Layer::INVALID_ID), |
+ internal_contents_scale_(0.f), |
thumb_thickness_(scrollbar_->ThumbThickness()), |
thumb_length_(scrollbar_->ThumbLength()), |
is_overlay_(scrollbar_->IsOverlay()), |
@@ -82,10 +87,10 @@ int PaintedScrollbarLayer::MaxTextureSize() { |
} |
float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) { |
- // If the scaled content_bounds() is bigger than the max texture size of the |
- // device, we need to clamp it by rescaling, since content_bounds() is used |
+ // If the scaled bounds() is bigger than the max texture size of the |
+ // device, we need to clamp it by rescaling, since this is used |
// below to set the texture size. |
- gfx::Size scaled_bounds = ComputeContentBoundsForScale(scale, scale); |
+ gfx::Size scaled_bounds = gfx::ToCeiledSize(gfx::ScaleSize(bounds(), scale)); |
if (scaled_bounds.width() > MaxTextureSize() || |
scaled_bounds.height() > MaxTextureSize()) { |
if (scaled_bounds.width() > scaled_bounds.height()) |
@@ -96,26 +101,17 @@ float PaintedScrollbarLayer::ClampScaleToMaxTextureSize(float scale) { |
return scale; |
} |
-void PaintedScrollbarLayer::CalculateContentsScale( |
- float ideal_contents_scale, |
- float* contents_scale_x, |
- float* contents_scale_y, |
- gfx::Size* content_bounds) { |
- ContentsScalingLayer::CalculateContentsScale( |
- ClampScaleToMaxTextureSize(ideal_contents_scale), |
- contents_scale_x, |
- contents_scale_y, |
- content_bounds); |
-} |
- |
void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { |
- ContentsScalingLayer::PushPropertiesTo(layer); |
+ Layer::PushPropertiesTo(layer); |
PushScrollClipPropertiesTo(layer); |
PaintedScrollbarLayerImpl* scrollbar_layer = |
static_cast<PaintedScrollbarLayerImpl*>(layer); |
+ scrollbar_layer->set_internal_contents_scale_and_bounds( |
+ internal_contents_scale_, internal_content_bounds_); |
+ |
scrollbar_layer->SetThumbThickness(thumb_thickness_); |
scrollbar_layer->SetThumbLength(thumb_length_); |
if (orientation() == HORIZONTAL) { |
@@ -160,7 +156,7 @@ void PaintedScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) { |
thumb_resource_ = nullptr; |
} |
- ContentsScalingLayer::SetLayerTreeHost(host); |
+ Layer::SetLayerTreeHost(host); |
} |
gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( |
@@ -168,10 +164,10 @@ gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( |
// Don't intersect with the bounds as in LayerRectToContentRect() because |
// layer_rect here might be in coordinates of the containing layer. |
gfx::Rect expanded_rect = gfx::ScaleToEnclosingRect( |
- layer_rect, contents_scale_x(), contents_scale_y()); |
- // We should never return a rect bigger than the content_bounds(). |
+ layer_rect, internal_contents_scale_, internal_contents_scale_); |
+ // We should never return a rect bigger than the content bounds. |
gfx::Size clamped_size = expanded_rect.size(); |
- clamped_size.SetToMin(content_bounds()); |
+ clamped_size.SetToMin(internal_content_bounds_); |
expanded_rect.set_size(clamped_size); |
return expanded_rect; |
} |
@@ -202,8 +198,36 @@ void PaintedScrollbarLayer::UpdateThumbAndTrackGeometry() { |
} |
} |
+void PaintedScrollbarLayer::UpdateInternalContentScale() { |
+ float scale = layer_tree_host()->device_scale_factor(); |
+ if (layer_tree_host() |
+ ->settings() |
+ .layer_transforms_should_scale_layer_contents) { |
+ gfx::Vector2dF transform_scales = |
+ MathUtil::ComputeTransform2dScaleComponents(draw_transform(), scale); |
+ scale = std::max(transform_scales.x(), transform_scales.y()); |
+ } |
+ bool changed = false; |
+ changed |= UpdateProperty(ClampScaleToMaxTextureSize(scale), |
+ &internal_contents_scale_); |
+ changed |= UpdateProperty( |
+ gfx::ToCeiledSize(gfx::ScaleSize(bounds(), internal_contents_scale_)), |
+ &internal_content_bounds_); |
+ if (changed) { |
+ // If the content scale or bounds change, repaint. |
+ SetNeedsDisplay(); |
+ } |
+} |
+ |
bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue, |
const OcclusionTracker<Layer>* occlusion) { |
+ { |
+ base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_, |
+ true); |
+ Layer::Update(queue, occlusion); |
+ UpdateInternalContentScale(); |
+ } |
+ |
UpdateThumbAndTrackGeometry(); |
gfx::Rect track_layer_rect = gfx::Rect(location_, bounds()); |
@@ -225,12 +249,7 @@ bool PaintedScrollbarLayer::Update(ResourceUpdateQueue* queue, |
if (!has_thumb_ && thumb_resource_) { |
thumb_resource_ = nullptr; |
SetNeedsPushProperties(); |
- } |
- |
- { |
- base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_, |
- true); |
- ContentsScalingLayer::Update(queue, occlusion); |
+ updated = true; |
} |
if (update_rect_.IsEmpty() && track_resource_) |