blob: ca6c23d1634746d397eecb4163c0b82f377fbef8 [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
8#include "SkRect.h"
Florin Malitaf4f3f0f2018-01-03 23:53:37 -05009
10#if !defined(SK_BUILD_FOR_GOOGLE3)
11
Florin Malitac75e2402018-01-03 16:17:29 -050012#include "SkSGColor.h"
13#include "SkSGDraw.h"
14#include "SkSGGroup.h"
15#include "SkSGInvalidationController.h"
16#include "SkSGRect.h"
17#include "SkSGTransform.h"
18
19#include "Test.h"
20
21#include <vector>
22
23static void check_inval(skiatest::Reporter* reporter, const sk_sp<sksg::Node>& root,
24 const SkRect& expected_bounds,
25 const SkRect& expected_inval_bounds,
26 const std::vector<SkRect>* expected_damage) {
27 sksg::InvalidationController ic;
28 const auto bbox = root->revalidate(&ic, SkMatrix::I());
29
30 if (0) {
Florin Malita67cd9b22018-01-03 20:13:34 -050031 SkDebugf("** bbox: [%f %f %f %f], ibbox: [%f %f %f %f]\n",
32 bbox.fLeft, bbox.fTop, bbox.fRight, bbox.fBottom,
33 ic.bounds().left(), ic.bounds().top(), ic.bounds().right(), ic.bounds().bottom());
Florin Malitac75e2402018-01-03 16:17:29 -050034 }
35
36 REPORTER_ASSERT(reporter, bbox == expected_bounds);
37 REPORTER_ASSERT(reporter, ic.bounds() == expected_inval_bounds);
38
39 if (expected_damage) {
40 REPORTER_ASSERT(reporter, expected_damage->size() == SkTo<size_t>(ic.end() - ic.begin()));
41 for (size_t i = 0; i < expected_damage->size(); ++i) {
42 const auto r1 = (*expected_damage)[i],
43 r2 = ic.begin()[i];
44 if (0) {
Florin Malita67cd9b22018-01-03 20:13:34 -050045 SkDebugf("*** expected inval: [%f %f %f %f], actual: [%f %f %f %f]\n",
46 r1.left(), r1.top(), r1.right(), r1.bottom(),
47 r2.left(), r2.top(), r2.right(), r2.bottom());
Florin Malitac75e2402018-01-03 16:17:29 -050048 }
49 REPORTER_ASSERT(reporter, r1 == r2);
50 }
51 }
52}
53
54DEF_TEST(SGInvalidation, reporter) {
55 auto color = sksg::Color::Make(0xff000000);
56 auto r1 = sksg::Rect::Make(SkRect::MakeWH(100, 100)),
57 r2 = sksg::Rect::Make(SkRect::MakeWH(100, 100));
58 auto grp = sksg::Group::Make();
59 auto tr = sksg::Transform::Make(grp, SkMatrix::I());
60
61 grp->addChild(sksg::Draw::Make(r1, color));
62 grp->addChild(sksg::Draw::Make(r2, color));
63
64 {
65 // Initial revalidation.
66 check_inval(reporter, tr,
67 SkRect::MakeWH(100, 100),
68 SkRect::MakeLargestS32(),
69 nullptr);
70 }
71
72 {
73 // Move r2 to (200 100).
74 r2->setL(200); r2->setT(100); r2->setR(300); r2->setB(200);
75 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
76 check_inval(reporter, tr,
77 SkRect::MakeWH(300, 200),
78 SkRect::MakeWH(300, 200),
79 &damage);
80 }
81
82 {
83 // Update the common color.
Florin Malita0ebf4192018-01-04 19:21:58 -050084 color->setColor(0xffff0000);
85 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 200, 100, 300, 200} };
86 check_inval(reporter, tr,
87 SkRect::MakeWH(300, 200),
88 SkRect::MakeWH(300, 200),
89 &damage);
Florin Malitac75e2402018-01-03 16:17:29 -050090 }
91
92 {
93 // Shrink r1.
94 r1->setR(50);
95 std::vector<SkRect> damage = { {0, 0, 100, 100}, { 0, 0, 50, 100} };
96 check_inval(reporter, tr,
97 SkRect::MakeWH(300, 200),
98 SkRect::MakeWH(100, 100),
99 &damage);
100 }
101
102 {
103 // Update transform.
104 tr->setMatrix(SkMatrix::MakeScale(2, 2));
105 std::vector<SkRect> damage = { {0, 0, 300, 200}, { 0, 0, 600, 400} };
106 check_inval(reporter, tr,
107 SkRect::MakeWH(600, 400),
108 SkRect::MakeWH(600, 400),
109 &damage);
110 }
111
112 {
113 // Shrink r2 under transform.
114 r2->setR(250);
115 std::vector<SkRect> damage = { {400, 200, 600, 400}, { 400, 200, 500, 400} };
116 check_inval(reporter, tr,
117 SkRect::MakeWH(500, 400),
118 SkRect::MakeLTRB(400, 200, 600, 400),
119 &damage);
120 }
121}
Florin Malitaf4f3f0f2018-01-03 23:53:37 -0500122
123#endif // !defined(SK_BUILD_FOR_GOOGLE3)