StyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const { StyleDifference styleDifference; if (diffNeedsLayoutAndPaintInvalidation(other)) { styleDifference.setNeedsFullLayout(); styleDifference.setNeedsPaintInvalidationObject(); } else if (diffNeedsPaintInvalidation(other)) { styleDifference.setNeedsPaintInvalidationObject(); } return styleDifference; }
void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, const ComputedStyle& style, const ComputedStyle& selectionStyle, const SVGTextFragment& fragment, LayoutSVGResourceMode resourceMode, bool shouldPaintSelection) { int startPosition = 0; int endPosition = 0; if (shouldPaintSelection) { m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); shouldPaintSelection = m_svgInlineTextBox.mapStartEndPositionsIntoFragmentCoordinates(fragment, startPosition, endPosition); } // Fast path if there is no selection, just draw the whole chunk part using the regular style TextRun textRun = m_svgInlineTextBox.constructTextRun(style, fragment); if (!shouldPaintSelection || startPosition >= endPosition) { paintTextWithShadows(paintInfo, style, textRun, fragment, 0, fragment.length, resourceMode); return; } // Eventually draw text using regular style until the start position of the selection bool paintSelectedTextOnly = paintInfo.phase == PaintPhaseSelection; if (startPosition > 0 && !paintSelectedTextOnly) paintTextWithShadows(paintInfo, style, textRun, fragment, 0, startPosition, resourceMode); // Draw text using selection style from the start to the end position of the selection if (style != selectionStyle) { StyleDifference diff; diff.setNeedsPaintInvalidationObject(); SVGResourcesCache::clientStyleChanged(&m_svgInlineTextBox.parent()->layoutObject(), diff, selectionStyle); } paintTextWithShadows(paintInfo, selectionStyle, textRun, fragment, startPosition, endPosition, resourceMode); if (style != selectionStyle) { StyleDifference diff; diff.setNeedsPaintInvalidationObject(); SVGResourcesCache::clientStyleChanged(&m_svgInlineTextBox.parent()->layoutObject(), diff, style); } // Eventually draw text using regular style from the end position of the selection to the end of the current chunk part if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnly) paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, fragment.length, resourceMode); }