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