OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Apple Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 if (recorder.canUseCachedDrawing()) | 214 if (recorder.canUseCachedDrawing()) |
215 return; | 215 return; |
216 | 216 |
217 #if OS(MACOSX) | 217 #if OS(MACOSX) |
218 context->fillRect(cornerRect, Color::white); | 218 context->fillRect(cornerRect, Color::white); |
219 #else | 219 #else |
220 Platform::current()->themeEngine()->paint(context->canvas(), WebThemeEngine:
:PartScrollbarCorner, WebThemeEngine::StateNormal, WebRect(cornerRect), 0); | 220 Platform::current()->themeEngine()->paint(context->canvas(), WebThemeEngine:
:PartScrollbarCorner, WebThemeEngine::StateNormal, WebRect(cornerRect), 0); |
221 #endif | 221 #endif |
222 } | 222 } |
223 | 223 |
224 void ScrollbarTheme::paintOverhangBackground(GraphicsContext* context, const Int
Rect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect
& dirtyRect) | |
225 { | |
226 context->setFillColor(Color::white); | |
227 if (!horizontalOverhangRect.isEmpty()) | |
228 context->fillRect(intersection(horizontalOverhangRect, dirtyRect)); | |
229 if (!verticalOverhangRect.isEmpty()) | |
230 context->fillRect(intersection(verticalOverhangRect, dirtyRect)); | |
231 } | |
232 | |
233 bool ScrollbarTheme::shouldCenterOnThumb(ScrollbarThemeClient* scrollbar, const
PlatformMouseEvent& evt) | 224 bool ScrollbarTheme::shouldCenterOnThumb(ScrollbarThemeClient* scrollbar, const
PlatformMouseEvent& evt) |
234 { | 225 { |
235 return Platform::current()->scrollbarBehavior()->shouldCenterOnThumb(static_
cast<WebScrollbarBehavior::Button>(evt.button()), evt.shiftKey(), evt.altKey()); | 226 return Platform::current()->scrollbarBehavior()->shouldCenterOnThumb(static_
cast<WebScrollbarBehavior::Button>(evt.button()), evt.shiftKey(), evt.altKey()); |
236 } | 227 } |
237 | 228 |
238 bool ScrollbarTheme::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar,
const PlatformMouseEvent& evt) | 229 bool ScrollbarTheme::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar,
const PlatformMouseEvent& evt) |
239 { | 230 { |
240 IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.position
()); | 231 IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.position
()); |
241 mousePosition.move(scrollbar->x(), scrollbar->y()); | 232 mousePosition.move(scrollbar->x(), scrollbar->y()); |
242 return Platform::current()->scrollbarBehavior()->shouldSnapBackToDragOrigin(
mousePosition, trackRect(scrollbar), scrollbar->orientation() == HorizontalScrol
lbar); | 233 return Platform::current()->scrollbarBehavior()->shouldSnapBackToDragOrigin(
mousePosition, trackRect(scrollbar), scrollbar->orientation() == HorizontalScrol
lbar); |
243 } | 234 } |
244 | 235 |
245 // Returns the size represented by track taking into account scrolling past | |
246 // the end of the document. | |
247 static float usedTotalSize(ScrollbarThemeClient* scrollbar) | |
248 { | |
249 float overhangAtStart = -scrollbar->currentPos(); | |
250 float overhangAtEnd = scrollbar->currentPos() + scrollbar->visibleSize() - s
crollbar->totalSize(); | |
251 float overhang = std::max(0.0f, std::max(overhangAtStart, overhangAtEnd)); | |
252 return scrollbar->totalSize() + overhang; | |
253 } | |
254 | |
255 int ScrollbarTheme::thumbPosition(ScrollbarThemeClient* scrollbar) | 236 int ScrollbarTheme::thumbPosition(ScrollbarThemeClient* scrollbar) |
256 { | 237 { |
257 if (scrollbar->enabled()) { | 238 if (scrollbar->enabled()) { |
258 float size = usedTotalSize(scrollbar) - scrollbar->visibleSize(); | 239 float size = scrollbar->totalSize() - scrollbar->visibleSize(); |
259 // Avoid doing a floating point divide by zero and return 1 when usedTot
alSize == visibleSize. | 240 // Avoid doing a floating point divide by zero and return 1 when usedTot
alSize == visibleSize. |
260 if (!size) | 241 if (!size) |
261 return 1; | 242 return 1; |
262 float pos = std::max(0.0f, scrollbar->currentPos()) * (trackLength(scrol
lbar) - thumbLength(scrollbar)) / size; | 243 float pos = std::max(0.0f, scrollbar->currentPos()) * (trackLength(scrol
lbar) - thumbLength(scrollbar)) / size; |
263 return (pos < 1 && pos > 0) ? 1 : pos; | 244 return (pos < 1 && pos > 0) ? 1 : pos; |
264 } | 245 } |
265 return 0; | 246 return 0; |
266 } | 247 } |
267 | 248 |
268 int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar) | 249 int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar) |
269 { | 250 { |
270 if (!scrollbar->enabled()) | 251 if (!scrollbar->enabled()) |
271 return 0; | 252 return 0; |
272 | 253 |
273 // It is safe to compute the overhang by adding the result from the main | 254 float overhang = fabsf(scrollbar->elasticOverscroll()); |
274 // thread overscroll mode (first) and then adding the result from compositor | |
275 // thread overscroll (second) because the modes are mutually exclusive (and | |
276 // determining which mode is in use here will require lots of temporary | |
277 // plumbing, and the main thread mode is to be deleted). | |
278 float overhang = 0; | |
279 if (scrollbar->currentPos() < 0) | |
280 overhang = -scrollbar->currentPos(); | |
281 else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollbar->tot
alSize()) | |
282 overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scrollba
r->totalSize(); | |
283 overhang += fabsf(scrollbar->elasticOverscroll()); | |
284 float proportion = 0.0f; | 255 float proportion = 0.0f; |
285 float totalSize = usedTotalSize(scrollbar); | 256 float totalSize = scrollbar->totalSize(); |
286 if (totalSize > 0.0f) { | 257 if (totalSize > 0.0f) { |
287 proportion = (scrollbar->visibleSize() - overhang) / totalSize; | 258 proportion = (scrollbar->visibleSize() - overhang) / totalSize; |
288 } | 259 } |
289 int trackLen = trackLength(scrollbar); | 260 int trackLen = trackLength(scrollbar); |
290 int length = round(proportion * trackLen); | 261 int length = round(proportion * trackLen); |
291 length = std::max(length, minimumThumbLength(scrollbar)); | 262 length = std::max(length, minimumThumbLength(scrollbar)); |
292 if (length > trackLen) | 263 if (length > trackLen) |
293 length = 0; // Once the thumb is below the track length, it just goes aw
ay (to make more room for the track). | 264 length = 0; // Once the thumb is below the track length, it just goes aw
ay (to make more room for the track). |
294 return length; | 265 return length; |
295 } | 266 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 return DisplayItem::ScrollbarBackTrack; | 367 return DisplayItem::ScrollbarBackTrack; |
397 case ForwardTrackPart: | 368 case ForwardTrackPart: |
398 return DisplayItem::ScrollbarForwardTrack; | 369 return DisplayItem::ScrollbarForwardTrack; |
399 default: | 370 default: |
400 ASSERT_NOT_REACHED(); | 371 ASSERT_NOT_REACHED(); |
401 return DisplayItem::ScrollbarBackTrack; | 372 return DisplayItem::ScrollbarBackTrack; |
402 } | 373 } |
403 } | 374 } |
404 | 375 |
405 } // namespace blink | 376 } // namespace blink |
OLD | NEW |