17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Use of this source code is governed by a BSD-style license that can be 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// found in the LICENSE file. 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h" 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/ObjectPainter.h" 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/PaintInfo.h" 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderObject.h" 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderTheme.h" 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/style/RenderStyle.h" 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/geometry/LayoutPoint.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/graphics/GraphicsContextStateSaver.h" 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink { 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::paintFocusRing(PaintInfo& paintInfo, const LayoutPoint& paintOffset, RenderStyle* style) 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Vector<LayoutRect> focusRingRects; 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_renderObject.addFocusRingRects(focusRingRects, paintOffset, paintInfo.paintContainer()); 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(style->outlineStyleIsAuto()); 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Vector<IntRect> focusRingIntRects; 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < focusRingRects.size(); ++i) 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci focusRingIntRects.append(pixelSnappedIntRect(focusRingRects[i])); 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci paintInfo.context->drawFocusRing(focusRingIntRects, style->outlineWidth(), style->outlineOffset(), m_renderObject.resolveColor(style, CSSPropertyOutlineColor)); 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::paintOutline(PaintInfo& paintInfo, const LayoutRect& paintRect) 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RenderStyle* styleToUse = m_renderObject.style(); 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!styleToUse->hasOutline()) 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit outlineWidth = styleToUse->outlineWidth(); 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int outlineOffset = styleToUse->outlineOffset(); 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (styleToUse->outlineStyleIsAuto()) { 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (RenderTheme::theme().shouldDrawDefaultFocusRing(&m_renderObject)) { 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Only paint the focus ring by hand if the theme isn't able to draw the focus ring. 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci paintFocusRing(paintInfo, paintRect.location(), styleToUse); 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (styleToUse->outlineStyle() == BNONE) 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci IntRect inner = pixelSnappedIntRect(paintRect); 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci inner.inflate(outlineOffset); 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci IntRect outer = pixelSnappedIntRect(inner); 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci outer.inflate(outlineWidth); 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: This prevents outlines from painting inside the object. See bug 12042 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (outer.isEmpty()) 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EBorderStyle outlineStyle = styleToUse->outlineStyle(); 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Color outlineColor = m_renderObject.resolveColor(styleToUse, CSSPropertyOutlineColor); 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci GraphicsContext* graphicsContext = paintInfo.context; 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool useTransparencyLayer = outlineColor.hasAlpha(); 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (useTransparencyLayer) { 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (outlineStyle == SOLID) { 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Path path; 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci path.addRect(outer); 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci path.addRect(inner); 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setFillRule(RULE_EVENODD); 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setFillColor(outlineColor); 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->fillPath(path); 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->beginTransparencyLayer(static_cast<float>(outlineColor.alpha()) / 255); 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineColor.blue()); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int leftOuter = outer.x(); 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int leftInner = inner.x(); 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int rightOuter = outer.maxX(); 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int rightInner = inner.maxX(); 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int topOuter = outer.y(); 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int topInner = inner.y(); 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int bottomOuter = outer.maxY(); 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int bottomInner = inner.maxY(); 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, leftOuter, topOuter, leftInner, bottomOuter, BSLeft, outlineColor, outlineStyle, outlineWidth, outlineWidth); 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, leftOuter, topOuter, rightOuter, topInner, BSTop, outlineColor, outlineStyle, outlineWidth, outlineWidth); 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, rightInner, topOuter, rightOuter, bottomOuter, BSRight, outlineColor, outlineStyle, outlineWidth, outlineWidth); 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, leftOuter, bottomInner, rightOuter, bottomOuter, BSBottom, outlineColor, outlineStyle, outlineWidth, outlineWidth); 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (useTransparencyLayer) 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->endLayer(); 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BoxSide side, Color color, EBorderStyle style, 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int adjacentWidth1, int adjacentWidth2, bool antialias) 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int thickness; 1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int length; 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (side == BSTop || side == BSBottom) { 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci thickness = y2 - y1; 1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci length = x2 - x1; 1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci thickness = x2 - x1; 1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci length = y2 - y1; 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: We really would like this check to be an ASSERT as we don't want to draw empty borders. However 1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // nothing guarantees that the following recursive calls to drawLineForBoxSide will have non-null dimensions. 1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!thickness || !length) 1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (style == DOUBLE && thickness < 3) 1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci style = SOLID; 1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (style) { 1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BNONE: 1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BHIDDEN: 1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case DOTTED: 1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case DASHED: 1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawDashedOrDottedBoxSide(graphicsContext, x1, y1, x2, y2, side, 1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci color, thickness, style, antialias); 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case DOUBLE: 1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawDoubleBoxSide(graphicsContext, x1, y1, x2, y2, length, side, color, 1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci thickness, adjacentWidth1, adjacentWidth2, antialias); 1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case RIDGE: 1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case GROOVE: 1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawRidgeOrGrooveBoxSide(graphicsContext, x1, y1, x2, y2, side, color, 1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci style, adjacentWidth1, adjacentWidth2, antialias); 1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case INSET: 1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Maybe we should lighten the colors on one side like Firefox. 1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // https://bugs.webkit.org/show_bug.cgi?id=58608 1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (side == BSTop || side == BSLeft) 1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci color = color.dark(); 1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // fall through 1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case OUTSET: 1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (style == OUTSET && (side == BSBottom || side == BSRight)) 1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci color = color.dark(); 1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // fall through 1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case SOLID: 1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawSolidBoxSide(graphicsContext, x1, y1, x2, y2, side, color, adjacentWidth1, adjacentWidth2, antialias); 1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::drawDashedOrDottedBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BoxSide side, Color color, int thickness, EBorderStyle style, bool antialias) 1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (thickness <= 0) 1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool wasAntialiased = graphicsContext->shouldAntialias(); 1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StrokeStyle oldStrokeStyle = graphicsContext->strokeStyle(); 1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(antialias); 1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeColor(color); 1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeThickness(thickness); 1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(style == DASHED ? DashedStroke : DottedStroke); 1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (side) { 1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSBottom: 1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSTop: 1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawLine(IntPoint(x1, (y1 + y2) / 2), IntPoint(x2, (y1 + y2) / 2)); 1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSRight: 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSLeft: 1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawLine(IntPoint((x1 + x2) / 2, y1), IntPoint((x1 + x2) / 2, y2)); 1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(wasAntialiased); 1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(oldStrokeStyle); 1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::drawDoubleBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int length, BoxSide side, Color color, int thickness, int adjacentWidth1, int adjacentWidth2, bool antialias) 1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int thirdOfThickness = (thickness + 1) / 3; 1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(thirdOfThickness); 1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!adjacentWidth1 && !adjacentWidth2) { 1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StrokeStyle oldStrokeStyle = graphicsContext->strokeStyle(); 1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(NoStroke); 1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setFillColor(color); 1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool wasAntialiased = graphicsContext->shouldAntialias(); 1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(antialias); 1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (side) { 1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSTop: 1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSBottom: 1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawRect(IntRect(x1, y1, length, thirdOfThickness)); 1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawRect(IntRect(x1, y2 - thirdOfThickness, length, thirdOfThickness)); 1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSLeft: 2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSRight: 2017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Why do we offset the border by 1 in this case but not the other one? 2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (length > 1) { 2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawRect(IntRect(x1, y1 + 1, thirdOfThickness, length - 1)); 2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawRect(IntRect(x2 - thirdOfThickness, y1 + 1, thirdOfThickness, length - 1)); 2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(wasAntialiased); 2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(oldStrokeStyle); 2117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int adjacent1BigThird = ((adjacentWidth1 > 0) ? adjacentWidth1 + 1 : adjacentWidth1 - 1) / 3; 2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int adjacent2BigThird = ((adjacentWidth2 > 0) ? adjacentWidth2 + 1 : adjacentWidth2 - 1) / 3; 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (side) { 2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSTop: 2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max((-adjacentWidth1 * 2 + 1) / 3, 0), 2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci y1, x2 - std::max((-adjacentWidth2 * 2 + 1) / 3, 0), y1 + thirdOfThickness, 2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max((adjacentWidth1 * 2 + 1) / 3, 0), 2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci y2 - thirdOfThickness, x2 - std::max((adjacentWidth2 * 2 + 1) / 3, 0), y2, 2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSLeft: 2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1, y1 + std::max((-adjacentWidth1 * 2 + 1) / 3, 0), 2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci x1 + thirdOfThickness, y2 - std::max((-adjacentWidth2 * 2 + 1) / 3, 0), 2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x2 - thirdOfThickness, y1 + std::max((adjacentWidth1 * 2 + 1) / 3, 0), 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci x2, y2 - std::max((adjacentWidth2 * 2 + 1) / 3, 0), 2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSBottom: 2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max((adjacentWidth1 * 2 + 1) / 3, 0), 2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci y1, x2 - std::max((adjacentWidth2 * 2 + 1) / 3, 0), y1 + thirdOfThickness, 2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max((-adjacentWidth1 * 2 + 1) / 3, 0), 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci y2 - thirdOfThickness, x2 - std::max((-adjacentWidth2 * 2 + 1) / 3, 0), y2, 2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSRight: 2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1, y1 + std::max((adjacentWidth1 * 2 + 1) / 3, 0), 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci x1 + thirdOfThickness, y2 - std::max((adjacentWidth2 * 2 + 1) / 3, 0), 2457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x2 - thirdOfThickness, y1 + std::max((-adjacentWidth1 * 2 + 1) / 3, 0), 2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci x2, y2 - std::max((-adjacentWidth2 * 2 + 1) / 3, 0), 2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, SOLID, adjacent1BigThird, adjacent2BigThird, antialias); 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 2517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::drawRidgeOrGrooveBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BoxSide side, Color color, EBorderStyle style, int adjacentWidth1, int adjacentWidth2, bool antialias) 2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EBorderStyle s1; 2597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EBorderStyle s2; 2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (style == GROOVE) { 2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s1 = INSET; 2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s2 = OUTSET; 2637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 2647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s1 = OUTSET; 2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s2 = INSET; 2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int adjacent1BigHalf = ((adjacentWidth1 > 0) ? adjacentWidth1 + 1 : adjacentWidth1 - 1) / 2; 2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int adjacent2BigHalf = ((adjacentWidth2 > 0) ? adjacentWidth2 + 1 : adjacentWidth2 - 1) / 2; 2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (side) { 2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSTop: 2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max(-adjacentWidth1, 0) / 2, y1, x2 - std::max(-adjacentWidth2, 0) / 2, (y1 + y2 + 1) / 2, 2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s1, adjacent1BigHalf, adjacent2BigHalf, antialias); 2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max(adjacentWidth1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - std::max(adjacentWidth2 + 1, 0) / 2, y2, 2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s2, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSLeft: 2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1, y1 + std::max(-adjacentWidth1, 0) / 2, (x1 + x2 + 1) / 2, y2 - std::max(-adjacentWidth2, 0) / 2, 2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s1, adjacent1BigHalf, adjacent2BigHalf, antialias); 2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + std::max(adjacentWidth1 + 1, 0) / 2, x2, y2 - std::max(adjacentWidth2 + 1, 0) / 2, 2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s2, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSBottom: 2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max(adjacentWidth1, 0) / 2, y1, x2 - std::max(adjacentWidth2, 0) / 2, (y1 + y2 + 1) / 2, 2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s2, adjacent1BigHalf, adjacent2BigHalf, antialias); 2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1 + std::max(-adjacentWidth1 + 1, 0) / 2, (y1 + y2 + 1) / 2, x2 - std::max(-adjacentWidth2 + 1, 0) / 2, y2, 2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s1, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSRight: 2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, x1, y1 + std::max(adjacentWidth1, 0) / 2, (x1 + x2 + 1) / 2, y2 - std::max(adjacentWidth2, 0) / 2, 2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s2, adjacent1BigHalf, adjacent2BigHalf, antialias); 2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci drawLineForBoxSide(graphicsContext, (x1 + x2 + 1) / 2, y1 + std::max(-adjacentWidth1 + 1, 0) / 2, x2, y2 - std::max(-adjacentWidth2 + 1, 0) / 2, 2947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci side, color, s1, adjacentWidth1 / 2, adjacentWidth2 / 2, antialias); 2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ObjectPainter::drawSolidBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, 3007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BoxSide side, Color color, int adjacentWidth1, int adjacentWidth2, bool antialias) 3017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 3027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StrokeStyle oldStrokeStyle = graphicsContext->strokeStyle(); 3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(NoStroke); 3047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setFillColor(color); 3057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(x2 >= x1); 3067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(y2 >= y1); 3077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!adjacentWidth1 && !adjacentWidth2) { 3087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Turn off antialiasing to match the behavior of drawConvexPolygon(); 3097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // this matters for rects in transformed contexts. 3107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool wasAntialiased = graphicsContext->shouldAntialias(); 3117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(antialias); 3127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawRect(IntRect(x1, y1, x2 - x1, y2 - y1)); 3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setShouldAntialias(wasAntialiased); 3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(oldStrokeStyle); 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FloatPoint quad[4]; 3187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (side) { 3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSTop: 3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[0] = FloatPoint(x1 + std::max(-adjacentWidth1, 0), y1); 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[1] = FloatPoint(x1 + std::max(adjacentWidth1, 0), y2); 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[2] = FloatPoint(x2 - std::max(adjacentWidth2, 0), y2); 3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[3] = FloatPoint(x2 - std::max(-adjacentWidth2, 0), y1); 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSBottom: 3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[0] = FloatPoint(x1 + std::max(adjacentWidth1, 0), y1); 3277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[1] = FloatPoint(x1 + std::max(-adjacentWidth1, 0), y2); 3287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[2] = FloatPoint(x2 - std::max(-adjacentWidth2, 0), y2); 3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[3] = FloatPoint(x2 - std::max(adjacentWidth2, 0), y1); 3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 3317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSLeft: 3327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[0] = FloatPoint(x1, y1 + std::max(-adjacentWidth1, 0)); 3337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[1] = FloatPoint(x1, y2 - std::max(-adjacentWidth2, 0)); 3347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[2] = FloatPoint(x2, y2 - std::max(adjacentWidth2, 0)); 3357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[3] = FloatPoint(x2, y1 + std::max(adjacentWidth1, 0)); 3367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 3377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case BSRight: 3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[0] = FloatPoint(x1, y1 + std::max(adjacentWidth1, 0)); 3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[1] = FloatPoint(x1, y2 - std::max(adjacentWidth2, 0)); 3407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[2] = FloatPoint(x2, y2 - std::max(-adjacentWidth2, 0)); 3417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci quad[3] = FloatPoint(x2, y1 + std::max(-adjacentWidth1, 0)); 3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 3437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->drawConvexPolygon(4, quad, antialias); 3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci graphicsContext->setStrokeStyle(oldStrokeStyle); 3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink 350