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 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 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 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> 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