1/*
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#ifndef RenderSVGResourceContainer_h
21#define RenderSVGResourceContainer_h
22
23#include "RenderSVGHiddenContainer.h"
24#include "RenderSVGResource.h"
25
26namespace WebCore {
27
28class RenderLayer;
29
30class RenderSVGResourceContainer : public RenderSVGHiddenContainer,
31                                   public RenderSVGResource {
32public:
33    virtual ~RenderSVGResourceContainer();
34
35    virtual void layout() override;
36    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override final;
37
38    virtual bool isSVGResourceContainer() const override final { return true; }
39
40    static bool shouldTransformOnTextPainting(const RenderElement&, AffineTransform&);
41    static AffineTransform transformOnNonScalingStroke(RenderObject*, const AffineTransform& resourceTransform);
42
43    void idChanged();
44    void addClientRenderLayer(RenderLayer*);
45    void removeClientRenderLayer(RenderLayer*);
46
47protected:
48    RenderSVGResourceContainer(SVGElement&, PassRef<RenderStyle>);
49
50    enum InvalidationMode {
51        LayoutAndBoundariesInvalidation,
52        BoundariesInvalidation,
53        RepaintInvalidation,
54        ParentOnlyInvalidation
55    };
56
57    // Used from the invalidateClient/invalidateClients methods from classes, inheriting from us.
58    void markAllClientsForInvalidation(InvalidationMode);
59    void markAllClientLayersForInvalidation();
60    void markClientForInvalidation(RenderObject&, InvalidationMode);
61
62private:
63    friend class SVGResourcesCache;
64    void addClient(RenderElement&);
65    void removeClient(RenderElement&);
66
67private:
68    virtual void willBeDestroyed() override final;
69    void registerResource();
70
71    AtomicString m_id;
72    bool m_registered : 1;
73    bool m_isInvalidating : 1;
74    HashSet<RenderElement*> m_clients;
75    HashSet<RenderLayer*> m_clientLayers;
76};
77
78RENDER_OBJECT_TYPE_CASTS(RenderSVGResourceContainer, isSVGResourceContainer())
79
80inline RenderSVGResourceContainer* getRenderSVGResourceContainerById(Document& document, const AtomicString& id)
81{
82    if (id.isEmpty())
83        return 0;
84
85    if (RenderSVGResourceContainer* renderResource = document.accessSVGExtensions()->resourceById(id))
86        return renderResource;
87
88    return 0;
89}
90
91template<typename Renderer>
92Renderer* getRenderSVGResourceById(Document& document, const AtomicString& id)
93{
94    if (RenderSVGResourceContainer* container = getRenderSVGResourceContainerById(document, id))
95        return container->cast<Renderer>();
96
97    return 0;
98}
99
100}
101
102#endif
103