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