2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2005 Nokia. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "platform/geometry/FloatPoint.h"
31 #include "platform/geometry/FloatRectOutsets.h"
32 #include "third_party/skia/include/core/SkRect.h"
33 #include "wtf/Vector.h"
37 typedef struct CGRect CGRect
;
40 #import <Foundation/Foundation.h>
50 class PLATFORM_EXPORT FloatRect
{
58 FloatRect(const FloatPoint
& location
, const FloatSize
& size
)
59 : m_location(location
), m_size(size
) { }
60 FloatRect(float x
, float y
, float width
, float height
)
61 : m_location(FloatPoint(x
, y
)), m_size(FloatSize(width
, height
)) { }
62 FloatRect(const IntRect
&);
63 explicit FloatRect(const LayoutRect
&);
64 FloatRect(const SkRect
&);
66 static FloatRect
narrowPrecision(double x
, double y
, double width
, double height
);
68 FloatPoint
location() const { return m_location
; }
69 FloatSize
size() const { return m_size
; }
71 void setLocation(const FloatPoint
& location
) { m_location
= location
; }
72 void setSize(const FloatSize
& size
) { m_size
= size
; }
74 float x() const { return m_location
.x(); }
75 float y() const { return m_location
.y(); }
76 float maxX() const { return x() + width(); }
77 float maxY() const { return y() + height(); }
78 float width() const { return m_size
.width(); }
79 float height() const { return m_size
.height(); }
81 void setX(float x
) { m_location
.setX(x
); }
82 void setY(float y
) { m_location
.setY(y
); }
83 void setWidth(float width
) { m_size
.setWidth(width
); }
84 void setHeight(float height
) { m_size
.setHeight(height
); }
86 bool isEmpty() const { return m_size
.isEmpty(); }
87 bool isZero() const { return m_size
.isZero(); }
88 bool isExpressibleAsIntRect() const;
90 FloatPoint
center() const { return FloatPoint(x() + width() / 2, y() + height() / 2); }
92 void move(const FloatSize
& delta
) { m_location
+= delta
; }
93 void move(const LayoutSize
&);
94 void move(const IntSize
&);
95 void moveBy(const FloatPoint
& delta
) { m_location
.move(delta
.x(), delta
.y()); }
96 void move(float dx
, float dy
) { m_location
.move(dx
, dy
); }
98 void expand(const FloatSize
& size
) { m_size
+= size
; }
99 void expand(float dw
, float dh
) { m_size
.expand(dw
, dh
); }
100 void expand(const FloatRectOutsets
& outsets
)
102 m_location
.move(-outsets
.left(), -outsets
.top());
103 m_size
.expand(outsets
.left() + outsets
.right(), outsets
.top() + outsets
.bottom());
106 void contract(const FloatSize
& size
) { m_size
-= size
; }
107 void contract(float dw
, float dh
) { m_size
.expand(-dw
, -dh
); }
109 void shiftXEdgeTo(float edge
)
111 float delta
= edge
- x();
113 setWidth(std::max(0.0f
, width() - delta
));
115 void shiftMaxXEdgeTo(float edge
)
117 float delta
= edge
- maxX();
118 setWidth(std::max(0.0f
, width() + delta
));
120 void shiftYEdgeTo(float edge
)
122 float delta
= edge
- y();
124 setHeight(std::max(0.0f
, height() - delta
));
126 void shiftMaxYEdgeTo(float edge
)
128 float delta
= edge
- maxY();
129 setHeight(std::max(0.0f
, height() + delta
));
132 FloatPoint
minXMinYCorner() const { return m_location
; } // typically topLeft
133 FloatPoint
maxXMinYCorner() const { return FloatPoint(m_location
.x() + m_size
.width(), m_location
.y()); } // typically topRight
134 FloatPoint
minXMaxYCorner() const { return FloatPoint(m_location
.x(), m_location
.y() + m_size
.height()); } // typically bottomLeft
135 FloatPoint
maxXMaxYCorner() const { return FloatPoint(m_location
.x() + m_size
.width(), m_location
.y() + m_size
.height()); } // typically bottomRight
137 bool intersects(const FloatRect
&) const;
138 bool contains(const FloatRect
&) const;
139 bool contains(const FloatPoint
&, ContainsMode
= InsideOrOnStroke
) const;
141 void intersect(const FloatRect
&);
142 void unite(const FloatRect
&);
143 void uniteEvenIfEmpty(const FloatRect
&);
144 void uniteIfNonZero(const FloatRect
&);
145 void extend(const FloatPoint
&);
147 // Note, this doesn't match what IntRect::contains(IntPoint&) does; the int version
148 // is really checking for containment of 1x1 rect, but that doesn't make sense with floats.
149 bool contains(float px
, float py
) const
151 return px
>= x() && px
<= maxX() && py
>= y() && py
<= maxY();
154 void inflateX(float dx
)
156 m_location
.setX(m_location
.x() - dx
);
157 m_size
.setWidth(m_size
.width() + dx
+ dx
);
159 void inflateY(float dy
)
161 m_location
.setY(m_location
.y() - dy
);
162 m_size
.setHeight(m_size
.height() + dy
+ dy
);
164 void inflate(float d
) { inflateX(d
); inflateY(d
); }
165 void scale(float s
) { scale(s
, s
); }
166 void scale(float sx
, float sy
);
168 FloatRect
transposedRect() const { return FloatRect(m_location
.transposedPoint(), m_size
.transposedSize()); }
171 FloatRect(const CGRect
&);
172 operator CGRect() const;
173 #if defined(__OBJC__) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)
174 FloatRect(const NSRect
&);
175 operator NSRect() const;
179 operator SkRect() const { return SkRect::MakeXYWH(x(), y(), width(), height()); }
182 // Prints the rect to the screen.
187 FloatPoint m_location
;
190 void setLocationAndSizeFromEdges(float left
, float top
, float right
, float bottom
)
192 m_location
.set(left
, top
);
193 m_size
.setWidth(right
- left
);
194 m_size
.setHeight(bottom
- top
);
198 inline FloatRect
intersection(const FloatRect
& a
, const FloatRect
& b
)
205 inline FloatRect
unionRect(const FloatRect
& a
, const FloatRect
& b
)
212 FloatRect
unionRect(const Vector
<FloatRect
>&);
214 inline FloatRect
& operator+=(FloatRect
& a
, const FloatRect
& b
)
216 a
.move(b
.x(), b
.y());
217 a
.setWidth(a
.width() + b
.width());
218 a
.setHeight(a
.height() + b
.height());
222 inline FloatRect
operator+(const FloatRect
& a
, const FloatRect
& b
)
229 inline bool operator==(const FloatRect
& a
, const FloatRect
& b
)
231 return a
.location() == b
.location() && a
.size() == b
.size();
234 inline bool operator!=(const FloatRect
& a
, const FloatRect
& b
)
236 return a
.location() != b
.location() || a
.size() != b
.size();
239 PLATFORM_EXPORT IntRect
enclosingIntRect(const FloatRect
&);
241 // Returns a valid IntRect contained within the given FloatRect.
242 PLATFORM_EXPORT IntRect
enclosedIntRect(const FloatRect
&);
244 PLATFORM_EXPORT IntRect
roundedIntRect(const FloatRect
&);
246 // Map supplied rect from srcRect to an equivalent rect in destRect.
247 PLATFORM_EXPORT FloatRect
mapRect(const FloatRect
&, const FloatRect
& srcRect
, const FloatRect
& destRect
);
249 // Redeclared here to avoid ODR issues.
250 // See platform/testing/GeometryPrinters.h.
251 void PrintTo(const FloatRect
&, std::ostream
*);