1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "Test.h"
9 #include "SkRandom.h"
10 #include "SkRect.h"
11
12 #ifdef SK_SCALAR_IS_FLOAT
make_zero()13 static float make_zero() {
14 return sk_float_sin(0);
15 }
16 #endif
17
18 struct RectCenter {
19 SkIRect fRect;
20 SkIPoint fCenter;
21 };
22
test_center(skiatest::Reporter * reporter)23 static void test_center(skiatest::Reporter* reporter) {
24 static const RectCenter gData[] = {
25 { { 0, 0, 0, 0 }, { 0, 0 } },
26 { { 0, 0, 1, 1 }, { 0, 0 } },
27 { { -1, -1, 0, 0 }, { -1, -1 } },
28 { { 0, 0, 10, 7 }, { 5, 3 } },
29 { { 0, 0, 11, 6 }, { 5, 3 } },
30 };
31 for (size_t index = 0; index < SK_ARRAY_COUNT(gData); ++index) {
32 REPORTER_ASSERT(reporter,
33 gData[index].fRect.centerX() == gData[index].fCenter.x());
34 REPORTER_ASSERT(reporter,
35 gData[index].fRect.centerY() == gData[index].fCenter.y());
36 }
37
38 SkRandom rand;
39 for (int i = 0; i < 10000; ++i) {
40 SkIRect r;
41
42 r.set(rand.nextS() >> 2, rand.nextS() >> 2,
43 rand.nextS() >> 2, rand.nextS() >> 2);
44 int cx = r.centerX();
45 int cy = r.centerY();
46 REPORTER_ASSERT(reporter, ((r.left() + r.right()) >> 1) == cx);
47 REPORTER_ASSERT(reporter, ((r.top() + r.bottom()) >> 1) == cy);
48 }
49 }
50
check_invalid(skiatest::Reporter * reporter,SkScalar l,SkScalar t,SkScalar r,SkScalar b)51 static void check_invalid(skiatest::Reporter* reporter,
52 SkScalar l, SkScalar t, SkScalar r, SkScalar b) {
53 SkRect rect;
54 rect.set(l, t, r, b);
55 REPORTER_ASSERT(reporter, !rect.isFinite());
56 }
57
58 // Tests that isFinite() will reject any rect with +/-inf values
59 // as one of its coordinates.
TestInfRect(skiatest::Reporter * reporter)60 static void TestInfRect(skiatest::Reporter* reporter) {
61 #ifdef SK_SCALAR_IS_FLOAT
62 float inf = 1 / make_zero(); // infinity
63 float nan = inf * 0;
64 SkASSERT(!(nan == nan));
65 #else
66 SkFixed inf = SK_FixedNaN;
67 SkFixed nan = SK_FixedNaN;
68 #endif
69 SkScalar small = SkIntToScalar(10);
70 SkScalar big = SkIntToScalar(100);
71
72 REPORTER_ASSERT(reporter, SkRect::MakeEmpty().isFinite());
73
74 SkRect rect = SkRect::MakeXYWH(small, small, big, big);
75 REPORTER_ASSERT(reporter, rect.isFinite());
76
77 const SkScalar invalid[] = { nan, inf, -inf };
78 for (size_t i = 0; i < SK_ARRAY_COUNT(invalid); ++i) {
79 check_invalid(reporter, small, small, big, invalid[i]);
80 check_invalid(reporter, small, small, invalid[i], big);
81 check_invalid(reporter, small, invalid[i], big, big);
82 check_invalid(reporter, invalid[i], small, big, big);
83 }
84
85 test_center(reporter);
86 }
87
88 // need tests for SkStrSearch
89
90 #include "TestClassDef.h"
91 DEFINE_TESTCLASS("InfRect", InfRectTestClass, TestInfRect)
92