summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp')
-rw-r--r--WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp188
1 files changed, 67 insertions, 121 deletions
diff --git a/WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp b/WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp
index d8f2c79..46e6993 100644
--- a/WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp
+++ b/WebCore/platform/chromium/ScrollbarThemeChromiumLinux.cpp
@@ -31,17 +31,12 @@
#include "config.h"
#include "ScrollbarThemeChromiumLinux.h"
-#include "PlatformContextSkia.h"
+#include "ChromiumBridge.h"
#include "PlatformMouseEvent.h"
-#include "PlatformThemeChromiumGtk.h"
#include "Scrollbar.h"
-#include "TransformationMatrix.h"
namespace WebCore {
-static const int scrollbarThicknessValue = 15;
-static const int buttonLength = 14;
-
ScrollbarTheme* ScrollbarTheme::nativeTheme()
{
static ScrollbarThemeChromiumLinux theme;
@@ -50,136 +45,79 @@ ScrollbarTheme* ScrollbarTheme::nativeTheme()
int ScrollbarThemeChromiumLinux::scrollbarThickness(ScrollbarControlSize controlSize)
{
- return scrollbarThicknessValue;
-}
-
-static void drawVertLine(SkCanvas* canvas, int x, int y1, int y2, const SkPaint& paint)
-{
- SkIRect skrect;
- skrect.set(x, y1, x + 1, y2 + 1);
- canvas->drawIRect(skrect, paint);
-}
-
-static void drawHorizLine(SkCanvas* canvas, int x1, int x2, int y, const SkPaint& paint)
-{
- SkIRect skrect;
- skrect.set(x1, y, x2 + 1, y + 1);
- canvas->drawIRect(skrect, paint);
-}
-
-static void drawBox(SkCanvas* canvas, const IntRect& rect, const SkPaint& paint)
-{
- const int right = rect.x() + rect.width() - 1;
- const int bottom = rect.y() + rect.height() - 1;
- drawHorizLine(canvas, rect.x(), right, rect.y(), paint);
- drawVertLine(canvas, right, rect.y(), bottom, paint);
- drawHorizLine(canvas, rect.x(), right, bottom, paint);
- drawVertLine(canvas, rect.x(), rect.y(), bottom, paint);
+ // Horiz and Vert scrollbars are the same thickness.
+ IntSize scrollbarSize = ChromiumBridge::getThemePartSize(ChromiumBridge::PartScrollbarVerticalTrack);
+ return scrollbarSize.width();
}
void ScrollbarThemeChromiumLinux::paintTrackPiece(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart partType)
{
- SkCanvas* const canvas = gc->platformContext()->canvas();
- SkPaint paint;
- SkIRect skrect;
-
- skrect.set(rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height());
- SkScalar trackHSV[3];
- SkColorToHSV(PlatformThemeChromiumGtk::trackColor(), trackHSV);
- paint.setColor(PlatformThemeChromiumGtk::saturateAndBrighten(trackHSV, 0, 0));
- canvas->drawIRect(skrect, paint);
-
- SkScalar thumbHSV[3];
- SkColorToHSV(PlatformThemeChromiumGtk::thumbInactiveColor(),
- thumbHSV);
-
- paint.setColor(PlatformThemeChromiumGtk::outlineColor(trackHSV, thumbHSV));
- drawBox(canvas, rect, paint);
+ ChromiumBridge::ThemePaintState state = scrollbar->hoveredPart() == partType ? ChromiumBridge::StateHover : ChromiumBridge::StateNormal;
+ IntRect alignRect = trackRect(scrollbar, false);
+ ChromiumBridge::ThemePaintExtraParams extraParams;
+ extraParams.scrollbarTrack.trackX = alignRect.x();
+ extraParams.scrollbarTrack.trackY = alignRect.y();
+ extraParams.scrollbarTrack.trackWidth = alignRect.width();
+ extraParams.scrollbarTrack.trackHeight = alignRect.height();
+ ChromiumBridge::paintThemePart(
+ gc,
+ scrollbar->orientation() == HorizontalScrollbar ? ChromiumBridge::PartScrollbarHoriztonalTrack : ChromiumBridge::PartScrollbarVerticalTrack,
+ state,
+ rect,
+ &extraParams);
}
void ScrollbarThemeChromiumLinux::paintButton(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart part)
{
- PlatformThemeChromiumGtk::ArrowDirection direction;
+ ChromiumBridge::ThemePart paintPart;
+ ChromiumBridge::ThemePaintState state = ChromiumBridge::StateNormal;
+ bool checkMin = false;
+ bool checkMax = false;
if (scrollbar->orientation() == HorizontalScrollbar) {
- if (part == BackButtonStartPart)
- direction = PlatformThemeChromiumGtk::West;
- else
- direction = PlatformThemeChromiumGtk::East;
+ if (part == BackButtonStartPart) {
+ paintPart = ChromiumBridge::PartScrollbarLeftArrow;
+ checkMin = true;
+ } else {
+ paintPart = ChromiumBridge::PartScrollbarRightArrow;
+ checkMax = true;
+ }
} else {
- if (part == BackButtonStartPart)
- direction = PlatformThemeChromiumGtk::North;
- else
- direction = PlatformThemeChromiumGtk::South;
+ if (part == BackButtonStartPart) {
+ paintPart = ChromiumBridge::PartScrollbarUpArrow;
+ checkMin = true;
+ } else {
+ paintPart = ChromiumBridge::PartScrollbarDownArrow;
+ checkMax = true;
+ }
}
-
- ControlStates states = 0;
- // Determine if the button can be pressed.
- if (((direction == PlatformThemeChromiumGtk::West || direction == PlatformThemeChromiumGtk::North) && scrollbar->currentPos())
- || ((direction == PlatformThemeChromiumGtk::East || direction == PlatformThemeChromiumGtk::South) && scrollbar->currentPos() != scrollbar->maximum()))
- states |= EnabledState;
-
- if (states & EnabledState) {
+ if ((checkMin && (scrollbar->currentPos() <= 0))
+ || (checkMax && scrollbar->currentPos() == scrollbar->maximum())) {
+ state = ChromiumBridge::StateDisabled;
+ } else {
if (part == scrollbar->pressedPart())
- states |= PressedState;
+ state = ChromiumBridge::StatePressed;
else if (part == scrollbar->hoveredPart())
- states |= HoverState;
+ state = ChromiumBridge::StateHover;
}
-
- PlatformThemeChromiumGtk::paintArrowButton(gc, rect, direction, states);
+ ChromiumBridge::paintThemePart(gc, paintPart, state, rect, 0);
}
void ScrollbarThemeChromiumLinux::paintThumb(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect)
{
- const bool hovered = scrollbar->hoveredPart() == ThumbPart;
- const int midx = rect.x() + rect.width() / 2;
- const int midy = rect.y() + rect.height() / 2;
- const bool vertical = scrollbar->orientation() == VerticalScrollbar;
- SkCanvas* const canvas = gc->platformContext()->canvas();
-
- SkScalar thumb[3];
- SkColorToHSV(hovered
- ? PlatformThemeChromiumGtk::thumbActiveColor()
- : PlatformThemeChromiumGtk::thumbInactiveColor(),
- thumb);
-
- SkPaint paint;
- paint.setColor(PlatformThemeChromiumGtk::saturateAndBrighten(thumb, 0, 0.02));
-
- SkIRect skrect;
- if (vertical)
- skrect.set(rect.x(), rect.y(), midx + 1, rect.y() + rect.height());
- else
- skrect.set(rect.x(), rect.y(), rect.x() + rect.width(), midy + 1);
-
- canvas->drawIRect(skrect, paint);
-
- paint.setColor(PlatformThemeChromiumGtk::saturateAndBrighten(thumb, 0, -0.02));
+ ChromiumBridge::ThemePaintState state;
- if (vertical)
- skrect.set(midx + 1, rect.y(), rect.x() + rect.width(), rect.y() + rect.height());
+ if (scrollbar->pressedPart() == ThumbPart)
+ state = ChromiumBridge::StatePressed;
+ else if (scrollbar->hoveredPart() == ThumbPart)
+ state = ChromiumBridge::StateHover;
else
- skrect.set(rect.x(), midy + 1, rect.x() + rect.width(), rect.y() + rect.height());
-
- canvas->drawIRect(skrect, paint);
-
- SkScalar track[3];
- SkColorToHSV(PlatformThemeChromiumGtk::trackColor(), track);
- paint.setColor(PlatformThemeChromiumGtk::outlineColor(track, thumb));
- drawBox(canvas, rect, paint);
-
- if (rect.height() > 10 && rect.width() > 10) {
- const int grippyHalfWidth = 2;
- const int interGrippyOffset = 3;
- if (vertical) {
- drawHorizLine(canvas, midx - grippyHalfWidth, midx + grippyHalfWidth, midy - interGrippyOffset, paint);
- drawHorizLine(canvas, midx - grippyHalfWidth, midx + grippyHalfWidth, midy, paint);
- drawHorizLine(canvas, midx - grippyHalfWidth, midx + grippyHalfWidth, midy + interGrippyOffset, paint);
- } else {
- drawVertLine(canvas, midx - interGrippyOffset, midy - grippyHalfWidth, midy + grippyHalfWidth, paint);
- drawVertLine(canvas, midx, midy - grippyHalfWidth, midy + grippyHalfWidth, paint);
- drawVertLine(canvas, midx + interGrippyOffset, midy - grippyHalfWidth, midy + grippyHalfWidth, paint);
- }
- }
+ state = ChromiumBridge::StateNormal;
+ ChromiumBridge::paintThemePart(
+ gc,
+ scrollbar->orientation() == HorizontalScrollbar ? ChromiumBridge::PartScrollbarHorizontalThumb : ChromiumBridge::PartScrollbarVerticalThumb,
+ state,
+ rect,
+ 0);
}
bool ScrollbarThemeChromiumLinux::shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent& evt)
@@ -189,17 +127,25 @@ bool ScrollbarThemeChromiumLinux::shouldCenterOnThumb(Scrollbar*, const Platform
IntSize ScrollbarThemeChromiumLinux::buttonSize(Scrollbar* scrollbar)
{
- if (scrollbar->orientation() == VerticalScrollbar)
- return IntSize(scrollbarThicknessValue, buttonLength);
+ if (scrollbar->orientation() == VerticalScrollbar) {
+ IntSize size = ChromiumBridge::getThemePartSize(ChromiumBridge::PartScrollbarUpArrow);
+ return IntSize(size.width(), scrollbar->height() < 2 * size.height() ? scrollbar->height() / 2 : size.height());
+ }
// HorizontalScrollbar
- return IntSize(buttonLength, scrollbarThicknessValue);
+ IntSize size = ChromiumBridge::getThemePartSize(ChromiumBridge::PartScrollbarLeftArrow);
+ return IntSize(scrollbar->width() < 2 * size.width() ? scrollbar->width() / 2 : size.width(), size.height());
}
int ScrollbarThemeChromiumLinux::minimumThumbLength(Scrollbar* scrollbar)
{
- // This matches Firefox on Linux.
- return 2 * scrollbarThickness(scrollbar->controlSize());
+ if (scrollbar->orientation() == VerticalScrollbar) {
+ IntSize size = ChromiumBridge::getThemePartSize(ChromiumBridge::PartScrollbarVerticalThumb);
+ return size.height();
+ }
+
+ IntSize size = ChromiumBridge::getThemePartSize(ChromiumBridge::PartScrollbarHorizontalThumb);
+ return size.width();
}
} // namespace WebCore