1/*
2    Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3                  2004, 2005 Rob Buis <buis@kde.org>
4                  2005 Eric Seidel <eric@webkit.org>
5                  2006 Apple Computer, Inc
6                  2009 Google, Inc.
7
8    This library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Library General Public
10    License as published by the Free Software Foundation; either
11    version 2 of the License, or (at your option) any later version.
12
13    This library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Library General Public License for more details.
17
18    You should have received a copy of the GNU Library General Public License
19    aint with this library; see the file COPYING.LIB.  If not, write to
20    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21    Boston, MA 02110-1301, USA.
22*/
23
24#ifndef RenderPath_h
25#define RenderPath_h
26
27#if ENABLE(SVG)
28#include "AffineTransform.h"
29#include "FloatRect.h"
30#include "RenderSVGModelObject.h"
31#include "SVGMarkerLayoutInfo.h"
32
33namespace WebCore {
34
35class FloatPoint;
36class RenderSVGContainer;
37class SVGStyledTransformableElement;
38
39class RenderPath : public RenderSVGModelObject {
40public:
41    RenderPath(SVGStyledTransformableElement*);
42
43    const Path& path() const { return m_path; }
44
45private:
46    // Hit-detection seperated for the fill and the stroke
47    bool fillContains(const FloatPoint&, bool requiresFill = true) const;
48    bool strokeContains(const FloatPoint&, bool requiresStroke = true) const;
49
50    virtual FloatRect objectBoundingBox() const;
51    virtual FloatRect strokeBoundingBox() const;
52    virtual FloatRect markerBoundingBox() const;
53    virtual FloatRect repaintRectInLocalCoordinates() const;
54
55    virtual const AffineTransform& localToParentTransform() const;
56
57    void setPath(const Path&);
58
59    virtual bool isRenderPath() const { return true; }
60    virtual const char* renderName() const { return "RenderPath"; }
61
62    virtual void layout();
63    virtual void paint(PaintInfo&, int parentX, int parentY);
64    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
65
66    virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
67
68    void calculateMarkerBoundsIfNeeded() const;
69
70private:
71    virtual AffineTransform localTransform() const;
72
73    mutable Path m_path;
74    mutable FloatRect m_cachedLocalFillBBox;
75    mutable FloatRect m_cachedLocalStrokeBBox;
76    mutable FloatRect m_cachedLocalRepaintRect;
77    mutable FloatRect m_cachedLocalMarkerBBox;
78    mutable SVGMarkerLayoutInfo m_markerLayoutInfo;
79    AffineTransform m_localTransform;
80};
81
82inline RenderPath* toRenderPath(RenderObject* object)
83{
84    ASSERT(!object || object->isRenderPath());
85    return static_cast<RenderPath*>(object);
86}
87
88inline const RenderPath* toRenderPath(const RenderObject* object)
89{
90    ASSERT(!object || object->isRenderPath());
91    return static_cast<const RenderPath*>(object);
92}
93
94// This will catch anyone doing an unnecessary cast.
95void toRenderPath(const RenderPath*);
96
97}
98
99#endif // ENABLE(SVG)
100#endif
101