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" 94db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III#include "SkMatrix.h" 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkRRect.h" 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 124db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins IIIstatic const SkScalar kWidth = SkFloatToScalar(100.0f); 134db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins IIIstatic const SkScalar kHeight = SkFloatToScalar(100.0f); 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerstatic void test_inset(skiatest::Reporter* reporter) { 16d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkRRect rr, rr2; 17d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkRect r = { 0, 0, 100, 100 }; 18d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 19d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.setRect(r); 20d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(-20, -20, &rr2); 21d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 23d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(20, 20, &rr2); 24d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 26d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(r.width()/2, r.height()/2, &rr2); 27d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isEmpty()); 28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 29d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.setRectXY(r, 20, 20); 30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(19, 19, &rr2); 31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isSimple()); 32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger rr.inset(20, 20, &rr2); 33d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger REPORTER_ASSERT(reporter, rr2.isRect()); 34d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger} 35d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the basic API entry points 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_basic(skiatest::Reporter* reporter) { 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Test out initialization methods 39d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkPoint zeroPt = { 0, 0 }; 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect empty; 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger empty.setEmpty(); 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, empty.rect().isEmpty()); 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, zeroPt == empty.radii((SkRRect::Corner) i)); 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRect(rect); 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr1.rect() == rect); 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, zeroPt == rr1.radii((SkRRect::Corner) i)); 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint halfPoint = { SkScalarHalf(kWidth), SkScalarHalf(kHeight) }; 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setOval(rect); 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr2.type()); 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr2.rect() == rect); 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.radii((SkRRect::Corner) i).equalsWithinTolerance(halfPoint)); 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint p = { 5, 5 }; 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr3; 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr3.setRectXY(rect, p.fX, p.fY); 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr3.type()); 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr3.rect() == rect); 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, p == rr3.radii((SkRRect::Corner) i)); 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 5, 5 }, { 5, 5 }, { 5, 5 }, { 5, 5 } }; 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr4; 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr4.setRectRadii(rect, radii); 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr4.type()); 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr4.rect() == rect); 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, radii[i] == rr4.radii((SkRRect::Corner) i)); 100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii2[4] = { { 0, 0 }, { 0, 0 }, { 50, 50 }, { 20, 50 } }; 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr5; 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr5.setRectRadii(rect, radii2); 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr5.type()); 109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr5.rect() == rect); 110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 4; ++i) { 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, radii2[i] == rr5.radii((SkRRect::Corner) i)); 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Test out == & != 116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, empty != rr3); 117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr3 == rr4); 118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rr4 != rr5); 119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the cases when the RR degenerates to a rect 122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_rects(skiatest::Reporter* reporter) { 123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect r; 124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, -SK_Scalar1 }, // out 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SK_Scalar1 }, // in 128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(101), -SK_Scalar1}, // out 130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(99), SK_Scalar1 }, // in 131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(101), SkIntToScalar(101) }, // out 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(99), SkIntToScalar(99) }, // in 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, SkIntToScalar(101) }, // out 136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SkIntToScalar(99) }, // in 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect empty; 146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger empty.setEmpty(); 148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = empty.rect(); 151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0 == r.fLeft && 0 == r.fTop && 0 == r.fRight && 0 == r.fBottom); 152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, 0, 0); 157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = rr1.rect(); 160363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rect == r); 161363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 162363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 169363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectRadii(rect, radii); 170363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 171363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 172363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger r = rr2.rect(); 173363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, rect == r); 174363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 175363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr2.contains(pts[i].fX, pts[i].fY)); 176363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 177363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 178363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 179363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii2[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 180363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 181363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr3; 182363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr3.setRectRadii(rect, radii2); 183363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr3.type()); 184363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 185363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 186363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the cases when the RR degenerates to an oval 187363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_ovals(skiatest::Reporter* reporter) { 188363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kEps = 0.1f; 189363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kWidthTol = SkScalarHalf(kWidth) * (SK_Scalar1 - SK_ScalarRoot2Over2); 190363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kHeightTol = SkScalarHalf(kHeight) * (SK_Scalar1 - SK_ScalarRoot2Over2); 191363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 192363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 193363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol - kEps, kHeightTol - kEps }, // out 194363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol + kEps, kHeightTol + kEps }, // in 195363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 196363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kWidthTol, kHeightTol - kEps }, // out 197363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kWidthTol, kHeightTol + kEps }, // in 198363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 199363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kWidthTol, kHeight + kEps - kHeightTol }, // out 200363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kWidthTol, kHeight - kEps - kHeightTol }, // in 201363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 202363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol - kEps, kHeight + kEps - kHeightTol }, //out 203363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidthTol + kEps, kHeight - kEps - kHeightTol }, // in 204363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 205363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 206363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 207363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 208363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 209363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 211363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect oval; 213363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 214363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 215363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, SkScalarHalf(kWidth), SkScalarHalf(kHeight)); 216363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 217363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr1.type()); 218363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger oval = rr1.rect(); 219363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, oval == rect); 220363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 221363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 222363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 223363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 224363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 225363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out the non-degenerate RR cases 226363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_general(skiatest::Reporter* reporter) { 227363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kEps = 0.1f; 228363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kDist20 = 20 * (SK_Scalar1 - SK_ScalarRoot2Over2); 229363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts[] = { 230363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 231363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kDist20 - kEps }, // out 232363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kDist20 + kEps }, // in 233363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 234363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kDist20 - kEps }, // out 235363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kDist20 + kEps }, // in 236363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 237363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kHeight + kEps - kDist20 }, // out 238363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kHeight - kEps - kDist20 }, // in 239363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 240363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kHeight + kEps - kDist20 }, //out 241363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kHeight - kEps - kDist20 }, // in 242363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 243363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 244363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 245363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const bool isIn[] = { false, true, false, true, false, true, false, true, true }; 246363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 247363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts) == SK_ARRAY_COUNT(isIn)); 248363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 249363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 250363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 251363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 252363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectXY(rect, 20, 20); 253363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 254363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr1.type()); 255363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 256363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr1.contains(pts[i].fX, pts[i].fY)); 257363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 258363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 259363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger //---- 260363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkScalar kDist50 = 50*(SK_Scalar1 - SK_ScalarRoot2Over2); 261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static const SkPoint pts2[] = { 262363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Left 263363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { -SK_Scalar1, -SK_Scalar1 }, // out 264363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SK_Scalar1, SK_Scalar1 }, // in 265363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Upper Right 266363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist20, kDist20 - kEps }, // out 267363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist20, kDist20 + kEps }, // in 268363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Right 269363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth + kEps - kDist50, kHeight + kEps - kDist50 }, // out 270363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kWidth - kEps - kDist50, kHeight - kEps - kDist50 }, // in 271363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Lower Left 272363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 - kEps, kHeight + kEps - kDist50 }, // out 273363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { kDist20 + kEps, kHeight - kEps - kDist50 }, // in 274363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Middle 275363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(50), SkIntToScalar(50) } // in 276363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 277363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 278363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(SK_ARRAY_COUNT(pts2) == SK_ARRAY_COUNT(isIn)); 279363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 280363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 281363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 282363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 283363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectRadii(rect, radii); 284363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 285363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr2.type()); 286363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 287363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, isIn[i] == rr2.contains(pts2[i].fX, pts2[i].fY)); 288363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 289363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 290363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 291363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// Test out questionable-parameter handling 292363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void test_round_rect_iffy_parameters(skiatest::Reporter* reporter) { 293363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 294363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // When the radii exceed the base rect they are proportionally scaled down 295363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // to fit 296363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 297363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint radii[4] = { { 50, 100 }, { 100, 50 }, { 50, 100 }, { 100, 50 } }; 298363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 299363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr1; 300363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr1.setRectRadii(rect, radii); 301363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 302363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr1.type()); 303363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 304363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkPoint& p = rr1.radii(SkRRect::kUpperLeft_Corner); 305363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 306363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fX, 33.33333f)); 307363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fY, 66.66666f)); 308363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 309363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Negative radii should be capped at zero 310363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkRRect rr2; 311363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger rr2.setRectXY(rect, -10, -20); 312363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 313363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 314363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 315363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkPoint& p2 = rr2.radii(SkRRect::kUpperLeft_Corner); 316363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 317363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0.0f == p2.fX); 318363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger REPORTER_ASSERT(reporter, 0.0f == p2.fY); 319363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 320363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 3217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// Move a small box from the start position by (stepX, stepY) 'numSteps' times 3227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// testing for containment in 'rr' at each step. 3237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void test_direction(skiatest::Reporter* reporter, const SkRRect &rr, 3247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkScalar initX, int stepX, SkScalar initY, int stepY, 3257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int numSteps, const bool* contains) { 3267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkScalar x = initX, y = initY; 3277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < numSteps; ++i) { 3287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkRect test = SkRect::MakeXYWH(x, y, 3297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger stepX ? SkIntToScalar(stepX) : SK_Scalar1, 3307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger stepY ? SkIntToScalar(stepY) : SK_Scalar1); 3317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test.sort(); 3327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger REPORTER_ASSERT(reporter, contains[i] == rr.contains(test)); 3347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger x += stepX; 3367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger y += stepY; 3377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 3397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// Exercise the RR's contains rect method 3417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void test_round_rect_contains_rect(skiatest::Reporter* reporter) { 3427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kNumRRects = 4; 3447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const SkVector gRadii[kNumRRects][4] = { 3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }, // rect 3467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 20, 20 }, { 20, 20 }, { 20, 20 }, { 20, 20 } }, // circle 3477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 10, 10 }, { 10, 10 }, { 10, 10 }, { 10, 10 } }, // simple 3487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { { 0, 0 }, { 20, 20 }, { 10, 10 }, { 30, 30 } } // complex 3497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 3507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkRRect rrects[kNumRRects]; 3527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 3537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger rrects[i].setRectRadii(SkRect::MakeWH(40, 40), gRadii[i]); 3547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // First test easy outs - boxes that are obviously out on 3577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // each corner and edge 3587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const SkRect easyOuts[] = { 3597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, -5, 5, 5 }, // NW 3607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 15, -5, 20, 5 }, // N 3617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, -5, 45, 5 }, // NE 3627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, 15, 45, 20 }, // E 3637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 35, 45, 35, 45 }, // SE 3647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 15, 35, 20, 45 }, // S 3657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, 35, 5, 45 }, // SW 3667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { -5, 15, 5, 20 } // W 3677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 3687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 3707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (size_t j = 0; j < SK_ARRAY_COUNT(easyOuts); ++j) { 3717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger REPORTER_ASSERT(reporter, !rrects[i].contains(easyOuts[j])); 3727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Now test non-trivial containment. For each compass 3767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // point walk a 1x1 rect in from the edge of the bounding 3777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // rect 3787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kNumSteps = 15; 3797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool answers[kNumRRects][8][kNumSteps] = { 3807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // all the test rects are inside the degenerate rrect 3817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 3827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // rect 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 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 3927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the circle we expect 6 blocks to be out on the 3937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // corners (then the rest in) and only the first block 3947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // out on the vertical and horizontal axes (then 3957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // the rest in) 3967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 3977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // circle 3987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 3997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 4077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the simple round rect we expect 3 out on 4087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // the corners (then the rest in) and no blocks out 4097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // on the vertical and horizontal axes 4107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 4117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // simple RR 4127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }, 4217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // for the complex case the answer is different for each direction 4227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 4237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // complex RR 4247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // all in for NW (rect) corner (same as rect case) 4257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // only first block out for N (same as circle case) 4277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 6 blocks out for NE (same as circle case) 4297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // only first block out for E (same as circle case) 4317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 3 blocks out for SE (same as simple case) 4337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first two blocks out for S 4357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first 9 blocks out for SW 4377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, 4387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // first two blocks out for W (same as S) 4397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 4407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 4417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 4427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 4437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < kNumRRects; ++i) { 4447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 0, 1, kNumSteps, answers[i][0]); // NW 4457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 19.5f, 0, 0, 1, kNumSteps, answers[i][1]); // N 4467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 0, 1, kNumSteps, answers[i][2]); // NE 4477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 19.5f, 0, kNumSteps, answers[i][3]); // E 4487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 40, -1, 40, -1, kNumSteps, answers[i][4]); // SE 4497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 19.5f, 0, 40, -1, kNumSteps, answers[i][5]); // S 4507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 40, -1, kNumSteps, answers[i][6]); // SW 4517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_direction(reporter, rrects[i], 0, 1, 19.5f, 0, kNumSteps, answers[i][7]); // W 4527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 4537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 4547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 4554db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III// Called for a matrix that should cause SkRRect::transform to fail. 4564db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins IIIstatic void assert_transform_failure(skiatest::Reporter* reporter, const SkRRect& orig, 4574db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkMatrix& matrix) { 4584db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // The test depends on the fact that the original is not empty. 4594db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkASSERT(!orig.isEmpty()); 4604db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkRRect dst; 4614db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 4624db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 4634db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkRRect copyOfDst = dst; 4644db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkRRect copyOfOrig = orig; 4654db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III bool success = orig.transform(matrix, &dst); 4664db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // This transform should fail. 4674db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, !success); 4684db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Since the transform failed, dst should be unchanged. 4694db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, copyOfDst == dst); 4704db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // original should not be modified. 4714db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, copyOfOrig == orig); 4724db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig != dst); 4734db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III} 4744db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 4754db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III#define GET_RADII \ 4764db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& origUL = orig.radii(SkRRect::kUpperLeft_Corner); \ 4774db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& origUR = orig.radii(SkRRect::kUpperRight_Corner); \ 4784db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& origLR = orig.radii(SkRRect::kLowerRight_Corner); \ 4794db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& origLL = orig.radii(SkRRect::kLowerLeft_Corner); \ 4804db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& dstUL = dst.radii(SkRRect::kUpperLeft_Corner); \ 4814db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& dstUR = dst.radii(SkRRect::kUpperRight_Corner); \ 4824db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& dstLR = dst.radii(SkRRect::kLowerRight_Corner); \ 4834db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III const SkVector& dstLL = dst.radii(SkRRect::kLowerLeft_Corner) 4844db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 4854db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III// Called to test various transforms on a single SkRRect. 4864db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins IIIstatic void test_transform_helper(skiatest::Reporter* reporter, const SkRRect& orig) { 4874db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkRRect dst; 4884db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 4894db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 4904db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // The identity matrix will duplicate the rrect. 4914db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III bool success = orig.transform(SkMatrix::I(), &dst); 4924db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 4934db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig == dst); 4944db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 4954db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Skew and Perspective make transform fail. 4964db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkMatrix matrix; 4974db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 4984db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setSkewX(SkIntToScalar(2)); 4994db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5004db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5014db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5024db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setSkewY(SkIntToScalar(3)); 5034db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5044db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5054db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5064db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setPerspX(SkScalarToPersp(SkIntToScalar(4))); 5074db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5084db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5094db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5104db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setPerspY(SkScalarToPersp(SkIntToScalar(5))); 5114db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5124db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5134db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Rotation fails. 5144db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5154db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setRotate(SkIntToScalar(90)); 5164db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5174db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setRotate(SkIntToScalar(37)); 5184db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5194db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5204db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Translate will keep the rect moved, but otherwise the same. 5214db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5224db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalar translateX = SkIntToScalar(32); 5234db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalar translateY = SkIntToScalar(15); 5244db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setTranslateX(translateX); 5254db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setTranslateY(translateY); 5264db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 5274db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III success = orig.transform(matrix, &dst); 5284db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 5294db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III for (int i = 0; i < 4; ++i) { 5304db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, 5314db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III orig.radii((SkRRect::Corner) i) == dst.radii((SkRRect::Corner) i)); 5324db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 5334db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 5344db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 5354db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, dst.rect().left() == orig.rect().left() + translateX); 5364db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, dst.rect().top() == orig.rect().top() + translateY); 5374db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5384db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Keeping the translation, but adding skew will make transform fail. 5394db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setSkewY(SkIntToScalar(7)); 5404db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5414db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5424db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Scaling in -x will flip the round rect horizontally. 5434db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5444db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleX(SkIntToScalar(-1)); 5454db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 5464db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III success = orig.transform(matrix, &dst); 5474db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 5484db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { 5494db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III GET_RADII; 5504db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Radii have swapped in x. 5514db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUL == dstUR); 5524db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUR == dstUL); 5534db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLR == dstLL); 5544db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLL == dstLR); 5554db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 5564db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Width and height remain the same. 5574db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 5584db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 5594db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Right and left have swapped (sort of) 5604db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().right() == -dst.rect().left()); 5614db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Top has stayed the same. 5624db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().top() == dst.rect().top()); 5634db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5644db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Keeping the scale, but adding a persp will make transform fail. 5654db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setPerspX(SkScalarToPersp(SkIntToScalar(7))); 5664db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III assert_transform_failure(reporter, orig, matrix); 5674db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5684db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Scaling in -y will flip the round rect vertically. 5694db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5704db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleY(SkIntToScalar(-1)); 5714db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 5724db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III success = orig.transform(matrix, &dst); 5734db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 5744db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { 5754db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III GET_RADII; 5764db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Radii have swapped in y. 5774db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUL == dstLL); 5784db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUR == dstLR); 5794db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLR == dstUR); 5804db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLL == dstUL); 5814db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 5824db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Width and height remain the same. 5834db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 5844db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 5854db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Top and bottom have swapped (sort of) 5864db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().top() == -dst.rect().bottom()); 5874db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Left has stayed the same. 5884db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().left() == dst.rect().left()); 5894db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 5904db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Scaling in -x and -y will swap in both directions. 5914db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 5924db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleY(SkIntToScalar(-1)); 5934db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleX(SkIntToScalar(-1)); 5944db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 5954db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III success = orig.transform(matrix, &dst); 5964db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 5974db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { 5984db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III GET_RADII; 5994db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUL == dstLR); 6004db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origUR == dstLL); 6014db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLR == dstUL); 6024db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, origLL == dstUR); 6034db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 6044db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Width and height remain the same. 6054db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 6064db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 6074db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().top() == -dst.rect().bottom()); 6084db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, orig.rect().right() == -dst.rect().left()); 6094db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 6104db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Scale in both directions. 6114db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalar xScale = SkIntToScalar(3); 6124db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalar yScale = SkFloatToScalar(3.2f); 6134db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.reset(); 6144db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleX(xScale); 6154db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III matrix.setScaleY(yScale); 6164db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III dst.setEmpty(); 6174db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III success = orig.transform(matrix, &dst); 6184db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, success); 6194db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III // Radii are scaled. 6204db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III for (int i = 0; i < 4; ++i) { 6214db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.radii((SkRRect::Corner) i).fX, 6224db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.radii((SkRRect::Corner) i).fX, xScale))); 6234db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.radii((SkRRect::Corner) i).fY, 6244db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.radii((SkRRect::Corner) i).fY, yScale))); 6254db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 6264db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().width(), 6274db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.rect().width(), xScale))); 6284db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().height(), 6294db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.rect().height(), yScale))); 6304db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().left(), 6314db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.rect().left(), xScale))); 6324db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().top(), 6334db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkScalarMul(orig.rect().top(), yScale))); 6344db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III} 6354db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 6364db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins IIIstatic void test_round_rect_transform(skiatest::Reporter* reporter) { 6374db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkRRect rrect; 6384db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { 6394db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkRect r = { 0, 0, kWidth, kHeight }; 6404db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III rrect.setRectXY(r, SkIntToScalar(4), SkIntToScalar(7)); 6414db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III test_transform_helper(reporter, rrect); 6424db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 6434db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { 6444db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkRect r = { SkIntToScalar(5), SkIntToScalar(15), 6454db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkIntToScalar(27), SkIntToScalar(34) }; 6464db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III SkVector radii[4] = { { 0, SkIntToScalar(1) }, 6474db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { SkIntToScalar(2), SkIntToScalar(3) }, 6484db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { SkIntToScalar(4), SkIntToScalar(5) }, 6494db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III { SkIntToScalar(6), SkIntToScalar(7) } }; 6504db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III rrect.setRectRadii(r, radii); 6514db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III test_transform_helper(reporter, rrect); 6524db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III } 6534db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III} 6544db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III 655363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void TestRoundRect(skiatest::Reporter* reporter) { 656363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_basic(reporter); 657363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_rects(reporter); 658363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_ovals(reporter); 659363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_general(reporter); 660363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger test_round_rect_iffy_parameters(reporter); 661d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger test_inset(reporter); 6627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger test_round_rect_contains_rect(reporter); 6634db85b50c0367461787ec2d7f252799aeac0b1c3Leon Scroggins III test_round_rect_transform(reporter); 664363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 665363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 666363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "TestClassDef.h" 667363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEFINE_TESTCLASS("RoundRect", TestRoundRectClass, TestRoundRect) 668