2009-03-02 Adam Langley <agl@google.com>
[WebKit-https.git] / WebCore / platform / chromium / ScrollbarThemeChromiumLinux.cpp
index 95d0f78b810ccce41149d54df7fc92a82d4a809d..11e24720a4391880db240da64db748afab064519 100644 (file)
 #include "Scrollbar.h"
 #include "TransformationMatrix.h"
 
-#include "gtkdrawing.h"
-#include <gtk/gtk.h>
-#include "skia/ext/GdkSkia.h"
-
 namespace WebCore {
 
 int ScrollbarThemeChromium::scrollbarThickness(ScrollbarControlSize controlSize)
 {
-    static int size = 0;
-    if (!size) {
-        MozGtkScrollbarMetrics metrics;
-        moz_gtk_get_scrollbar_metrics(&metrics);
-        size = metrics.slider_width;
-    }
-    return size;
+    return 15;
 }
 
 bool ScrollbarThemeChromium::invalidateOnMouseEnterExit()
@@ -60,89 +50,80 @@ bool ScrollbarThemeChromium::invalidateOnMouseEnterExit()
     return false;
 }
 
-// Given an uninitialised widget state object, set the members such that it's
-// sane for drawing scrollbars
-static void initMozState(GtkWidgetState* mozState)
-{
-    mozState->active = true;
-    mozState->focused = false;
-    mozState->inHover = false;
-    mozState->disabled = false;
-    mozState->isDefault = false;
-    mozState->canDefault = false;
-    mozState->depressed = false;
-    mozState->curpos = 0;
-    mozState->maxpos = 0;
-}
-
-// Paint a GTK widget
-//   gc: context to draw onto
-//   rect: the area of the widget
-//   widget_type: the type of widget to draw
-//   flags: widget dependent flags (e.g. direction of scrollbar arrows etc)
-//
-// See paintMozWiget in RenderThemeGtk.cpp for an explanation of the clipping.
-static void paintScrollbarWidget(GraphicsContext* gc, const IntRect& rect,
-                                 GtkThemeWidgetType widget_type, gint flags)
-{
-    PlatformContextSkia* pcs = gc->platformContext();
-
-    GdkRectangle gdkRect = { rect.x(), rect.y(), rect.width(), rect.height() };
-
-    const SkIRect clip_region = pcs->canvas()->getTotalClip().getBounds();
-    TransformationMatrix ctm = gc->getCTM().inverse();
-    IntPoint pos = ctm.mapPoint(
-        IntPoint(SkScalarRound(clip_region.fLeft), SkScalarRound(clip_region.fTop)));
-    GdkRectangle gdkClipRect;
-    gdkClipRect.x = pos.x();
-    gdkClipRect.y = pos.y();
-    gdkClipRect.width = clip_region.width();
-    gdkClipRect.height = clip_region.height();
-
-    gdk_rectangle_intersect(&gdkRect, &gdkClipRect, &gdkClipRect);
-
-    GtkWidgetState mozState;
-    initMozState(&mozState);
-
-    moz_gtk_widget_paint(widget_type, pcs->gdk_skia(), &gdkRect, &gdkClipRect,
-                         &mozState, flags, GTK_TEXT_DIR_LTR);
-}
-
 void ScrollbarThemeChromium::paintTrackPiece(GraphicsContext* gc, Scrollbar* scrollbar,
                                              const IntRect& rect, ScrollbarPart partType)
 {
-    const bool horz = scrollbar->orientation() == HorizontalScrollbar;
-    const GtkThemeWidgetType track_type =
-        horz ? MOZ_GTK_SCROLLBAR_TRACK_HORIZONTAL : MOZ_GTK_SCROLLBAR_TRACK_VERTICAL;
-    paintScrollbarWidget(gc, rect, track_type, 0);
-}
+    const int right = rect.x() + rect.width();
+    const int bottom = rect.y() + rect.height();
+    SkCanvas* const canvas = gc->platformContext()->canvas();
 
