Home | History | Annotate | Download | only in canvas
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef HitRegion_h
      6 #define HitRegion_h
      7 
      8 #include "bindings/core/v8/Dictionary.h"
      9 #include "core/dom/Element.h"
     10 #include "platform/graphics/Path.h"
     11 #include "platform/heap/Handle.h"
     12 #include "wtf/Noncopyable.h"
     13 #include "wtf/OwnPtr.h"
     14 #include "wtf/PassOwnPtr.h"
     15 #include "wtf/PassRefPtr.h"
     16 #include "wtf/RefPtr.h"
     17 
     18 namespace blink {
     19 
     20 // FIXME: We already have IDL dictionary support; this should be removed.
     21 // http://crbug.com/403150
     22 struct HitRegionOptionsInternal {
     23     STACK_ALLOCATED();
     24 
     25 public:
     26     String id;
     27     RefPtrWillBeMember<Element> control;
     28     Path path;
     29     WindRule fillRule;
     30 };
     31 
     32 class HitRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<HitRegion> {
     33 public:
     34     static PassRefPtrWillBeRawPtr<HitRegion> create(const HitRegionOptionsInternal& options)
     35     {
     36         return adoptRefWillBeNoop(new HitRegion(options));
     37     }
     38 
     39     virtual ~HitRegion() { }
     40 
     41     void removePixels(const Path&);
     42     void updateAccessibility(Element* canvas);
     43 
     44     bool contains(const LayoutPoint&) const;
     45 
     46     const String& id() const { return m_id; }
     47     const Path& path() const { return m_path; }
     48     Element* control() const { return m_control.get(); }
     49     WindRule fillRule() const { return m_fillRule; }
     50 
     51     void trace(Visitor*);
     52 
     53 private:
     54     explicit HitRegion(const HitRegionOptionsInternal&);
     55 
     56     String m_id;
     57     RefPtrWillBeMember<Element> m_control;
     58     Path m_path;
     59     WindRule m_fillRule;
     60 };
     61 
     62 class HitRegionManager FINAL : public NoBaseWillBeGarbageCollected<HitRegionManager> {
     63     WTF_MAKE_NONCOPYABLE(HitRegionManager);
     64     DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(HitRegionManager)
     65 public:
     66     static PassOwnPtrWillBeRawPtr<HitRegionManager> create() { return adoptPtrWillBeNoop(new HitRegionManager()); }
     67 
     68     void addHitRegion(PassRefPtrWillBeRawPtr<HitRegion>);
     69 
     70     void removeHitRegion(HitRegion*);
     71     void removeHitRegionById(const String& id);
     72     void removeHitRegionByControl(Element*);
     73     void removeHitRegionsInRect(const FloatRect&, const AffineTransform&);
     74     void removeAllHitRegions();
     75 
     76     HitRegion* getHitRegionById(const String& id) const;
     77     HitRegion* getHitRegionByControl(Element*) const;
     78     HitRegion* getHitRegionAtPoint(const LayoutPoint&) const;
     79 
     80     unsigned getHitRegionsCount() const;
     81 
     82     void trace(Visitor*);
     83 
     84 private:
     85     HitRegionManager() { }
     86 
     87     typedef WillBeHeapListHashSet<RefPtrWillBeMember<HitRegion> > HitRegionList;
     88     typedef HitRegionList::const_reverse_iterator HitRegionIterator;
     89     typedef WillBeHeapHashMap<String, RefPtrWillBeMember<HitRegion> > HitRegionIdMap;
     90     typedef WillBeHeapHashMap<RefPtrWillBeMember<Element>, RefPtrWillBeMember<HitRegion> > HitRegionControlMap;
     91 
     92     HitRegionList m_hitRegionList;
     93     HitRegionIdMap m_hitRegionIdMap;
     94     HitRegionControlMap m_hitRegionControlMap;
     95 };
     96 
     97 } // namespace blink
     98 
     99 #endif
    100