| // Copyright 2014 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/blink/scrollbar_impl.h" |
| |
| #include "base/logging.h" |
| #include "third_party/WebKit/public/platform/WebScrollbar.h" |
| #include "third_party/WebKit/public/platform/WebScrollbarThemeGeometry.h" |
| |
| using blink::WebScrollbar; |
| |
| namespace cc_blink { |
| |
| ScrollbarImpl::ScrollbarImpl( |
| std::unique_ptr<WebScrollbar> scrollbar, |
| blink::WebScrollbarThemePainter painter, |
| std::unique_ptr<blink::WebScrollbarThemeGeometry> geometry) |
| : scrollbar_(std::move(scrollbar)), |
| painter_(painter), |
| geometry_(std::move(geometry)) {} |
| |
| ScrollbarImpl::~ScrollbarImpl() { |
| } |
| |
| cc::ScrollbarOrientation ScrollbarImpl::Orientation() const { |
| if (scrollbar_->orientation() == WebScrollbar::Horizontal) |
| return cc::HORIZONTAL; |
| return cc::VERTICAL; |
| } |
| |
| bool ScrollbarImpl::IsLeftSideVerticalScrollbar() const { |
| return scrollbar_->isLeftSideVerticalScrollbar(); |
| } |
| |
| bool ScrollbarImpl::HasThumb() const { |
| return geometry_->hasThumb(scrollbar_.get()); |
| } |
| |
| bool ScrollbarImpl::IsOverlay() const { |
| return scrollbar_->isOverlay(); |
| } |
| |
| gfx::Point ScrollbarImpl::Location() const { |
| return scrollbar_->location(); |
| } |
| |
| int ScrollbarImpl::ThumbThickness() const { |
| gfx::Rect thumb_rect = geometry_->thumbRect(scrollbar_.get()); |
| if (scrollbar_->orientation() == WebScrollbar::Horizontal) |
| return thumb_rect.height(); |
| return thumb_rect.width(); |
| } |
| |
| int ScrollbarImpl::ThumbLength() const { |
| gfx::Rect thumb_rect = geometry_->thumbRect(scrollbar_.get()); |
| if (scrollbar_->orientation() == WebScrollbar::Horizontal) |
| return thumb_rect.width(); |
| return thumb_rect.height(); |
| } |
| |
| gfx::Rect ScrollbarImpl::TrackRect() const { |
| return geometry_->trackRect(scrollbar_.get()); |
| } |
| |
| float ScrollbarImpl::ThumbOpacity() const { |
| return painter_.thumbOpacity(); |
| } |
| |
| bool ScrollbarImpl::NeedsPaintPart(cc::ScrollbarPart part) const { |
| if (part == cc::THUMB) |
| return painter_.thumbNeedsRepaint(); |
| return painter_.trackNeedsRepaint(); |
| } |
| |
| void ScrollbarImpl::PaintPart(SkCanvas* canvas, |
| cc::ScrollbarPart part, |
| const gfx::Rect& content_rect) { |
| if (part == cc::THUMB) { |
| painter_.paintThumb(canvas, content_rect); |
| return; |
| } |
| |
| // The following is a simplification of ScrollbarThemeComposite::paint. |
| painter_.paintScrollbarBackground(canvas, content_rect); |
| |
| if (geometry_->hasButtons(scrollbar_.get())) { |
| gfx::Rect back_button_start_paint_rect = |
| geometry_->backButtonStartRect(scrollbar_.get()); |
| painter_.paintBackButtonStart(canvas, back_button_start_paint_rect); |
| |
| gfx::Rect back_button_end_paint_rect = |
| geometry_->backButtonEndRect(scrollbar_.get()); |
| painter_.paintBackButtonEnd(canvas, back_button_end_paint_rect); |
| |
| gfx::Rect forward_button_start_paint_rect = |
| geometry_->forwardButtonStartRect(scrollbar_.get()); |
| painter_.paintForwardButtonStart(canvas, forward_button_start_paint_rect); |
| |
| gfx::Rect forward_button_end_paint_rect = |
| geometry_->forwardButtonEndRect(scrollbar_.get()); |
| painter_.paintForwardButtonEnd(canvas, forward_button_end_paint_rect); |
| } |
| |
| gfx::Rect track_paint_rect = geometry_->trackRect(scrollbar_.get()); |
| painter_.paintTrackBackground(canvas, track_paint_rect); |
| |
| bool thumb_present = geometry_->hasThumb(scrollbar_.get()); |
| if (thumb_present) { |
| painter_.paintForwardTrackPart(canvas, track_paint_rect); |
| painter_.paintBackTrackPart(canvas, track_paint_rect); |
| } |
| |
| painter_.paintTickmarks(canvas, track_paint_rect); |
| } |
| |
| } // namespace cc_blink |