OLD | NEW |
| (Empty) |
1 // Copyright 2012 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 "config.h" | |
6 | |
7 #include "CCScrollbarGeometryFixedThumb.h" | |
8 | |
9 #include <cmath> | |
10 #include <public/WebRect.h> | |
11 #include <public/WebScrollbar.h> | |
12 | |
13 using WebKit::WebRect; | |
14 using WebKit::WebScrollbar; | |
15 using WebKit::WebScrollbarThemeGeometry; | |
16 | |
17 namespace cc { | |
18 | |
19 PassOwnPtr<CCScrollbarGeometryFixedThumb> CCScrollbarGeometryFixedThumb::create(
PassOwnPtr<WebScrollbarThemeGeometry> geometry) | |
20 { | |
21 return adoptPtr(new CCScrollbarGeometryFixedThumb(geometry)); | |
22 } | |
23 | |
24 CCScrollbarGeometryFixedThumb::~CCScrollbarGeometryFixedThumb() | |
25 { | |
26 } | |
27 | |
28 void CCScrollbarGeometryFixedThumb::update(WebScrollbar* scrollbar) | |
29 { | |
30 int length = CCScrollbarGeometryStub::thumbLength(scrollbar); | |
31 | |
32 if (scrollbar->orientation() == WebScrollbar::Horizontal) | |
33 m_thumbSize = IntSize(length, scrollbar->size().height); | |
34 else | |
35 m_thumbSize = IntSize(scrollbar->size().width, length); | |
36 } | |
37 | |
38 WebScrollbarThemeGeometry* CCScrollbarGeometryFixedThumb::clone() const | |
39 { | |
40 CCScrollbarGeometryFixedThumb* geometry = new CCScrollbarGeometryFixedThumb(
adoptPtr(CCScrollbarGeometryStub::clone())); | |
41 geometry->m_thumbSize = m_thumbSize; | |
42 return geometry; | |
43 } | |
44 | |
45 int CCScrollbarGeometryFixedThumb::thumbLength(WebScrollbar* scrollbar) | |
46 { | |
47 if (scrollbar->orientation() == WebScrollbar::Horizontal) | |
48 return m_thumbSize.width(); | |
49 return m_thumbSize.height(); | |
50 } | |
51 | |
52 int CCScrollbarGeometryFixedThumb::thumbPosition(WebScrollbar* scrollbar) | |
53 { | |
54 if (scrollbar->enabled()) { | |
55 float size = scrollbar->maximum(); | |
56 if (!size) | |
57 return 1; | |
58 int value = std::min(std::max(0, scrollbar->value()), scrollbar->maximum
()); | |
59 float pos = (trackLength(scrollbar) - thumbLength(scrollbar)) * value /
size; | |
60 return static_cast<int>(floorf((pos < 1 && pos > 0) ? 1 : pos)); | |
61 } | |
62 return 0; | |
63 } | |
64 void CCScrollbarGeometryFixedThumb::splitTrack(WebScrollbar* scrollbar, const We
bRect& unconstrainedTrackRect, WebRect& beforeThumbRect, WebRect& thumbRect, Web
Rect& afterThumbRect) | |
65 { | |
66 // This is a reimplementation of ScrollbarThemeComposite::splitTrack. | |
67 // Because the WebScrollbarThemeGeometry functions call down to native | |
68 // ScrollbarThemeComposite code which uses ScrollbarThemeComposite virtual | |
69 // helpers, there's no way to override a helper like thumbLength from | |
70 // the WebScrollbarThemeGeometry level. So, these three functions | |
71 // (splitTrack, thumbPosition, thumbLength) are copied here so that the | |
72 // WebScrollbarThemeGeometry helper functions are used instead and | |
73 // a fixed size thumbLength can be used. | |
74 | |
75 WebRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrained
TrackRect); | |
76 int thickness = scrollbar->orientation() == WebScrollbar::Horizontal ? scrol
lbar->size().height : scrollbar->size().width; | |
77 int thumbPos = thumbPosition(scrollbar); | |
78 if (scrollbar->orientation() == WebScrollbar::Horizontal) { | |
79 thumbRect = WebRect(trackRect.x + thumbPos, trackRect.y + (trackRect.hei
ght - thickness) / 2, thumbLength(scrollbar), thickness); | |
80 beforeThumbRect = WebRect(trackRect.x, trackRect.y, thumbPos + thumbRect
.width / 2, trackRect.height); | |
81 afterThumbRect = WebRect(trackRect.x + beforeThumbRect.width, trackRect.
y, trackRect.x + trackRect.width - beforeThumbRect.x - beforeThumbRect.width, tr
ackRect.height); | |
82 } else { | |
83 thumbRect = WebRect(trackRect.x + (trackRect.width - thickness) / 2, tra
ckRect.y + thumbPos, thickness, thumbLength(scrollbar)); | |
84 beforeThumbRect = WebRect(trackRect.x, trackRect.y, trackRect.width, thu
mbPos + thumbRect.height / 2); | |
85 afterThumbRect = WebRect(trackRect.x, trackRect.y + beforeThumbRect.heig
ht, trackRect.width, trackRect.y + trackRect.height - beforeThumbRect.y - before
ThumbRect.height); | |
86 } | |
87 } | |
88 | |
89 CCScrollbarGeometryFixedThumb::CCScrollbarGeometryFixedThumb(PassOwnPtr<WebScrol
lbarThemeGeometry> geometry) | |
90 : CCScrollbarGeometryStub(geometry) | |
91 { | |
92 } | |
93 | |
94 } | |
OLD | NEW |