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

Side by Side Diff: Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.mm

Issue 7134051: Merge 88396 - 2011-06-08 Sailesh Agrawal <sail@chromium.org> (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/782/
Patch Set: Created 9 years, 6 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
« no previous file with comments | « Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2009 Google Inc. All Rights Reserved. 3 * Copyright (C) 2009 Google Inc. All Rights Reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 11 matching lines...) Expand all
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */ 25 */
26 26
27 #include "config.h" 27 #include "config.h"
28 #include "ScrollbarThemeChromiumMac.h" 28 #include "ScrollbarThemeChromiumMac.h"
29 29
30 #include "FrameView.h" 30 #include "FrameView.h"
31 #include "ImageBuffer.h" 31 #include "ImageBuffer.h"
32 #include "LocalCurrentGraphicsContext.h"
32 #include "PlatformBridge.h" 33 #include "PlatformBridge.h"
33 #include "PlatformMouseEvent.h" 34 #include "PlatformMouseEvent.h"
35 #include "ScrollAnimatorChromiumMac.h"
34 #include "ScrollView.h" 36 #include "ScrollView.h"
35 #include <Carbon/Carbon.h> 37 #include <Carbon/Carbon.h>
38 #include <wtf/HashMap.h>
36 #include <wtf/StdLibExtras.h> 39 #include <wtf/StdLibExtras.h>
37 #include <wtf/UnusedParam.h> 40 #include <wtf/UnusedParam.h>
38 41
39 42
40 // FIXME: There are repainting problems due to Aqua scroll bar buttons' visual o verflow. 43 // FIXME: There are repainting problems due to Aqua scroll bar buttons' visual o verflow.
41 44
42 using namespace std; 45 using namespace std;
43 using namespace WebCore; 46 using namespace WebCore;
44 47
45 // This file (and its associated .h file) is a clone of ScrollbarThemeMac.mm. 48 // This file (and its associated .h file) is a clone of ScrollbarThemeMac.mm.
46 // Because we want to draw tickmarks in the scrollbar, we must maintain a fork. 49 // Because we want to draw tickmarks in the scrollbar, we must maintain a fork.
47 // Please maintain this file by performing parallel changes to it. 50 // Please maintain this file by performing parallel changes to it.
48 // 51 //
49 // The only changes from ScrollbarThemeMac should be: 52 // The only changes from ScrollbarThemeMac should be:
50 // - The classname change from ScrollbarThemeMac to ScrollbarThemeChromiumMac. 53 // - The classname change from ScrollbarThemeMac to ScrollbarThemeChromiumMac.
51 // - In paint() the code to paint the track, tickmarks, and thumb separately. 54 // - In paint() the code to paint the track, tickmarks, and thumb separately.
52 // - In paint() the thumb is drawn via ChromeBridge/WebThemeEngine. 55 // - In paint() the thumb is drawn via ChromeBridge/WebThemeEngine.
56 // - Various functions that were split using #if USE(WK_SCROLLBAR_PAINTER)
57 // have been combined using runtime checks instead.
53 // 58 //
54 // For all other differences, if it was introduced in this file, then the 59 // For all other differences, if it was introduced in this file, then the
55 // maintainer forgot to include it in the list; otherwise it is an update that 60 // maintainer forgot to include it in the list; otherwise it is an update that
56 // should have been applied to this file but was not. 61 // should have been applied to this file but was not.
57 62
58 static HashSet<Scrollbar*>* gScrollbars; 63 namespace WebCore {
64
65 typedef HashMap<Scrollbar*, RetainPtr<WKScrollbarPainterRef> > ScrollbarPainterM ap;
66
67 static ScrollbarPainterMap* scrollbarMap()
68 {
69 static ScrollbarPainterMap* map = new ScrollbarPainterMap;
70 return map;
71 }
72
73 }
59 74
60 @interface ScrollbarPrefsObserver : NSObject 75 @interface ScrollbarPrefsObserver : NSObject
61 { 76 {
62
63 } 77 }
64 78
65 + (void)registerAsObserver; 79 + (void)registerAsObserver;
66 + (void)appearancePrefsChanged:(NSNotification*)theNotification; 80 + (void)appearancePrefsChanged:(NSNotification*)theNotification;
67 + (void)behaviorPrefsChanged:(NSNotification*)theNotification; 81 + (void)behaviorPrefsChanged:(NSNotification*)theNotification;
68 82
69 @end 83 @end
70 84
71 @implementation ScrollbarPrefsObserver 85 @implementation ScrollbarPrefsObserver
72 86
73 + (void)appearancePrefsChanged:(NSNotification*)unusedNotification 87 + (void)appearancePrefsChanged:(NSNotification*)unusedNotification
74 { 88 {
75 UNUSED_PARAM(unusedNotification); 89 UNUSED_PARAM(unusedNotification);
76 90
77 static_cast<ScrollbarThemeChromiumMac*>(ScrollbarTheme::nativeTheme())->pref erencesChanged(); 91 static_cast<ScrollbarThemeChromiumMac*>(ScrollbarTheme::nativeTheme())->pref erencesChanged();
78 if (!gScrollbars) 92 if (scrollbarMap()->isEmpty())
79 return; 93 return;
80 HashSet<Scrollbar*>::iterator end = gScrollbars->end(); 94 ScrollbarPainterMap::iterator end = scrollbarMap()->end();
81 for (HashSet<Scrollbar*>::iterator it = gScrollbars->begin(); it != end; ++i t) { 95 for (ScrollbarPainterMap::iterator it = scrollbarMap()->begin(); it != end; ++it) {
82 (*it)->styleChanged(); 96 it->first->styleChanged();
83 (*it)->invalidate(); 97 it->first->invalidate();
84 } 98 }
85 } 99 }
86 100
87 + (void)behaviorPrefsChanged:(NSNotification*)unusedNotification 101 + (void)behaviorPrefsChanged:(NSNotification*)unusedNotification
88 { 102 {
89 UNUSED_PARAM(unusedNotification); 103 UNUSED_PARAM(unusedNotification);
90 104
91 static_cast<ScrollbarThemeChromiumMac*>(ScrollbarTheme::nativeTheme())->pref erencesChanged(); 105 static_cast<ScrollbarThemeChromiumMac*>(ScrollbarTheme::nativeTheme())->pref erencesChanged();
92 } 106 }
93 107
(...skipping 21 matching lines...) Expand all
115 // cRealButtonLength - cButtonInset 129 // cRealButtonLength - cButtonInset
116 static int cButtonLength[] = { 14, 10 }; 130 static int cButtonLength[] = { 14, 10 };
117 static int cThumbMinLength[] = { 26, 20 }; 131 static int cThumbMinLength[] = { 26, 20 };
118 132
119 static int cOuterButtonLength[] = { 16, 14 }; // The outer button in a double bu tton pair is a bit bigger. 133 static int cOuterButtonLength[] = { 16, 14 }; // The outer button in a double bu tton pair is a bit bigger.
120 static int cOuterButtonOverlap = 2; 134 static int cOuterButtonOverlap = 2;
121 135
122 static float gInitialButtonDelay = 0.5f; 136 static float gInitialButtonDelay = 0.5f;
123 static float gAutoscrollButtonDelay = 0.05f; 137 static float gAutoscrollButtonDelay = 0.05f;
124 static bool gJumpOnTrackClick = false; 138 static bool gJumpOnTrackClick = false;
125 static ScrollbarButtonsPlacement gButtonPlacement = ScrollbarButtonsDoubleEnd; 139 static ScrollbarButtonsPlacement gButtonPlacement = isScrollbarOverlayAPIAvailab le() ? ScrollbarButtonsNone : ScrollbarButtonsDoubleEnd;
126 140
127 static void updateArrowPlacement() 141 static void updateArrowPlacement()
128 { 142 {
143 if (isScrollbarOverlayAPIAvailable())
144 return;
145
129 NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectFor Key:@"AppleScrollBarVariant"]; 146 NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectFor Key:@"AppleScrollBarVariant"];
130 if ([buttonPlacement isEqualToString:@"Single"]) 147 if ([buttonPlacement isEqualToString:@"Single"])
131 gButtonPlacement = ScrollbarButtonsSingle; 148 gButtonPlacement = ScrollbarButtonsSingle;
132 else if ([buttonPlacement isEqualToString:@"DoubleMin"]) 149 else if ([buttonPlacement isEqualToString:@"DoubleMin"])
133 gButtonPlacement = ScrollbarButtonsDoubleStart; 150 gButtonPlacement = ScrollbarButtonsDoubleStart;
134 else if ([buttonPlacement isEqualToString:@"DoubleBoth"]) 151 else if ([buttonPlacement isEqualToString:@"DoubleBoth"])
135 gButtonPlacement = ScrollbarButtonsDoubleBoth; 152 gButtonPlacement = ScrollbarButtonsDoubleBoth;
136 else 153 else
137 gButtonPlacement = ScrollbarButtonsDoubleEnd; // The default is Scrollba rButtonsDoubleEnd. 154 gButtonPlacement = ScrollbarButtonsDoubleEnd;
138 } 155 }
139 156
140 void ScrollbarThemeChromiumMac::registerScrollbar(Scrollbar* scrollbar) 157 void ScrollbarThemeChromiumMac::registerScrollbar(Scrollbar* scrollbar)
141 { 158 {
142 if (!gScrollbars) 159 bool isHorizontal = scrollbar->orientation() == HorizontalScrollbar;
143 gScrollbars = new HashSet<Scrollbar*>; 160 WKScrollbarPainterRef scrollbarPainter = wkMakeScrollbarPainter(scrollbar->c ontrolSize(), isHorizontal);
144 gScrollbars->add(scrollbar); 161 scrollbarMap()->add(scrollbar, scrollbarPainter);
145 } 162 }
146 163
147 void ScrollbarThemeChromiumMac::unregisterScrollbar(Scrollbar* scrollbar) 164 void ScrollbarThemeChromiumMac::unregisterScrollbar(Scrollbar* scrollbar)
148 { 165 {
149 gScrollbars->remove(scrollbar); 166 scrollbarMap()->remove(scrollbar);
150 if (gScrollbars->isEmpty()) { 167 }
151 delete gScrollbars; 168
152 gScrollbars = 0; 169 void ScrollbarThemeChromiumMac::setNewPainterForScrollbar(Scrollbar* scrollbar, WKScrollbarPainterRef newPainter)
153 } 170 {
171 scrollbarMap()->set(scrollbar, newPainter);
172 }
173
174 WKScrollbarPainterRef ScrollbarThemeChromiumMac::painterForScrollbar(Scrollbar* scrollbar)
175 {
176 return scrollbarMap()->get(scrollbar).get();
154 } 177 }
155 178
156 ScrollbarThemeChromiumMac::ScrollbarThemeChromiumMac() 179 ScrollbarThemeChromiumMac::ScrollbarThemeChromiumMac()
157 { 180 {
158 static bool initialized; 181 static bool initialized;
159 if (!initialized) { 182 if (!initialized) {
160 initialized = true; 183 initialized = true;
161 [ScrollbarPrefsObserver registerAsObserver]; 184 [ScrollbarPrefsObserver registerAsObserver];
162 preferencesChanged(); 185 preferencesChanged();
163 } 186 }
164 } 187 }
165 188
166 ScrollbarThemeChromiumMac::~ScrollbarThemeChromiumMac() 189 ScrollbarThemeChromiumMac::~ScrollbarThemeChromiumMac()
167 { 190 {
168 } 191 }
169 192
170 void ScrollbarThemeChromiumMac::preferencesChanged() 193 void ScrollbarThemeChromiumMac::preferencesChanged()
171 { 194 {
172 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 195 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
173 [defaults synchronize]; 196 [defaults synchronize];
174 updateArrowPlacement(); 197 updateArrowPlacement();
175 gInitialButtonDelay = [defaults floatForKey:@"NSScrollerButtonDelay"]; 198 gInitialButtonDelay = [defaults floatForKey:@"NSScrollerButtonDelay"];
176 gAutoscrollButtonDelay = [defaults floatForKey:@"NSScrollerButtonPeriod"]; 199 gAutoscrollButtonDelay = [defaults floatForKey:@"NSScrollerButtonPeriod"];
177 gJumpOnTrackClick = [defaults boolForKey:@"AppleScrollerPagingBehavior"]; 200 gJumpOnTrackClick = [defaults boolForKey:@"AppleScrollerPagingBehavior"];
178 } 201 }
179 202
180 int ScrollbarThemeChromiumMac::scrollbarThickness(ScrollbarControlSize controlSi ze) 203 int ScrollbarThemeChromiumMac::scrollbarThickness(ScrollbarControlSize controlSi ze)
181 { 204 {
182 return cScrollbarThickness[controlSize]; 205 if (isScrollbarOverlayAPIAvailable())
206 return wkScrollbarThickness(controlSize);
207 else
208 return cScrollbarThickness[controlSize];
209 }
210
211 bool ScrollbarThemeChromiumMac::usesOverlayScrollbars() const
212 {
213 if (isScrollbarOverlayAPIAvailable())
214 return wkScrollbarPainterUsesOverlayScrollers();
215 else
216 return false;
183 } 217 }
184 218
185 double ScrollbarThemeChromiumMac::initialAutoscrollTimerDelay() 219 double ScrollbarThemeChromiumMac::initialAutoscrollTimerDelay()
186 { 220 {
187 return gInitialButtonDelay; 221 return gInitialButtonDelay;
188 } 222 }
189 223
190 double ScrollbarThemeChromiumMac::autoscrollTimerDelay() 224 double ScrollbarThemeChromiumMac::autoscrollTimerDelay()
191 { 225 {
192 return gAutoscrollButtonDelay; 226 return gAutoscrollButtonDelay;
193 } 227 }
194 228
195 ScrollbarButtonsPlacement ScrollbarThemeChromiumMac::buttonsPlacement() const 229 ScrollbarButtonsPlacement ScrollbarThemeChromiumMac::buttonsPlacement() const
196 { 230 {
197 return gButtonPlacement; 231 return gButtonPlacement;
198 } 232 }
199 233
200 bool ScrollbarThemeChromiumMac::hasButtons(Scrollbar* scrollbar) 234 bool ScrollbarThemeChromiumMac::hasButtons(Scrollbar* scrollbar)
201 { 235 {
202 return scrollbar->enabled() && (scrollbar->orientation() == HorizontalScroll bar ? 236 return scrollbar->enabled() && gButtonPlacement != ScrollbarButtonsNone
203 scrollbar->width() : 237 && (scrollbar->orientation() == HorizontalScrollbar
204 scrollbar->height()) >= 2 * (cRealButtonLength[scrollbar->controlSi ze()] - cButtonHitInset[scrollbar->controlSize()]); 238 ? scrollbar->width()
239 : scrollbar->height()) >= 2 * (cRealButtonLength[scrollbar->control Size()] - cButtonHitInset[scrollbar->controlSize()]);
205 } 240 }
206 241
207 bool ScrollbarThemeChromiumMac::hasThumb(Scrollbar* scrollbar) 242 bool ScrollbarThemeChromiumMac::hasThumb(Scrollbar* scrollbar)
208 { 243 {
244 int minLengthForThumb;
245 if (isScrollbarOverlayAPIAvailable())
246 minLengthForThumb = wkScrollbarMinimumTotalLengthNeededForThumb(scrollba rMap()->get(scrollbar).get());
247 else
248 minLengthForThumb = 2 * cButtonInset[scrollbar->controlSize()] + cThumbM inLength[scrollbar->controlSize()] + 1;
209 return scrollbar->enabled() && (scrollbar->orientation() == HorizontalScroll bar ? 249 return scrollbar->enabled() && (scrollbar->orientation() == HorizontalScroll bar ?
210 scrollbar->width() : 250 scrollbar->width() :
211 scrollbar->height()) >= 2 * cButtonInset[scrollbar->controlSize()] + cThumbMinLength[scrollbar->controlSize()] + 1; 251 scrollbar->height()) >= minLengthForThumb;
212 } 252 }
213 253
214 static IntRect buttonRepaintRect(const IntRect& buttonRect, ScrollbarOrientation orientation, ScrollbarControlSize controlSize, bool start) 254 static IntRect buttonRepaintRect(const IntRect& buttonRect, ScrollbarOrientation orientation, ScrollbarControlSize controlSize, bool start)
215 { 255 {
256 ASSERT(gButtonPlacement != ScrollbarButtonsNone);
257
216 IntRect paintRect(buttonRect); 258 IntRect paintRect(buttonRect);
217 if (orientation == HorizontalScrollbar) { 259 if (orientation == HorizontalScrollbar) {
218 paintRect.setWidth(cRealButtonLength[controlSize]); 260 paintRect.setWidth(cRealButtonLength[controlSize]);
219 if (!start) 261 if (!start)
220 paintRect.setX(buttonRect.x() - (cRealButtonLength[controlSize] - bu ttonRect.width())); 262 paintRect.setX(buttonRect.x() - (cRealButtonLength[controlSize] - bu ttonRect.width()));
221 } else { 263 } else {
222 paintRect.setHeight(cRealButtonLength[controlSize]); 264 paintRect.setHeight(cRealButtonLength[controlSize]);
223 if (!start) 265 if (!start)
224 paintRect.setY(buttonRect.y() - (cRealButtonLength[controlSize] - bu ttonRect.height())); 266 paintRect.setY(buttonRect.y() - (cRealButtonLength[controlSize] - bu ttonRect.height()));
225 } 267 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 } 375 }
334 376
335 int totalWidth = startWidth + endWidth; 377 int totalWidth = startWidth + endWidth;
336 if (scrollbar->orientation() == HorizontalScrollbar) 378 if (scrollbar->orientation() == HorizontalScrollbar)
337 return IntRect(scrollbar->x() + startWidth, scrollbar->y(), scrollbar->w idth() - totalWidth, thickness); 379 return IntRect(scrollbar->x() + startWidth, scrollbar->y(), scrollbar->w idth() - totalWidth, thickness);
338 return IntRect(scrollbar->x(), scrollbar->y() + startWidth, thickness, scrol lbar->height() - totalWidth); 380 return IntRect(scrollbar->x(), scrollbar->y() + startWidth, thickness, scrol lbar->height() - totalWidth);
339 } 381 }
340 382
341 int ScrollbarThemeChromiumMac::minimumThumbLength(Scrollbar* scrollbar) 383 int ScrollbarThemeChromiumMac::minimumThumbLength(Scrollbar* scrollbar)
342 { 384 {
343 return cThumbMinLength[scrollbar->controlSize()]; 385 if (isScrollbarOverlayAPIAvailable())
386 return wkScrollbarMinimumThumbLength(scrollbarMap()->get(scrollbar).get( ));
387 else
388 return cThumbMinLength[scrollbar->controlSize()];
344 } 389 }
345 390
346 bool ScrollbarThemeChromiumMac::shouldCenterOnThumb(Scrollbar*, const PlatformMo useEvent& evt) 391 bool ScrollbarThemeChromiumMac::shouldCenterOnThumb(Scrollbar*, const PlatformMo useEvent& evt)
347 { 392 {
348 if (evt.button() != LeftButton) 393 if (evt.button() != LeftButton)
349 return false; 394 return false;
350 if (gJumpOnTrackClick) 395 if (gJumpOnTrackClick)
351 return !evt.altKey(); 396 return !evt.altKey();
352 return evt.altKey(); 397 return evt.altKey();
353 } 398 }
354 399
400 bool ScrollbarThemeChromiumMac::shouldDragDocumentInsteadOfThumb(Scrollbar*, con st PlatformMouseEvent& event)
401 {
402 return event.altKey();
403 }
404
355 static int scrollbarPartToHIPressedState(ScrollbarPart part) 405 static int scrollbarPartToHIPressedState(ScrollbarPart part)
356 { 406 {
357 switch (part) { 407 switch (part) {
358 case BackButtonStartPart: 408 case BackButtonStartPart:
359 return kThemeTopOutsideArrowPressed; 409 return kThemeTopOutsideArrowPressed;
360 case BackButtonEndPart: 410 case BackButtonEndPart:
361 return kThemeTopOutsideArrowPressed; // This does not make much sens e. For some reason the outside constant is required. 411 return kThemeTopOutsideArrowPressed; // This does not make much sens e. For some reason the outside constant is required.
362 case ForwardButtonStartPart: 412 case ForwardButtonStartPart:
363 return kThemeTopInsideArrowPressed; 413 return kThemeTopInsideArrowPressed;
364 case ForwardButtonEndPart: 414 case ForwardButtonEndPart:
365 return kThemeBottomOutsideArrowPressed; 415 return kThemeBottomOutsideArrowPressed;
366 case ThumbPart: 416 case ThumbPart:
367 return kThemeThumbPressed; 417 return kThemeThumbPressed;
368 default: 418 default:
369 return 0; 419 return 0;
370 } 420 }
371 } 421 }
372 422
423 static inline wkScrollerKnobStyle toScrollbarPainterKnobStyle(ScrollbarOverlaySt yle style)
424 {
425 switch (style) {
426 case ScrollbarOverlayStyleDark:
427 return wkScrollerKnobStyleDark;
428 case ScrollbarOverlayStyleLight:
429 return wkScrollerKnobStyleLight;
430 default:
431 return wkScrollerKnobStyleDefault;
432 }
433 }
434
373 static PlatformBridge::ThemePaintState scrollbarStateToThemeState(Scrollbar* scr ollbar) { 435 static PlatformBridge::ThemePaintState scrollbarStateToThemeState(Scrollbar* scr ollbar) {
374 if (!scrollbar->enabled()) 436 if (!scrollbar->enabled())
375 return PlatformBridge::StateDisabled; 437 return PlatformBridge::StateDisabled;
376 if (!scrollbar->scrollableArea()->isActive()) 438 if (!scrollbar->scrollableArea()->isActive())
377 return PlatformBridge::StateInactive; 439 return PlatformBridge::StateInactive;
378 if (scrollbar->pressedPart() == ThumbPart) 440 if (scrollbar->pressedPart() == ThumbPart)
379 return PlatformBridge::StatePressed; 441 return PlatformBridge::StatePressed;
380 442
381 return PlatformBridge::StateActive; 443 return PlatformBridge::StateActive;
382 } 444 }
383 445
384 bool ScrollbarThemeChromiumMac::paint(Scrollbar* scrollbar, GraphicsContext* con text, const IntRect& damageRect) 446 bool ScrollbarThemeChromiumMac::paint(Scrollbar* scrollbar, GraphicsContext* con text, const IntRect& damageRect)
385 { 447 {
448 if (isScrollbarOverlayAPIAvailable()) {
449 float value = 0;
450 float overhang = 0;
451
452 if (scrollbar->currentPos() < 0) {
453 // Scrolled past the top.
454 value = 0;
455 overhang = -scrollbar->currentPos();
456 } else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollba r->totalSize()) {
457 // Scrolled past the bottom.
458 value = 1;
459 overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scro llbar->totalSize();
460 } else {
461 // Within the bounds of the scrollable area.
462 int maximum = scrollbar->maximum();
463 if (maximum > 0)
464 value = scrollbar->currentPos() / maximum;
465 else
466 value = 0;
467 }
468
469 ScrollAnimatorChromiumMac* scrollAnimator = static_cast<ScrollAnimatorCh romiumMac*>(scrollbar->scrollableArea()->scrollAnimator());
470 scrollAnimator->setIsDrawingIntoLayer(context->isCALayerContext());
471
472 wkSetScrollbarPainterKnobStyle(painterForScrollbar(scrollbar), toScrollb arPainterKnobStyle(scrollbar->scrollableArea()->recommendedScrollbarOverlayStyle ()));
473
474 GraphicsContextStateSaver stateSaver(*context);
475 context->clip(damageRect);
476 context->translate(scrollbar->frameRect().x(), scrollbar->frameRect().y( ));
477 LocalCurrentGraphicsContext localContext(context);
478 wkScrollbarPainterPaint(scrollbarMap()->get(scrollbar).get(),
479 scrollbar->enabled(),
480 value,
481 (static_cast<CGFloat>(scrollbar->visibleSize()) - overhang) / scrollbar->totalSize(),
482 scrollbar->frameRect());
483
484 scrollAnimator->setIsDrawingIntoLayer(false);
485 return true;
486 }
487
386 HIThemeTrackDrawInfo trackInfo; 488 HIThemeTrackDrawInfo trackInfo;
387 trackInfo.version = 0; 489 trackInfo.version = 0;
388 trackInfo.kind = scrollbar->controlSize() == RegularScrollbar ? kThemeMedium ScrollBar : kThemeSmallScrollBar; 490 trackInfo.kind = scrollbar->controlSize() == RegularScrollbar ? kThemeMedium ScrollBar : kThemeSmallScrollBar;
389 trackInfo.bounds = scrollbar->frameRect(); 491 trackInfo.bounds = scrollbar->frameRect();
390 trackInfo.min = 0; 492 trackInfo.min = 0;
391 trackInfo.max = scrollbar->maximum(); 493 trackInfo.max = scrollbar->maximum();
392 trackInfo.value = scrollbar->currentPos(); 494 trackInfo.value = scrollbar->currentPos();
393 trackInfo.trackInfo.scrollbar.viewsize = scrollbar->visibleSize(); 495 trackInfo.trackInfo.scrollbar.viewsize = scrollbar->visibleSize();
394 trackInfo.attributes = 0; 496 trackInfo.attributes = 0;
395 if (scrollbar->orientation() == HorizontalScrollbar) 497 if (scrollbar->orientation() == HorizontalScrollbar)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 scrollbarInfo); 581 scrollbarInfo);
480 } 582 }
481 583
482 if (!canDrawDirectly) 584 if (!canDrawDirectly)
483 context->drawImageBuffer(imageBuffer.get(), ColorSpaceDeviceRGB, scrollb ar->frameRect().location()); 585 context->drawImageBuffer(imageBuffer.get(), ColorSpaceDeviceRGB, scrollb ar->frameRect().location());
484 586
485 return true; 587 return true;
486 } 588 }
487 589
488 } 590 }
489
OLDNEW
« no previous file with comments | « Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698