1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "Test.h" 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkRRect.h" 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic const SkScalar kWidth = 100.0f; 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic const SkScalar kHeight = 100.0f; 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 14d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerstatic void test_inset(skiatest::Reporter* reporter) { 15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkRRect rr, rr2; 16d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkRect r = { 0, 0, 100, 100 }; 17d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 18d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.setRect(r); 19d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(-20, -20, &rr2); 20d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 21d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(20, 20, &rr2); 23d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 24d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(r.width()/2, r.height()/2, &rr2); 26d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isEmpty()); 27d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.setRectXY(r, 20, 20); 29d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(19, 19, &rr2); 30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isSimple()); 31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(20, 20, &rr2); 32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 33d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger} 34d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the basic API entry points 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_basic(skiatest::Reporter* reporter) { 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Test out initialization methods 38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkPoint zeroPt = { 0, 0 }; 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect empty; 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger empty.setEmpty(); 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, empty.rect().isEmpty()); 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, zeroPt == empty.radii((SkRRect::Corner) i)); 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRect(rect); 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr1.rect() == rect); 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, zeroPt == rr1.radii((SkRRect::Corner) i)); 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint halfPoint = { SkScalarHalf(kWidth), SkScalarHalf(kHeight) }; 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setOval(rect); 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr2.type()); 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr2.rect() == rect); 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.radii((SkRRect::Corner) i).equalsWithinTolerance(halfPoint)); 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint p = { 5, 5 }; 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr3; 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr3.setRectXY(rect, p.fX, p.fY); 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr3.type()); 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr3.rect() == rect); 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, p == rr3.radii((SkRRect::Corner) i)); 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 5, 5 }, { 5, 5 }, { 5, 5 }, { 5, 5 } }; 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr4; 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr4.setRectRadii(rect, radii); 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr4.type()); 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr4.rect() == rect); 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, radii[i] == rr4.radii((SkRRect::Corner) i)); 99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii2[4] = { { 0, 0 }, { 0, 0 }, { 50, 50 }, { 20, 50 } }; 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr5; 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr5.setRectRadii(rect, radii2); 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr5.type()); 108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr5.rect() == rect); 109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, radii2[i] == rr5.radii((SkRRect::Corner) i)); 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Test out == & != 115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, empty != rr3); 116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr3 == rr4); 117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr4 != rr5); 118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the cases when the RR degenerates to a rect 121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_rects(skiatest::Reporter* reporter) { 122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect r; 123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, -SK_Scalar1 }, // out 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SK_Scalar1 }, // in 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(101), -SK_Scalar1}, // out 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(99), SK_Scalar1 }, // in 130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(101), SkIntToScalar(101) }, // out 132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(99), SkIntToScalar(99) }, // in 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, SkIntToScalar(101) }, // out 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SkIntToScalar(99) }, // in 136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect empty; 145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger empty.setEmpty(); 147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = empty.rect(); 150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0 == r.fLeft && 0 == r.fTop && 0 == r.fRight && 0 == r.fBottom); 151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, 0, 0); 156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = rr1.rect(); 159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rect == r); 160363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 161363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 162363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectRadii(rect, radii); 169363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 170363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 171363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = rr2.rect(); 172363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rect == r); 173363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 174363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr2.contains(pts[i].fX, pts[i].fY)); 175363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 176363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 177363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 178363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii2[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 179363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 180363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr3; 181363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr3.setRectRadii(rect, radii2); 182363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr3.type()); 183363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 184363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 185363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the cases when the RR degenerates to an oval 186363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_ovals(skiatest::Reporter* reporter) { 187363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kEps = 0.1f; 188363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kWidthTol = SkScalarHalf(kWidth) * (SK_Scalar1 - SK_ScalarRoot2Over2); 189363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kHeightTol = SkScalarHalf(kHeight) * (SK_Scalar1 - SK_ScalarRoot2Over2); 190363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 191363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 192363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol - kEps, kHeightTol - kEps }, // out 193363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol + kEps, kHeightTol + kEps }, // in 194363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 195363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kWidthTol, kHeightTol - kEps }, // out 196363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kWidthTol, kHeightTol + kEps }, // in 197363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 198363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kWidthTol, kHeight + kEps - kHeightTol }, // out 199363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kWidthTol, kHeight - kEps - kHeightTol }, // in 200363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 201363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol - kEps, kHeight + kEps - kHeightTol }, //out 202363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol + kEps, kHeight - kEps - kHeightTol }, // in 203363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 204363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 205363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 206363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 207363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 208363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 209363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 211363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect oval; 212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 213363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 214363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, SkScalarHalf(kWidth), SkScalarHalf(kHeight)); 215363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 216363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr1.type()); 217363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger oval = rr1.rect(); 218363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, oval == rect); 219363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 220363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 221363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 222363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 223363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 224363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the non-degenerate RR cases 225363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_general(skiatest::Reporter* reporter) { 226363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kEps = 0.1f; 227363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kDist20 = 20 * (SK_Scalar1 - SK_ScalarRoot2Over2); 228363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 229363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 230363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kDist20 - kEps }, // out 231363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kDist20 + kEps }, // in 232363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 233363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kDist20 - kEps }, // out 234363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kDist20 + kEps }, // in 235363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 236363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kHeight + kEps - kDist20 }, // out 237363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kHeight - kEps - kDist20 }, // in 238363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 239363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kHeight + kEps - kDist20 }, //out 240363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kHeight - kEps - kDist20 }, // in 241363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 242363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 243363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 244363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 245363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 246363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 247363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 248363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 249363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 250363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 251363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, 20, 20); 252363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 253363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr1.type()); 254363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 255363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 256363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 257363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 258363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 259363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kDist50 = 50*(SK_Scalar1 - SK_ScalarRoot2Over2); 260363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts2[] = { 261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 262363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, -SK_Scalar1 }, // out 263363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SK_Scalar1 }, // in 264363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 265363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kDist20 - kEps }, // out 266363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kDist20 + kEps }, // in 267363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 268363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist50, kHeight + kEps - kDist50 }, // out 269363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist50, kHeight - kEps - kDist50 }, // in 270363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 271363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kHeight + kEps - kDist50 }, // out 272363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kHeight - kEps - kDist50 }, // in 273363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 274363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 275363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 276363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 277363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts2) == SK_ARRAY_COUNT(isIn)); 278363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 279363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 280363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 281363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 282363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectRadii(rect, radii); 283363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 284363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr2.type()); 285363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 286363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr2.contains(pts2[i].fX, pts2[i].fY)); 287363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 288363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 289363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 290363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out questionable-parameter handling 291363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_iffy_parameters(skiatest::Reporter* reporter) { 292363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 293363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // When the radii exceed the base rect they are proportionally scaled down 294363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // to fit 295363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 296363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 50, 100 }, { 100, 50 }, { 50, 100 }, { 100, 50 } }; 297363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 298363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 299363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectRadii(rect, radii); 300363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 301363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr1.type()); 302363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 303363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkPoint& p = rr1.radii(SkRRect::kUpperLeft_Corner); 304363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 305363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fX, 33.33333f)); 306363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fY, 66.66666f)); 307363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 308363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Negative radii should be capped at zero 309363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 310363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectXY(rect, -10, -20); 311363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 312363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 313363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 314363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkPoint& p2 = rr2.radii(SkRRect::kUpperLeft_Corner); 315363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 316363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0.0f == p2.fX); 317363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0.0f == p2.fY); 318363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 319363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 3207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// Move a small box from the start position by (stepX, stepY) 'numSteps' times 3217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// testing for containment in 'rr' at each step. 3227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void test_direction(skiatest::Reporter* reporter, const SkRRect &rr, 3237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkScalar initX, int stepX, SkScalar initY, int stepY, 3247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int numSteps, const bool* contains) { 3257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkScalar x = initX, y = initY; 3267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < numSteps; ++i) { 3277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkRect test = SkRect::MakeXYWH(x, y, 3287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger stepX ? SkIntToScalar(stepX) : SK_Scalar1, 3297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger stepY ? SkIntToScalar(stepY) : SK_Scalar1); 3307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test.sort(); 3317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger REPORTER_ASSERT(reporter, contains[i] == rr.contains(test)); 3337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger x += stepX; 3357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger y += stepY; 3367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 3387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// Exercise the RR's contains rect method 3407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void test_round_rect_contains_rect(skiatest::Reporter* reporter) { 3417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kNumRRects = 4; 3437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const SkVector gRadii[kNumRRects][4] = { 3447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }, // rect 3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 20, 20 }, { 20, 20 }, { 20, 20 }, { 20, 20 } }, // circle 3467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 10, 10 }, { 10, 10 }, { 10, 10 }, { 10, 10 } }, // simple 3477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 0, 0 }, { 20, 20 }, { 10, 10 }, { 30, 30 } } // complex 3487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 3497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkRRect rrects[kNumRRects]; 3517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 3527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger rrects[i].setRectRadii(SkRect::MakeWH(40, 40), gRadii[i]); 3537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // First test easy outs - boxes that are obviously out on 3567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // each corner and edge 3577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const SkRect easyOuts[] = { 3587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, -5, 5, 5 }, // NW 3597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 15, -5, 20, 5 }, // N 3607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, -5, 45, 5 }, // NE 3617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, 15, 45, 20 }, // E 3627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, 45, 35, 45 }, // SE 3637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 15, 35, 20, 45 }, // S 3647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, 35, 5, 45 }, // SW 3657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, 15, 5, 20 } // W 3667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 3677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 3697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (size_t j = 0; j < SK_ARRAY_COUNT(easyOuts); ++j) { 3707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger REPORTER_ASSERT(reporter, !rrects[i].contains(easyOuts[j])); 3717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Now test non-trivial containment. For each compass 3757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // point walk a 1x1 rect in from the edge of the bounding 3767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // rect 3777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kNumSteps = 15; 3787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool answers[kNumRRects][8][kNumSteps] = { 3797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // all the test rects are inside the degenerate rrect 3807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 3817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // rect 3827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 3917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the circle we expect 6 blocks to be out on the 3927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // corners (then the rest in) and only the first block 3937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // out on the vertical and horizontal axes (then 3947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // the rest in) 3957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 3967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // circle 3977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 4067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the simple round rect we expect 3 out on 4077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // the corners (then the rest in) and no blocks out 4087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // on the vertical and horizontal axes 4097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 4107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // simple RR 4117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 4207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the complex case the answer is different for each direction 4217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 4227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // complex RR 4237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // all in for NW (rect) corner (same as rect case) 4247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // only first block out for N (same as circle case) 4267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 6 blocks out for NE (same as circle case) 4287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // only first block out for E (same as circle case) 4307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 3 blocks out for SE (same as simple case) 4327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first two blocks out for S 4347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 9 blocks out for SW 4367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, 4377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first two blocks out for W (same as S) 4387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 4407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 4417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 4427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 4437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 0, 1, kNumSteps, answers[i][0]); // NW 4447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 19.5f, 0, 0, 1, kNumSteps, answers[i][1]); // N 4457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 0, 1, kNumSteps, answers[i][2]); // NE 4467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 19.5f, 0, kNumSteps, answers[i][3]); // E 4477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 40, -1, kNumSteps, answers[i][4]); // SE 4487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 19.5f, 0, 40, -1, kNumSteps, answers[i][5]); // S 4497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 40, -1, kNumSteps, answers[i][6]); // SW 4507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 19.5f, 0, kNumSteps, answers[i][7]); // W 4517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 4527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 4537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 454363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void TestRoundRect(skiatest::Reporter* reporter) { 455363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_basic(reporter); 456363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_rects(reporter); 457363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_ovals(reporter); 458363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_general(reporter); 459363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_iffy_parameters(reporter); 460d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger test_inset(reporter); 4617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_round_rect_contains_rect(reporter); 462363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 463363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 464363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "TestClassDef.h" 465363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEFINE_TESTCLASS("RoundRect", TestRoundRectClass, TestRoundRect) 466