Commit f53b40a6 authored by pdr@chromium.org's avatar pdr@chromium.org

Factor SVGMarkerPainter into SVGShapePainter

SVGShapePainter is the only class to paint markers so the marker painter
class is all overhead. This patch moves the marker painter code into
SVGShapePainter.

BUG=412088

Review URL: https://codereview.chromium.org/693313003

git-svn-id: svn://svn.chromium.org/blink/trunk@184895 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 47f3934d
......@@ -1561,8 +1561,6 @@
'paint/SVGInlineFlowBoxPainter.h',
'paint/SVGInlineTextBoxPainter.cpp',
'paint/SVGInlineTextBoxPainter.h',
'paint/SVGMarkerPainter.cpp',
'paint/SVGMarkerPainter.h',
'paint/SVGRootInlineBoxPainter.cpp',
'paint/SVGRootInlineBoxPainter.h',
'paint/SVGRootPainter.cpp',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/paint/SVGMarkerPainter.h"
#include "core/paint/SVGContainerPainter.h"
#include "core/rendering/PaintInfo.h"
#include "core/rendering/svg/RenderSVGResourceMarker.h"
#include "core/rendering/svg/SVGMarkerData.h"
#include "core/rendering/svg/SVGRenderSupport.h"
#include "platform/graphics/GraphicsContextStateSaver.h"
namespace blink {
void SVGMarkerPainter::paint(PaintInfo& paintInfo, const MarkerPosition& position, float strokeWidth)
{
// An empty viewBox disables rendering.
SVGMarkerElement* marker = toSVGMarkerElement(m_renderSVGMarker.element());
ASSERT(marker);
if (marker->hasAttribute(SVGNames::viewBoxAttr) && marker->viewBox()->currentValue()->isValid() && marker->viewBox()->currentValue()->value().isEmpty())
return;
PaintInfo info(paintInfo);
GraphicsContextStateSaver stateSaver(*info.context, false);
info.applyTransform(m_renderSVGMarker.markerTransformation(position.origin, position.angle, strokeWidth), &stateSaver);
if (SVGRenderSupport::isOverflowHidden(&m_renderSVGMarker)) {
stateSaver.saveIfNeeded();
info.context->clip(m_renderSVGMarker.viewport());
}
SVGContainerPainter(m_renderSVGMarker).paint(info);
}
} // namespace blink
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SVGMarkerPainter_h
#define SVGMarkerPainter_h
namespace blink {
struct PaintInfo;
struct MarkerPosition;
class RenderSVGResourceMarker;
class SVGMarkerPainter {
public:
SVGMarkerPainter(RenderSVGResourceMarker& renderSVGMarker) : m_renderSVGMarker(renderSVGMarker) { }
void paint(PaintInfo&, const MarkerPosition&, float);
private:
RenderSVGResourceMarker& m_renderSVGMarker;
};
} // namespace blink
#endif // SVGMarkerPainter_h
......@@ -6,10 +6,11 @@
#include "core/paint/SVGShapePainter.h"
#include "core/paint/ObjectPainter.h"
#include "core/paint/SVGMarkerPainter.h"
#include "core/paint/SVGContainerPainter.h"
#include "core/rendering/GraphicsContextAnnotator.h"
#include "core/rendering/PaintInfo.h"
#include "core/rendering/svg/RenderSVGPath.h"
#include "core/rendering/svg/RenderSVGResourceMarker.h"
#include "core/rendering/svg/RenderSVGShape.h"
#include "core/rendering/svg/SVGMarkerData.h"
#include "core/rendering/svg/SVGRenderSupport.h"
......@@ -162,10 +163,30 @@ void SVGShapePainter::paintMarkers(PaintInfo& paintInfo)
unsigned size = markerPositions->size();
for (unsigned i = 0; i < size; ++i) {
if (RenderSVGResourceMarker* marker = SVGMarkerData::markerForType((*markerPositions)[i].type, markerStart, markerMid, markerEnd))
SVGMarkerPainter(*marker).paint(paintInfo, (*markerPositions)[i], strokeWidth);
paintMarker(paintInfo, *marker, (*markerPositions)[i], strokeWidth);
}
}
void SVGShapePainter::paintMarker(PaintInfo& paintInfo, RenderSVGResourceMarker& marker, const MarkerPosition& position, float strokeWidth)
{
// An empty viewBox disables rendering.
SVGMarkerElement* markerElement = toSVGMarkerElement(marker.element());
ASSERT(markerElement);
if (markerElement->hasAttribute(SVGNames::viewBoxAttr) && markerElement->viewBox()->currentValue()->isValid() && markerElement->viewBox()->currentValue()->value().isEmpty())
return;
PaintInfo info(paintInfo);
GraphicsContextStateSaver stateSaver(*info.context, false);
info.applyTransform(marker.markerTransformation(position.origin, position.angle, strokeWidth), &stateSaver);
if (SVGRenderSupport::isOverflowHidden(&marker)) {
stateSaver.saveIfNeeded();
info.context->clip(marker.viewport());
}
SVGContainerPainter(marker).paint(info);
}
void SVGShapePainter::strokeZeroLengthLineCaps(GraphicsContext* context)
{
const Vector<FloatPoint>* zeroLengthLineCaps = m_renderSVGShape.zeroLengthLineCaps();
......
......@@ -7,10 +7,12 @@
namespace blink {
struct MarkerPosition;
struct PaintInfo;
class FloatPoint;
class GraphicsContext;
class Path;
class RenderSVGResourceMarker;
class RenderSVGShape;
class SVGShapePainter {
......@@ -24,6 +26,7 @@ private:
void strokeShape(GraphicsContext*);
void paintMarkers(PaintInfo&);
void paintMarker(PaintInfo&, RenderSVGResourceMarker&, const MarkerPosition&, float);
void strokeZeroLengthLineCaps(GraphicsContext*);
Path* zeroLengthLinecapPath(const FloatPoint&) const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment