1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is free software; you can redistribute it and/or
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modify it under the terms of the GNU Library General Public
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * License as published by the Free Software Foundation; either
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * version 2 of the License, or (at your option) any later version.
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is distributed in the hope that it will be useful,
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Library General Public License for more details.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * You should have received a copy of the GNU Library General Public License
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * along with this library; see the file COPYING.LIB.  If not, write to
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Boston, MA 02110-1301, USA.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef RenderSVGResourceMarker_h
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define RenderSVGResourceMarker_h
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(SVG)
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FloatRect.h"
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderObject.h"
2621939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "RenderSVGResourceContainer.h"
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SVGMarkerElement.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SVGStyledElement.h"
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/HashSet.h>
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass AffineTransform;
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3621939df44de1705786c545cd1bf519d47250322dBen Murdochclass RenderSVGResourceMarker : public RenderSVGResourceContainer {
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
3821939df44de1705786c545cd1bf519d47250322dBen Murdoch    RenderSVGResourceMarker(SVGMarkerElement*);
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual ~RenderSVGResourceMarker();
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual const char* renderName() const { return "RenderSVGResourceMarker"; }
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    virtual void removeAllClientsFromCache(bool markForInvalidation = true);
44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    virtual void removeClientFromCache(RenderObject*, bool markForInvalidation = true);
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void draw(PaintInfo&, const AffineTransform&);
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Calculates marker boundaries, mapped to the target element's coordinate space
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    FloatRect markerBoundaries(const AffineTransform& markerTransformation) const;
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void applyViewportClip(PaintInfo&);
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void layout();
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void calcViewport();
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual const AffineTransform& localToParentTransform() const;
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AffineTransform markerTransformation(const FloatPoint& origin, float angle, float strokeWidth) const;
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5821939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual bool applyResource(RenderObject*, RenderStyle*, GraphicsContext*&, unsigned short) { return false; }
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual FloatRect resourceBoundingBox(RenderObject*) { return FloatRect(); }
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    FloatPoint referencePoint() const;
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    float angle() const;
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SVGMarkerElement::SVGMarkerUnitsType markerUnits() const { return static_cast<SVGMarkerElement::SVGMarkerUnitsType>(static_cast<SVGMarkerElement*>(node())->markerUnits()); }
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual RenderSVGResourceType resourceType() const { return s_resourceType; }
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static RenderSVGResourceType s_resourceType;
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate:
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Generates a transformation matrix usable to render marker content. Handles scaling the marker content
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // acording to SVGs markerUnits="strokeWidth" concept, when a strokeWidth value != -1 is passed in.
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AffineTransform markerContentTransformation(const AffineTransform& contentTransformation, const FloatPoint& origin, float strokeWidth = -1) const;
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AffineTransform viewportTransform() const;
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    mutable AffineTransform m_localToParentTransform;
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    FloatRect m_viewport;
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
83