1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/*
* Copyright (C) 2006 Apple Inc. All rights reserved.
* Copyright (C) 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef SVGDocumentExtensions_h
#define SVGDocumentExtensions_h
#include "platform/geometry/FloatPoint.h"
#include "platform/heap/Handle.h"
#include "wtf/Forward.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/text/AtomicStringHash.h"
namespace WebCore {
class Document;
class RenderSVGResourceContainer;
class SubtreeLayoutScope;
class SVGElement;
#if ENABLE(SVG_FONTS)
class SVGFontFaceElement;
#endif
class SVGResourcesCache;
class SVGSVGElement;
class Element;
typedef WillBeHeapHashSet<RawPtrWillBeMember<SVGElement> > SVGElementSet;
class SVGDocumentExtensions : public NoBaseWillBeGarbageCollectedFinalized<SVGDocumentExtensions> {
WTF_MAKE_NONCOPYABLE(SVGDocumentExtensions); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
public:
typedef HashSet<Element*> SVGPendingElements;
explicit SVGDocumentExtensions(Document*);
~SVGDocumentExtensions();
void addTimeContainer(SVGSVGElement*);
void removeTimeContainer(SVGSVGElement*);
void addResource(const AtomicString& id, RenderSVGResourceContainer*);
void removeResource(const AtomicString& id);
RenderSVGResourceContainer* resourceById(const AtomicString& id) const;
static void serviceOnAnimationFrame(Document&, double monotonicAnimationStartTime);
void startAnimations();
void pauseAnimations();
void dispatchSVGLoadEventToOutermostSVGElements();
void reportWarning(const String&);
void reportError(const String&);
SVGResourcesCache* resourcesCache() const { return m_resourcesCache.get(); }
SVGElementSet* setOfElementsReferencingTarget(SVGElement* referencedElement) const;
void addElementReferencingTarget(SVGElement* referencingElement, SVGElement* referencedElement);
void removeAllTargetReferencesForElement(SVGElement*);
void rebuildAllElementReferencesForTarget(SVGElement*);
void removeAllElementReferencesForTarget(SVGElement*);
void addSVGRootWithRelativeLengthDescendents(SVGSVGElement*);
void removeSVGRootWithRelativeLengthDescendents(SVGSVGElement*);
bool isSVGRootWithRelativeLengthDescendents(SVGSVGElement*) const;
void invalidateSVGRootsWithRelativeLengthDescendents(SubtreeLayoutScope*);
#if ENABLE(SVG_FONTS)
const WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >& svgFontFaceElements() const { return m_svgFontFaceElements; }
void registerSVGFontFaceElement(SVGFontFaceElement*);
void unregisterSVGFontFaceElement(SVGFontFaceElement*);
void registerPendingSVGFontFaceElementsForRemoval(PassRefPtrWillBeRawPtr<SVGFontFaceElement>);
void removePendingSVGFontFaceElementsForRemoval();
#endif
bool zoomAndPanEnabled() const;
void startPan(const FloatPoint& start);
void updatePan(const FloatPoint& pos) const;
static SVGSVGElement* rootElement(const Document&);
SVGSVGElement* rootElement() const;
void trace(Visitor*);
private:
RawPtrWillBeMember<Document> m_document;
WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> > m_timeContainers; // For SVG 1.2 support this will need to be made more general.
#if ENABLE(SVG_FONTS)
WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> > m_svgFontFaceElements;
// SVGFontFaceElements that are pending and scheduled for removal.
WillBeHeapHashSet<RefPtrWillBeMember<SVGFontFaceElement> > m_pendingSVGFontFaceElementsForRemoval;
#endif
HashMap<AtomicString, RenderSVGResourceContainer*> m_resources;
HashMap<AtomicString, OwnPtr<SVGPendingElements> > m_pendingResources; // Resources that are pending.
HashMap<AtomicString, OwnPtr<SVGPendingElements> > m_pendingResourcesForRemoval; // Resources that are pending and scheduled for removal.
typedef WillBeHeapHashMap<RawPtrWillBeMember<SVGElement>, OwnPtrWillBeMember<SVGElementSet> > ElementDependenciesMap;
ElementDependenciesMap m_elementDependencies;
OwnPtr<SVGResourcesCache> m_resourcesCache;
WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> > m_relativeLengthSVGRoots; // Root SVG elements with relative length descendants.
FloatPoint m_translate;
#if ASSERT_ENABLED
bool m_inRelativeLengthSVGRootsInvalidation;
#endif
public:
// This HashMap contains a list of pending resources. Pending resources, are such
// which are referenced by any object in the SVG document, but do NOT exist yet.
// For instance, dynamically build gradients / patterns / clippers...
void addPendingResource(const AtomicString& id, Element*);
bool hasPendingResource(const AtomicString& id) const;
bool isElementPendingResources(Element*) const;
bool isElementPendingResource(Element*, const AtomicString& id) const;
void clearHasPendingResourcesIfPossible(Element*);
void removeElementFromPendingResources(Element*);
PassOwnPtr<SVGPendingElements> removePendingResource(const AtomicString& id);
void serviceAnimations(double monotonicAnimationStartTime);
// The following two functions are used for scheduling a pending resource to be removed.
void markPendingResourcesForRemoval(const AtomicString&);
Element* removeElementFromPendingResourcesForRemoval(const AtomicString&);
private:
PassOwnPtr<SVGPendingElements> removePendingResourceForRemoval(const AtomicString&);
};
}
#endif
|