RoundRectTest.cpp revision d686ac77c2c485c4a3302eda9c1de597a6f8c568
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 320363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void TestRoundRect(skiatest::Reporter* reporter) { 321363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_basic(reporter); 322363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_rects(reporter); 323363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_ovals(reporter); 324363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_general(reporter); 325363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_iffy_parameters(reporter); 326d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger test_inset(reporter); 327363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 328363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 329363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "TestClassDef.h" 330363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEFINE_TESTCLASS("RoundRect", TestRoundRectClass, TestRoundRect) 331