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