Modified: trunk/Source/WebCore/ChangeLog (89325 => 89326)
--- trunk/Source/WebCore/ChangeLog 2011-06-21 01:07:04 UTC (rev 89325)
+++ trunk/Source/WebCore/ChangeLog 2011-06-21 01:22:07 UTC (rev 89326)
@@ -1,3 +1,22 @@
+2011-06-20 Sailesh Agrawal <[email protected]>
+
+ Reviewed by Mihai Parparita.
+
+ [Chromium] Draw search tickmarks on overlay scrollbars
+ https://bugs.webkit.org/show_bug.cgi?id=62783
+
+ This change adds search tickmark support for overlay scrollbars. Tickmarks are only drawn when the scroll track is visible.
+
+ * platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.h:Split the scrollbar drawing code into a track and knob version.
+ * platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.mm:
+ (wkScrollbarPainterPaint):
+ (wkScrollbarPainterPaintTrack):
+ (wkScrollbarPainterPaintKnob):
+ * platform/chromium/ScrollbarThemeChromiumMac.h:
+ * platform/chromium/ScrollbarThemeChromiumMac.mm:Factor out the paint tickmark code and call it from the overlay scrollbar drawing code.
+ (WebCore::ScrollbarThemeChromiumMac::paint):
+ (WebCore::ScrollbarThemeChromiumMac::paintTickmarks):
+
2011-06-20 Adam Barth <[email protected]>
Mac build fix. In addition to adding the files to the project, we need
Modified: trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.h (89325 => 89326)
--- trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.h 2011-06-21 01:07:04 UTC (rev 89325)
+++ trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.h 2011-06-21 01:22:07 UTC (rev 89326)
@@ -57,6 +57,8 @@
CGFloat wkScrollbarPainterKnobAlpha(WKScrollbarPainterRef);
void wkScrollbarPainterSetOverlayState(WKScrollbarPainterRef, int overlayScrollerState);
void wkScrollbarPainterPaint(WKScrollbarPainterRef, bool enabled, double value, CGFloat proportion, NSRect frameRect);
+void wkScrollbarPainterPaintTrack(WKScrollbarPainterRef, bool enabled, double value, CGFloat proportion, NSRect frameRect);
+void wkScrollbarPainterPaintKnob(WKScrollbarPainterRef);
int wkScrollbarMinimumThumbLength(WKScrollbarPainterRef);
void wkScrollbarPainterSetDelegate(WKScrollbarPainterRef, id scrollbarPainterDelegate);
CGFloat wkScrollbarPainterTrackAlpha(WKScrollbarPainterRef);
Modified: trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.mm (89325 => 89326)
--- trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.mm 2011-06-21 01:07:04 UTC (rev 89325)
+++ trunk/Source/WebCore/platform/chromium/ScrollbarOverlayUtilitiesChromiumMac.mm 2011-06-21 01:22:07 UTC (rev 89326)
@@ -152,6 +152,12 @@
void wkScrollbarPainterPaint(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
{
+ wkScrollbarPainterPaintTrack(painter, enabled, value, proportion, frameRect);
+ wkScrollbarPainterPaintKnob(painter);
+}
+
+void wkScrollbarPainterPaintTrack(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
+{
[painter setEnabled:enabled];
[painter setBoundsSize:frameRect.size];
[painter setDoubleValue:value];
@@ -164,6 +170,10 @@
frameRect.origin = NSZeroPoint;
[painter drawKnobSlotInRect:frameRect highlight:NO];
+}
+
+void wkScrollbarPainterPaintKnob(WKScrollbarPainterRef painter)
+{
[painter drawKnob];
}
Modified: trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.h (89325 => 89326)
--- trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.h 2011-06-21 01:07:04 UTC (rev 89325)
+++ trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.h 2011-06-21 01:22:07 UTC (rev 89326)
@@ -71,6 +71,8 @@
virtual bool shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent&);
virtual bool shouldDragDocumentInsteadOfThumb(Scrollbar*, const PlatformMouseEvent&);
+ virtual void paintTickmarks(GraphicsContext*, Scrollbar*, const IntRect&);
+
public:
void preferencesChanged();
};
Modified: trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.mm (89325 => 89326)
--- trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.mm 2011-06-21 01:07:04 UTC (rev 89325)
+++ trunk/Source/WebCore/platform/chromium/ScrollbarThemeChromiumMac.mm 2011-06-21 01:22:07 UTC (rev 89326)
@@ -483,12 +483,21 @@
context->clip(damageRect);
context->translate(scrollbar->frameRect().x(), scrollbar->frameRect().y());
LocalCurrentGraphicsContext localContext(context);
- wkScrollbarPainterPaint(scrollbarMap()->get(scrollbar).get(),
- scrollbar->enabled(),
- value,
- (static_cast<CGFloat>(scrollbar->visibleSize()) - overhang) / scrollbar->totalSize(),
- scrollbar->frameRect());
+ WKScrollbarPainterRef scrollbarPainter = scrollbarMap()->get(scrollbar).get();
+ wkScrollbarPainterPaintTrack(scrollbarPainter,
+ scrollbar->enabled(),
+ value,
+ (static_cast<CGFloat>(scrollbar->visibleSize()) - overhang) / scrollbar->totalSize(),
+ scrollbar->frameRect());
+ IntRect tickmarkTrackRect(IntPoint(), trackRect(scrollbar, false).size());
+ // Inset by 2 on the left and 3 on the right.
+ tickmarkTrackRect.setX(tickmarkTrackRect.x() + 2);
+ tickmarkTrackRect.setWidth(tickmarkTrackRect.width() - 3);
+ paintTickmarks(context, scrollbar, tickmarkTrackRect);
+
+ wkScrollbarPainterPaintKnob(scrollbarPainter);
+
scrollAnimator->setIsDrawingIntoLayer(false);
return true;
}
@@ -548,40 +557,17 @@
#endif
HIThemeDrawTrack(&trackInfo, 0, cgContext, kHIThemeOrientationNormal);
- Vector<IntRect> tickmarks;
- scrollbar->scrollableArea()->getTickmarks(tickmarks);
- if (scrollbar->orientation() == VerticalScrollbar && tickmarks.size()) {
- drawingContext->save();
- drawingContext->setShouldAntialias(false);
- drawingContext->setStrokeColor(Color(0xCC, 0xAA, 0x00, 0xFF), ColorSpaceDeviceRGB);
- drawingContext->setFillColor(Color(0xFF, 0xDD, 0x00, 0xFF), ColorSpaceDeviceRGB);
-
- IntRect thumbArea = trackRect(scrollbar, false);
- if (!canDrawDirectly) {
- thumbArea.setX(0);
- thumbArea.setY(0);
- }
- // The ends are rounded and the thumb doesn't go there.
- thumbArea.inflateY(-thumbArea.width());
-
- for (Vector<IntRect>::const_iterator i = tickmarks.begin(); i != tickmarks.end(); ++i) {
- // Calculate how far down (in %) the tick-mark should appear.
- const float percent = static_cast<float>(i->y()) / scrollbar->totalSize();
- if (percent < 0.0 || percent > 1.0)
- continue;
-
- // Calculate how far down (in pixels) the tick-mark should appear.
- const int yPos = static_cast<int>((thumbArea.y() + (thumbArea.height() * percent))) & ~1;
-
- // Paint.
- const int indent = 2;
- FloatRect tickRect(thumbArea.x() + indent, yPos, thumbArea.width() - 2 * indent - 1, 2);
- drawingContext->fillRect(tickRect);
- drawingContext->strokeRect(tickRect, 1);
- }
-
- drawingContext->restore();
+ IntRect tickmarkTrackRect = trackRect(scrollbar, false);
+ if (!canDrawDirectly) {
+ tickmarkTrackRect.setX(0);
+ tickmarkTrackRect.setY(0);
}
+ // The ends are rounded and the thumb doesn't go there.
+ tickmarkTrackRect.inflateY(-tickmarkTrackRect.width());
+ // Inset by 2 on the left and 3 on the right.
+ tickmarkTrackRect.setX(tickmarkTrackRect.x() + 2);
+ tickmarkTrackRect.setWidth(tickmarkTrackRect.width() - 3);
+ paintTickmarks(drawingContext, scrollbar, tickmarkTrackRect);
if (hasThumb(scrollbar)) {
PlatformBridge::ThemePaintScrollbarInfo scrollbarInfo;
@@ -606,4 +592,49 @@
return true;
}
+void ScrollbarThemeChromiumMac::paintTickmarks(GraphicsContext* context, Scrollbar* scrollbar, const IntRect& rect) {
+ if (scrollbar->orientation() != VerticalScrollbar)
+ return;
+
+ if (rect.height() <= 0 || rect.width() <= 0)
+ return; // nothing to draw on.
+
+ // Get the tickmarks for the frameview.
+ Vector<IntRect> tickmarks;
+ scrollbar->scrollableArea()->getTickmarks(tickmarks);
+ if (!tickmarks.size())
+ return;
+
+ int alphaInt = 0xFF;
+ if (scrollbarMap()->contains(scrollbar)) {
+ WKScrollbarPainterRef scrollbarPainter = scrollbarMap()->get(scrollbar).get();
+ if (scrollbarPainter)
+ alphaInt = 0xFF * wkScrollbarPainterTrackAlpha(scrollbarPainter);
+ }
+ if (alphaInt == 0)
+ return;
+
+ context->save();
+ context->setShouldAntialias(false);
+ context->setStrokeColor(Color(0xCC, 0xAA, 0x00, alphaInt), ColorSpaceDeviceRGB);
+ context->setFillColor(Color(0xFF, 0xDD, 0x00, alphaInt), ColorSpaceDeviceRGB);
+
+ for (Vector<IntRect>::const_iterator i = tickmarks.begin(); i != tickmarks.end(); ++i) {
+ // Calculate how far down (in %) the tick-mark should appear.
+ const float percent = static_cast<float>(i->y()) / scrollbar->totalSize();
+ if (percent < 0.0 || percent > 1.0)
+ continue;
+
+ // Calculate how far down (in pixels) the tick-mark should appear.
+ const int yPos = rect.y() + (rect.height() * percent);
+
+ // Paint.
+ FloatRect tickRect(rect.x(), yPos, rect.width(), 2);
+ context->fillRect(tickRect);
+ context->strokeRect(tickRect, 1);
+ }
+
+ context->restore();
}
+
+}