Index: cc/layers/painted_overlay_scrollbar_layer_impl.cc |
diff --git a/cc/layers/painted_overlay_scrollbar_layer_impl.cc b/cc/layers/painted_overlay_scrollbar_layer_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..694fb85ab68d506f935f33b000b04598d341824c |
--- /dev/null |
+++ b/cc/layers/painted_overlay_scrollbar_layer_impl.cc |
@@ -0,0 +1,205 @@ |
+// 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_impl.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/memory/ptr_util.h" |
+#include "cc/input/scrollbar_animation_controller.h" |
+#include "cc/layers/layer.h" |
+#include "cc/quads/solid_color_draw_quad.h" |
+#include "cc/quads/texture_draw_quad.h" |
+#include "cc/trees/layer_tree_impl.h" |
+#include "cc/trees/layer_tree_settings.h" |
+#include "cc/trees/occlusion.h" |
+#include "ui/gfx/geometry/rect_conversions.h" |
+ |
+namespace cc { |
+ |
+std::unique_ptr<PaintedOverlayScrollbarLayerImpl> |
+PaintedOverlayScrollbarLayerImpl::Create(LayerTreeImpl* tree_impl, |
+ int id, |
+ ScrollbarOrientation orientation, |
+ bool is_left_side_vertical_scrollbar) { |
+ return base::WrapUnique(new PaintedOverlayScrollbarLayerImpl( |
+ tree_impl, id, orientation, is_left_side_vertical_scrollbar)); |
+} |
+ |
+PaintedOverlayScrollbarLayerImpl::PaintedOverlayScrollbarLayerImpl( |
+ LayerTreeImpl* tree_impl, |
+ int id, |
+ ScrollbarOrientation orientation, |
+ bool is_left_side_vertical_scrollbar) |
+ : ScrollbarLayerImplBase(tree_impl, |
+ id, |
+ orientation, |
+ is_left_side_vertical_scrollbar, |
+ true), |
+ thumb_ui_resource_id_(0), |
+ thumb_thickness_(0), |
+ thumb_length_(0), |
+ track_start_(0), |
+ track_length_(0) {} |
+ |
+PaintedOverlayScrollbarLayerImpl::~PaintedOverlayScrollbarLayerImpl() {} |
+ |
+std::unique_ptr<LayerImpl> PaintedOverlayScrollbarLayerImpl::CreateLayerImpl( |
+ LayerTreeImpl* tree_impl) { |
+ return PaintedOverlayScrollbarLayerImpl::Create( |
+ tree_impl, id(), orientation(), is_left_side_vertical_scrollbar()); |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) { |
+ ScrollbarLayerImplBase::PushPropertiesTo(layer); |
+ |
+ PaintedOverlayScrollbarLayerImpl* scrollbar_layer = |
+ static_cast<PaintedOverlayScrollbarLayerImpl*>(layer); |
+ |
+ scrollbar_layer->SetThumbThickness(thumb_thickness_); |
+ scrollbar_layer->SetThumbLength(thumb_length_); |
+ scrollbar_layer->SetTrackStart(track_start_); |
+ scrollbar_layer->SetTrackLength(track_length_); |
+ |
+ scrollbar_layer->SetImageBounds(image_bounds_); |
+ scrollbar_layer->SetAperture(aperture_); |
+ |
+ scrollbar_layer->set_thumb_ui_resource_id(thumb_ui_resource_id_); |
+} |
+ |
+bool PaintedOverlayScrollbarLayerImpl::WillDraw( |
+ DrawMode draw_mode, |
+ ResourceProvider* resource_provider) { |
+ DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE); |
+ return LayerImpl::WillDraw(draw_mode, resource_provider); |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::AppendQuads( |
aelias_OOO_until_Jul13
2017/02/28 23:23:51
There's still a bit of code duplication here with
bokan
2017/03/01 00:44:21
Ok, I've moved as much as I could into NinePatchGe
|
+ RenderPass* render_pass, |
+ AppendQuadsData* append_quads_data) { |
+ // For overlay scrollbars, the border should match the inset of the aperture |
+ // and be symmetrical. |
+ gfx::Rect border(aperture_.x(), aperture_.y(), aperture_.x() * 2, |
+ aperture_.y() * 2); |
+ gfx::Rect thumb_quad_rect(ComputeThumbQuadRect()); |
+ gfx::Rect layer_occlusion; |
+ bool fill_center = true; |
+ bool nearest_neighbor = false; |
+ |
+ quad_generator_.SetLayout(image_bounds_, thumb_quad_rect.size(), aperture_, |
+ border, layer_occlusion, fill_center); |
+ |
+ SharedQuadState* shared_quad_state = |
+ render_pass->CreateAndAppendSharedQuadState(); |
+ PopulateSharedQuadState(shared_quad_state); |
+ |
+ AppendDebugBorderQuad(render_pass, bounds(), shared_quad_state, |
+ append_quads_data); |
+ |
+ if (!thumb_ui_resource_id_) |
+ return; |
+ |
+ ResourceId resource = |
+ layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_); |
+ |
+ if (!resource) |
+ return; |
+ |
+ std::vector<NinePatchGenerator::Patch> patches = |
+ quad_generator_.GeneratePatches(); |
+ |
+ const float vertex_opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
+ const bool opaque = |
+ layer_tree_impl()->IsUIResourceOpaque(thumb_ui_resource_id_); |
+ static const bool flipped = false; |
+ static const bool premultiplied_alpha = true; |
+ |
+ gfx::Vector2dF offset = thumb_quad_rect.OffsetFromOrigin(); |
+ |
+ for (const auto& patch : patches) { |
+ gfx::Rect output_rect = gfx::ToEnclosingRect(patch.output_rect + offset); |
+ gfx::Rect visible_rect = |
+ draw_properties().occlusion_in_content_space.GetUnoccludedContentRect( |
+ output_rect); |
+ gfx::Rect opaque_rect = opaque ? visible_rect : gfx::Rect(); |
+ if (!visible_rect.IsEmpty()) { |
+ gfx::RectF image_rect = patch.normalized_image_rect; |
+ TextureDrawQuad* quad = |
+ render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
+ quad->SetNew(shared_quad_state, output_rect, opaque_rect, visible_rect, |
+ resource, premultiplied_alpha, image_rect.origin(), |
+ image_rect.bottom_right(), SK_ColorTRANSPARENT, |
+ vertex_opacity, flipped, nearest_neighbor, false); |
+ ValidateQuadResources(quad); |
+ } |
+ } |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetThumbThickness(int thumb_thickness) { |
+ if (thumb_thickness_ == thumb_thickness) |
+ return; |
+ thumb_thickness_ = thumb_thickness; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+int PaintedOverlayScrollbarLayerImpl::ThumbThickness() const { |
+ return thumb_thickness_; |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetThumbLength(int thumb_length) { |
+ if (thumb_length_ == thumb_length) |
+ return; |
+ thumb_length_ = thumb_length; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+int PaintedOverlayScrollbarLayerImpl::ThumbLength() const { |
+ return thumb_length_; |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetTrackStart(int track_start) { |
+ if (track_start_ == track_start) |
+ return; |
+ track_start_ = track_start; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+int PaintedOverlayScrollbarLayerImpl::TrackStart() const { |
+ return track_start_; |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetTrackLength(int track_length) { |
+ if (track_length_ == track_length) |
+ return; |
+ track_length_ = track_length; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetImageBounds(const gfx::Size& bounds) { |
+ if (image_bounds_ == bounds) |
+ return; |
+ image_bounds_ = bounds; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+void PaintedOverlayScrollbarLayerImpl::SetAperture(const gfx::Rect& aperture) { |
+ if (aperture_ == aperture) |
+ return; |
+ aperture_ = aperture; |
+ NoteLayerPropertyChanged(); |
+} |
+ |
+float PaintedOverlayScrollbarLayerImpl::TrackLength() const { |
+ return track_length_ + (orientation() == VERTICAL ? vertical_adjust() : 0); |
+} |
+ |
+bool PaintedOverlayScrollbarLayerImpl::IsThumbResizable() const { |
+ return false; |
+} |
+ |
+const char* PaintedOverlayScrollbarLayerImpl::LayerTypeAsString() const { |
+ return "cc::PaintedOverlayScrollbarLayerImpl"; |
+} |
+ |
+} // namespace cc |