• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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