Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / rendering / svg / RenderSVGResourceContainer.h
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 #pragma once
21
22 #include "RenderSVGHiddenContainer.h"
23 #include "RenderSVGResource.h"
24
25 namespace WebCore {
26
27 class RenderLayer;
28
29 class RenderSVGResourceContainer : public RenderSVGHiddenContainer,
30                                    public RenderSVGResource {
31 public:
32     virtual ~RenderSVGResourceContainer();
33
34     void layout() override;
35     void styleDidChange(StyleDifference, const RenderStyle* oldStyle) final;
36
37     bool isSVGResourceContainer() const final { return true; }
38
39     static bool shouldTransformOnTextPainting(const RenderElement&, AffineTransform&);
40     static AffineTransform transformOnNonScalingStroke(RenderObject*, const AffineTransform& resourceTransform);
41
42     void idChanged();
43     void addClientRenderLayer(RenderLayer*);
44     void removeClientRenderLayer(RenderLayer*);
45
46 protected:
47     RenderSVGResourceContainer(SVGElement&, RenderStyle&&);
48
49     enum InvalidationMode {
50         LayoutAndBoundariesInvalidation,
51         BoundariesInvalidation,
52         RepaintInvalidation,
53         ParentOnlyInvalidation
54     };
55
56     // Used from the invalidateClient/invalidateClients methods from classes, inheriting from us.
57     virtual bool selfNeedsClientInvalidation() const { return everHadLayout() && selfNeedsLayout(); }
58
59     void markAllClientsForInvalidation(InvalidationMode);
60     void markAllClientLayersForInvalidation();
61     void markClientForInvalidation(RenderObject&, InvalidationMode);
62
63 private:
64     friend class SVGResourcesCache;
65     void addClient(RenderElement&);
66     void removeClient(RenderElement&);
67
68     void willBeDestroyed() 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
78 inline RenderSVGResourceContainer* getRenderSVGResourceContainerById(Document& document, const AtomicString& id)
79 {
80     if (id.isEmpty())
81         return nullptr;
82
83     if (RenderSVGResourceContainer* renderResource = document.accessSVGExtensions().resourceById(id))
84         return renderResource;
85
86     return nullptr;
87 }
88
89 template<typename Renderer>
90 Renderer* getRenderSVGResourceById(Document& document, const AtomicString& id)
91 {
92     // Using the RenderSVGResource type here avoids ambiguous casts for types that
93     // descend from both RenderObject and RenderSVGResourceContainer.
94     RenderSVGResource* container = getRenderSVGResourceContainerById(document, id);
95     if (is<Renderer>(container))
96         return downcast<Renderer>(container);
97
98     return nullptr;
99 }
100
101 } // namespace WebCore
102
103 SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderSVGResourceContainer, isSVGResourceContainer())