1d0346cc14e0be821de1c1a8762917ebf7c896533John Reck/*
2d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * Copyright (C) 2015 The Android Open Source Project
3d0346cc14e0be821de1c1a8762917ebf7c896533John Reck *
4d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * you may not use this file except in compliance with the License.
6d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * You may obtain a copy of the License at
7d0346cc14e0be821de1c1a8762917ebf7c896533John Reck *
8d0346cc14e0be821de1c1a8762917ebf7c896533John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9d0346cc14e0be821de1c1a8762917ebf7c896533John Reck *
10d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * Unless required by applicable law or agreed to in writing, software
11d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * See the License for the specific language governing permissions and
14d0346cc14e0be821de1c1a8762917ebf7c896533John Reck * limitations under the License.
15d0346cc14e0be821de1c1a8762917ebf7c896533John Reck */
16d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
17d0346cc14e0be821de1c1a8762917ebf7c896533John Reck#include <gtest/gtest.h>
18d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
19d0346cc14e0be821de1c1a8762917ebf7c896533John Reck#include <DamageAccumulator.h>
20d0346cc14e0be821de1c1a8762917ebf7c896533John Reck#include <Matrix.h>
21c128823940fb0be96eda810fa9f0c75f66d944b0John Reck#include <RenderNode.h>
22d0346cc14e0be821de1c1a8762917ebf7c896533John Reck#include <utils/LinearAllocator.h>
23d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
24d0346cc14e0be821de1c1a8762917ebf7c896533John Reck#include <SkRect.h>
25d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
26d0346cc14e0be821de1c1a8762917ebf7c896533John Reckusing namespace android;
27d0346cc14e0be821de1c1a8762917ebf7c896533John Reckusing namespace android::uirenderer;
28d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
29d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// Test that push & pop are propegating the dirty rect
30d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// There is no transformation of the dirty rect, the input is the same
31d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// as the output.
32d0346cc14e0be821de1c1a8762917ebf7c896533John ReckTEST(DamageAccumulator, identity) {
33d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    DamageAccumulator da;
34d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    SkRect curDirty;
35386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    da.pushTransform(&Matrix4::identity());
36d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.dirty(50, 50, 100, 100);
37c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    {
38386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        da.pushTransform(&Matrix4::identity());
39c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.peekAtDirty(&curDirty);
40c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        ASSERT_EQ(SkRect(), curDirty);
41c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.popTransform();
42c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    }
43d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.peekAtDirty(&curDirty);
44d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    ASSERT_EQ(SkRect::MakeLTRB(50, 50, 100, 100), curDirty);
45d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.popTransform();
46d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.finish(&curDirty);
47d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    ASSERT_EQ(SkRect::MakeLTRB(50, 50, 100, 100), curDirty);
48d0346cc14e0be821de1c1a8762917ebf7c896533John Reck}
49d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
50d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// Test that transformation is happening at the correct levels via
51d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// peekAtDirty & popTransform. Just uses a simple translate to test this
52d0346cc14e0be821de1c1a8762917ebf7c896533John ReckTEST(DamageAccumulator, translate) {
53d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    DamageAccumulator da;
54d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    Matrix4 translate;
55d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    SkRect curDirty;
56d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    translate.loadTranslate(25, 25, 0);
57d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.pushTransform(&translate);
58d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.dirty(50, 50, 100, 100);
59d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.peekAtDirty(&curDirty);
60d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    ASSERT_EQ(SkRect::MakeLTRB(50, 50, 100, 100), curDirty);
61d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.popTransform();
62d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.finish(&curDirty);
63d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    ASSERT_EQ(SkRect::MakeLTRB(75, 75, 125, 125), curDirty);
64d0346cc14e0be821de1c1a8762917ebf7c896533John Reck}
65d0346cc14e0be821de1c1a8762917ebf7c896533John Reck
66d0346cc14e0be821de1c1a8762917ebf7c896533John Reck// Test that dirty rectangles are being unioned across "siblings
67d0346cc14e0be821de1c1a8762917ebf7c896533John ReckTEST(DamageAccumulator, union) {
68d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    DamageAccumulator da;
69d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    SkRect curDirty;
70386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    da.pushTransform(&Matrix4::identity());
71c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    {
72386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        da.pushTransform(&Matrix4::identity());
73c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.dirty(50, 50, 100, 100);
74c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.popTransform();
75386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        da.pushTransform(&Matrix4::identity());
76c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.dirty(150, 50, 200, 125);
77c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.popTransform();
78c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    }
79d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.popTransform();
80d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    da.finish(&curDirty);
81d0346cc14e0be821de1c1a8762917ebf7c896533John Reck    ASSERT_EQ(SkRect::MakeLTRB(50, 50, 200, 125), curDirty);
82d0346cc14e0be821de1c1a8762917ebf7c896533John Reck}
83c128823940fb0be96eda810fa9f0c75f66d944b0John Reck
84c128823940fb0be96eda810fa9f0c75f66d944b0John ReckTEST(DamageAccumulator, basicRenderNode) {
85c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    DamageAccumulator da;
86c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    RenderNode node1;
87c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    node1.animatorProperties().setLeftTopRightBottom(50, 50, 500, 500);
88c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    node1.animatorProperties().updateMatrix();
89c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.pushTransform(&node1);
90c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    {
91c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        RenderNode node2;
92c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setLeftTopRightBottom(50, 50, 100, 100);
93c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().updateMatrix();
94c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.pushTransform(&node2);
95c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.dirty(0, 0, 25, 25);
96c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.popTransform();
97c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    }
98c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.popTransform();
99c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    SkRect dirty;
100c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.finish(&dirty);
101c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    ASSERT_EQ(SkRect::MakeLTRB(100, 100, 125, 125), dirty);
102c128823940fb0be96eda810fa9f0c75f66d944b0John Reck}
103c128823940fb0be96eda810fa9f0c75f66d944b0John Reck
104c128823940fb0be96eda810fa9f0c75f66d944b0John ReckTEST(DamageAccumulator, perspectiveTransform) {
105c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    DamageAccumulator da;
106c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    RenderNode node1;
107c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    node1.animatorProperties().setLeftTopRightBottom(50, 50, 500, 500);
108c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    node1.animatorProperties().setClipToBounds(true);
109c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    node1.animatorProperties().updateMatrix();
110c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.pushTransform(&node1);
111c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    {
112c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        RenderNode node2;
113c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setLeftTopRightBottom(50, 50, 100, 100);
114c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setClipToBounds(false);
115c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setRotationX(1.0f);
116c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setRotationY(1.0f);
117c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setRotation(20.0f);
118c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setCameraDistance(500.0f);
119c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().setTranslationZ(30.0f);
120c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        node2.animatorProperties().updateMatrix();
121c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.pushTransform(&node2);
122c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
123c128823940fb0be96eda810fa9f0c75f66d944b0John Reck        da.popTransform();
124c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    }
125c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.popTransform();
126c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    SkRect dirty;
127c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    da.finish(&dirty);
128c128823940fb0be96eda810fa9f0c75f66d944b0John Reck    ASSERT_EQ(SkRect::MakeLTRB(50, 50, 500, 500), dirty);
129c128823940fb0be96eda810fa9f0c75f66d944b0John Reck}
130