Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1328)

Side by Side Diff: cc/hardcoded_scrollbar.cc

Issue 12147005: Hardcode scrollbar rendering for Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: hardcoded scrollbar not using layer structure. similar to M18 approach Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/hardcoded_scrollbar.h"
6
7 #include "cc/layer_impl.h"
8 #include "cc/layer_tree_host_impl.h"
9 #include "cc/layer_tree_impl.h"
10 #include "cc/render_pass.h"
11 #include "cc/shared_quad_state.h"
12 #include "cc/solid_color_draw_quad.h"
13 #include "ui/gfx/rect_conversions.h"
14
15 namespace cc {
16
17 #if defined(OS_ANDROID)
18
19 static const int kScrollbarWidth = 8;
20 static const int kScrollbarMargin = 5;
21 static const int kFadeoutDelayMs = 300;
22 static const int kFadeoutLengthMs = 300;
23
24 HardcodedScrollbar::HardcodedScrollbar(LayerTreeHostImpl* layer_tree_host_impl)
25 : layer_tree_host_impl_(layer_tree_host_impl)
26 , opacity_(0)
27 , pinch_in_effect_(false)
28 {
29 }
30
31 void HardcodedScrollbar::Animate(base::TimeTicks monotonic_time)
32 {
33 if (!layer_tree_host_impl_->rootScrollLayer())
34 return;
35
36 const base::TimeDelta fadeout_delay =
37 base::TimeDelta::FromMilliseconds(kFadeoutDelayMs);
38 const base::TimeDelta fadeout_length =
39 base::TimeDelta::FromMilliseconds(kFadeoutLengthMs);
40
41 if (pinch_in_effect_)
42 last_awaken_time_ = monotonic_time;
43
44 LayerImpl* scroll_layer = layer_tree_host_impl_->rootScrollLayer();
45 gfx::Vector2dF scroll_offset = scroll_layer->scrollOffset() +
46 scroll_layer->scrollDelta();
47
48 if (last_scroll_offset_ != scroll_offset) {
49 last_scroll_offset_ = scroll_offset;
50 last_awaken_time_ = monotonic_time;
51 }
52
53 if (!last_awaken_time_.is_null() &&
54 last_awaken_time_ + fadeout_delay >= monotonic_time)
55 opacity_ = 1;
56 else if (!last_awaken_time_.is_null() &&
57 last_awaken_time_ + fadeout_delay + fadeout_length > monotonic_time) {
58 opacity_ = (last_awaken_time_ + fadeout_delay + fadeout_length -
59 monotonic_time).InMillisecondsF() / kFadeoutLengthMs;
60 } else
61 opacity_ = 0;
62
63 if (opacity_)
64 layer_tree_host_impl_->setNeedsRedraw();
65 }
66
67 static void PrependRect(QuadList* quad_list,
68 SharedQuadState* quad_state,
69 const gfx::Rect& rect,
70 const SkColor& color)
71 {
72 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
73 quad->SetAll(quad_state,
74 rect,
75 gfx::Rect(),
76 rect,
77 true,
78 color);
79 quad_list->insert(quad_list->begin(),
80 quad.PassAs<DrawQuad>());
81 }
82
83 static void PrependSmoothEdgedRect(QuadList* quad_list,
84 SharedQuadState* quad_state,
85 const gfx::Rect& rect,
86 const SkColor& color)
87 {
88 if (rect.width() < 2 || rect.height() < 2)
89 return;
90
91 SkColor half_color = SkColorSetA(color, SkColorGetA(color) / 2);
92
93 gfx::Rect top_rect(rect.x() + 1, rect.y(), rect.width() - 2, 1);
94 PrependRect(quad_list, quad_state, top_rect, half_color);
95 gfx::Rect left_rect(rect.x(), rect.y() + 1, 1, rect.height() - 2);
96 PrependRect(quad_list, quad_state, left_rect, half_color);
97 gfx::Rect center_rect(rect.x() + 1, rect.y() + 1,
98 rect.width() - 2, rect.height() - 2);
99 PrependRect(quad_list, quad_state, center_rect, color);
100 gfx::Rect right_rect(rect.right() - 1, rect.y() + 1, 1, rect.height() - 2);
101 PrependRect(quad_list, quad_state, right_rect, half_color);
102 gfx::Rect bottom_rect(rect.x() + 1, rect.bottom() - 1, rect.width() - 2, 1);
103 PrependRect(quad_list, quad_state, bottom_rect, half_color);
104 }
105
106 void HardcodedScrollbar::PrependQuads(RenderPass* render_pass)
107 {
danakj 2013/02/05 17:55:02 { on previous line
108 if (!opacity_ || !layer_tree_host_impl_->rootScrollLayer())
109 return;
110
111 gfx::Rect screen_rect(layer_tree_host_impl_->deviceViewportSize());
112
113 render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
114 SharedQuadState* quad_state = render_pass->shared_quad_state_list.back();
115 quad_state->SetAll(gfx::Transform(),
116 screen_rect,
117 screen_rect,
118 false,
119 opacity_);
120
121 LayerImpl* scroll_layer = layer_tree_host_impl_->rootScrollLayer();
122 gfx::Size scrollable_size =
123 layer_tree_host_impl_->activeTree()->ScrollableSize();
124 gfx::SizeF scrollable_viewport_size =
125 layer_tree_host_impl_->activeTree()->ScrollableViewportSize();
126
127 gfx::RectF normalized_visible_content_rect = ScaleRect(
128 gfx::RectF(gfx::PointF() + last_scroll_offset_, scrollable_viewport_size),
129 1.0 / scrollable_size.width(),
130 1.0 / scrollable_size.height());
131 normalized_visible_content_rect.Intersect(gfx::RectF(0, 0, 1, 1));
132
133 int scrollbar_width = kScrollbarWidth *
134 layer_tree_host_impl_->deviceScaleFactor();
135 int scrollbar_margin = kScrollbarMargin *
136 layer_tree_host_impl_->deviceScaleFactor();
137
138 gfx::Rect thumb_position = ToEnclosingRect(ScaleRect(
139 normalized_visible_content_rect,
140 screen_rect.width() - scrollbar_margin * 4 - scrollbar_width,
141 screen_rect.height() - 2 * scrollbar_margin));
142 thumb_position.Offset(scrollbar_margin, scrollbar_margin);
143
144 gfx::Rect horizontal_scrollbar_rect(
145 thumb_position.x(),
146 screen_rect.bottom() - scrollbar_margin - scrollbar_width,
147 thumb_position.width(),
148 scrollbar_width);
149 PrependSmoothEdgedRect(&render_pass->quad_list, quad_state,
150 horizontal_scrollbar_rect, SkColorSetARGB(128, 128, 128, 128));
151
152 gfx::Rect vertical_scrollbar_rect(
153 screen_rect.right() - scrollbar_margin - scrollbar_width,
154 thumb_position.y(),
155 scrollbar_width,
156 thumb_position.height());
157 PrependSmoothEdgedRect(&render_pass->quad_list, quad_state,
158 vertical_scrollbar_rect, SkColorSetARGB(128, 128, 128, 128));
159 }
160
161 void HardcodedScrollbar::DidPinchGestureUpdate(base::TimeTicks monotonic_time)
162 {
163 pinch_in_effect_ = true;
164 Animate(monotonic_time);
165 }
166
167 void HardcodedScrollbar::DidPinchGestureEnd(base::TimeTicks monotonic_time)
168 {
169 pinch_in_effect_ = false;
170 last_awaken_time_ = monotonic_time;
171 Animate(monotonic_time);
172 }
173
174 void HardcodedScrollbar::DidUpdateScrollOffset(base::TimeTicks monotonic_time)
175 {
176 Animate(monotonic_time);
177 }
178
179 #endif
180
181 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698