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/InlinePainter.h"
77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/BoxPainter.h"
97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/LineBoxListPainter.h"
107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/ObjectPainter.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/GraphicsContextAnnotator.h"
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/PaintInfo.h"
137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderInline.h"
147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderTheme.h"
157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RootInlineBox.h"
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/geometry/LayoutPoint.h"
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink {
197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid InlinePainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderInline);
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LineBoxListPainter(*m_renderInline.lineBoxes()).paint(&m_renderInline, paintInfo, paintOffset);
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid InlinePainter::paintOutline(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderStyle* styleToUse = m_renderInline.style();
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!styleToUse->hasOutline())
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (styleToUse->outlineStyleIsAuto()) {
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (RenderTheme::theme().shouldDrawDefaultFocusRing(&m_renderInline)) {
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // Only paint the focus ring by hand if the theme isn't able to draw the focus ring.
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            ObjectPainter(m_renderInline).paintFocusRing(paintInfo, paintOffset, styleToUse);
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (styleToUse->outlineStyle() == BNONE)
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Vector<LayoutRect> rects;
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    rects.append(LayoutRect());
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (InlineFlowBox* curr = m_renderInline.firstLineBox(); curr; curr = curr->nextLineBox()) {
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        RootInlineBox& root = curr->root();
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LayoutUnit top = std::max<LayoutUnit>(root.lineTop(), curr->logicalTop());
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LayoutUnit bottom = std::min<LayoutUnit>(root.lineBottom(), curr->logicalBottom());
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        rects.append(LayoutRect(curr->x(), top, curr->logicalWidth(), bottom - top));
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    rects.append(LayoutRect());
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Color outlineColor = m_renderInline.resolveColor(styleToUse, CSSPropertyOutlineColor);
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool useTransparencyLayer = outlineColor.hasAlpha();
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    GraphicsContext* graphicsContext = paintInfo.context;
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (useTransparencyLayer) {
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        graphicsContext->beginTransparencyLayer(static_cast<float>(outlineColor.alpha()) / 255);
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineColor.blue());
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (unsigned i = 1; i < rects.size() - 1; i++)
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        paintOutlineForLine(graphicsContext, paintOffset, rects.at(i - 1), rects.at(i), rects.at(i + 1), outlineColor);
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (useTransparencyLayer)
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        graphicsContext->endLayer();
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid InlinePainter::paintOutlineForLine(GraphicsContext* graphicsContext, const LayoutPoint& paintOffset,
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const LayoutRect& lastline, const LayoutRect& thisline, const LayoutRect& nextline, const Color outlineColor)
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderStyle* styleToUse = m_renderInline.style();
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int outlineWidth = styleToUse->outlineWidth();
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EBorderStyle outlineStyle = styleToUse->outlineStyle();
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool antialias = BoxPainter::shouldAntialiasLines(graphicsContext);
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int offset = m_renderInline.style()->outlineOffset();
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect box(LayoutPoint(paintOffset.x() + thisline.x() - offset, paintOffset.y() + thisline.y() - offset),
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LayoutSize(thisline.width() + offset, thisline.height() + offset));
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntRect pixelSnappedBox = pixelSnappedIntRect(box);
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (pixelSnappedBox.width() < 0 || pixelSnappedBox.height() < 0)
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntRect pixelSnappedLastLine = pixelSnappedIntRect(paintOffset.x() + lastline.x(), 0, lastline.width(), 0);
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntRect pixelSnappedNextLine = pixelSnappedIntRect(paintOffset.x() + nextline.x(), 0, nextline.width(), 0);
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // left edge
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ObjectPainter::drawLineForBoxSide(graphicsContext,
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.x() - outlineWidth,
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.y() - (lastline.isEmpty() || thisline.x() < lastline.x() || (lastline.maxX() - 1) <= thisline.x() ? outlineWidth : 0),
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.x(),
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.maxY() + (nextline.isEmpty() || thisline.x() <= nextline.x() || (nextline.maxX() - 1) <= thisline.x() ? outlineWidth : 0),
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        BSLeft,
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        outlineColor, outlineStyle,
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        (lastline.isEmpty() || thisline.x() < lastline.x() || (lastline.maxX() - 1) <= thisline.x() ? outlineWidth : -outlineWidth),
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        (nextline.isEmpty() || thisline.x() <= nextline.x() || (nextline.maxX() - 1) <= thisline.x() ? outlineWidth : -outlineWidth),
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        antialias);
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // right edge
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ObjectPainter::drawLineForBoxSide(graphicsContext,
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.maxX(),
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.y() - (lastline.isEmpty() || lastline.maxX() < thisline.maxX() || (thisline.maxX() - 1) <= lastline.x() ? outlineWidth : 0),
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.maxX() + outlineWidth,
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        pixelSnappedBox.maxY() + (nextline.isEmpty() || nextline.maxX() <= thisline.maxX() || (thisline.maxX() - 1) <= nextline.x() ? outlineWidth : 0),
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        BSRight,
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        outlineColor, outlineStyle,
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        (lastline.isEmpty() || lastline.maxX() < thisline.maxX() || (thisline.maxX() - 1) <= lastline.x() ? outlineWidth : -outlineWidth),
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        (nextline.isEmpty() || nextline.maxX() <= thisline.maxX() || (thisline.maxX() - 1) <= nextline.x() ? outlineWidth : -outlineWidth),
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        antialias);
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // upper edge
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (thisline.x() < lastline.x()) {
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.x() - outlineWidth,
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y() - outlineWidth,
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            std::min(pixelSnappedBox.maxX() + outlineWidth, (lastline.isEmpty() ? 1000000 : pixelSnappedLastLine.x())),
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y(),
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSTop, outlineColor, outlineStyle,
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            (!lastline.isEmpty() && paintOffset.x() + lastline.x() + 1 < pixelSnappedBox.maxX() + outlineWidth) ? -outlineWidth : outlineWidth,
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            antialias);
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (lastline.maxX() < thisline.maxX()) {
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            std::max(lastline.isEmpty() ? -1000000 : pixelSnappedLastLine.maxX(), pixelSnappedBox.x() - outlineWidth),
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y() - outlineWidth,
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxX() + outlineWidth,
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y(),
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSTop, outlineColor, outlineStyle,
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            (!lastline.isEmpty() && pixelSnappedBox.x() - outlineWidth < paintOffset.x() + lastline.maxX()) ? -outlineWidth : outlineWidth,
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth, antialias);
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (thisline.x() == thisline.maxX()) {
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.x() - outlineWidth,
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y() - outlineWidth,
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxX() + outlineWidth,
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.y(),
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSTop, outlineColor, outlineStyle,
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            antialias);
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // lower edge
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (thisline.x() < nextline.x()) {
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.x() - outlineWidth,
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY(),
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            std::min(pixelSnappedBox.maxX() + outlineWidth, !nextline.isEmpty() ? pixelSnappedNextLine.x() + 1 : 1000000),
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY() + outlineWidth,
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSBottom, outlineColor, outlineStyle,
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            (!nextline.isEmpty() && paintOffset.x() + nextline.x() + 1 < pixelSnappedBox.maxX() + outlineWidth) ? -outlineWidth : outlineWidth,
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            antialias);
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (nextline.maxX() < thisline.maxX()) {
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            std::max(!nextline.isEmpty() ? pixelSnappedNextLine.maxX() : -1000000, pixelSnappedBox.x() - outlineWidth),
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY(),
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxX() + outlineWidth,
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY() + outlineWidth,
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSBottom, outlineColor, outlineStyle,
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            (!nextline.isEmpty() && pixelSnappedBox.x() - outlineWidth < paintOffset.x() + nextline.maxX()) ? -outlineWidth : outlineWidth,
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth, antialias);
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (thisline.x() == thisline.maxX()) {
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ObjectPainter::drawLineForBoxSide(graphicsContext,
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.x() - outlineWidth,
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY(),
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxX() + outlineWidth,
1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pixelSnappedBox.maxY() + outlineWidth,
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            BSBottom, outlineColor, outlineStyle,
1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            outlineWidth,
1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            antialias);
1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
187