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 "core/rendering/svg/RenderSVGHiddenContainer.h"
24 #include "core/rendering/svg/RenderSVGResource.h"
25
26 namespace WebCore {
27
28 class RenderLayer;
29
30 class RenderSVGResourceContainer : public RenderSVGHiddenContainer,
31 public RenderSVGResource {
32 public:
33 explicit RenderSVGResourceContainer(SVGElement*);
34 virtual ~RenderSVGResourceContainer();
35
36 virtual void layout() OVERRIDE;
37 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE FINAL;
38
isSVGResourceContainer()39 virtual bool isSVGResourceContainer() const OVERRIDE FINAL { return true; }
40
41 static AffineTransform transformOnNonScalingStroke(RenderObject*, const AffineTransform& resourceTransform);
42
43 void idChanged();
44 void addClientRenderLayer(Node*);
45 void addClientRenderLayer(RenderLayer*);
46 void removeClientRenderLayer(RenderLayer*);
47
48 void invalidateCacheAndMarkForLayout(SubtreeLayoutScope* = 0);
49
50 protected:
51 // When adding modes, make sure we don't overflow m_invalidationMask below.
52 enum InvalidationMode {
53 LayoutAndBoundariesInvalidation = 1 << 0,
54 BoundariesInvalidation = 1 << 1,
55 RepaintInvalidation = 1 << 2,
56 ParentOnlyInvalidation = 1 << 3
57 };
58
59 // Used from the invalidateClient/invalidateClients methods from classes, inheriting from us.
60 void markAllClientsForInvalidation(InvalidationMode);
61 void markAllClientLayersForInvalidation();
62 void markClientForInvalidation(RenderObject*, InvalidationMode);
63
clearInvalidationMask()64 void clearInvalidationMask() { m_invalidationMask = 0; }
65
66 static AffineTransform computeResourceSpaceTransform(RenderObject*, const AffineTransform& baseTransform, const SVGRenderStyle*, unsigned short resourceMode);
67
68 bool m_isInLayout;
69
70 private:
71 friend class SVGResourcesCache;
72 void addClient(RenderObject*);
73 void removeClient(RenderObject*);
74
75 virtual void willBeDestroyed() OVERRIDE FINAL;
76 void registerResource();
77
78 AtomicString m_id;
79 // Track global (markAllClientsForInvalidation) invals to avoid redundant crawls.
80 unsigned m_invalidationMask : 8;
81
82 bool m_registered : 1;
83 bool m_isInvalidating : 1;
84 // 22 padding bits available
85
86 HashSet<RenderObject*> m_clients;
87 HashSet<RenderLayer*> m_clientLayers;
88 };
89
getRenderSVGResourceContainerById(TreeScope & treeScope,const AtomicString & id)90 inline RenderSVGResourceContainer* getRenderSVGResourceContainerById(TreeScope& treeScope, const AtomicString& id)
91 {
92 if (id.isEmpty())
93 return 0;
94
95 if (RenderSVGResourceContainer* renderResource = treeScope.document().accessSVGExtensions().resourceById(id))
96 return renderResource;
97
98 return 0;
99 }
100
101 template<typename Renderer>
getRenderSVGResourceById(TreeScope & treeScope,const AtomicString & id)102 Renderer* getRenderSVGResourceById(TreeScope& treeScope, const AtomicString& id)
103 {
104 if (RenderSVGResourceContainer* container = getRenderSVGResourceContainerById(treeScope, id))
105 return container->cast<Renderer>();
106
107 return 0;
108 }
109
110 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderSVGResourceContainer, isSVGResourceContainer());
111
112 }
113
114 #endif
115