| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2003, 2006, 2009 Apple Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions | |
| 6 * are met: | |
| 7 * 1. Redistributions of source code must retain the above copyright | |
| 8 * notice, this list of conditions and the following disclaimer. | |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 * notice, this list of conditions and the following disclaimer in the | |
| 11 * documentation and/or other materials provided with the distribution. | |
| 12 * | |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' | |
| 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS | |
| 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | |
| 23 * THE POSSIBILITY OF SUCH DAMAGE. | |
| 24 */ | |
| 25 | |
| 26 #ifndef IntRect_h | |
| 27 #define IntRect_h | |
| 28 | |
| 29 #include "core/platform/graphics/IntPoint.h" | |
| 30 #include "wtf/FastAllocBase.h" | |
| 31 #include "wtf/Vector.h" | |
| 32 | |
| 33 #if OS(MACOSX) | |
| 34 typedef struct CGRect CGRect; | |
| 35 | |
| 36 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES | |
| 37 typedef struct CGRect NSRect; | |
| 38 #else | |
| 39 typedef struct _NSRect NSRect; | |
| 40 #endif | |
| 41 #endif | |
| 42 | |
| 43 struct SkRect; | |
| 44 struct SkIRect; | |
| 45 | |
| 46 namespace WebCore { | |
| 47 | |
| 48 class FloatRect; | |
| 49 class LayoutRect; | |
| 50 | |
| 51 class IntRect { | |
| 52 WTF_MAKE_FAST_ALLOCATED; | |
| 53 public: | |
| 54 IntRect() { } | |
| 55 IntRect(const IntPoint& location, const IntSize& size) | |
| 56 : m_location(location), m_size(size) { } | |
| 57 IntRect(int x, int y, int width, int height) | |
| 58 : m_location(IntPoint(x, y)), m_size(IntSize(width, height)) { } | |
| 59 | |
| 60 explicit IntRect(const FloatRect&); // don't do this implicitly since it's l
ossy | |
| 61 explicit IntRect(const LayoutRect&); // don't do this implicitly since it's
lossy | |
| 62 | |
| 63 IntPoint location() const { return m_location; } | |
| 64 IntSize size() const { return m_size; } | |
| 65 | |
| 66 void setLocation(const IntPoint& location) { m_location = location; } | |
| 67 void setSize(const IntSize& size) { m_size = size; } | |
| 68 | |
| 69 int x() const { return m_location.x(); } | |
| 70 int y() const { return m_location.y(); } | |
| 71 int maxX() const { return x() + width(); } | |
| 72 int maxY() const { return y() + height(); } | |
| 73 int width() const { return m_size.width(); } | |
| 74 int height() const { return m_size.height(); } | |
| 75 | |
| 76 void setX(int x) { m_location.setX(x); } | |
| 77 void setY(int y) { m_location.setY(y); } | |
| 78 void setWidth(int width) { m_size.setWidth(width); } | |
| 79 void setHeight(int height) { m_size.setHeight(height); } | |
| 80 | |
| 81 bool isEmpty() const { return m_size.isEmpty(); } | |
| 82 | |
| 83 // NOTE: The result is rounded to integer values, and thus may be not the ex
act | |
| 84 // center point. | |
| 85 IntPoint center() const { return IntPoint(x() + width() / 2, y() + height()
/ 2); } | |
| 86 | |
| 87 void move(const IntSize& size) { m_location += size; } | |
| 88 void moveBy(const IntPoint& offset) { m_location.move(offset.x(), offset.y()
); } | |
| 89 void move(int dx, int dy) { m_location.move(dx, dy); } | |
| 90 | |
| 91 void expand(const IntSize& size) { m_size += size; } | |
| 92 void expand(int dw, int dh) { m_size.expand(dw, dh); } | |
| 93 void contract(const IntSize& size) { m_size -= size; } | |
| 94 void contract(int dw, int dh) { m_size.expand(-dw, -dh); } | |
| 95 | |
| 96 void shiftXEdgeTo(int edge) | |
| 97 { | |
| 98 int delta = edge - x(); | |
| 99 setX(edge); | |
| 100 setWidth(std::max(0, width() - delta)); | |
| 101 } | |
| 102 void shiftMaxXEdgeTo(int edge) | |
| 103 { | |
| 104 int delta = edge - maxX(); | |
| 105 setWidth(std::max(0, width() + delta)); | |
| 106 } | |
| 107 void shiftYEdgeTo(int edge) | |
| 108 { | |
| 109 int delta = edge - y(); | |
| 110 setY(edge); | |
| 111 setHeight(std::max(0, height() - delta)); | |
| 112 } | |
| 113 void shiftMaxYEdgeTo(int edge) | |
| 114 { | |
| 115 int delta = edge - maxY(); | |
| 116 setHeight(std::max(0, height() + delta)); | |
| 117 } | |
| 118 | |
| 119 IntPoint minXMinYCorner() const { return m_location; } // typically topLeft | |
| 120 IntPoint maxXMinYCorner() const { return IntPoint(m_location.x() + m_size.wi
dth(), m_location.y()); } // typically topRight | |
| 121 IntPoint minXMaxYCorner() const { return IntPoint(m_location.x(), m_location
.y() + m_size.height()); } // typically bottomLeft | |
| 122 IntPoint maxXMaxYCorner() const { return IntPoint(m_location.x() + m_size.wi
dth(), m_location.y() + m_size.height()); } // typically bottomRight | |
| 123 | |
| 124 bool intersects(const IntRect&) const; | |
| 125 bool contains(const IntRect&) const; | |
| 126 | |
| 127 // This checks to see if the rect contains x,y in the traditional sense. | |
| 128 // Equivalent to checking if the rect contains a 1x1 rect below and to the r
ight of (px,py). | |
| 129 bool contains(int px, int py) const | |
| 130 { return px >= x() && px < maxX() && py >= y() && py < maxY(); } | |
| 131 bool contains(const IntPoint& point) const { return contains(point.x(), poin
t.y()); } | |
| 132 | |
| 133 void intersect(const IntRect&); | |
| 134 void unite(const IntRect&); | |
| 135 void uniteIfNonZero(const IntRect&); | |
| 136 | |
| 137 void inflateX(int dx) | |
| 138 { | |
| 139 m_location.setX(m_location.x() - dx); | |
| 140 m_size.setWidth(m_size.width() + dx + dx); | |
| 141 } | |
| 142 void inflateY(int dy) | |
| 143 { | |
| 144 m_location.setY(m_location.y() - dy); | |
| 145 m_size.setHeight(m_size.height() + dy + dy); | |
| 146 } | |
| 147 void inflate(int d) { inflateX(d); inflateY(d); } | |
| 148 void scale(float s); | |
| 149 | |
| 150 IntSize differenceToPoint(const IntPoint&) const; | |
| 151 int distanceSquaredToPoint(const IntPoint& p) const { return differenceToPoi
nt(p).diagonalLengthSquared(); } | |
| 152 | |
| 153 IntRect transposedRect() const { return IntRect(m_location.transposedPoint()
, m_size.transposedSize()); } | |
| 154 | |
| 155 #if OS(MACOSX) | |
| 156 operator CGRect() const; | |
| 157 #if !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) | |
| 158 operator NSRect() const; | |
| 159 #endif | |
| 160 #endif | |
| 161 | |
| 162 operator SkRect() const; | |
| 163 operator SkIRect() const; | |
| 164 | |
| 165 private: | |
| 166 IntPoint m_location; | |
| 167 IntSize m_size; | |
| 168 }; | |
| 169 | |
| 170 inline IntRect intersection(const IntRect& a, const IntRect& b) | |
| 171 { | |
| 172 IntRect c = a; | |
| 173 c.intersect(b); | |
| 174 return c; | |
| 175 } | |
| 176 | |
| 177 inline IntRect unionRect(const IntRect& a, const IntRect& b) | |
| 178 { | |
| 179 IntRect c = a; | |
| 180 c.unite(b); | |
| 181 return c; | |
| 182 } | |
| 183 | |
| 184 IntRect unionRect(const Vector<IntRect>&); | |
| 185 | |
| 186 inline bool operator==(const IntRect& a, const IntRect& b) | |
| 187 { | |
| 188 return a.location() == b.location() && a.size() == b.size(); | |
| 189 } | |
| 190 | |
| 191 inline bool operator!=(const IntRect& a, const IntRect& b) | |
| 192 { | |
| 193 return a.location() != b.location() || a.size() != b.size(); | |
| 194 } | |
| 195 | |
| 196 #if OS(MACOSX) | |
| 197 IntRect enclosingIntRect(const CGRect&); | |
| 198 #if !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) | |
| 199 IntRect enclosingIntRect(const NSRect&); | |
| 200 #endif | |
| 201 #endif | |
| 202 | |
| 203 } // namespace WebCore | |
| 204 | |
| 205 #endif // IntRect_h | |
| OLD | NEW |