Modified: trunk/Source/WebCore/rendering/TextPainter.cpp (173501 => 173502)
--- trunk/Source/WebCore/rendering/TextPainter.cpp 2014-09-11 00:47:26 UTC (rev 173501)
+++ trunk/Source/WebCore/rendering/TextPainter.cpp 2014-09-11 00:50:09 UTC (rev 173502)
@@ -27,6 +27,7 @@
#include "InlineTextBox.h"
#include "RenderCombineText.h"
#include "TextPaintStyle.h"
+#include <wtf/NeverDestroyed.h>
namespace WebCore {
@@ -34,20 +35,24 @@
int startPositionInTextRun, int endPositionInTextBoxString, int length, const AtomicString& emphasisMark, RenderCombineText* combinedText, TextRun& textRun,
FloatRect& boxRect, FloatPoint& textOrigin, int emphasisMarkOffset, const ShadowData* textShadow, const ShadowData* selectionShadow,
bool textBoxIsHorizontal, TextPaintStyle& textPaintStyle, TextPaintStyle& selectionPaintStyle)
- : m_paintSelectedTextOnly(paintSelectedTextOnly)
- , m_paintSelectedTextSeparately(paintSelectedTextSeparately)
- , m_font(font)
- , m_startPositionInTextRun(startPositionInTextRun)
- , m_endPositionInTextRun(endPositionInTextBoxString)
- , m_length(length)
- , m_emphasisMark(emphasisMark)
- , m_combinedText(combinedText)
- , m_textRun(textRun)
- , m_boxRect(boxRect)
- , m_textOrigin(textOrigin)
- , m_emphasisMarkOffset(emphasisMarkOffset)
- , m_textBoxIsHorizontal(textBoxIsHorizontal)
- , m_savedDrawingStateForMask(&context, &textPaintStyle, &selectionPaintStyle, textShadow, selectionShadow)
+ : m_context(context)
+ , m_textPaintStyle(textPaintStyle)
+ , m_selectionPaintStyle(selectionPaintStyle)
+ , m_textShadow(textShadow)
+ , m_selectionShadow(selectionShadow)
+ , m_paintSelectedTextOnly(paintSelectedTextOnly)
+ , m_paintSelectedTextSeparately(paintSelectedTextSeparately)
+ , m_font(font)
+ , m_startPositionInTextRun(startPositionInTextRun)
+ , m_endPositionInTextRun(endPositionInTextBoxString)
+ , m_length(length)
+ , m_emphasisMark(emphasisMark)
+ , m_combinedText(combinedText)
+ , m_textRun(textRun)
+ , m_boxRect(boxRect)
+ , m_textOrigin(textOrigin)
+ , m_emphasisMarkOffset(emphasisMarkOffset)
+ , m_textBoxIsHorizontal(textBoxIsHorizontal)
{
}
@@ -67,15 +72,15 @@
return shadow->location() == IntPoint() && !shadow->radius();
}
-static void paintTextWithShadows(GraphicsContext* context, const Font& font, const TextRun& textRun, const AtomicString& emphasisMark,
+static void paintTextWithShadows(GraphicsContext& context, const Font& font, const TextRun& textRun, const AtomicString& emphasisMark,
int emphasisMarkOffset, int startOffset, int endOffset, int truncationPoint, const FloatPoint& textOrigin, const FloatRect& boxRect,
const ShadowData* shadow, bool stroked, bool horizontal)
{
- Color fillColor = context->fillColor();
- ColorSpace fillColorSpace = context->fillColorSpace();
+ Color fillColor = context.fillColor();
+ ColorSpace fillColorSpace = context.fillColorSpace();
bool opaque = !fillColor.hasAlpha();
if (!opaque)
- context->setFillColor(Color::black, fillColorSpace);
+ context.setFillColor(Color::black, fillColorSpace);
do {
if (isEmptyShadow(shadow)) {
@@ -88,24 +93,24 @@
if (shadow)
extraOffset = roundedIntSize(InlineTextBox::applyShadowToGraphicsContext(context, shadow, boxRect, stroked, opaque, horizontal, didSaveContext));
else if (!opaque)
- context->setFillColor(fillColor, fillColorSpace);
+ context.setFillColor(fillColor, fillColorSpace);
if (startOffset <= endOffset)
- drawTextOrEmphasisMarks(*context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, endOffset);
+ drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, endOffset);
else {
if (endOffset > 0)
- drawTextOrEmphasisMarks(*context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, 0, endOffset);
+ drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, 0, endOffset);
if (startOffset < truncationPoint)
- drawTextOrEmphasisMarks(*context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, truncationPoint);
+ drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, truncationPoint);
}
if (!shadow)
break;
if (didSaveContext)
- context->restore();
+ context.restore();
else
- context->clearShadow();
+ context.clearShadow();
shadow = shadow->next();
} while (shadow || stroked || !opaque);
@@ -113,62 +118,59 @@
void TextPainter::paintText()
{
- ASSERT(m_savedDrawingStateForMask.m_textPaintStyle);
- ASSERT(m_savedDrawingStateForMask.m_selectionPaintStyle);
-
FloatPoint boxOrigin = m_boxRect.location();
if (!m_paintSelectedTextOnly) {
// For stroked painting, we have to change the text drawing mode. It's probably dangerous to leave that mutated as a side
// effect, so only when we know we're stroking, do a save/restore.
- GraphicsContextStateSaver stateSaver(*m_savedDrawingStateForMask.m_context, m_savedDrawingStateForMask.m_textPaintStyle->strokeWidth > 0);
+ GraphicsContextStateSaver stateSaver(m_context, m_textPaintStyle.strokeWidth > 0);
- updateGraphicsContext(*m_savedDrawingStateForMask.m_context, *m_savedDrawingStateForMask.m_textPaintStyle);
+ updateGraphicsContext(m_context, m_textPaintStyle);
if (!m_paintSelectedTextSeparately || m_endPositionInTextRun <= m_startPositionInTextRun) {
// FIXME: Truncate right-to-left text correctly.
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_font, m_textRun, nullAtom, 0, 0, m_length, m_length, m_textOrigin, m_boxRect, m_savedDrawingStateForMask.m_textShadow, m_savedDrawingStateForMask.m_textPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ paintTextWithShadows(m_context, m_font, m_textRun, nullAtom, 0, 0, m_length, m_length, m_textOrigin, m_boxRect, m_textShadow, m_textPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
} else
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_font, m_textRun, nullAtom, 0, m_endPositionInTextRun, m_startPositionInTextRun, m_length, m_textOrigin, m_boxRect, m_savedDrawingStateForMask.m_textShadow, m_savedDrawingStateForMask.m_textPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ paintTextWithShadows(m_context, m_font, m_textRun, nullAtom, 0, m_endPositionInTextRun, m_startPositionInTextRun, m_length, m_textOrigin, m_boxRect, m_textShadow, m_textPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
if (!m_emphasisMark.isEmpty()) {
- updateGraphicsContext(*m_savedDrawingStateForMask.m_context, *m_savedDrawingStateForMask.m_textPaintStyle, UseEmphasisMarkColor);
+ updateGraphicsContext(m_context, m_textPaintStyle, UseEmphasisMarkColor);
- DEPRECATED_DEFINE_STATIC_LOCAL(TextRun, objectReplacementCharacterTextRun, (&objectReplacementCharacter, 1));
- TextRun& emphasisMarkTextRun = m_combinedText ? objectReplacementCharacterTextRun : m_textRun;
+ static NeverDestroyed<TextRun> objectReplacementCharacterTextRun(&objectReplacementCharacter, 1);
+ TextRun& emphasisMarkTextRun = m_combinedText ? objectReplacementCharacterTextRun.get() : m_textRun;
FloatPoint emphasisMarkTextOrigin = m_combinedText ? FloatPoint(boxOrigin.x() + m_boxRect.width() / 2, boxOrigin.y() + m_font.fontMetrics().ascent()) : m_textOrigin;
if (m_combinedText)
- m_savedDrawingStateForMask.m_context->concatCTM(rotation(m_boxRect, Clockwise));
+ m_context.concatCTM(rotation(m_boxRect, Clockwise));
if (!m_paintSelectedTextSeparately || m_endPositionInTextRun <= m_startPositionInTextRun) {
// FIXME: Truncate right-to-left text correctly.
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, 0, m_length, m_length, emphasisMarkTextOrigin, m_boxRect, m_savedDrawingStateForMask.m_textShadow, m_savedDrawingStateForMask.m_textPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ paintTextWithShadows(m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, 0, m_length, m_length, emphasisMarkTextOrigin, m_boxRect, m_textShadow, m_textPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
} else
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, m_endPositionInTextRun, m_startPositionInTextRun, m_length, emphasisMarkTextOrigin, m_boxRect, m_savedDrawingStateForMask.m_textShadow, m_savedDrawingStateForMask.m_textPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ paintTextWithShadows(m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, m_endPositionInTextRun, m_startPositionInTextRun, m_length, emphasisMarkTextOrigin, m_boxRect, m_textShadow, m_textPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
if (m_combinedText)
- m_savedDrawingStateForMask.m_context->concatCTM(rotation(m_boxRect, Counterclockwise));
+ m_context.concatCTM(rotation(m_boxRect, Counterclockwise));
}
}
if ((m_paintSelectedTextOnly || m_paintSelectedTextSeparately) && m_startPositionInTextRun < m_endPositionInTextRun) {
// paint only the text that is selected
- GraphicsContextStateSaver stateSaver(*m_savedDrawingStateForMask.m_context, m_savedDrawingStateForMask.m_selectionPaintStyle->strokeWidth > 0);
+ GraphicsContextStateSaver stateSaver(m_context, m_selectionPaintStyle.strokeWidth > 0);
- updateGraphicsContext(*m_savedDrawingStateForMask.m_context, *m_savedDrawingStateForMask.m_selectionPaintStyle);
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_font, m_textRun, nullAtom, 0, m_startPositionInTextRun, m_endPositionInTextRun, m_length, m_textOrigin, m_boxRect, m_savedDrawingStateForMask.m_selectionShadow, m_savedDrawingStateForMask.m_selectionPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ updateGraphicsContext(m_context, m_selectionPaintStyle);
+ paintTextWithShadows(m_context, m_font, m_textRun, nullAtom, 0, m_startPositionInTextRun, m_endPositionInTextRun, m_length, m_textOrigin, m_boxRect, m_selectionShadow, m_selectionPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
if (!m_emphasisMark.isEmpty()) {
- updateGraphicsContext(*m_savedDrawingStateForMask.m_context, *m_savedDrawingStateForMask.m_selectionPaintStyle, UseEmphasisMarkColor);
+ updateGraphicsContext(m_context, m_selectionPaintStyle, UseEmphasisMarkColor);
DEPRECATED_DEFINE_STATIC_LOCAL(TextRun, objectReplacementCharacterTextRun, (&objectReplacementCharacter, 1));
TextRun& emphasisMarkTextRun = m_combinedText ? objectReplacementCharacterTextRun : m_textRun;
FloatPoint emphasisMarkTextOrigin = m_combinedText ? FloatPoint(boxOrigin.x() + m_boxRect.width() / 2, boxOrigin.y() + m_font.fontMetrics().ascent()) : m_textOrigin;
if (m_combinedText)
- m_savedDrawingStateForMask.m_context->concatCTM(rotation(m_boxRect, Clockwise));
+ m_context.concatCTM(rotation(m_boxRect, Clockwise));
- paintTextWithShadows(m_savedDrawingStateForMask.m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, m_startPositionInTextRun, m_endPositionInTextRun, m_length, emphasisMarkTextOrigin, m_boxRect, m_savedDrawingStateForMask.m_selectionShadow, m_savedDrawingStateForMask.m_selectionPaintStyle->strokeWidth > 0, m_textBoxIsHorizontal);
+ paintTextWithShadows(m_context, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, m_startPositionInTextRun, m_endPositionInTextRun, m_length, emphasisMarkTextOrigin, m_boxRect, m_selectionShadow, m_selectionPaintStyle.strokeWidth > 0, m_textBoxIsHorizontal);
if (m_combinedText)
- m_savedDrawingStateForMask.m_context->concatCTM(rotation(m_boxRect, Counterclockwise));
+ m_context.concatCTM(rotation(m_boxRect, Counterclockwise));
}
}
}