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/ListMarkerPainter.h"
77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/BlockPainter.h"
97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/GraphicsContextAnnotator.h"
107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/PaintInfo.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderListItem.h"
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderListMarker.h"
137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/TextRunConstructor.h"
147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/geometry/LayoutPoint.h"
157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/graphics/GraphicsContextStateSaver.h"
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/unicode/CharacterNames.h"
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink {
197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ListMarkerPainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderListMarker);
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (paintInfo.phase != PaintPhaseForeground)
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_renderListMarker.style()->visibility() != VISIBLE)
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutPoint boxOrigin(paintOffset + m_renderListMarker.location());
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect overflowRect(m_renderListMarker.visualOverflowRect());
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    overflowRect.moveBy(boxOrigin);
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!paintInfo.rect.intersects(pixelSnappedIntRect(overflowRect)))
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect box(boxOrigin, m_renderListMarker.size());
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntRect marker = m_renderListMarker.getRelativeMarkerRect();
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    marker.moveBy(roundedIntPoint(boxOrigin));
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    GraphicsContext* context = paintInfo.context;
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_renderListMarker.isImage()) {
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->drawImage(m_renderListMarker.image()->image(&m_renderListMarker, marker.size()).get(), marker);
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_renderListMarker.selectionState() != RenderObject::SelectionNone) {
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            LayoutRect selRect = m_renderListMarker.localSelectionRect();
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            selRect.moveBy(boxOrigin);
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            context->fillRect(pixelSnappedIntRect(selRect), m_renderListMarker.selectionBackgroundColor());
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_renderListMarker.selectionState() != RenderObject::SelectionNone) {
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LayoutRect selRect = m_renderListMarker.localSelectionRect();
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        selRect.moveBy(boxOrigin);
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->fillRect(pixelSnappedIntRect(selRect), m_renderListMarker.selectionBackgroundColor());
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const Color color(m_renderListMarker.resolveColor(CSSPropertyColor));
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context->setStrokeColor(color);
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context->setStrokeStyle(SolidStroke);
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context->setStrokeThickness(1.0f);
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context->setFillColor(color);
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EListStyleType type = m_renderListMarker.style()->listStyleType();
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    switch (type) {
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Disc:
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->fillEllipse(marker);
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Circle:
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->strokeEllipse(marker);
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Square:
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->fillRect(marker);
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case NoneListStyle:
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Afar:
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Amharic:
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case AmharicAbegede:
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case ArabicIndic:
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Armenian:
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case BinaryListStyle:
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Bengali:
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Cambodian:
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CJKIdeographic:
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CjkEarthlyBranch:
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CjkHeavenlyStem:
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case DecimalLeadingZero:
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case DecimalListStyle:
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Devanagari:
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Ethiopic:
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicAbegede:
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicAbegedeAmEt:
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicAbegedeGez:
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicAbegedeTiEr:
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicAbegedeTiEt:
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameAaEr:
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameAaEt:
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameAmEt:
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameGez:
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameOmEt:
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameSidEt:
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameSoEt:
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameTiEr:
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameTiEt:
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case EthiopicHalehameTig:
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Georgian:
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Gujarati:
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Gurmukhi:
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Hangul:
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case HangulConsonant:
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Hebrew:
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Hiragana:
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case HiraganaIroha:
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Kannada:
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Katakana:
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case KatakanaIroha:
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Khmer:
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Lao:
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerAlpha:
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerArmenian:
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerGreek:
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerHexadecimal:
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerLatin:
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerNorwegian:
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case LowerRoman:
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Malayalam:
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Mongolian:
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Myanmar:
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Octal:
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Oriya:
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Oromo:
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Persian:
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Sidama:
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Somali:
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Telugu:
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Thai:
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Tibetan:
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Tigre:
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case TigrinyaEr:
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case TigrinyaErAbegede:
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case TigrinyaEt:
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case TigrinyaEtAbegede:
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperAlpha:
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperArmenian:
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperGreek:
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperHexadecimal:
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperLatin:
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperNorwegian:
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case UpperRoman:
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Urdu:
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Asterisks:
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Footnotes:
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        break;
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_renderListMarker.text().isEmpty())
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const Font& font = m_renderListMarker.style()->font();
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TextRun textRun = constructTextRun(&m_renderListMarker, font, m_renderListMarker.text(), m_renderListMarker.style());
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    GraphicsContextStateSaver stateSaver(*context, false);
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_renderListMarker.style()->isHorizontalWritingMode()) {
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        marker.moveBy(roundedIntPoint(-boxOrigin));
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        marker = marker.transposedRect();
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        marker.moveBy(IntPoint(roundToInt(box.x()), roundToInt(box.y() - m_renderListMarker.logicalHeight())));
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        stateSaver.save();
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->translate(marker.x(), marker.maxY());
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->rotate(static_cast<float>(deg2rad(90.)));
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->translate(-marker.x(), -marker.maxY());
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TextRunPaintInfo textRunPaintInfo(textRun);
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    textRunPaintInfo.bounds = marker;
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IntPoint textOrigin = IntPoint(marker.x(), marker.y() + m_renderListMarker.style()->fontMetrics().ascent());
1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (type == Asterisks || type == Footnotes) {
1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        context->drawText(font, textRunPaintInfo, textOrigin);
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    } else {
1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Text is not arbitrary. We can judge whether it's RTL from the first character,
1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // and we only need to handle the direction RightToLeft for now.
1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        bool textNeedsReversing = WTF::Unicode::direction(m_renderListMarker.text()[0]) == WTF::Unicode::RightToLeft;
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        StringBuilder reversedText;
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (textNeedsReversing) {
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            int length = m_renderListMarker.text().length();
1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            reversedText.reserveCapacity(length);
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            for (int i = length - 1; i >= 0; --i)
1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                reversedText.append(m_renderListMarker.text()[i]);
1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            ASSERT(reversedText.length() == reversedText.capacity());
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            textRun.setText(reversedText.toString());
1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const UChar suffix = m_renderListMarker.listMarkerSuffix(type, m_renderListMarker.listItem()->value());
1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        UChar suffixStr[2] = {
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_renderListMarker.style()->isLeftToRightDirection() ? suffix : ' ',
1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_renderListMarker.style()->isLeftToRightDirection() ? ' ' : suffix
1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        };
2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        TextRun suffixRun = constructTextRun(&m_renderListMarker, font, suffixStr, 2, m_renderListMarker.style(), m_renderListMarker.style()->direction());
2017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        TextRunPaintInfo suffixRunInfo(suffixRun);
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        suffixRunInfo.bounds = marker;
2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_renderListMarker.style()->isLeftToRightDirection()) {
2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            context->drawText(font, textRunPaintInfo, textOrigin);
2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            context->drawText(font, suffixRunInfo, textOrigin + IntSize(font.width(textRun), 0));
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else {
2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            context->drawText(font, suffixRunInfo, textOrigin);
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            context->drawText(font, textRunPaintInfo, textOrigin + IntSize(font.width(suffixRun), 0));
2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
215