15985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com/* 25985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * Copyright 2012 Google Inc. 35985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * 45985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 55985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com * found in the LICENSE file. 65985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com */ 75985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com#include "SkMatrix.h" 95985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com#include "SkRRect.h" 108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 124b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.orgstatic const SkScalar kWidth = 100.0f; 134b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.orgstatic const SkScalar kHeight = 100.0f; 145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 15bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.orgstatic void test_inset(skiatest::Reporter* reporter) { 16bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org SkRRect rr, rr2; 17bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org SkRect r = { 0, 0, 100, 100 }; 18bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org 19bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.setRect(r); 20bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.inset(-20, -20, &rr2); 21bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org REPORTER_ASSERT(reporter, rr2.isRect()); 22bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org 23bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.inset(20, 20, &rr2); 24bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org REPORTER_ASSERT(reporter, rr2.isRect()); 251a60dab449ee8ab3b4c4330a18fae57b5980363eskia.committer@gmail.com 26bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.inset(r.width()/2, r.height()/2, &rr2); 27bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org REPORTER_ASSERT(reporter, rr2.isEmpty()); 28bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org 29bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.setRectXY(r, 20, 20); 30bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.inset(19, 19, &rr2); 31bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org REPORTER_ASSERT(reporter, rr2.isSimple()); 32bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org rr.inset(20, 20, &rr2); 33bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org REPORTER_ASSERT(reporter, rr2.isRect()); 34bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org} 35bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org 365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// Test out the basic API entry points 375985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comstatic void test_round_rect_basic(skiatest::Reporter* reporter) { 385985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Test out initialization methods 392b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com SkPoint zeroPt = { 0, 0 }; 405985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect empty; 41c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com 425985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com empty.setEmpty(); 435985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 445985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 455985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, empty.rect().isEmpty()); 465985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 475985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 485985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, zeroPt == empty.radii((SkRRect::Corner) i)); 495985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 505985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 515985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 525985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 535985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 545985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr1; 555985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr1.setRect(rect); 565985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 575985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 585985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr1.rect() == rect); 595985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 605985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 615985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, zeroPt == rr1.radii((SkRRect::Corner) i)); 625985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 63f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr1_2; // construct the same RR using the most general set function 64f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkVector rr1_2_radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 65f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr1_2.setRectRadii(rect, rr1_2_radii); 66f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr1_2 == rr1 && rr1_2.getType() == rr1.getType()); 67f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr1_3; // construct the same RR using the nine patch set function 68f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr1_3.setNinePatch(rect, 0, 0, 0, 0); 69f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr1_3 == rr1 && rr1_3.getType() == rr1.getType()); 705985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 715985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 725985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint halfPoint = { SkScalarHalf(kWidth), SkScalarHalf(kHeight) }; 735985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr2; 745985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr2.setOval(rect); 755985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 765985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr2.type()); 775985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr2.rect() == rect); 785985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 795985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 80c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com REPORTER_ASSERT(reporter, 815985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr2.radii((SkRRect::Corner) i).equalsWithinTolerance(halfPoint)); 825985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 83f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr2_2; // construct the same RR using the most general set function 84f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkVector rr2_2_radii[4] = { { halfPoint.fX, halfPoint.fY }, { halfPoint.fX, halfPoint.fY }, 85f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org { halfPoint.fX, halfPoint.fY }, { halfPoint.fX, halfPoint.fY } }; 86f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr2_2.setRectRadii(rect, rr2_2_radii); 87f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr2_2 == rr2 && rr2_2.getType() == rr2.getType()); 88f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr2_3; // construct the same RR using the nine patch set function 89f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr2_3.setNinePatch(rect, halfPoint.fX, halfPoint.fY, halfPoint.fX, halfPoint.fY); 90f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr2_3 == rr2 && rr2_3.getType() == rr2.getType()); 915985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 925985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 935985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint p = { 5, 5 }; 945985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr3; 955985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr3.setRectXY(rect, p.fX, p.fY); 965985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 975985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr3.type()); 985985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr3.rect() == rect); 995985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1005985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 1015985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, p == rr3.radii((SkRRect::Corner) i)); 1025985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 103f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr3_2; // construct the same RR using the most general set function 104f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkVector rr3_2_radii[4] = { { 5, 5 }, { 5, 5 }, { 5, 5 }, { 5, 5 } }; 105f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr3_2.setRectRadii(rect, rr3_2_radii); 106f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr3_2 == rr3 && rr3_2.getType() == rr3.getType()); 107f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr3_3; // construct the same RR using the nine patch set function 108f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr3_3.setNinePatch(rect, 5, 5, 5, 5); 109f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr3_3 == rr3 && rr3_3.getType() == rr3.getType()); 110c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com 1115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 112f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRect ninePatchRadii = { 10, 9, 8, 7 }; 1135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr4; 115f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr4.setNinePatch(rect, ninePatchRadii.fLeft, ninePatchRadii.fTop, ninePatchRadii.fRight, 116f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org ninePatchRadii.fBottom); 1175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 118f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, SkRRect::kNinePatch_Type == rr4.type()); 1195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr4.rect() == rect); 1205985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 121f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkPoint rquad[4]; 122f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org ninePatchRadii.toQuad(rquad); 1235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 124f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rquad[i] == rr4.radii((SkRRect::Corner) i)); 1255985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 126f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkRRect rr4_2; // construct the same RR using the most general set function 127f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org SkVector rr4_2_radii[4] = { { 10, 9 }, { 8, 9 }, {8, 7 }, { 10, 7 } }; 128f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org rr4_2.setRectRadii(rect, rr4_2_radii); 129f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr4_2 == rr4 && rr4_2.getType() == rr4.getType()); 1305985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1315985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1325985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint radii2[4] = { { 0, 0 }, { 0, 0 }, { 50, 50 }, { 20, 50 } }; 1335985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1345985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr5; 1355985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr5.setRectRadii(rect, radii2); 1365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1375985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr5.type()); 1385985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr5.rect() == rect); 1395985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1405985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com for (int i = 0; i < 4; ++i) { 1415985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, radii2[i] == rr5.radii((SkRRect::Corner) i)); 1425985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com } 1435985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1445985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Test out == & != 1455985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, empty != rr3); 146f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org REPORTER_ASSERT(reporter, rr3 != rr4); 1475985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rr4 != rr5); 1485985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 1495985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1505985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// Test out the cases when the RR degenerates to a rect 1515985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comstatic void test_round_rect_rects(skiatest::Reporter* reporter) { 1525985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect r; 1535985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1545985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1555985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect empty; 156c3d7d90973528527131c72549b10c2a21300e0acskia.committer@gmail.com 1575985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com empty.setEmpty(); 1585985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1595985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type()); 1605985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com r = empty.rect(); 1615985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, 0 == r.fLeft && 0 == r.fTop && 0 == r.fRight && 0 == r.fBottom); 1625985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1635985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1645985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 1655985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr1; 1665985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr1.setRectXY(rect, 0, 0); 1675985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1685985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr1.type()); 1695985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com r = rr1.rect(); 1705985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rect == r); 1715985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1725985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1735985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 1745985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1755985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr2; 1765985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr2.setRectRadii(rect, radii); 1775985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1785985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 1795985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com r = rr2.rect(); 1805985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, rect == r); 1815985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1825985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1835985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint radii2[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 1845985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1855985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr3; 1865985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr3.setRectRadii(rect, radii2); 1875985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr3.type()); 1885985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 1895985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1905985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// Test out the cases when the RR degenerates to an oval 1915985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comstatic void test_round_rect_ovals(skiatest::Reporter* reporter) { 1925985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 1935985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect oval; 1945985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 1955985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr1; 1965985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr1.setRectXY(rect, SkScalarHalf(kWidth), SkScalarHalf(kHeight)); 1975985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 1985985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kOval_Type == rr1.type()); 1995985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com oval = rr1.rect(); 2005985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, oval == rect); 2015985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 2025985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2035985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// Test out the non-degenerate RR cases 2045985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comstatic void test_round_rect_general(skiatest::Reporter* reporter) { 2055985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 2065985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 2075985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr1; 2085985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr1.setRectXY(rect, 20, 20); 2095985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2105985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kSimple_Type == rr1.type()); 2115985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2125985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com //---- 2135985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint radii[4] = { { 0, 0 }, { 20, 20 }, { 50, 50 }, { 20, 50 } }; 2145985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr2; 2165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr2.setRectRadii(rect, radii); 2175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr2.type()); 2195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 2205985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2215985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com// Test out questionable-parameter handling 2225985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.comstatic void test_round_rect_iffy_parameters(skiatest::Reporter* reporter) { 2235985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // When the radii exceed the base rect they are proportionally scaled down 2255985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // to fit 2265985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRect rect = SkRect::MakeLTRB(0, 0, kWidth, kHeight); 2275985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkPoint radii[4] = { { 50, 100 }, { 100, 50 }, { 50, 100 }, { 100, 50 } }; 2285985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2295985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr1; 2305985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr1.setRectRadii(rect, radii); 2315985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2325985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kComplex_Type == rr1.type()); 2335985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2345985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com const SkPoint& p = rr1.radii(SkRRect::kUpperLeft_Corner); 2355985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2365985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fX, 33.33333f)); 2375985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.fY, 66.66666f)); 2385985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2395985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com // Negative radii should be capped at zero 2405985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com SkRRect rr2; 2415985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com rr2.setRectXY(rect, -10, -20); 2425985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2435985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, SkRRect::kRect_Type == rr2.type()); 2445985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2455985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com const SkPoint& p2 = rr2.radii(SkRRect::kUpperLeft_Corner); 2465985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 2475985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, 0.0f == p2.fX); 2485985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com REPORTER_ASSERT(reporter, 0.0f == p2.fY); 2495985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 2505985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com 25132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com// Move a small box from the start position by (stepX, stepY) 'numSteps' times 25232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com// testing for containment in 'rr' at each step. 25332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.comstatic void test_direction(skiatest::Reporter* reporter, const SkRRect &rr, 2542cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com SkScalar initX, int stepX, SkScalar initY, int stepY, 25532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com int numSteps, const bool* contains) { 25632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com SkScalar x = initX, y = initY; 25732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com for (int i = 0; i < numSteps; ++i) { 2582cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com SkRect test = SkRect::MakeXYWH(x, y, 2592cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com stepX ? SkIntToScalar(stepX) : SK_Scalar1, 26032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com stepY ? SkIntToScalar(stepY) : SK_Scalar1); 26132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test.sort(); 26232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 26332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com REPORTER_ASSERT(reporter, contains[i] == rr.contains(test)); 26432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 26532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com x += stepX; 26632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com y += stepY; 26732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 26832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com} 26932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 27032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com// Exercise the RR's contains rect method 27132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.comstatic void test_round_rect_contains_rect(skiatest::Reporter* reporter) { 27232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 27332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com static const int kNumRRects = 4; 27432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com static const SkVector gRadii[kNumRRects][4] = { 27532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }, // rect 27632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { { 20, 20 }, { 20, 20 }, { 20, 20 }, { 20, 20 } }, // circle 27732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { { 10, 10 }, { 10, 10 }, { 10, 10 }, { 10, 10 } }, // simple 27832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { { 0, 0 }, { 20, 20 }, { 10, 10 }, { 30, 30 } } // complex 27932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }; 28032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 28132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com SkRRect rrects[kNumRRects]; 28232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com for (int i = 0; i < kNumRRects; ++i) { 28332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com rrects[i].setRectRadii(SkRect::MakeWH(40, 40), gRadii[i]); 28432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 28532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 28632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // First test easy outs - boxes that are obviously out on 28732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // each corner and edge 28832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com static const SkRect easyOuts[] = { 28932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { -5, -5, 5, 5 }, // NW 29032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 15, -5, 20, 5 }, // N 29132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 35, -5, 45, 5 }, // NE 29232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 35, 15, 45, 20 }, // E 29332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 35, 45, 35, 45 }, // SE 29432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 15, 35, 20, 45 }, // S 29532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { -5, 35, 5, 45 }, // SW 29632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { -5, 15, 5, 20 } // W 29732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }; 2982cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com 29932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com for (int i = 0; i < kNumRRects; ++i) { 30032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(easyOuts); ++j) { 30132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com REPORTER_ASSERT(reporter, !rrects[i].contains(easyOuts[j])); 30232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 30332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 30432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 3052cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com // Now test non-trivial containment. For each compass 3062cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com // point walk a 1x1 rect in from the edge of the bounding 30732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // rect 30832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com static const int kNumSteps = 15; 30932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com bool answers[kNumRRects][8][kNumSteps] = { 31032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // all the test rects are inside the degenerate rrect 31132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 31232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // rect 31332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 31932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 32032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 32132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }, 32232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // for the circle we expect 6 blocks to be out on the 3232cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com // corners (then the rest in) and only the first block 3242cf444f7040614b43af67e368f3aa636ebeaa45askia.committer@gmail.com // out on the vertical and horizontal axes (then 32532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // the rest in) 32632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 32732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // circle 32832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 32932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 33632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }, 33732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // for the simple round rect we expect 3 out on 33832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // the corners (then the rest in) and no blocks out 33932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // on the vertical and horizontal axes 34032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 34132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // simple RR 34232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 34932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 35032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }, 35132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // for the complex case the answer is different for each direction 35232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 35332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // complex RR 35432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // all in for NW (rect) corner (same as rect case) 35532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 35632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // only first block out for N (same as circle case) 35732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 35832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // first 6 blocks out for NE (same as circle case) 35932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 36032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // only first block out for E (same as circle case) 36132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 36232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // first 3 blocks out for SE (same as simple case) 36332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 36432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // first two blocks out for S 36532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 36632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // first 9 blocks out for SW 36732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, 36832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com // first two blocks out for W (same as S) 36932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 37032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 37132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com }; 37232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 37332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com for (int i = 0; i < kNumRRects; ++i) { 37432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 0, 1, 0, 1, kNumSteps, answers[i][0]); // NW 37532c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 19.5f, 0, 0, 1, kNumSteps, answers[i][1]); // N 37632c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 40, -1, 0, 1, kNumSteps, answers[i][2]); // NE 37732c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 40, -1, 19.5f, 0, kNumSteps, answers[i][3]); // E 37832c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 40, -1, 40, -1, kNumSteps, answers[i][4]); // SE 37932c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 19.5f, 0, 40, -1, kNumSteps, answers[i][5]); // S 38032c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 0, 1, 40, -1, kNumSteps, answers[i][6]); // SW 38132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_direction(reporter, rrects[i], 0, 1, 19.5f, 0, kNumSteps, answers[i][7]); // W 38232c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com } 38332c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com} 38432c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com 38520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com// Called for a matrix that should cause SkRRect::transform to fail. 38620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.comstatic void assert_transform_failure(skiatest::Reporter* reporter, const SkRRect& orig, 38720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkMatrix& matrix) { 38820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // The test depends on the fact that the original is not empty. 38920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkASSERT(!orig.isEmpty()); 39020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRRect dst; 39120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 39220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 39320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkRRect copyOfDst = dst; 39420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkRRect copyOfOrig = orig; 39520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com bool success = orig.transform(matrix, &dst); 39620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // This transform should fail. 39720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, !success); 39820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Since the transform failed, dst should be unchanged. 39920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, copyOfDst == dst); 40020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // original should not be modified. 40120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, copyOfOrig == orig); 40220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig != dst); 40320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com} 40420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 40520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com#define GET_RADII \ 40620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& origUL = orig.radii(SkRRect::kUpperLeft_Corner); \ 40720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& origUR = orig.radii(SkRRect::kUpperRight_Corner); \ 40820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& origLR = orig.radii(SkRRect::kLowerRight_Corner); \ 40920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& origLL = orig.radii(SkRRect::kLowerLeft_Corner); \ 41020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& dstUL = dst.radii(SkRRect::kUpperLeft_Corner); \ 41120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& dstUR = dst.radii(SkRRect::kUpperRight_Corner); \ 41220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& dstLR = dst.radii(SkRRect::kLowerRight_Corner); \ 41320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com const SkVector& dstLL = dst.radii(SkRRect::kLowerLeft_Corner) 41420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 41520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com// Called to test various transforms on a single SkRRect. 41620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.comstatic void test_transform_helper(skiatest::Reporter* reporter, const SkRRect& orig) { 41720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRRect dst; 41820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 41920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 42020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // The identity matrix will duplicate the rrect. 42120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com bool success = orig.transform(SkMatrix::I(), &dst); 42220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 42320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig == dst); 42420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 42520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Skew and Perspective make transform fail. 42620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkMatrix matrix; 42720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 42820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setSkewX(SkIntToScalar(2)); 42920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 43020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 43120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 43220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setSkewY(SkIntToScalar(3)); 43320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 43420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 43520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 43620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setPerspX(SkScalarToPersp(SkIntToScalar(4))); 43720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 43820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 43920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 44020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setPerspY(SkScalarToPersp(SkIntToScalar(5))); 44120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 44220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 44320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Rotation fails. 44420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 44520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setRotate(SkIntToScalar(90)); 44620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 44720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setRotate(SkIntToScalar(37)); 44820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 44920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 45020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Translate will keep the rect moved, but otherwise the same. 45120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 45220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalar translateX = SkIntToScalar(32); 45320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalar translateY = SkIntToScalar(15); 45420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setTranslateX(translateX); 45520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setTranslateY(translateY); 45620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 45720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com success = orig.transform(matrix, &dst); 45820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 45920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com for (int i = 0; i < 4; ++i) { 46020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, 46120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com orig.radii((SkRRect::Corner) i) == dst.radii((SkRRect::Corner) i)); 46220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 46320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 46420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 46520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, dst.rect().left() == orig.rect().left() + translateX); 46620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, dst.rect().top() == orig.rect().top() + translateY); 46720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 46820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Keeping the translation, but adding skew will make transform fail. 46920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setSkewY(SkIntToScalar(7)); 47020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 47120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 47220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Scaling in -x will flip the round rect horizontally. 47320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 47420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleX(SkIntToScalar(-1)); 47520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 47620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com success = orig.transform(matrix, &dst); 47720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 47820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { 47920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com GET_RADII; 48020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Radii have swapped in x. 48120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUL == dstUR); 48220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUR == dstUL); 48320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLR == dstLL); 48420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLL == dstLR); 48520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 48620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Width and height remain the same. 48720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 48820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 48920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Right and left have swapped (sort of) 49020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().right() == -dst.rect().left()); 49120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Top has stayed the same. 49220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().top() == dst.rect().top()); 49320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 49420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Keeping the scale, but adding a persp will make transform fail. 49520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setPerspX(SkScalarToPersp(SkIntToScalar(7))); 49620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com assert_transform_failure(reporter, orig, matrix); 49720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 49820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Scaling in -y will flip the round rect vertically. 49920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 50020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleY(SkIntToScalar(-1)); 50120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 50220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com success = orig.transform(matrix, &dst); 50320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 50420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { 50520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com GET_RADII; 50620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Radii have swapped in y. 50720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUL == dstLL); 50820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUR == dstLR); 50920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLR == dstUR); 51020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLL == dstUL); 51120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 51220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Width and height remain the same. 51320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 51420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 51520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Top and bottom have swapped (sort of) 51620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().top() == -dst.rect().bottom()); 51720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Left has stayed the same. 51820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().left() == dst.rect().left()); 51920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 52020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Scaling in -x and -y will swap in both directions. 52120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 52220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleY(SkIntToScalar(-1)); 52320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleX(SkIntToScalar(-1)); 52420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 52520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com success = orig.transform(matrix, &dst); 52620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 52720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { 52820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com GET_RADII; 52920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUL == dstLR); 53020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origUR == dstLL); 53120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLR == dstUL); 53220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, origLL == dstUR); 53320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 53420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Width and height remain the same. 53520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().width() == dst.rect().width()); 53620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().height() == dst.rect().height()); 53720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().top() == -dst.rect().bottom()); 53820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, orig.rect().right() == -dst.rect().left()); 53920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 54020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Scale in both directions. 54120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalar xScale = SkIntToScalar(3); 5424b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar yScale = 3.2f; 54320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.reset(); 54420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleX(xScale); 54520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com matrix.setScaleY(yScale); 54620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com dst.setEmpty(); 54720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com success = orig.transform(matrix, &dst); 54820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, success); 54920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com // Radii are scaled. 55020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com for (int i = 0; i < 4; ++i) { 55120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.radii((SkRRect::Corner) i).fX, 55220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.radii((SkRRect::Corner) i).fX, xScale))); 55320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.radii((SkRRect::Corner) i).fY, 55420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.radii((SkRRect::Corner) i).fY, yScale))); 55520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 55620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().width(), 55720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.rect().width(), xScale))); 55820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().height(), 55920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.rect().height(), yScale))); 56020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().left(), 56120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.rect().left(), xScale))); 56220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dst.rect().top(), 56320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkScalarMul(orig.rect().top(), yScale))); 56420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com} 56520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 56620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.comstatic void test_round_rect_transform(skiatest::Reporter* reporter) { 56720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRRect rrect; 56820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { 56920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRect r = { 0, 0, kWidth, kHeight }; 57020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com rrect.setRectXY(r, SkIntToScalar(4), SkIntToScalar(7)); 57120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com test_transform_helper(reporter, rrect); 57220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 57320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { 57420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkRect r = { SkIntToScalar(5), SkIntToScalar(15), 57520e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkIntToScalar(27), SkIntToScalar(34) }; 57620e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com SkVector radii[4] = { { 0, SkIntToScalar(1) }, 57720e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { SkIntToScalar(2), SkIntToScalar(3) }, 57820e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { SkIntToScalar(4), SkIntToScalar(5) }, 57920e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com { SkIntToScalar(6), SkIntToScalar(7) } }; 58020e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com rrect.setRectRadii(r, radii); 58120e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com test_transform_helper(reporter, rrect); 58220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com } 58320e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com} 58420e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com 585e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips// Test out the case where an oval already off in space is translated/scaled 586e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips// further off into space - yielding numerical issues when the rect & radii 587e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips// are transformed separatly 588e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips// BUG=skia:2696 589e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillipsstatic void test_issue_2696(skiatest::Reporter* reporter) { 590e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkRRect rrect; 591e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkRect r = { 28443.8594f, 53.1428604f, 28446.7148f, 56.0000038f }; 592e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips rrect.setOval(r); 593e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 594e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkMatrix xform; 595e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips xform.setAll(2.44f, 0.0f, 485411.7f, 596e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 0.0f, 2.44f, -438.7f, 597e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 0.0f, 0.0f, 1.0f); 598e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkRRect dst; 599e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 600e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips bool success = rrect.transform(xform, &dst); 601e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips REPORTER_ASSERT(reporter, success); 602e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 603e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkScalar halfWidth = SkScalarHalf(dst.width()); 604e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkScalar halfHeight = SkScalarHalf(dst.height()); 605e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 606e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips for (int i = 0; i < 4; ++i) { 607e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips REPORTER_ASSERT(reporter, 608e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fX, halfWidth)); 609e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips REPORTER_ASSERT(reporter, 610e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fY, halfHeight)); 611e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips } 612e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips} 613e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips 614e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(RoundRect, reporter) { 6155985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com test_round_rect_basic(reporter); 6165985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com test_round_rect_rects(reporter); 6175985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com test_round_rect_ovals(reporter); 6185985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com test_round_rect_general(reporter); 6195985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com test_round_rect_iffy_parameters(reporter); 620bcbef579d02e255b9a29b5db2d6804f4bfc76d1cmike@reedtribe.org test_inset(reporter); 62132c1b66a2c4f26935ba59f3afe3e81600fade78drobertphillips@google.com test_round_rect_contains_rect(reporter); 62220e3cd2c9fbc049eae8bcedc591c2cc8d4bed656scroggo@google.com test_round_rect_transform(reporter); 623e5c1e3cd63e22bb06c24dd051f4d814f24786c08robertphillips test_issue_2696(reporter); 6245985e7c4d13b04d6b819bfff3df44f1dd3eb35b8robertphillips@google.com} 625