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