blob: e098171db84374b73d85550f388b966ec96c94c4 [file] [log] [blame]
Florin Malitac75e2402018-01-03 16:17:29 -05001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Hal Canaryc640d0d2018-06-13 09:59:02 -04008#include "SkTypes.h"
Florin Malitaf4f3f0f2018-01-03 23:53:37 -05009
10#if !defined(SK_BUILD_FOR_GOOGLE3)
11
Hal Canaryc640d0d2018-06-13 09:59:02 -040012#include "SkRect.h"
13#include "SkRectPriv.h"
Florin Malitac75e2402018-01-03 16:17:29 -050014#include "SkSGColor.h"
15#include "SkSGDraw.h"
16#include "SkSGGroup.h"
17#include "SkSGInvalidationController.h"
18#include "SkSGRect.h"
19#include "SkSGTransform.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040020#include "SkTo.h"
Florin Malitac75e2402018-01-03 16:17:29 -050021
22#include "Test.h"
23
24#include <vector>
25
26static void check_inval(skiatest::Reporter* reporter, const sk_sp<sksg::Node>& root,
27 const SkRect& expected_bounds,
28 const SkRect& expected_inval_bounds,
29 const std::vector<SkRect>* expected_damage) {
30 sksg::InvalidationController ic;
31 const auto bbox = root->revalidate(&ic, SkMatrix::I());
32
33 if (0) {
Florin Malita67cd9b22018-01-03 20:13:34 -050034 SkDebugf("** bbox: [%f %f %f %f], ibbox: [%f %f %f %f]\n",
35 bbox.fLeft, bbox.fTop, bbox.fRight, bbox.fBottom,
36 ic.bounds().left(), ic.bounds().top(), ic.bounds().right(), ic.bounds().bottom());
Florin Malitac75e2402018-01-03 16:17:29 -050037 }
38
39 REPORTER_ASSERT(reporter, bbox == expected_bounds);
40 REPORTER_ASSERT(reporter, ic.bounds() == expected_inval_bounds);
41
42 if (expected_damage) {
Florin Malitac14f1442018-01-05 11:32:31 -050043 const auto damage_count = SkTo<size_t>(ic.end() - ic.begin());
44 REPORTER_ASSERT(reporter, expected_damage->size() == damage_count);
45 for (size_t i = 0; i < std::min(expected_damage->size(), damage_count); ++i) {
Florin Malitac75e2402018-01-03 16:17:29 -050046 const auto r1 = (*expected_damage)[i],
47 r2 = ic.begin()[i];
48 if (0) {
Florin Malita67cd9b22018-01-03 20:13:34 -050049 SkDebugf("*** expected inval: [%f %f %f %f], actual: [%f %f %f %f]\n",
50 r1.left(), r1.top(), r1.right(), r1.bottom(),
51 r2.left(), r2.top(), r2.right(), r2.bottom());
Florin Malitac75e2402018-01-03 16:17:29 -050052 }
53 REPORTER_ASSERT(reporter, r1 == r2);
54 }
55 }
56}
57
Florin Malitac14f1442018-01-05 11:32:31 -050058static void inval_test1(skiatest::Reporter* reporter) {
Florin Malita18eafd92018-01-04 21:11:55 -050059 auto color = sksg::Color::Make(0xff000000);
60 auto r1 = sksg::Rect::Make(SkRect::MakeWH(100, 100)),
61 r2 = sksg::Rect::Make(SkRect::MakeWH(100, 100));
62 auto grp = sksg::Group::Make();
63 auto matrix = sksg::Matrix::Make(SkMatrix::I());
64 auto root = sksg::Transform::Make(grp, matrix);
Florin Malitac75e2402018-01-03 16:17:29 -050065
66 grp->addChild(sksg::Draw::Make(r1, color));
67 grp->addChild(sksg::Draw::Make(r2, color));
68
69 {
70 // Initial revalidation.
Florin Malita18eafd92018-01-04 21:11:55 -050071 check_inval(reporter, root,
Florin Malitac75e2402018-01-03 16:17:29 -050072 SkRect::MakeWH(100, 100),
Mike Reed8008df12018-01-17 12:20:04 -050073 SkRectPriv::MakeLargeS32(),
Florin Malitac75e2402018-01-03 16:17:29 -050074 nullptr);
75 }
76
77 {
78 // Move r2 to (200 100).
79 r2->setL(200); r2->setT(100); r2->setR(300); r2->setB(200);
80 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
Florin Malita18eafd92018-01-04 21:11:55 -050081 check_inval(reporter, root,
Florin Malitac75e2402018-01-03 16:17:29 -050082 SkRect::MakeWH(300, 200),
83 SkRect::MakeWH(300, 200),
84 &damage);
85 }
86
87 {
88 // Update the common color.
Florin Malita0ebf4192018-01-04 19:21:58 -050089 color->setColor(0xffff0000);
90 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
Florin Malita18eafd92018-01-04 21:11:55 -050091 check_inval(reporter, root,
Florin Malita0ebf4192018-01-04 19:21:58 -050092 SkRect::MakeWH(300, 200),
93 SkRect::MakeWH(300, 200),
94 &damage);
Florin Malitac75e2402018-01-03 16:17:29 -050095 }
96
97 {
98 // Shrink r1.
99 r1->setR(50);
100 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 50, 100} };
Florin Malita18eafd92018-01-04 21:11:55 -0500101 check_inval(reporter, root,
Florin Malitac75e2402018-01-03 16:17:29 -0500102 SkRect::MakeWH(300, 200),
103 SkRect::MakeWH(100, 100),
104 &damage);
105 }
106
107 {
108 // Update transform.
Florin Malita18eafd92018-01-04 21:11:55 -0500109 matrix->setMatrix(SkMatrix::MakeScale(2, 2));
Florin Malitac75e2402018-01-03 16:17:29 -0500110 std::vector<SkRect> damage = { {0, 0, 300, 200}, { 0, 0, 600, 400} };
Florin Malita18eafd92018-01-04 21:11:55 -0500111 check_inval(reporter, root,
Florin Malitac75e2402018-01-03 16:17:29 -0500112 SkRect::MakeWH(600, 400),
113 SkRect::MakeWH(600, 400),
114 &damage);
115 }
116
117 {
118 // Shrink r2 under transform.
119 r2->setR(250);
120 std::vector<SkRect> damage = { {400, 200, 600, 400}, { 400, 200, 500, 400} };
Florin Malita18eafd92018-01-04 21:11:55 -0500121 check_inval(reporter, root,
Florin Malitac75e2402018-01-03 16:17:29 -0500122 SkRect::MakeWH(500, 400),
123 SkRect::MakeLTRB(400, 200, 600, 400),
124 &damage);
125 }
126}
Florin Malitaf4f3f0f2018-01-03 23:53:37 -0500127
Florin Malitac14f1442018-01-05 11:32:31 -0500128static void inval_test2(skiatest::Reporter* reporter) {
129 auto color = sksg::Color::Make(0xff000000);
130 auto rect = sksg::Rect::Make(SkRect::MakeWH(100, 100));
131 auto m1 = sksg::Matrix::Make(SkMatrix::I()),
132 m2 = sksg::Matrix::Make(SkMatrix::I(), m1);
133 auto t1 = sksg::Transform::Make(sksg::Draw::Make(rect, color), m2),
134 t2 = sksg::Transform::Make(sksg::Draw::Make(rect, color), m1);
135 auto root = sksg::Group::Make();
136 root->addChild(t1);
137 root->addChild(t2);
138
139 {
140 // Initial revalidation.
141 check_inval(reporter, root,
142 SkRect::MakeWH(100, 100),
Mike Reed8008df12018-01-17 12:20:04 -0500143 SkRectPriv::MakeLargeS32(),
Florin Malitac14f1442018-01-05 11:32:31 -0500144 nullptr);
145 }
146
147 {
148 // Update the shared color.
149 color->setColor(0xffff0000);
150 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 100, 100} };
151 check_inval(reporter, root,
152 SkRect::MakeWH(100, 100),
153 SkRect::MakeWH(100, 100),
154 &damage);
155 }
156
157 {
158 // Update m2.
159 m2->setMatrix(SkMatrix::MakeScale(2, 2));
160 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 200, 200} };
161 check_inval(reporter, root,
162 SkRect::MakeWH(200, 200),
163 SkRect::MakeWH(200, 200),
164 &damage);
165 }
166
167 {
168 // Update shared m1.
169 m1->setMatrix(SkMatrix::MakeTrans(100, 100));
170 std::vector<SkRect> damage = { { 0, 0, 200, 200}, // draw1 prev bounds
171 { 100, 100, 300, 300}, // draw1 new bounds
172 { 0, 0, 100, 100}, // draw2 prev bounds
173 { 100, 100, 200, 200} }; // draw2 new bounds
174 check_inval(reporter, root,
175 SkRect::MakeLTRB(100, 100, 300, 300),
176 SkRect::MakeLTRB( 0, 0, 300, 300),
177 &damage);
178 }
179
180 {
181 // Update shared rect.
182 rect->setR(50);
183 std::vector<SkRect> damage = { { 100, 100, 300, 300}, // draw1 prev bounds
184 { 100, 100, 200, 300}, // draw1 new bounds
185 { 100, 100, 200, 200}, // draw2 prev bounds
186 { 100, 100, 150, 200} }; // draw2 new bounds
187 check_inval(reporter, root,
188 SkRect::MakeLTRB(100, 100, 200, 300),
189 SkRect::MakeLTRB(100, 100, 300, 300),
190 &damage);
191 }
192}
193
194DEF_TEST(SGInvalidation, reporter) {
195 inval_test1(reporter);
196 inval_test2(reporter);
197}
198
Florin Malitaf4f3f0f2018-01-03 23:53:37 -0500199#endif // !defined(SK_BUILD_FOR_GOOGLE3)