add centerX() and centerY() to SkIRect (because they made me)

Review URL: https://codereview.appspot.com/6826078

git-svn-id: http://skia.googlecode.com/svn/trunk@6360 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2012-11-08 22:36:19 +00:00
parent fc5100af55
commit 6898d52c37
2 changed files with 52 additions and 0 deletions

View File

@ -71,6 +71,24 @@ struct SK_API SkIRect {
*/
int height() const { return fBottom - fTop; }
/**
* Since the center of an integer rect may fall on a factional value, this
* method is defined to return (right + left) >> 1.
*
* This is a specific "truncation" of the average, which is different than
* (right + left) / 2 when the sum is negative.
*/
int centerX() const { return (fRight + fLeft) >> 1; }
/**
* Since the center of an integer rect may fall on a factional value, this
* method is defined to return (bottom + top) >> 1
*
* This is a specific "truncation" of the average, which is different than
* (bottom + top) / 2 when the sum is negative.
*/
int centerY() const { return (fBottom + fTop) >> 1; }
/**
* Return true if the rectangle's width or height are <= 0
*/

View File

@ -6,6 +6,7 @@
* found in the LICENSE file.
*/
#include "Test.h"
#include "SkRandom.h"
#include "SkRect.h"
#ifdef SK_SCALAR_IS_FLOAT
@ -14,6 +15,37 @@ static float make_zero() {
}
#endif
static void test_center(skiatest::Reporter* reporter) {
static const struct {
SkIRect fRect;
SkIPoint fCenter;
} data[] = {
{ { 0, 0, 0, 0 }, { 0, 0 } },
{ { 0, 0, 1, 1 }, { 0, 0 } },
{ { -1, -1, 0, 0 }, { -1, -1 } },
{ { 0, 0, 10, 7 }, { 5, 3 } },
{ { 0, 0, 11, 6 }, { 5, 3 } },
};
for (size_t index = 0; index < SK_ARRAY_COUNT(data); ++index) {
REPORTER_ASSERT(reporter,
data[index].fRect.centerX() == data[index].fCenter.x());
REPORTER_ASSERT(reporter,
data[index].fRect.centerY() == data[index].fCenter.y());
}
SkRandom rand;
for (int i = 0; i < 10000; ++i) {
SkIRect r;
r.set(rand.nextS() >> 2, rand.nextS() >> 2,
rand.nextS() >> 2, rand.nextS() >> 2);
int cx = r.centerX();
int cy = r.centerY();
REPORTER_ASSERT(reporter, (r.left() + r.right() >> 1) == cx);
REPORTER_ASSERT(reporter, (r.top() + r.bottom() >> 1) == cy);
}
}
static void check_invalid(skiatest::Reporter* reporter,
SkScalar l, SkScalar t, SkScalar r, SkScalar b) {
SkRect rect;
@ -47,6 +79,8 @@ static void TestInfRect(skiatest::Reporter* reporter) {
check_invalid(reporter, small, invalid[i], big, big);
check_invalid(reporter, invalid[i], small, big, big);
}
test_center(reporter);
}
// need tests for SkStrSearch