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