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