1 /* 2 * Copyright (C) 2006 Apple Computer, Inc. 3 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 * 20 */ 21 22 #ifndef HitTestLocation_h 23 #define HitTestLocation_h 24 25 #include "platform/geometry/FloatQuad.h" 26 #include "platform/geometry/FloatRect.h" 27 #include "platform/geometry/LayoutRect.h" 28 #include "platform/geometry/RoundedRect.h" 29 #include "wtf/Forward.h" 30 #include "wtf/ListHashSet.h" 31 #include "wtf/OwnPtr.h" 32 #include "wtf/RefPtr.h" 33 34 namespace WebCore { 35 36 class Element; 37 class Frame; 38 class Image; 39 class KURL; 40 class Node; 41 class RenderRegion; 42 class Scrollbar; 43 44 class HitTestLocation { 45 public: 46 47 HitTestLocation(); 48 HitTestLocation(const LayoutPoint&); 49 HitTestLocation(const FloatPoint&); 50 HitTestLocation(const FloatPoint&, const FloatQuad&); 51 // Pass non-zero padding values to perform a rect-based hit test. 52 HitTestLocation(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding); 53 // Make a copy the HitTestLocation in a new region by applying given offset to internal point and area. 54 HitTestLocation(const HitTestLocation&, const LayoutSize& offset, RenderRegion* = 0); 55 HitTestLocation(const HitTestLocation&); 56 ~HitTestLocation(); 57 HitTestLocation& operator=(const HitTestLocation&); 58 point()59 const LayoutPoint& point() const { return m_point; } roundedPoint()60 IntPoint roundedPoint() const { return roundedIntPoint(m_point); } 61 region()62 RenderRegion* region() const { return m_region; } 63 64 // Rect-based hit test related methods. isRectBasedTest()65 bool isRectBasedTest() const { return m_isRectBased; } isRectilinear()66 bool isRectilinear() const { return m_isRectilinear; } boundingBox()67 IntRect boundingBox() const { return m_boundingBox; } 68 69 static IntRect rectForPoint(const LayoutPoint&, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding); topPadding()70 int topPadding() const { return roundedPoint().y() - m_boundingBox.y(); } rightPadding()71 int rightPadding() const { return m_boundingBox.maxX() - roundedPoint().x() - 1; } bottomPadding()72 int bottomPadding() const { return m_boundingBox.maxY() - roundedPoint().y() - 1; } leftPadding()73 int leftPadding() const { return roundedPoint().x() - m_boundingBox.x(); } 74 75 bool intersects(const LayoutRect&) const; 76 bool intersects(const FloatRect&) const; 77 bool intersects(const RoundedRect&) const; 78 transformedPoint()79 const FloatPoint& transformedPoint() const { return m_transformedPoint; } transformedRect()80 const FloatQuad& transformedRect() const { return m_transformedRect; } 81 82 private: 83 template<typename RectType> 84 bool intersectsRect(const RectType&) const; 85 void move(const LayoutSize& offset); 86 87 // This is cached forms of the more accurate point and area below. 88 LayoutPoint m_point; 89 IntRect m_boundingBox; 90 91 FloatPoint m_transformedPoint; 92 FloatQuad m_transformedRect; 93 94 RenderRegion* m_region; // The region we're inside. 95 96 bool m_isRectBased; 97 bool m_isRectilinear; 98 }; 99 100 } // namespace WebCore 101 102 #endif // HitTestLocation_h 103