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 // Defines a simple integer rectangle class. The containment semantics | 5 // Defines a simple integer rectangle class. The containment semantics |
6 // are array-like; that is, the coordinate (x, y) is considered to be | 6 // are array-like; that is, the coordinate (x, y) is considered to be |
7 // contained by the rectangle, but the coordinate (x + width, y) is not. | 7 // contained by the rectangle, but the coordinate (x + width, y) is not. |
8 // The class will happily let you create malformed rectangles (that is, | 8 // The class will happily let you create malformed rectangles (that is, |
9 // rectangles with negative width and/or height), but there will be assertions | 9 // rectangles with negative width and/or height), but there will be assertions |
10 // in the operations (such as Contains()) to complain in this case. | 10 // in the operations (such as Contains()) to complain in this case. |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 x : static_cast<int>(std::floor(rect.right() * x_scale)); | 333 x : static_cast<int>(std::floor(rect.right() * x_scale)); |
334 int b = rect.height() == 0 ? | 334 int b = rect.height() == 0 ? |
335 y : static_cast<int>(std::floor(rect.bottom() * y_scale)); | 335 y : static_cast<int>(std::floor(rect.bottom() * y_scale)); |
336 return Rect(x, y, r - x, b - y); | 336 return Rect(x, y, r - x, b - y); |
337 } | 337 } |
338 | 338 |
339 inline Rect ScaleToEnclosedRect(const Rect& rect, float scale) { | 339 inline Rect ScaleToEnclosedRect(const Rect& rect, float scale) { |
340 return ScaleToEnclosedRect(rect, scale, scale); | 340 return ScaleToEnclosedRect(rect, scale, scale); |
341 } | 341 } |
342 | 342 |
| 343 // Scales |rect| by scaling its four corner points. If the corner points lie on |
| 344 // non-integral coordinate after scaling, their values are rounded to the |
| 345 // nearest integer. |
| 346 // This is helpful during layout when relative positions of multiple gfx::Rect |
| 347 // in a given coordinate space needs to be same after scaling as it was before |
| 348 // scaling. ie. this gives a lossless relative positioning of rects. |
| 349 inline Rect ScaleToRoundedRect(const Rect& rect, float x_scale, float y_scale) { |
| 350 if (x_scale == 1.f && y_scale == 1.f) |
| 351 return rect; |
| 352 |
| 353 DCHECK( |
| 354 base::IsValueInRangeForNumericType<int>(std::round(rect.x() * x_scale))); |
| 355 DCHECK( |
| 356 base::IsValueInRangeForNumericType<int>(std::round(rect.y() * y_scale))); |
| 357 DCHECK(base::IsValueInRangeForNumericType<int>( |
| 358 std::round(rect.right() * x_scale))); |
| 359 DCHECK(base::IsValueInRangeForNumericType<int>( |
| 360 std::round(rect.bottom() * y_scale))); |
| 361 |
| 362 int x = static_cast<int>(std::round(rect.x() * x_scale)); |
| 363 int y = static_cast<int>(std::round(rect.y() * y_scale)); |
| 364 int r = rect.width() == 0 |
| 365 ? x |
| 366 : static_cast<int>(std::round(rect.right() * x_scale)); |
| 367 int b = rect.height() == 0 |
| 368 ? y |
| 369 : static_cast<int>(std::round(rect.bottom() * y_scale)); |
| 370 |
| 371 return Rect(x, y, r - x, b - y); |
| 372 } |
| 373 |
| 374 inline Rect ScaleToRoundedRect(const Rect& rect, float scale) { |
| 375 return ScaleToRoundedRect(rect, scale, scale); |
| 376 } |
| 377 |
343 // This is declared here for use in gtest-based unit tests but is defined in | 378 // This is declared here for use in gtest-based unit tests but is defined in |
344 // the //ui/gfx:test_support target. Depend on that to use this in your unit | 379 // the //ui/gfx:test_support target. Depend on that to use this in your unit |
345 // test. This should not be used in production code - call ToString() instead. | 380 // test. This should not be used in production code - call ToString() instead. |
346 void PrintTo(const Rect& rect, ::std::ostream* os); | 381 void PrintTo(const Rect& rect, ::std::ostream* os); |
347 | 382 |
348 } // namespace gfx | 383 } // namespace gfx |
349 | 384 |
350 #endif // UI_GFX_GEOMETRY_RECT_H_ | 385 #endif // UI_GFX_GEOMETRY_RECT_H_ |
OLD | NEW |