Chromium Code Reviews| Index: Source/core/rendering/svg/SVGInlineTextBox.cpp |
| diff --git a/Source/core/rendering/svg/SVGInlineTextBox.cpp b/Source/core/rendering/svg/SVGInlineTextBox.cpp |
| index b0b0162459732df92253171b9e3deedd9f88bb81..a672ed8a26e57efdf50e1a225badb75b820d9984 100644 |
| --- a/Source/core/rendering/svg/SVGInlineTextBox.cpp |
| +++ b/Source/core/rendering/svg/SVGInlineTextBox.cpp |
| @@ -48,7 +48,6 @@ namespace blink { |
| struct ExpectedSVGInlineTextBoxSize : public InlineTextBox { |
| float float1; |
| uint32_t bitfields : 1; |
| - void* pointer; |
| Vector<SVGTextFragment> vector; |
| }; |
| @@ -58,7 +57,6 @@ SVGInlineTextBox::SVGInlineTextBox(RenderObject& object) |
| : InlineTextBox(object) |
| , m_logicalHeight(0) |
| , m_startsNewTextChunk(false) |
| - , m_paintingResource(0) |
| { |
| } |
| @@ -221,7 +219,6 @@ void SVGInlineTextBox::paintSelectionBackground(PaintInfo& paintInfo) |
| unsigned textFragmentsSize = m_textFragments.size(); |
| for (unsigned i = 0; i < textFragmentsSize; ++i) { |
| SVGTextFragment& fragment = m_textFragments.at(i); |
| - ASSERT(!m_paintingResource); |
| fragmentStartPosition = startPosition; |
| fragmentEndPosition = endPosition; |
| @@ -236,8 +233,6 @@ void SVGInlineTextBox::paintSelectionBackground(PaintInfo& paintInfo) |
| paintInfo.context->setFillColor(backgroundColor); |
| paintInfo.context->fillRect(selectionRectForTextFragment(fragment, fragmentStartPosition, fragmentEndPosition, style), backgroundColor); |
| } |
| - |
| - ASSERT(!m_paintingResource); |
| } |
| void SVGInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit, LayoutUnit) |
| @@ -297,7 +292,6 @@ void SVGInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffse |
| unsigned textFragmentsSize = m_textFragments.size(); |
| for (unsigned i = 0; i < textFragmentsSize; ++i) { |
| SVGTextFragment& fragment = m_textFragments.at(i); |
| - ASSERT(!m_paintingResource); |
| GraphicsContextStateSaver stateSaver(*paintInfo.context, false); |
| fragment.buildFragmentTransform(fragmentTransform); |
| @@ -346,24 +340,40 @@ void SVGInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffse |
| // finally, paint the outline if any |
| if (style->hasOutline() && parentRenderer.isRenderInline()) |
| toRenderInline(parentRenderer).paintOutline(paintInfo, paintOffset); |
| - |
| - ASSERT(!m_paintingResource); |
| } |
| -bool SVGInlineTextBox::acquirePaintingResource(GraphicsContext*& context, float scalingFactor, |
| - RenderObject* renderer, RenderStyle* style, RenderSVGResourceModeFlags resourceMode) |
| +class PaintingResourceScope { |
| +public: |
| + PaintingResourceScope(RenderObject& renderer, TextRun::RenderingContext* renderingContext = 0) |
|
f(malita)
2014/09/12 13:40:56
We could try to go full RAII with this class: acqu
|
| + : m_renderer(renderer) |
| + , m_renderingContext(renderingContext) |
| + , m_paintingResource(0) |
| + { |
| + } |
| + ~PaintingResourceScope() { ASSERT(!m_paintingResource); } |
| + |
| + bool acquirePaintingResource(GraphicsContext*&, float scalingFactor, RenderStyle*, RenderSVGResourceModeFlags); |
| + void releasePaintingResource(GraphicsContext*&, const Path*, RenderSVGResourceModeFlags); |
| + |
| +private: |
| + RenderObject& m_renderer; |
| + TextRun::RenderingContext* m_renderingContext; |
| + RenderSVGResource* m_paintingResource; |
| +}; |
| + |
| +bool PaintingResourceScope::acquirePaintingResource(GraphicsContext*& context, float scalingFactor, |
| + RenderStyle* style, RenderSVGResourceModeFlags resourceMode) |
| { |
| // Callers must save the context state before calling when scalingFactor is not 1. |
| ASSERT(scalingFactor); |
| - ASSERT(renderer); |
| ASSERT(style); |
| ASSERT(resourceMode != ApplyToDefaultMode); |
| bool hasFallback = false; |
| if (resourceMode & ApplyToFillMode) |
| - m_paintingResource = RenderSVGResource::fillPaintingResource(renderer, style, hasFallback); |
| + m_paintingResource = RenderSVGResource::fillPaintingResource(&m_renderer, style, hasFallback); |
| else if (resourceMode & ApplyToStrokeMode) |
| - m_paintingResource = RenderSVGResource::strokePaintingResource(renderer, style, hasFallback); |
| + m_paintingResource = RenderSVGResource::strokePaintingResource(&m_renderer, style, hasFallback); |
| else { |
| // We're either called for stroking or filling. |
| ASSERT_NOT_REACHED(); |
| @@ -372,54 +382,36 @@ bool SVGInlineTextBox::acquirePaintingResource(GraphicsContext*& context, float |
| if (!m_paintingResource) |
| return false; |
| - if (!m_paintingResource->applyResource(renderer, style, context, resourceMode)) { |
| + if (!m_paintingResource->applyResource(&m_renderer, style, context, resourceMode)) { |
| if (hasFallback) { |
| m_paintingResource = RenderSVGResource::sharedSolidPaintingResource(); |
| - m_paintingResource->applyResource(renderer, style, context, resourceMode); |
| + m_paintingResource->applyResource(&m_renderer, style, context, resourceMode); |
| } |
| } |
| if (scalingFactor != 1 && resourceMode & ApplyToStrokeMode) |
| context->setStrokeThickness(context->strokeThickness() * scalingFactor); |
| - return true; |
| -} |
| - |
| -void SVGInlineTextBox::releasePaintingResource(GraphicsContext*& context, const Path* path, |
| - RenderSVGResourceModeFlags resourceMode) |
| -{ |
| - ASSERT(m_paintingResource); |
| - |
| - m_paintingResource->postApplyResource(&parent()->renderer(), context, resourceMode, path, 0); |
| - m_paintingResource = 0; |
| -} |
| - |
| -bool SVGInlineTextBox::prepareGraphicsContextForTextPainting(GraphicsContext*& context, |
| - float scalingFactor, TextRun& textRun, RenderStyle* style, RenderSVGResourceModeFlags resourceMode) |
| -{ |
| - bool acquiredResource = acquirePaintingResource(context, scalingFactor, &parent()->renderer(), style, resourceMode); |
| - if (!acquiredResource) |
| - return false; |
| - |
| #if ENABLE(SVG_FONTS) |
| // SVG Fonts need access to the painting resource used to draw the current text chunk. |
| - TextRun::RenderingContext* renderingContext = textRun.renderingContext(); |
| - if (renderingContext) |
| - static_cast<SVGTextRunRenderingContext*>(renderingContext)->setActivePaintingResource(m_paintingResource); |
| + if (m_renderingContext) |
| + static_cast<SVGTextRunRenderingContext*>(m_renderingContext)->setActivePaintingResource(m_paintingResource); |
| #endif |
| return true; |
| } |
| -void SVGInlineTextBox::restoreGraphicsContextAfterTextPainting(GraphicsContext*& context, |
| - TextRun& textRun, RenderSVGResourceModeFlags resourceMode) |
| +void PaintingResourceScope::releasePaintingResource(GraphicsContext*& context, const Path* path, |
| + RenderSVGResourceModeFlags resourceMode) |
| { |
| - releasePaintingResource(context, 0, resourceMode); |
| + ASSERT(m_paintingResource); |
| + |
| + m_paintingResource->postApplyResource(&m_renderer, context, resourceMode, path, 0); |
| + m_paintingResource = 0; |
| #if ENABLE(SVG_FONTS) |
| - TextRun::RenderingContext* renderingContext = textRun.renderingContext(); |
| - if (renderingContext) |
| - static_cast<SVGTextRunRenderingContext*>(renderingContext)->setActivePaintingResource(0); |
| + if (m_renderingContext) |
| + static_cast<SVGTextRunRenderingContext*>(m_renderingContext)->setActivePaintingResource(0); |
| #endif |
| } |
| @@ -562,7 +554,6 @@ void SVGInlineTextBox::paintDecoration(GraphicsContext* context, TextDecoration |
| void SVGInlineTextBox::paintDecorationWithStyle(GraphicsContext* context, TextDecoration decoration, |
| const SVGTextFragment& fragment, RenderObject* decorationRenderer, RenderSVGResourceModeFlags resourceMode) |
| { |
| - ASSERT(!m_paintingResource); |
| ASSERT(resourceMode != ApplyToDefaultMode); |
| RenderStyle* decorationStyle = decorationRenderer->style(); |
| @@ -598,8 +589,9 @@ void SVGInlineTextBox::paintDecorationWithStyle(GraphicsContext* context, TextDe |
| // acquirePaintingResource also modifies state if the scalingFactor is non-identity. |
| // Above we have saved the state for this case. |
| - if (acquirePaintingResource(context, scalingFactor, decorationRenderer, decorationStyle, resourceMode)) |
| - releasePaintingResource(context, &path, resourceMode); |
| + PaintingResourceScope resourceScope(*decorationRenderer); |
| + if (resourceScope.acquirePaintingResource(context, scalingFactor, decorationStyle, resourceMode)) |
| + resourceScope.releasePaintingResource(context, &path, resourceMode); |
| } |
| void SVGInlineTextBox::paintTextWithShadows(GraphicsContext* context, RenderStyle* style, |
| @@ -630,7 +622,8 @@ void SVGInlineTextBox::paintTextWithShadows(GraphicsContext* context, RenderStyl |
| if (hasShadow) |
| context->setDrawLooper(shadowList->createDrawLooper(DrawLooperBuilder::ShadowRespectsAlpha)); |
| - if (prepareGraphicsContextForTextPainting(context, scalingFactor, textRun, style, resourceMode)) { |
| + PaintingResourceScope resourceScope(parent()->renderer(), textRun.renderingContext()); |
| + if (resourceScope.acquirePaintingResource(context, scalingFactor, style, resourceMode)) { |
| TextRunPaintInfo textRunPaintInfo(textRun); |
| textRunPaintInfo.from = startPosition; |
| textRunPaintInfo.to = endPosition; |
| @@ -640,7 +633,7 @@ void SVGInlineTextBox::paintTextWithShadows(GraphicsContext* context, RenderStyl |
| textSize.width(), textSize.height()); |
| scaledFont.drawText(context, textRunPaintInfo, textOrigin); |
| - restoreGraphicsContextAfterTextPainting(context, textRun, resourceMode); |
| + resourceScope.releasePaintingResource(context, 0, resourceMode); |
| } |
| if (scalingFactor != 1) |