Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Side by Side Diff: Source/platform/geometry/FloatRect.cpp

Issue 25494003: Move geometry classes from core/platform/graphics to platform/geometry (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2005 Nokia. All rights reserved. 3 * Copyright (C) 2005 Nokia. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the 11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution. 12 * documentation and/or other materials provided with the distribution.
13 * 13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 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. 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */ 25 */
26 26
27 #include "config.h" 27 #include "config.h"
28 #include "core/platform/graphics/FloatRect.h" 28 #include "platform/geometry/FloatRect.h"
29 29
30 #include "core/platform/FloatConversion.h" 30 #include "platform/FloatConversion.h"
31 #include "core/platform/graphics/IntRect.h" 31 #include "platform/geometry/IntRect.h"
32 #include "core/platform/graphics/LayoutRect.h" 32 #include "platform/geometry/LayoutRect.h"
33 #include "third_party/skia/include/core/SkRect.h" 33 #include "third_party/skia/include/core/SkRect.h"
34 #include "wtf/MathExtras.h" 34 #include "wtf/MathExtras.h"
35 35
36 #include <algorithm> 36 #include <algorithm>
37 #include <math.h> 37 #include <math.h>
38 38
39 using std::max;
40 using std::min;
41
42 namespace WebCore { 39 namespace WebCore {
43 40
44 FloatRect::FloatRect(const IntRect& r) : m_location(r.location()), m_size(r.size ()) 41 FloatRect::FloatRect(const IntRect& r) : m_location(r.location()), m_size(r.size ())
45 { 42 {
46 } 43 }
47 44
48 FloatRect::FloatRect(const LayoutRect& r) : m_location(r.location()), m_size(r.s ize()) 45 FloatRect::FloatRect(const LayoutRect& r) : m_location(r.location()), m_size(r.s ize())
49 { 46 {
50 } 47 }
51 48
(...skipping 29 matching lines...) Expand all
81 78
82 bool FloatRect::contains(const FloatPoint& point, ContainsMode containsMode) con st 79 bool FloatRect::contains(const FloatPoint& point, ContainsMode containsMode) con st
83 { 80 {
84 if (containsMode == InsideOrOnStroke) 81 if (containsMode == InsideOrOnStroke)
85 return contains(point.x(), point.y()); 82 return contains(point.x(), point.y());
86 return x() < point.x() && maxX() > point.x() && y() < point.y() && maxY() > point.y(); 83 return x() < point.x() && maxX() > point.x() && y() < point.y() && maxY() > point.y();
87 } 84 }
88 85
89 void FloatRect::intersect(const FloatRect& other) 86 void FloatRect::intersect(const FloatRect& other)
90 { 87 {
91 float l = max(x(), other.x()); 88 float left = std::max(x(), other.x());
92 float t = max(y(), other.y()); 89 float top = std::max(y(), other.y());
93 float r = min(maxX(), other.maxX()); 90 float right = std::min(maxX(), other.maxX());
94 float b = min(maxY(), other.maxY()); 91 float bottom = std::min(maxY(), other.maxY());
95 92
96 // Return a clean empty rectangle for non-intersecting cases. 93 // Return a clean empty rectangle for non-intersecting cases.
97 if (l >= r || t >= b) { 94 if (left >= right || top >= bottom) {
98 l = 0; 95 left = 0;
99 t = 0; 96 top = 0;
100 r = 0; 97 right = 0;
101 b = 0; 98 bottom = 0;
102 } 99 }
103 100
104 setLocationAndSizeFromEdges(l, t, r, b); 101 setLocationAndSizeFromEdges(left, top, right, bottom);
105 } 102 }
106 103
107 void FloatRect::unite(const FloatRect& other) 104 void FloatRect::unite(const FloatRect& other)
108 { 105 {
109 // Handle empty special cases first. 106 // Handle empty special cases first.
110 if (other.isEmpty()) 107 if (other.isEmpty())
111 return; 108 return;
112 if (isEmpty()) { 109 if (isEmpty()) {
113 *this = other; 110 *this = other;
114 return; 111 return;
115 } 112 }
116 113
117 uniteEvenIfEmpty(other); 114 uniteEvenIfEmpty(other);
118 } 115 }
119 116
120 void FloatRect::uniteEvenIfEmpty(const FloatRect& other) 117 void FloatRect::uniteEvenIfEmpty(const FloatRect& other)
121 { 118 {
122 float minX = min(x(), other.x()); 119 float minX = std::min(x(), other.x());
123 float minY = min(y(), other.y()); 120 float minY = std::min(y(), other.y());
124 float maxX = max(this->maxX(), other.maxX()); 121 float maxX = std::max(this->maxX(), other.maxX());
125 float maxY = max(this->maxY(), other.maxY()); 122 float maxY = std::max(this->maxY(), other.maxY());
126 123
127 setLocationAndSizeFromEdges(minX, minY, maxX, maxY); 124 setLocationAndSizeFromEdges(minX, minY, maxX, maxY);
128 } 125 }
129 126
130 void FloatRect::uniteIfNonZero(const FloatRect& other) 127 void FloatRect::uniteIfNonZero(const FloatRect& other)
131 { 128 {
132 // Handle empty special cases first. 129 // Handle empty special cases first.
133 if (other.isZero()) 130 if (other.isZero())
134 return; 131 return;
135 if (isZero()) { 132 if (isZero()) {
136 *this = other; 133 *this = other;
137 return; 134 return;
138 } 135 }
139 136
140 uniteEvenIfEmpty(other); 137 uniteEvenIfEmpty(other);
141 } 138 }
142 139
143 void FloatRect::extend(const FloatPoint& p) 140 void FloatRect::extend(const FloatPoint& p)
144 { 141 {
145 float minX = min(x(), p.x()); 142 float minX = std::min(x(), p.x());
146 float minY = min(y(), p.y()); 143 float minY = std::min(y(), p.y());
147 float maxX = max(this->maxX(), p.x()); 144 float maxX = std::max(this->maxX(), p.x());
148 float maxY = max(this->maxY(), p.y()); 145 float maxY = std::max(this->maxY(), p.y());
149 146
150 setLocationAndSizeFromEdges(minX, minY, maxX, maxY); 147 setLocationAndSizeFromEdges(minX, minY, maxX, maxY);
151 } 148 }
152 149
153 void FloatRect::scale(float sx, float sy) 150 void FloatRect::scale(float sx, float sy)
154 { 151 {
155 m_location.setX(x() * sx); 152 m_location.setX(x() * sx);
156 m_location.setY(y() * sy); 153 m_location.setY(y() * sy);
157 m_size.setWidth(width() * sx); 154 m_size.setWidth(width() * sx);
158 m_size.setHeight(height() * sy); 155 m_size.setHeight(height() * sy);
159 } 156 }
160 157
161 FloatRect unionRect(const Vector<FloatRect>& rects) 158 FloatRect unionRect(const Vector<FloatRect>& rects)
162 { 159 {
163 FloatRect result; 160 FloatRect result;
164 161
165 size_t count = rects.size(); 162 size_t count = rects.size();
166 for (size_t i = 0; i < count; ++i) 163 for (size_t i = 0; i < count; ++i)
167 result.unite(rects[i]); 164 result.unite(rects[i]);
168 165
169 return result; 166 return result;
170 } 167 }
171 168
172 void FloatRect::fitToPoints(const FloatPoint& p0, const FloatPoint& p1) 169 void FloatRect::fitToPoints(const FloatPoint& p0, const FloatPoint& p1)
173 { 170 {
174 float left = min(p0.x(), p1.x()); 171 float left = std::min(p0.x(), p1.x());
175 float top = min(p0.y(), p1.y()); 172 float top = std::min(p0.y(), p1.y());
176 float right = max(p0.x(), p1.x()); 173 float right = std::max(p0.x(), p1.x());
177 float bottom = max(p0.y(), p1.y()); 174 float bottom = std::max(p0.y(), p1.y());
178 175
179 setLocationAndSizeFromEdges(left, top, right, bottom); 176 setLocationAndSizeFromEdges(left, top, right, bottom);
180 } 177 }
181 178
182 namespace { 179 namespace {
183 // Helpers for 3- and 4-way max and min. 180 // Helpers for 3- and 4-way max and min.
184 181
185 template <typename T> 182 template <typename T>
186 T min3(const T& v1, const T& v2, const T& v3) 183 T min3(const T& v1, const T& v2, const T& v3)
187 { 184 {
188 return min(min(v1, v2), v3); 185 return std::min(std::min(v1, v2), v3);
189 } 186 }
190 187
191 template <typename T> 188 template <typename T>
192 T max3(const T& v1, const T& v2, const T& v3) 189 T max3(const T& v1, const T& v2, const T& v3)
193 { 190 {
194 return max(max(v1, v2), v3); 191 return std::max(std::max(v1, v2), v3);
195 } 192 }
196 193
197 template <typename T> 194 template <typename T>
198 T min4(const T& v1, const T& v2, const T& v3, const T& v4) 195 T min4(const T& v1, const T& v2, const T& v3, const T& v4)
199 { 196 {
200 return min(min(v1, v2), min(v3, v4)); 197 return std::min(std::min(v1, v2), std::min(v3, v4));
201 } 198 }
202 199
203 template <typename T> 200 template <typename T>
204 T max4(const T& v1, const T& v2, const T& v3, const T& v4) 201 T max4(const T& v1, const T& v2, const T& v3, const T& v4)
205 { 202 {
206 return max(max(v1, v2), max(v3, v4)); 203 return std::max(std::max(v1, v2), std::max(v3, v4));
207 } 204 }
208 205
209 } // anonymous namespace 206 } // anonymous namespace
210 207
211 void FloatRect::fitToPoints(const FloatPoint& p0, const FloatPoint& p1, const Fl oatPoint& p2) 208 void FloatRect::fitToPoints(const FloatPoint& p0, const FloatPoint& p1, const Fl oatPoint& p2)
212 { 209 {
213 float left = min3(p0.x(), p1.x(), p2.x()); 210 float left = min3(p0.x(), p1.x(), p2.x());
214 float top = min3(p0.y(), p1.y(), p2.y()); 211 float top = min3(p0.y(), p1.y(), p2.y());
215 float right = max3(p0.x(), p1.x(), p2.x()); 212 float right = max3(p0.x(), p1.x(), p2.x());
216 float bottom = max3(p0.y(), p1.y(), p2.y()); 213 float bottom = max3(p0.y(), p1.y(), p2.y());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 return IntRect(location, size); 249 return IntRect(location, size);
253 } 250 }
254 251
255 IntRect roundedIntRect(const FloatRect& rect) 252 IntRect roundedIntRect(const FloatRect& rect)
256 { 253 {
257 return IntRect(roundedIntPoint(rect.location()), roundedIntSize(rect.size()) ); 254 return IntRect(roundedIntPoint(rect.location()), roundedIntSize(rect.size()) );
258 } 255 }
259 256
260 FloatRect mapRect(const FloatRect& r, const FloatRect& srcRect, const FloatRect& destRect) 257 FloatRect mapRect(const FloatRect& r, const FloatRect& srcRect, const FloatRect& destRect)
261 { 258 {
262 if (srcRect.width() == 0 || srcRect.height() == 0) 259 if (!srcRect.width() || !srcRect.height())
263 return FloatRect(); 260 return FloatRect();
264 261
265 float widthScale = destRect.width() / srcRect.width(); 262 float widthScale = destRect.width() / srcRect.width();
266 float heightScale = destRect.height() / srcRect.height(); 263 float heightScale = destRect.height() / srcRect.height();
267 return FloatRect(destRect.x() + (r.x() - srcRect.x()) * widthScale, 264 return FloatRect(destRect.x() + (r.x() - srcRect.x()) * widthScale,
268 destRect.y() + (r.y() - srcRect.y()) * heightScale, 265 destRect.y() + (r.y() - srcRect.y()) * heightScale,
269 r.width() * widthScale, r.height() * heightScale); 266 r.width() * widthScale, r.height() * heightScale);
270 } 267 }
271 268
272 } 269 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698