Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "config.h" | |
| 6 #include "core/paint/SVGContainerPainter.h" | |
| 7 | |
| 8 #include "core/frame/Settings.h" | |
| 9 #include "core/paint/ObjectPainter.h" | |
| 10 #include "core/rendering/GraphicsContextAnnotator.h" | |
| 11 #include "core/rendering/PaintInfo.h" | |
| 12 #include "core/rendering/svg/RenderSVGContainer.h" | |
| 13 #include "core/rendering/svg/RenderSVGViewportContainer.h" | |
| 14 #include "core/rendering/svg/SVGRenderSupport.h" | |
| 15 #include "core/rendering/svg/SVGRenderingContext.h" | |
| 16 #include "core/svg/SVGSVGElement.h" | |
| 17 #include "platform/graphics/GraphicsContextCullSaver.h" | |
| 18 #include "platform/graphics/GraphicsContextStateSaver.h" | |
| 19 | |
| 20 namespace blink { | |
| 21 | |
| 22 void SVGContainerPainter::paint(PaintInfo& paintInfo) | |
| 23 { | |
| 24 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderSVGContainer); | |
| 25 | |
| 26 // Spec: groups w/o children still may render filter content. | |
| 27 if (!m_renderSVGContainer.firstChild() && !m_renderSVGContainer.selfWillPain t()) | |
| 28 return; | |
| 29 | |
| 30 FloatRect paintInvalidationRect = m_renderSVGContainer.paintInvalidationRect InLocalCoordinates(); | |
| 31 if (!SVGRenderSupport::paintInfoIntersectsPaintInvalidationRect(paintInvalid ationRect, m_renderSVGContainer.localToParentTransform(), paintInfo)) | |
| 32 return; | |
| 33 | |
| 34 // Spec: An empty viewBox on the <svg> element disables rendering. | |
| 35 ASSERT(m_renderSVGContainer.element()); | |
| 36 if (isSVGSVGElement(*m_renderSVGContainer.element()) && toSVGSVGElement(*m_r enderSVGContainer.element()).hasEmptyViewBox()) | |
|
chrishtr
2014/10/08 21:56:38
Are you sure adding this here rather than the subc
pdr.
2014/10/08 23:12:28
SVGSVGElement can create one of two kinds of rende
| |
| 37 return; | |
| 38 | |
| 39 PaintInfo childPaintInfo(paintInfo); | |
| 40 { | |
| 41 GraphicsContextStateSaver stateSaver(*childPaintInfo.context); | |
| 42 | |
| 43 if (m_renderSVGContainer.isSVGViewportContainer() && SVGRenderSupport::i sOverflowHidden(&m_renderSVGContainer)) | |
|
chrishtr
2014/10/08 21:56:38
Same question here.
pdr.
2014/10/08 23:12:28
This one is a little more contentious and fmalita
chrishtr
2014/10/08 23:23:16
Ah I didn't see the isSVGViewportContainer() in th
| |
| 44 paintInfo.context->clip(toRenderSVGViewportContainer(m_renderSVGCont ainer).viewport()); | |
| 45 | |
| 46 childPaintInfo.applyTransform(m_renderSVGContainer.localToParentTransfor m()); | |
| 47 | |
| 48 SVGRenderingContext renderingContext; | |
| 49 GraphicsContextCullSaver cullSaver(*childPaintInfo.context); | |
| 50 bool continueRendering = true; | |
| 51 if (childPaintInfo.phase == PaintPhaseForeground) { | |
| 52 renderingContext.prepareToRenderSVGContent(&m_renderSVGContainer, ch ildPaintInfo); | |
| 53 continueRendering = renderingContext.isRenderingPrepared(); | |
| 54 | |
| 55 if (continueRendering && m_renderSVGContainer.document().settings()- >containerCullingEnabled()) | |
| 56 cullSaver.cull(paintInvalidationRect); | |
| 57 } | |
| 58 | |
| 59 if (continueRendering) { | |
| 60 childPaintInfo.updatePaintingRootForChildren(&m_renderSVGContainer); | |
| 61 for (RenderObject* child = m_renderSVGContainer.firstChild(); child; child = child->nextSibling()) | |
| 62 child->paint(childPaintInfo, IntPoint()); | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 // FIXME: This really should be drawn from local coordinates, but currently we hack it | |
| 67 // to avoid our clip killing our outline rect. Thus we translate our | |
| 68 // outline rect into parent coords before drawing. | |
| 69 // FIXME: This means our focus ring won't share our rotation like it should. | |
| 70 // We should instead disable our clip during PaintPhaseOutline | |
| 71 if (paintInfo.phase == PaintPhaseForeground && m_renderSVGContainer.style()- >outlineWidth() && m_renderSVGContainer.style()->visibility() == VISIBLE) { | |
| 72 IntRect paintRectInParent = enclosingIntRect(m_renderSVGContainer.localT oParentTransform().mapRect(paintInvalidationRect)); | |
| 73 ObjectPainter(m_renderSVGContainer).paintOutline(paintInfo, paintRectInP arent); | |
| 74 } | |
| 75 } | |
| 76 | |
| 77 } // namespace blink | |
| OLD | NEW |