Index: Source/core/html/canvas/CanvasHitRegion.h |
diff --git a/Source/core/html/canvas/CanvasHitRegion.h b/Source/core/html/canvas/CanvasHitRegion.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1e3935224ca50a0aa28f581b83579501bce939c7 |
--- /dev/null |
+++ b/Source/core/html/canvas/CanvasHitRegion.h |
@@ -0,0 +1,135 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CanvasHitRegion_h |
+#define CanvasHitRegion_h |
+ |
+#include "platform/graphics/Path.h" |
+#include "platform/heap/Handle.h" |
+#include "platform/transforms/AffineTransform.h" |
+#include "wtf/HashMap.h" |
+#include "wtf/HashSet.h" |
+#include "wtf/Noncopyable.h" |
+#include "wtf/OwnPtr.h" |
+#include "wtf/PassOwnPtr.h" |
+#include "wtf/PassRefPtr.h" |
+#include "wtf/RefPtr.h" |
+#include "wtf/Vector.h" |
+#include "wtf/text/WTFString.h" |
+ |
+namespace WebCore { |
+ |
+class CanvasHitRegion; |
+class CanvasHitRegionManager; |
+class Dictionary; |
+class Element; |
+class ExceptionState; |
+ |
+struct DecodedHitRegionOptions { |
+ DecodedHitRegionOptions(); |
+ DecodedHitRegionOptions(const Dictionary& options); |
+ |
+ void resolvePath(const Path&, const AffineTransform&); |
+ void resolveIds(const CanvasHitRegionManager*); |
+ |
+ bool validate(ExceptionState&) const; |
+ |
+ Path path; |
+ bool hasPath; |
+ WindRule fillRule; |
+ String id; |
+ String parentId; |
+ String cursor; |
+ RefPtrWillBeRawPtr<Element> control; |
+ String label; |
+ String role; |
+ RefPtrWillBeRawPtr<CanvasHitRegion> previousHitRegion; |
+ RefPtrWillBeRawPtr<CanvasHitRegion> parentHitRegion; |
+}; |
+ |
+class CanvasHitRegion : public RefCountedWillBeGarbageCollectedFinalized<CanvasHitRegion> { |
+public: |
+ static PassRefPtrWillBeRawPtr<CanvasHitRegion> create(const DecodedHitRegionOptions& options) |
+ { |
+ return adoptRef(new CanvasHitRegion(options)); |
+ } |
+ |
+ virtual ~CanvasHitRegion(); |
+ |
+ class GeometryInfo : public RefCounted<GeometryInfo> { |
+ public: |
+ static PassRefPtr<GeometryInfo> create(const Path& path, WindRule fillRule, CanvasHitRegion* hitRegion) |
+ { |
+ return adoptRef(new GeometryInfo(path, fillRule, hitRegion)); |
+ } |
+ |
+ bool contains(const LayoutPoint&) const; |
+ bool isEnclosed(const FloatRect&, const AffineTransform&) const; |
+ |
+ CanvasHitRegion* hitRegion() const { return m_hitRegion; } |
+ void detachHitRegion() { m_hitRegion = 0; } |
+ |
+ private: |
+ GeometryInfo(const Path&, WindRule, CanvasHitRegion*); |
+ |
+ Path m_path; |
+ WindRule m_fillRule; |
+ CanvasHitRegion* m_hitRegion; |
+ }; |
+ |
+ bool isAncestorOf(const CanvasHitRegion*) const; |
+ |
+ GeometryInfo* geometryInfo() const { return m_geometryInfo.get(); } |
+ const String& id() const { return m_id; } |
+ const CanvasHitRegion* parent() const { return m_parent.get(); } |
+ const Element* control() const { return m_control.get(); } |
+ |
+ virtual void trace(Visitor*) OVERRIDE; |
+ |
+private: |
+ CanvasHitRegion(const DecodedHitRegionOptions&); |
+ |
+ RefPtr<GeometryInfo> m_geometryInfo; |
+ RefPtrWillBeMember<CanvasHitRegion> m_parent; |
+ RefPtrWillBeMember<Element> m_control; |
+ String m_id; |
+ String m_cursor; |
+ String m_label; |
+ String m_ariaRole; |
+}; |
+ |
+class CanvasHitRegionManager : public NoBaseWillBeGarbageCollectedFinalized<CanvasHitRegionManager> { |
+ WTF_MAKE_NONCOPYABLE(CanvasHitRegionManager); |
+public: |
+ static PassOwnPtrWillBeRawPtr<CanvasHitRegionManager> create() { return adoptPtr(new CanvasHitRegionManager()); } |
+ |
+ virtual ~CanvasHitRegionManager() { } |
+ |
+ void add(PassRefPtrWillBeRawPtr<CanvasHitRegion>); |
+ void remove(CanvasHitRegion*); |
+ |
+ void clear(); |
+ |
+ void removeEnclosed(const FloatRect&, const AffineTransform&); |
+ |
+ CanvasHitRegion* getHitRegionById(const String& id) const; |
+ CanvasHitRegion* getHitRegionAtPoint(const LayoutPoint&) const; |
+ |
+ virtual void trace(Visitor*) OVERRIDE; |
+ |
+private: |
+ CanvasHitRegionManager() { } |
+ |
+ typedef WillBeHeapHashSet<RefPtrWillBeMember<CanvasHitRegion> > HitRegionList; |
+ typedef WillBeHeapHashMap<String, RefPtrWillBeMember<CanvasHitRegion> > HitRegionMap; |
+ typedef Vector<RefPtr<CanvasHitRegion::GeometryInfo> > HitRegionGeometry; |
+ |
+ HitRegionList m_hitRegions; // Storage for hit regions. |
+ HitRegionMap m_hitRegionIdMap; // Map for id-based lookups. |
+ HitRegionGeometry m_hitRegionGeometry; // The intersection/hit test query list. |
+}; |
+ |
+} // namespace WebCore |
+ |
+#endif |