OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/rect_base.h" | 5 #include "ui/gfx/rect_base.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 | 9 |
10 // This file provides the implementation for RectBaese template and | 10 // This file provides the implementation for RectBaese template and |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 const Class& rect) const { | 158 const Class& rect) const { |
159 return !(rect.x() >= right() || rect.right() <= x() || | 159 return !(rect.x() >= right() || rect.right() <= x() || |
160 rect.y() >= bottom() || rect.bottom() <= y()); | 160 rect.y() >= bottom() || rect.bottom() <= y()); |
161 } | 161 } |
162 | 162 |
163 template<typename Class, | 163 template<typename Class, |
164 typename PointClass, | 164 typename PointClass, |
165 typename SizeClass, | 165 typename SizeClass, |
166 typename InsetsClass, | 166 typename InsetsClass, |
167 typename Type> | 167 typename Type> |
168 Class RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Intersect( | 168 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Intersect( |
169 const Class& rect) const { | 169 const Class& rect) { |
| 170 if (IsEmpty() || rect.IsEmpty()) { |
| 171 SetRect(0, 0, 0, 0); |
| 172 return; |
| 173 } |
| 174 |
170 Type rx = std::max(x(), rect.x()); | 175 Type rx = std::max(x(), rect.x()); |
171 Type ry = std::max(y(), rect.y()); | 176 Type ry = std::max(y(), rect.y()); |
172 Type rr = std::min(right(), rect.right()); | 177 Type rr = std::min(right(), rect.right()); |
173 Type rb = std::min(bottom(), rect.bottom()); | 178 Type rb = std::min(bottom(), rect.bottom()); |
174 | 179 |
175 if (rx >= rr || ry >= rb) | 180 if (rx >= rr || ry >= rb) |
176 rx = ry = rr = rb = 0; // non-intersecting | 181 rx = ry = rr = rb = 0; // non-intersecting |
177 | 182 |
178 return Class(rx, ry, rr - rx, rb - ry); | 183 SetRect(rx, ry, rr - rx, rb - ry); |
179 } | 184 } |
180 | 185 |
181 template<typename Class, | 186 template<typename Class, |
182 typename PointClass, | 187 typename PointClass, |
183 typename SizeClass, | 188 typename SizeClass, |
184 typename InsetsClass, | 189 typename InsetsClass, |
185 typename Type> | 190 typename Type> |
186 Class RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Union( | 191 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Union( |
187 const Class& rect) const { | 192 const Class& rect) { |
188 // special case empty rects... | 193 if (IsEmpty()) { |
189 if (IsEmpty()) | 194 *this = rect; |
190 return rect; | 195 return; |
| 196 } |
191 if (rect.IsEmpty()) | 197 if (rect.IsEmpty()) |
192 return *static_cast<const Class*>(this); | 198 return; |
193 | 199 |
194 Type rx = std::min(x(), rect.x()); | 200 Type rx = std::min(x(), rect.x()); |
195 Type ry = std::min(y(), rect.y()); | 201 Type ry = std::min(y(), rect.y()); |
196 Type rr = std::max(right(), rect.right()); | 202 Type rr = std::max(right(), rect.right()); |
197 Type rb = std::max(bottom(), rect.bottom()); | 203 Type rb = std::max(bottom(), rect.bottom()); |
198 | 204 |
199 return Class(rx, ry, rr - rx, rb - ry); | 205 SetRect(rx, ry, rr - rx, rb - ry); |
200 } | 206 } |
201 | 207 |
202 template<typename Class, | 208 template<typename Class, |
203 typename PointClass, | 209 typename PointClass, |
204 typename SizeClass, | 210 typename SizeClass, |
205 typename InsetsClass, | 211 typename InsetsClass, |
206 typename Type> | 212 typename Type> |
207 Class RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Subtract( | 213 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Subtract( |
208 const Class& rect) const { | 214 const Class& rect) { |
209 // boundary cases: | |
210 if (!Intersects(rect)) | 215 if (!Intersects(rect)) |
211 return *static_cast<const Class*>(this); | 216 return; |
212 if (rect.Contains(*static_cast<const Class*>(this))) | 217 if (rect.Contains(*static_cast<const Class*>(this))) { |
213 return Class(); | 218 SetRect(0, 0, 0, 0); |
| 219 return; |
| 220 } |
214 | 221 |
215 Type rx = x(); | 222 Type rx = x(); |
216 Type ry = y(); | 223 Type ry = y(); |
217 Type rr = right(); | 224 Type rr = right(); |
218 Type rb = bottom(); | 225 Type rb = bottom(); |
219 | 226 |
220 if (rect.y() <= y() && rect.bottom() >= bottom()) { | 227 if (rect.y() <= y() && rect.bottom() >= bottom()) { |
221 // complete intersection in the y-direction | 228 // complete intersection in the y-direction |
222 if (rect.x() <= x()) { | 229 if (rect.x() <= x()) { |
223 rx = rect.right(); | 230 rx = rect.right(); |
224 } else { | 231 } else { |
225 rr = rect.x(); | 232 rr = rect.x(); |
226 } | 233 } |
227 } else if (rect.x() <= x() && rect.right() >= right()) { | 234 } else if (rect.x() <= x() && rect.right() >= right()) { |
228 // complete intersection in the x-direction | 235 // complete intersection in the x-direction |
229 if (rect.y() <= y()) { | 236 if (rect.y() <= y()) { |
230 ry = rect.bottom(); | 237 ry = rect.bottom(); |
231 } else { | 238 } else { |
232 rb = rect.y(); | 239 rb = rect.y(); |
233 } | 240 } |
234 } | 241 } |
235 return Class(rx, ry, rr - rx, rb - ry); | 242 SetRect(rx, ry, rr - rx, rb - ry); |
236 } | 243 } |
237 | 244 |
238 template<typename Class, | 245 template<typename Class, |
239 typename PointClass, | 246 typename PointClass, |
240 typename SizeClass, | 247 typename SizeClass, |
241 typename InsetsClass, | 248 typename InsetsClass, |
242 typename Type> | 249 typename Type> |
243 Class RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::AdjustToFit( | 250 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::AdjustToFit( |
244 const Class& rect) const { | 251 const Class& rect) { |
245 Type new_x = x(); | 252 Type new_x = x(); |
246 Type new_y = y(); | 253 Type new_y = y(); |
247 Type new_width = width(); | 254 Type new_width = width(); |
248 Type new_height = height(); | 255 Type new_height = height(); |
249 AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width); | 256 AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width); |
250 AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height); | 257 AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height); |
251 return Class(new_x, new_y, new_width, new_height); | 258 SetRect(new_x, new_y, new_width, new_height); |
252 } | 259 } |
253 | 260 |
254 template<typename Class, | 261 template<typename Class, |
255 typename PointClass, | 262 typename PointClass, |
256 typename SizeClass, | 263 typename SizeClass, |
257 typename InsetsClass, | 264 typename InsetsClass, |
258 typename Type> | 265 typename Type> |
259 PointClass RectBase<Class, PointClass, SizeClass, InsetsClass, Type>:: | 266 PointClass RectBase<Class, PointClass, SizeClass, InsetsClass, Type>:: |
260 CenterPoint() const { | 267 CenterPoint() const { |
261 return PointClass(x() + width() / 2, y() + height() / 2); | 268 return PointClass(x() + width() / 2, y() + height() / 2); |
262 } | 269 } |
263 | 270 |
264 template<typename Class, | 271 template<typename Class, |
265 typename PointClass, | 272 typename PointClass, |
266 typename SizeClass, | 273 typename SizeClass, |
267 typename InsetsClass, | 274 typename InsetsClass, |
268 typename Type> | 275 typename Type> |
269 Class RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::Center( | 276 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>:: |
270 const SizeClass& size) const { | 277 ClampToCenteredSize(const SizeClass& size) { |
271 Type new_width = std::min(width(), size.width()); | 278 Type new_width = std::min(width(), size.width()); |
272 Type new_height = std::min(height(), size.height()); | 279 Type new_height = std::min(height(), size.height()); |
273 Type new_x = x() + (width() - new_width) / 2; | 280 Type new_x = x() + (width() - new_width) / 2; |
274 Type new_y = y() + (height() - new_height) / 2; | 281 Type new_y = y() + (height() - new_height) / 2; |
275 return Class(new_x, new_y, new_width, new_height); | 282 SetRect(new_x, new_y, new_width, new_height); |
276 } | 283 } |
277 | 284 |
278 template<typename Class, | 285 template<typename Class, |
279 typename PointClass, | 286 typename PointClass, |
280 typename SizeClass, | 287 typename SizeClass, |
281 typename InsetsClass, | 288 typename InsetsClass, |
282 typename Type> | 289 typename Type> |
283 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::SplitVertically( | 290 void RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::SplitVertically( |
284 Class* left_half, Class* right_half) const { | 291 Class* left_half, Class* right_half) const { |
285 DCHECK(left_half); | 292 DCHECK(left_half); |
(...skipping 13 matching lines...) Expand all Loading... |
299 typename Type> | 306 typename Type> |
300 bool RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::SharesEdgeWith( | 307 bool RectBase<Class, PointClass, SizeClass, InsetsClass, Type>::SharesEdgeWith( |
301 const Class& rect) const { | 308 const Class& rect) const { |
302 return (y() == rect.y() && height() == rect.height() && | 309 return (y() == rect.y() && height() == rect.height() && |
303 (x() == rect.right() || right() == rect.x())) || | 310 (x() == rect.right() || right() == rect.x())) || |
304 (x() == rect.x() && width() == rect.width() && | 311 (x() == rect.x() && width() == rect.width() && |
305 (y() == rect.bottom() || bottom() == rect.y())); | 312 (y() == rect.bottom() || bottom() == rect.y())); |
306 } | 313 } |
307 | 314 |
308 } // namespace gfx | 315 } // namespace gfx |
OLD | NEW |