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