• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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