-void ScrollbarThemeChromium::paintButton(GraphicsContext* gc, Scrollbar* scrollbar,
-                                    const IntRect& rect, ScrollbarPart part)
-{
-    // FIXME: It appears the either we're upsetting GTK by forcing WebKit sizes
-    // on it, or the buttons expect the track to be drawn under them.  Either
-    // way, we end up with unpainted pixels which are upsetting the pixel
-    // tests. Thus we paint green under the buttons to, at least, make the
-    // pixel output the same between debug and opt builds.
     SkPaint paint;
-    paint.setARGB(255, 0, 255, 128);
+    paint.setARGB(0xff, 0xe3, 0xdd, 0xd8);
     SkRect skrect;
-    skrect.set(rect.x(), rect.y(), rect.x() + rect.width() - 1, rect.y() + rect.height() - 1);
-    gc->platformContext()->canvas()->drawRect(skrect, paint);
+    skrect.set(rect.x(), rect.y(), right, bottom);
+    canvas->drawRect(skrect, paint);
+
+    paint.setARGB(0xff, 0xc5, 0xba, 0xb0);
+    canvas->drawLine(rect.x(), rect.y(), rect.x(), bottom, paint);
+    canvas->drawLine(right, rect.y(), right, bottom, paint);
+    canvas->drawLine(rect.x(), rect.y(), right, rect.y(), paint);
+    canvas->drawLine(rect.x(), bottom, right, bottom, paint);
+}
 
-    const bool horz = scrollbar->orientation() == HorizontalScrollbar;
-    gint flags = horz ? 0 : MOZ_GTK_STEPPER_VERTICAL;
-    flags |= ForwardButtonEndPart == part ? MOZ_GTK_STEPPER_DOWN : 0;
-    paintScrollbarWidget(gc, rect, MOZ_GTK_SCROLLBAR_BUTTON, flags);
+void ScrollbarThemeChromium::paintButton(GraphicsContext* gc, Scrollbar* scrollbar,
+                                         const IntRect& rect, ScrollbarPart part)
+{
+    // We don't use buttons
 }
 
 void ScrollbarThemeChromium::paintThumb(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect)
 {
-    const bool horz = scrollbar->orientation() == HorizontalScrollbar;
-    const GtkThemeWidgetType thumb_type =
-        horz ? MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL : MOZ_GTK_SCROLLBAR_THUMB_VERTICAL;
-    paintScrollbarWidget(gc, rect, thumb_type, 0);
+    const bool hovered = scrollbar->hoveredPart() == ThumbPart;
+    const int right = rect.x() + rect.width();
+    const int bottom = rect.y() + rect.height();
+    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();
+
+    SkPaint paint;
+    if (hovered)
+        paint.setARGB(0xff, 0xff, 0xff, 0xff);
+    else
+        paint.setARGB(0xff, 0xf4, 0xf2, 0xef);
+
+    SkRect skrect;
+    if (vertical) {
+      skrect.set(rect.x(), rect.y(), midx + 1, bottom);
+    } else {
+      skrect.set(rect.x(), rect.y(), right, midy + 1);
+    }
+    canvas->drawRect(skrect, paint);
+
+    if (hovered) {
+      paint.setARGB(0xff, 0xf4, 0xf2, 0xef);
+    } else {
+      paint.setARGB(0xff, 0xea, 0xe5, 0xe0);
+    }
+    if (vertical) {
+      skrect.set(midx + 1, rect.y(), right, bottom);
+    } else {
+      skrect.set(rect.x(), midy + 1, right, bottom);
+    }
+    canvas->drawRect(skrect, paint);
+
+    paint.setARGB(0xff, 0x9d, 0x96, 0x8e);
+    canvas->drawLine(rect.x(), rect.y(), rect.x(), bottom, paint);
+    canvas->drawLine(right, rect.y(), right, bottom, paint);
+    canvas->drawLine(rect.x(), rect.y(), right, rect.y(), paint);
+    canvas->drawLine(rect.x(), bottom, right, bottom, paint);
+
+    if (rect.height() > 10 && rect.width() > 10) {
+      paint.setARGB(0xff, 0x9d, 0x96, 0x8e);
+      canvas->drawLine(midx - 1, midy, midx + 3, midy, paint);
+      canvas->drawLine(midx - 1, midy - 3, midx + 3, midy - 3, paint);
+      canvas->drawLine(midx - 1, midy + 3, midx + 3, midy + 3, paint);
+    }
 }
 
 } // namespace WebCore