1967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch/*
2967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * Copyright (C) 2010 Google Inc. All rights reserved.
3967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *
4967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * Redistribution and use in source and binary forms, with or without
5967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * modification, are permitted provided that the following conditions are
6967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * met:
7967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *
8967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *     * Redistributions of source code must retain the above copyright
9967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * notice, this list of conditions and the following disclaimer.
10967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *     * Redistributions in binary form must reproduce the above
11967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
12967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * in the documentation and/or other materials provided with the
13967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * distribution.
14967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
15967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * contributors may be used to endorse or promote products derived from
16967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * this software without specific prior written permission.
17967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch *
18967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch */
30967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
31967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "config.h"
32967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "PlatformThemeChromiumGtk.h"
33967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
34967717af5423377c967781471ee106e2bb4e11c8Ben Murdochnamespace WebCore {
35967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
36967717af5423377c967781471ee106e2bb4e11c8Ben Murdochunsigned PlatformThemeChromiumGtk::s_thumbInactiveColor = 0xeaeaea;
37967717af5423377c967781471ee106e2bb4e11c8Ben Murdochunsigned PlatformThemeChromiumGtk::s_thumbActiveColor = 0xf4f4f4;
38967717af5423377c967781471ee106e2bb4e11c8Ben Murdochunsigned PlatformThemeChromiumGtk::s_trackColor = 0xd3d3d3;
39967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
40967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid PlatformThemeChromiumGtk::setScrollbarColors(
41967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkColor inactiveColor, SkColor activeColor, SkColor trackColor)
42967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
43967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    s_thumbInactiveColor = inactiveColor;
44967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    s_thumbActiveColor = activeColor;
45967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    s_trackColor = trackColor;
46967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
47967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
48967717af5423377c967781471ee106e2bb4e11c8Ben Murdochstatic SkScalar clamp(SkScalar value, SkScalar min, SkScalar max)
49967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
50967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return std::min(std::max(value, min), max);
51967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
52967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
53967717af5423377c967781471ee106e2bb4e11c8Ben MurdochSkColor PlatformThemeChromiumGtk::saturateAndBrighten(const SkScalar hsv[3], SkScalar saturateAmount, SkScalar brightenAmount)
54967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
55967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkScalar color[3];
56967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    color[0] = hsv[0];
57967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    color[1] = clamp(hsv[1] + saturateAmount, 0.0, 1.0);
58967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    color[2] = clamp(hsv[2] + brightenAmount, 0.0, 1.0);
59967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return SkHSVToColor(color);
60967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
61967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
62967717af5423377c967781471ee106e2bb4e11c8Ben MurdochSkColor PlatformThemeChromiumGtk::outlineColor(const SkScalar hsv1[3], const SkScalar hsv2[3])
63967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
64967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // GTK Theme engines have way too much control over the layout of
65967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // the scrollbar. We might be able to more closely approximate its
66967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // look-and-feel, if we sent whole images instead of just colors
67967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // from the browser to the renderer. But even then, some themes
68967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // would just break.
69967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    //
70967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // So, instead, we don't even try to 100% replicate the look of
71967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // the native scrollbar. We render our own version, but we make
72967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // sure to pick colors that blend in nicely with the system GTK
73967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // theme. In most cases, we can just sample a couple of pixels
74967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // from the system scrollbar and use those colors to draw our
75967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // scrollbar.
76967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    //
77967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // This works fine for the track color and the overall thumb
78967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // color. But it fails spectacularly for the outline color used
79967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // around the thumb piece.  Not all themes have a clearly defined
80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // outline. For some of them it is partially transparent, and for
81967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // others the thickness is very unpredictable.
82967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    //
83967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // So, instead of trying to approximate the system theme, we
84967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // instead try to compute a reasonable looking choice based on the
85967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // known color of the track and the thumb piece. This is difficult
86967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // when trying to deal both with high- and low-contrast themes,
87967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // and both with positive and inverted themes.
88967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    //
89967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // The following code has been tested to look OK with all of the
90967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // default GTK themes.
91967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkScalar minDiff = clamp((hsv1[1] + hsv2[1]) * 1.2, 0.28, 0.5);
92967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkScalar diff = clamp(fabs(hsv1[2] - hsv2[2]) / 2, minDiff, 0.5);
93967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
94967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (hsv1[2] + hsv2[2] > 1.0)
95967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        diff = -diff;
96967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
97967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return saturateAndBrighten(hsv2, -0.2, diff);
98967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
99967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
100967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid PlatformThemeChromiumGtk::paintArrowButton(GraphicsContext* gc, const IntRect& rect, ArrowDirection direction, ControlStates states)
101967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
102967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkCanvas* const canvas = gc->platformContext()->canvas();
103967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    int widthMiddle, lengthMiddle;
104967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkPaint paint;
105967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (direction == North || direction == South) {
106967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        widthMiddle = rect.width() / 2 + 1;
107967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        lengthMiddle = rect.height() / 2 + 1;
108967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    } else {
109967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        lengthMiddle = rect.width() / 2 + 1;
110967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        widthMiddle = rect.height() / 2 + 1;
111967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
112967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
113967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Calculate button color.
114967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkScalar trackHSV[3];
115967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkColorToHSV(trackColor(), trackHSV);
116967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkColor buttonColor = saturateAndBrighten(trackHSV, 0, 0.2);
117967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkColor backgroundColor = buttonColor;
118967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (states & PressedState) {
119967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        SkScalar buttonHSV[3];
120967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        SkColorToHSV(buttonColor, buttonHSV);
121967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        buttonColor = saturateAndBrighten(buttonHSV, 0, -0.1);
122967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    } else if (states & HoverState) {
123967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        SkScalar buttonHSV[3];
124967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        SkColorToHSV(buttonColor, buttonHSV);
125967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        buttonColor = saturateAndBrighten(buttonHSV, 0, 0.05);
126967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
127967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkIRect skrect;
129967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    skrect.set(rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height());
130967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Paint the background (the area visible behind the rounded corners).
131967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setColor(backgroundColor);
132967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    canvas->drawIRect(skrect, paint);
133967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
134967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Paint the button's outline and fill the middle
135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkPath outline;
136967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    switch (direction) {
137967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case North:
138967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.moveTo(rect.x() + 0.5, rect.y() + rect.height() + 0.5);
139967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, -(rect.height() - 2));
140967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, -2);
141967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(rect.width() - 5, 0);
142967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, 2);
143967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, rect.height() - 2);
144967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
145967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case South:
146967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.moveTo(rect.x() + 0.5, rect.y() - 0.5);
147967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, rect.height() - 2);
148967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, 2);
149967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(rect.width() - 5, 0);
150967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, -2);
151967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, -(rect.height() - 2));
152967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
153967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case East:
154967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.moveTo(rect.x() - 0.5, rect.y() + 0.5);
155967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(rect.width() - 2, 0);
156967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, 2);
157967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, rect.height() - 5);
158967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(-2, 2);
159967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(-(rect.width() - 2), 0);
160967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
161967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case West:
162967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.moveTo(rect.x() + rect.width() + 0.5, rect.y() + 0.5);
163967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(-(rect.width() - 2), 0);
164967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(-2, 2);
165967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(0, rect.height() - 5);
166967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(2, 2);
167967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        outline.rLineTo(rect.width() - 2, 0);
168967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
169967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
170967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    outline.close();
171967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
172967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setStyle(SkPaint::kFill_Style);
173967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setColor(buttonColor);
174967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    canvas->drawPath(outline, paint);
175967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
176967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setAntiAlias(true);
177967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setStyle(SkPaint::kStroke_Style);
178967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkScalar thumbHSV[3];
179967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkColorToHSV(thumbInactiveColor(), thumbHSV);
180967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setColor(outlineColor(trackHSV, thumbHSV));
181967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    canvas->drawPath(outline, paint);
182967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // If the button is disabled or read-only, the arrow is drawn with the outline color.
1840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (states & EnabledState && !(states & ReadOnlyState))
185967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        paint.setColor(SK_ColorBLACK);
186967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
187967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setAntiAlias(false);
188967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    paint.setStyle(SkPaint::kFill_Style);
189967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
190967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SkPath path;
191967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // The constants in this block of code are hand-tailored to produce good
192967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // looking arrows without anti-aliasing.
193967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    switch (direction) {
194967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case North:
195967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle + 2);
196967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(7, 0);
197967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(-4, -4);
198967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
199967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case South:
200967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle - 3);
201967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(7, 0);
202967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(-4, 4);
203967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
204967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case East:
205967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.moveTo(rect.x() + lengthMiddle - 3, rect.y() + widthMiddle - 4);
206967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(0, 7);
207967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(4, -4);
208967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case West:
210967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.moveTo(rect.x() + lengthMiddle + 1, rect.y() + widthMiddle - 5);
211967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(0, 9);
212967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        path.rLineTo(-4, -4);
213967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
214967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
215967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    path.close();
216967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
217967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    canvas->drawPath(path, paint);
218967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
219967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
220967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} // namespace WebCore
221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
222