xref: /aosp_15_r20/external/skia/modules/sksg/tests/SGTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_BUILD_FOR_GOOGLE3)
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGDraw.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGGroup.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGInvalidationController.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGPaint.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGRect.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGRenderEffect.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGTransform.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRectPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
26*c8dee2aaSAndroid Build Coastguard Worker 
check_inval(skiatest::Reporter * reporter,const sk_sp<sksg::Node> & root,const SkRect & expected_bounds,const SkRect & expected_inval_bounds,const std::vector<SkRect> * expected_damage)27*c8dee2aaSAndroid Build Coastguard Worker static void check_inval(skiatest::Reporter* reporter, const sk_sp<sksg::Node>& root,
28*c8dee2aaSAndroid Build Coastguard Worker                         const SkRect& expected_bounds,
29*c8dee2aaSAndroid Build Coastguard Worker                         const SkRect& expected_inval_bounds,
30*c8dee2aaSAndroid Build Coastguard Worker                         const std::vector<SkRect>* expected_damage) {
31*c8dee2aaSAndroid Build Coastguard Worker     sksg::InvalidationController ic;
32*c8dee2aaSAndroid Build Coastguard Worker     const auto bbox = root->revalidate(&ic, SkMatrix::I());
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker     if ((false)) {
35*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("** bbox: [%f %f %f %f], ibbox: [%f %f %f %f]\n",
36*c8dee2aaSAndroid Build Coastguard Worker                  bbox.fLeft, bbox.fTop, bbox.fRight, bbox.fBottom,
37*c8dee2aaSAndroid Build Coastguard Worker                  ic.bounds().left(), ic.bounds().top(), ic.bounds().right(), ic.bounds().bottom());
38*c8dee2aaSAndroid Build Coastguard Worker     }
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, bbox == expected_bounds);
41*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, ic.bounds() == expected_inval_bounds);
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker     if (expected_damage) {
44*c8dee2aaSAndroid Build Coastguard Worker         const auto damage_count = SkTo<size_t>(ic.end() - ic.begin());
45*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, expected_damage->size() == damage_count);
46*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < std::min(expected_damage->size(), damage_count); ++i) {
47*c8dee2aaSAndroid Build Coastguard Worker             const auto r1 = (*expected_damage)[i],
48*c8dee2aaSAndroid Build Coastguard Worker                        r2 = ic.begin()[i];
49*c8dee2aaSAndroid Build Coastguard Worker             if ((false)) {
50*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("*** expected inval: [%f %f %f %f], actual: [%f %f %f %f]\n",
51*c8dee2aaSAndroid Build Coastguard Worker                          r1.left(), r1.top(), r1.right(), r1.bottom(),
52*c8dee2aaSAndroid Build Coastguard Worker                          r2.left(), r2.top(), r2.right(), r2.bottom());
53*c8dee2aaSAndroid Build Coastguard Worker             }
54*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, r1 == r2);
55*c8dee2aaSAndroid Build Coastguard Worker         }
56*c8dee2aaSAndroid Build Coastguard Worker     }
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker struct HitTest {
60*c8dee2aaSAndroid Build Coastguard Worker     const SkPoint           pt;
61*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> node;
62*c8dee2aaSAndroid Build Coastguard Worker };
63*c8dee2aaSAndroid Build Coastguard Worker 
check_hittest(skiatest::Reporter * reporter,const sk_sp<sksg::RenderNode> & root,const std::vector<HitTest> & tests)64*c8dee2aaSAndroid Build Coastguard Worker static void check_hittest(skiatest::Reporter* reporter, const sk_sp<sksg::RenderNode>& root,
65*c8dee2aaSAndroid Build Coastguard Worker                           const std::vector<HitTest>& tests) {
66*c8dee2aaSAndroid Build Coastguard Worker     for (const auto& tst : tests) {
67*c8dee2aaSAndroid Build Coastguard Worker         const auto* node = root->nodeAt(tst.pt);
68*c8dee2aaSAndroid Build Coastguard Worker         if (node != tst.node.get()) {
69*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("*** nodeAt(%f, %f) - expected %p, got %p\n",
70*c8dee2aaSAndroid Build Coastguard Worker                      tst.pt.x(), tst.pt.y(), tst.node.get(), node);
71*c8dee2aaSAndroid Build Coastguard Worker         }
72*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, tst.node.get() == node);
73*c8dee2aaSAndroid Build Coastguard Worker     }
74*c8dee2aaSAndroid Build Coastguard Worker }
75*c8dee2aaSAndroid Build Coastguard Worker 
inval_test1(skiatest::Reporter * reporter)76*c8dee2aaSAndroid Build Coastguard Worker static void inval_test1(skiatest::Reporter* reporter) {
77*c8dee2aaSAndroid Build Coastguard Worker     auto color  = sksg::Color::Make(0xff000000);
78*c8dee2aaSAndroid Build Coastguard Worker     auto r1     = sksg::Rect::Make(SkRect::MakeWH(100, 100)),
79*c8dee2aaSAndroid Build Coastguard Worker          r2     = sksg::Rect::Make(SkRect::MakeWH(100, 100));
80*c8dee2aaSAndroid Build Coastguard Worker     auto grp    = sksg::Group::Make();
81*c8dee2aaSAndroid Build Coastguard Worker     auto matrix = sksg::Matrix<SkMatrix>::Make(SkMatrix::I());
82*c8dee2aaSAndroid Build Coastguard Worker     auto root   = sksg::TransformEffect::Make(grp, matrix);
83*c8dee2aaSAndroid Build Coastguard Worker     auto d1     = sksg::Draw::Make(r1, color),
84*c8dee2aaSAndroid Build Coastguard Worker          d2     = sksg::Draw::Make(r2, color);
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     grp->addChild(d1);
87*c8dee2aaSAndroid Build Coastguard Worker     grp->addChild(d2);
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     {
90*c8dee2aaSAndroid Build Coastguard Worker         // Initial revalidation.
91*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
92*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(100, 100),
93*c8dee2aaSAndroid Build Coastguard Worker                     SkRectPriv::MakeLargeS32(),
94*c8dee2aaSAndroid Build Coastguard Worker                     nullptr);
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker         check_hittest(reporter, root, {
97*c8dee2aaSAndroid Build Coastguard Worker                           {{  -1,   0 }, nullptr },
98*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  -1 }, nullptr },
99*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,   0 }, nullptr },
100*c8dee2aaSAndroid Build Coastguard Worker                           {{   0, 100 }, nullptr },
101*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,   0 },      d2 },
102*c8dee2aaSAndroid Build Coastguard Worker                           {{  99,  99 },      d2 },
103*c8dee2aaSAndroid Build Coastguard Worker                       });
104*c8dee2aaSAndroid Build Coastguard Worker     }
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     {
107*c8dee2aaSAndroid Build Coastguard Worker         // Move r2 to (200 100).
108*c8dee2aaSAndroid Build Coastguard Worker         r2->setL(200); r2->setT(100); r2->setR(300); r2->setB(200);
109*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
110*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
111*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(300, 200),
112*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(300, 200),
113*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker         check_hittest(reporter, root, {
116*c8dee2aaSAndroid Build Coastguard Worker                           {{  -1,   0 }, nullptr },
117*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  -1 }, nullptr },
118*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,   0 }, nullptr },
119*c8dee2aaSAndroid Build Coastguard Worker                           {{   0, 100 }, nullptr },
120*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,   0 },      d1 },
121*c8dee2aaSAndroid Build Coastguard Worker                           {{  99,  99 },      d1 },
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker                           {{ 199, 100 }, nullptr },
124*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200,  99 }, nullptr },
125*c8dee2aaSAndroid Build Coastguard Worker                           {{ 300, 100 }, nullptr },
126*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200, 200 }, nullptr },
127*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200, 100 },      d2 },
128*c8dee2aaSAndroid Build Coastguard Worker                           {{ 299, 199 },      d2 },
129*c8dee2aaSAndroid Build Coastguard Worker                       });
130*c8dee2aaSAndroid Build Coastguard Worker     }
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     {
133*c8dee2aaSAndroid Build Coastguard Worker         // Update the common color.
134*c8dee2aaSAndroid Build Coastguard Worker         color->setColor(0xffff0000);
135*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
136*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
137*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(300, 200),
138*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(300, 200),
139*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
140*c8dee2aaSAndroid Build Coastguard Worker     }
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     {
143*c8dee2aaSAndroid Build Coastguard Worker         // Shrink r1.
144*c8dee2aaSAndroid Build Coastguard Worker         r1->setR(50);
145*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 50, 100} };
146*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
147*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(300, 200),
148*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(100, 100),
149*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker         check_hittest(reporter, root, {
152*c8dee2aaSAndroid Build Coastguard Worker                           {{  -1,   0 }, nullptr },
153*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  -1 }, nullptr },
154*c8dee2aaSAndroid Build Coastguard Worker                           {{  50,   0 }, nullptr },
155*c8dee2aaSAndroid Build Coastguard Worker                           {{   0, 100 }, nullptr },
156*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,   0 },      d1 },
157*c8dee2aaSAndroid Build Coastguard Worker                           {{  49,  99 },      d1 },
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker                           {{ 199, 100 }, nullptr },
160*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200,  99 }, nullptr },
161*c8dee2aaSAndroid Build Coastguard Worker                           {{ 300, 100 }, nullptr },
162*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200, 200 }, nullptr },
163*c8dee2aaSAndroid Build Coastguard Worker                           {{ 200, 100 },      d2 },
164*c8dee2aaSAndroid Build Coastguard Worker                           {{ 299, 199 },      d2 },
165*c8dee2aaSAndroid Build Coastguard Worker                       });
166*c8dee2aaSAndroid Build Coastguard Worker     }
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker     {
169*c8dee2aaSAndroid Build Coastguard Worker         // Update transform.
170*c8dee2aaSAndroid Build Coastguard Worker         matrix->setMatrix(SkMatrix::Scale(2, 2));
171*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 300, 200}, { 0, 0, 600, 400} };
172*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
173*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(600, 400),
174*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(600, 400),
175*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
176*c8dee2aaSAndroid Build Coastguard Worker 
177*c8dee2aaSAndroid Build Coastguard Worker         check_hittest(reporter, root, {
178*c8dee2aaSAndroid Build Coastguard Worker                           {{  -1,   0 }, nullptr },
179*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  -1 }, nullptr },
180*c8dee2aaSAndroid Build Coastguard Worker                           {{  25,   0 }, nullptr },
181*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  50 }, nullptr },
182*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,   0 },      d1 },
183*c8dee2aaSAndroid Build Coastguard Worker                           {{  24,  49 },      d1 },
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker                           {{  99,  50 }, nullptr },
186*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,  49 }, nullptr },
187*c8dee2aaSAndroid Build Coastguard Worker                           {{ 150,  50 }, nullptr },
188*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100, 100 }, nullptr },
189*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,  50 },      d2 },
190*c8dee2aaSAndroid Build Coastguard Worker                           {{ 149,  99 },      d2 },
191*c8dee2aaSAndroid Build Coastguard Worker                       });
192*c8dee2aaSAndroid Build Coastguard Worker     }
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker     {
195*c8dee2aaSAndroid Build Coastguard Worker         // Shrink r2 under transform.
196*c8dee2aaSAndroid Build Coastguard Worker         r2->setR(250);
197*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {400, 200, 600, 400}, { 400, 200, 500, 400} };
198*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
199*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(500, 400),
200*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(400, 200, 600, 400),
201*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
202*c8dee2aaSAndroid Build Coastguard Worker 
203*c8dee2aaSAndroid Build Coastguard Worker         check_hittest(reporter, root, {
204*c8dee2aaSAndroid Build Coastguard Worker                           {{  -1,   0 }, nullptr },
205*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  -1 }, nullptr },
206*c8dee2aaSAndroid Build Coastguard Worker                           {{  25,   0 }, nullptr },
207*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,  50 }, nullptr },
208*c8dee2aaSAndroid Build Coastguard Worker                           {{   0,   0 },      d1 },
209*c8dee2aaSAndroid Build Coastguard Worker                           {{  24,  49 },      d1 },
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker                           {{  99,  50 }, nullptr },
212*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,  49 }, nullptr },
213*c8dee2aaSAndroid Build Coastguard Worker                           {{ 125,  50 }, nullptr },
214*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100, 100 }, nullptr },
215*c8dee2aaSAndroid Build Coastguard Worker                           {{ 100,  50 },      d2 },
216*c8dee2aaSAndroid Build Coastguard Worker                           {{ 124,  99 },      d2 },
217*c8dee2aaSAndroid Build Coastguard Worker                       });
218*c8dee2aaSAndroid Build Coastguard Worker     }
219*c8dee2aaSAndroid Build Coastguard Worker }
220*c8dee2aaSAndroid Build Coastguard Worker 
inval_test2(skiatest::Reporter * reporter)221*c8dee2aaSAndroid Build Coastguard Worker static void inval_test2(skiatest::Reporter* reporter) {
222*c8dee2aaSAndroid Build Coastguard Worker     auto color = sksg::Color::Make(0xff000000);
223*c8dee2aaSAndroid Build Coastguard Worker     auto rect  = sksg::Rect::Make(SkRect::MakeWH(100, 100));
224*c8dee2aaSAndroid Build Coastguard Worker     auto m1    = sksg::Matrix<SkMatrix>::Make(SkMatrix::I()),
225*c8dee2aaSAndroid Build Coastguard Worker          m2    = sksg::Matrix<SkMatrix>::Make(SkMatrix::I());
226*c8dee2aaSAndroid Build Coastguard Worker     auto t1    = sksg::TransformEffect::Make(sksg::Draw::Make(rect, color),
227*c8dee2aaSAndroid Build Coastguard Worker                                              sksg::Transform::MakeConcat(m1, m2)),
228*c8dee2aaSAndroid Build Coastguard Worker          t2    = sksg::TransformEffect::Make(sksg::Draw::Make(rect, color), m1);
229*c8dee2aaSAndroid Build Coastguard Worker     auto root  = sksg::Group::Make();
230*c8dee2aaSAndroid Build Coastguard Worker     root->addChild(t1);
231*c8dee2aaSAndroid Build Coastguard Worker     root->addChild(t2);
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     {
234*c8dee2aaSAndroid Build Coastguard Worker         // Initial revalidation.
235*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
236*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(100, 100),
237*c8dee2aaSAndroid Build Coastguard Worker                     SkRectPriv::MakeLargeS32(),
238*c8dee2aaSAndroid Build Coastguard Worker                     nullptr);
239*c8dee2aaSAndroid Build Coastguard Worker     }
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     {
242*c8dee2aaSAndroid Build Coastguard Worker         // Update the shared color.
243*c8dee2aaSAndroid Build Coastguard Worker         color->setColor(0xffff0000);
244*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 100, 100} };
245*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
246*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(100, 100),
247*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(100, 100),
248*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
249*c8dee2aaSAndroid Build Coastguard Worker     }
250*c8dee2aaSAndroid Build Coastguard Worker 
251*c8dee2aaSAndroid Build Coastguard Worker     {
252*c8dee2aaSAndroid Build Coastguard Worker         // Update m2.
253*c8dee2aaSAndroid Build Coastguard Worker         m2->setMatrix(SkMatrix::Scale(2, 2));
254*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 200, 200} };
255*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
256*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(200, 200),
257*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeWH(200, 200),
258*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
259*c8dee2aaSAndroid Build Coastguard Worker     }
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     {
262*c8dee2aaSAndroid Build Coastguard Worker         // Update shared m1.
263*c8dee2aaSAndroid Build Coastguard Worker         m1->setMatrix(SkMatrix::Translate(100, 100));
264*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {   0,   0, 200, 200},   // draw1 prev bounds
265*c8dee2aaSAndroid Build Coastguard Worker                                        { 100, 100, 300, 300},   // draw1 new bounds
266*c8dee2aaSAndroid Build Coastguard Worker                                        {   0,   0, 100, 100},   // draw2 prev bounds
267*c8dee2aaSAndroid Build Coastguard Worker                                        { 100, 100, 200, 200} }; // draw2 new bounds
268*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
269*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(100, 100, 300, 300),
270*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(  0,   0, 300, 300),
271*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
272*c8dee2aaSAndroid Build Coastguard Worker     }
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker     {
275*c8dee2aaSAndroid Build Coastguard Worker         // Update shared rect.
276*c8dee2aaSAndroid Build Coastguard Worker         rect->setR(50);
277*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { { 100, 100, 300, 300},   // draw1 prev bounds
278*c8dee2aaSAndroid Build Coastguard Worker                                        { 100, 100, 200, 300},   // draw1 new bounds
279*c8dee2aaSAndroid Build Coastguard Worker                                        { 100, 100, 200, 200},   // draw2 prev bounds
280*c8dee2aaSAndroid Build Coastguard Worker                                        { 100, 100, 150, 200} }; // draw2 new bounds
281*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
282*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(100, 100, 200, 300),
283*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(100, 100, 300, 300),
284*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
285*c8dee2aaSAndroid Build Coastguard Worker     }
286*c8dee2aaSAndroid Build Coastguard Worker }
287*c8dee2aaSAndroid Build Coastguard Worker 
inval_test3(skiatest::Reporter * reporter)288*c8dee2aaSAndroid Build Coastguard Worker static void inval_test3(skiatest::Reporter* reporter) {
289*c8dee2aaSAndroid Build Coastguard Worker     auto color1 = sksg::Color::Make(0xff000000),
290*c8dee2aaSAndroid Build Coastguard Worker          color2 = sksg::Color::Make(0xff000000);
291*c8dee2aaSAndroid Build Coastguard Worker     auto group  = sksg::Group::Make();
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker     group->addChild(sksg::Draw::Make(sksg::Rect::Make(SkRect::MakeWH(100, 100)),
294*c8dee2aaSAndroid Build Coastguard Worker                                      color1));
295*c8dee2aaSAndroid Build Coastguard Worker     group->addChild(sksg::Draw::Make(sksg::Rect::Make(SkRect::MakeXYWH(200, 0, 100, 100)),
296*c8dee2aaSAndroid Build Coastguard Worker                                      color2));
297*c8dee2aaSAndroid Build Coastguard Worker     auto filter = sksg::DropShadowImageFilter::Make();
298*c8dee2aaSAndroid Build Coastguard Worker     filter->setOffset({50, 75});
299*c8dee2aaSAndroid Build Coastguard Worker     auto root = sksg::ImageFilterEffect::Make(group, filter);
300*c8dee2aaSAndroid Build Coastguard Worker 
301*c8dee2aaSAndroid Build Coastguard Worker     {
302*c8dee2aaSAndroid Build Coastguard Worker         // Initial revalidation.
303*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
304*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeXYWH(0, 0, 350, 175),
305*c8dee2aaSAndroid Build Coastguard Worker                     SkRectPriv::MakeLargeS32(),
306*c8dee2aaSAndroid Build Coastguard Worker                     nullptr);
307*c8dee2aaSAndroid Build Coastguard Worker     }
308*c8dee2aaSAndroid Build Coastguard Worker 
309*c8dee2aaSAndroid Build Coastguard Worker     {
310*c8dee2aaSAndroid Build Coastguard Worker         // Shadow-only.
311*c8dee2aaSAndroid Build Coastguard Worker         filter->setMode(sksg::DropShadowImageFilter::Mode::kShadowOnly);
312*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { {0, 0, 350, 175}, { 50, 75, 350, 175} };
313*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
314*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(50, 75, 350, 175),
315*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(0, 0, 350, 175),
316*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
317*c8dee2aaSAndroid Build Coastguard Worker     }
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     {
320*c8dee2aaSAndroid Build Coastguard Worker         // Content change -> single/full filter bounds inval.
321*c8dee2aaSAndroid Build Coastguard Worker         color1->setColor(0xffff0000);
322*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { { 50, 75, 350, 175} };
323*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
324*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(50, 75, 350, 175),
325*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(50, 75, 350, 175),
326*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
327*c8dee2aaSAndroid Build Coastguard Worker     }
328*c8dee2aaSAndroid Build Coastguard Worker 
329*c8dee2aaSAndroid Build Coastguard Worker     {
330*c8dee2aaSAndroid Build Coastguard Worker         // Visibility change -> full inval.
331*c8dee2aaSAndroid Build Coastguard Worker         group->setVisible(false);
332*c8dee2aaSAndroid Build Coastguard Worker         std::vector<SkRect> damage = { { 50, 75, 350, 175} };
333*c8dee2aaSAndroid Build Coastguard Worker         check_inval(reporter, root,
334*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(50, 75, 350, 175),
335*c8dee2aaSAndroid Build Coastguard Worker                     SkRect::MakeLTRB(50, 75, 350, 175),
336*c8dee2aaSAndroid Build Coastguard Worker                     &damage);
337*c8dee2aaSAndroid Build Coastguard Worker     }
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker 
inval_group_remove(skiatest::Reporter * reporter)340*c8dee2aaSAndroid Build Coastguard Worker static void inval_group_remove(skiatest::Reporter* reporter) {
341*c8dee2aaSAndroid Build Coastguard Worker     auto draw = sksg::Draw::Make(sksg::Rect::Make(SkRect::MakeWH(100, 100)),
342*c8dee2aaSAndroid Build Coastguard Worker                                  sksg::Color::Make(SK_ColorBLACK));
343*c8dee2aaSAndroid Build Coastguard Worker     auto grp = sksg::Group::Make();
344*c8dee2aaSAndroid Build Coastguard Worker 
345*c8dee2aaSAndroid Build Coastguard Worker     // Readding the child should not trigger asserts.
346*c8dee2aaSAndroid Build Coastguard Worker     grp->addChild(draw);
347*c8dee2aaSAndroid Build Coastguard Worker     grp->removeChild(draw);
348*c8dee2aaSAndroid Build Coastguard Worker     grp->addChild(draw);
349*c8dee2aaSAndroid Build Coastguard Worker }
350*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SGInvalidation,reporter)351*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SGInvalidation, reporter) {
352*c8dee2aaSAndroid Build Coastguard Worker     inval_test1(reporter);
353*c8dee2aaSAndroid Build Coastguard Worker     inval_test2(reporter);
354*c8dee2aaSAndroid Build Coastguard Worker     inval_test3(reporter);
355*c8dee2aaSAndroid Build Coastguard Worker     inval_group_remove(reporter);
356*c8dee2aaSAndroid Build Coastguard Worker }
357*c8dee2aaSAndroid Build Coastguard Worker 
358*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_BUILD_FOR_GOOGLE3)
359