| Index: cc/layers/painted_overlay_scrollbar_layer.cc
|
| diff --git a/cc/layers/painted_overlay_scrollbar_layer.cc b/cc/layers/painted_overlay_scrollbar_layer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ab8643ecac019f803376b6168a43c2dd7a04778a
|
| --- /dev/null
|
| +++ b/cc/layers/painted_overlay_scrollbar_layer.cc
|
| @@ -0,0 +1,173 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "cc/layers/painted_overlay_scrollbar_layer.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/auto_reset.h"
|
| +#include "cc/base/math_util.h"
|
| +#include "cc/layers/painted_overlay_scrollbar_layer_impl.h"
|
| +#include "cc/resources/ui_resource_bitmap.h"
|
| +#include "cc/resources/ui_resource_manager.h"
|
| +#include "cc/trees/layer_tree_host.h"
|
| +#include "cc/trees/layer_tree_impl.h"
|
| +#include "skia/ext/platform_canvas.h"
|
| +#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 {
|
| +
|
| +std::unique_ptr<LayerImpl> PaintedOverlayScrollbarLayer::CreateLayerImpl(
|
| + LayerTreeImpl* tree_impl) {
|
| + return PaintedOverlayScrollbarLayerImpl::Create(
|
| + tree_impl, id(), scrollbar_->Orientation(),
|
| + scrollbar_->IsLeftSideVerticalScrollbar());
|
| +}
|
| +
|
| +scoped_refptr<PaintedOverlayScrollbarLayer>
|
| +PaintedOverlayScrollbarLayer::Create(std::unique_ptr<Scrollbar> scrollbar,
|
| + int scroll_layer_id) {
|
| + return make_scoped_refptr(
|
| + new PaintedOverlayScrollbarLayer(std::move(scrollbar), scroll_layer_id));
|
| +}
|
| +
|
| +PaintedOverlayScrollbarLayer::PaintedOverlayScrollbarLayer(
|
| + std::unique_ptr<Scrollbar> scrollbar,
|
| + int scroll_layer_id)
|
| + : scrollbar_(std::move(scrollbar)),
|
| + scroll_layer_id_(scroll_layer_id),
|
| + thumb_thickness_(scrollbar_->ThumbThickness()),
|
| + thumb_length_(scrollbar_->ThumbLength()) {
|
| + DCHECK(scrollbar_->UsesNinePatchThumbResource());
|
| +}
|
| +
|
| +PaintedOverlayScrollbarLayer::~PaintedOverlayScrollbarLayer() {}
|
| +
|
| +int PaintedOverlayScrollbarLayer::ScrollLayerId() const {
|
| + return scroll_layer_id_;
|
| +}
|
| +
|
| +void PaintedOverlayScrollbarLayer::SetScrollLayer(int layer_id) {
|
| + if (layer_id == scroll_layer_id_)
|
| + return;
|
| +
|
| + scroll_layer_id_ = layer_id;
|
| + SetNeedsFullTreeSync();
|
| +}
|
| +
|
| +bool PaintedOverlayScrollbarLayer::OpacityCanAnimateOnImplThread() const {
|
| + return scrollbar_->IsOverlay();
|
| +}
|
| +
|
| +bool PaintedOverlayScrollbarLayer::AlwaysUseActiveTreeOpacity() const {
|
| + return true;
|
| +}
|
| +
|
| +ScrollbarOrientation PaintedOverlayScrollbarLayer::orientation() const {
|
| + return scrollbar_->Orientation();
|
| +}
|
| +
|
| +void PaintedOverlayScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
|
| + Layer::PushPropertiesTo(layer);
|
| +
|
| + PaintedOverlayScrollbarLayerImpl* scrollbar_layer =
|
| + static_cast<PaintedOverlayScrollbarLayerImpl*>(layer);
|
| +
|
| + scrollbar_layer->SetScrollLayerId(scroll_layer_id_);
|
| +
|
| + scrollbar_layer->SetThumbThickness(thumb_thickness_);
|
| + scrollbar_layer->SetThumbLength(thumb_length_);
|
| + if (orientation() == HORIZONTAL) {
|
| + scrollbar_layer->SetTrackStart(track_rect_.x() - location_.x());
|
| + scrollbar_layer->SetTrackLength(track_rect_.width());
|
| + } else {
|
| + scrollbar_layer->SetTrackStart(track_rect_.y() - location_.y());
|
| + scrollbar_layer->SetTrackLength(track_rect_.height());
|
| + }
|
| +
|
| + if (thumb_resource_.get()) {
|
| + scrollbar_layer->SetImageBounds(
|
| + layer_tree_host()->GetUIResourceManager()->GetUIResourceSize(
|
| + thumb_resource_->id()));
|
| + scrollbar_layer->SetAperture(aperture_);
|
| + scrollbar_layer->set_thumb_ui_resource_id(thumb_resource_->id());
|
| + } else {
|
| + scrollbar_layer->SetImageBounds(gfx::Size());
|
| + scrollbar_layer->SetAperture(gfx::Rect());
|
| + scrollbar_layer->set_thumb_ui_resource_id(0);
|
| + }
|
| +}
|
| +
|
| +ScrollbarLayerInterface* PaintedOverlayScrollbarLayer::ToScrollbarLayer() {
|
| + return this;
|
| +}
|
| +
|
| +void PaintedOverlayScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) {
|
| + // When the LTH is set to null or has changed, then this layer should remove
|
| + // all of its associated resources.
|
| + if (host != layer_tree_host())
|
| + thumb_resource_ = nullptr;
|
| +
|
| + Layer::SetLayerTreeHost(host);
|
| +}
|
| +
|
| +gfx::Rect PaintedOverlayScrollbarLayer::OriginThumbRectForPainting() const {
|
| + return gfx::Rect(gfx::Point(), scrollbar_->NinePatchThumbCanvasSize());
|
| +}
|
| +
|
| +bool PaintedOverlayScrollbarLayer::Update() {
|
| + bool updated = false;
|
| + updated |= Layer::Update();
|
| +
|
| + DCHECK(scrollbar_->HasThumb());
|
| + DCHECK(scrollbar_->IsOverlay());
|
| + DCHECK(scrollbar_->UsesNinePatchThumbResource());
|
| + updated |= UpdateProperty(scrollbar_->TrackRect(), &track_rect_);
|
| + updated |= UpdateProperty(scrollbar_->Location(), &location_);
|
| + updated |= UpdateProperty(scrollbar_->ThumbThickness(), &thumb_thickness_);
|
| + updated |= UpdateProperty(scrollbar_->ThumbLength(), &thumb_length_);
|
| + updated |= PaintThumbIfNeeded();
|
| +
|
| + return updated;
|
| +}
|
| +
|
| +bool PaintedOverlayScrollbarLayer::PaintThumbIfNeeded() {
|
| + if (!scrollbar_->NeedsPaintPart(THUMB))
|
| + return false;
|
| +
|
| + gfx::Rect paint_rect = OriginThumbRectForPainting();
|
| + aperture_ = scrollbar_->NinePatchThumbAperture();
|
| +
|
| + DCHECK(!paint_rect.size().IsEmpty());
|
| + DCHECK(paint_rect.origin().IsOrigin());
|
| +
|
| + SkBitmap skbitmap;
|
| + skbitmap.allocN32Pixels(paint_rect.width(), paint_rect.height());
|
| + SkCanvas skcanvas(skbitmap);
|
| +
|
| + SkRect content_skrect = RectToSkRect(paint_rect);
|
| + SkPaint paint;
|
| + paint.setAntiAlias(false);
|
| + paint.setBlendMode(SkBlendMode::kClear);
|
| + skcanvas.drawRect(content_skrect, paint);
|
| + skcanvas.clipRect(content_skrect);
|
| +
|
| + scrollbar_->PaintPart(&skcanvas, THUMB, paint_rect);
|
| + // Make sure that the pixels are no longer mutable to unavoid unnecessary
|
| + // allocation and copying.
|
| + skbitmap.setImmutable();
|
| +
|
| + thumb_resource_ = ScopedUIResource::Create(
|
| + layer_tree_host()->GetUIResourceManager(), UIResourceBitmap(skbitmap));
|
| +
|
| + SetNeedsPushProperties();
|
| +
|
| + return true;
|
| +}
|
| +
|
| +} // namespace cc
|
|
|