10091181f32f023282205f74806dfa5146bb7c75eChris Craik/* 20091181f32f023282205f74806dfa5146bb7c75eChris Craik * Copyright (C) 2017 The Android Open Source Project 30091181f32f023282205f74806dfa5146bb7c75eChris Craik * 40091181f32f023282205f74806dfa5146bb7c75eChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 50091181f32f023282205f74806dfa5146bb7c75eChris Craik * you may not use this file except in compliance with the License. 60091181f32f023282205f74806dfa5146bb7c75eChris Craik * You may obtain a copy of the License at 70091181f32f023282205f74806dfa5146bb7c75eChris Craik * 80091181f32f023282205f74806dfa5146bb7c75eChris Craik * http://www.apache.org/licenses/LICENSE-2.0 90091181f32f023282205f74806dfa5146bb7c75eChris Craik * 100091181f32f023282205f74806dfa5146bb7c75eChris Craik * Unless required by applicable law or agreed to in writing, software 110091181f32f023282205f74806dfa5146bb7c75eChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 120091181f32f023282205f74806dfa5146bb7c75eChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130091181f32f023282205f74806dfa5146bb7c75eChris Craik * See the License for the specific language governing permissions and 140091181f32f023282205f74806dfa5146bb7c75eChris Craik * limitations under the License. 150091181f32f023282205f74806dfa5146bb7c75eChris Craik */ 160091181f32f023282205f74806dfa5146bb7c75eChris Craik 170091181f32f023282205f74806dfa5146bb7c75eChris Craik#include "TestSceneBase.h" 180091181f32f023282205f74806dfa5146bb7c75eChris Craik 190091181f32f023282205f74806dfa5146bb7c75eChris Craikclass ShadowShaderAnimation; 200091181f32f023282205f74806dfa5146bb7c75eChris Craik 210091181f32f023282205f74806dfa5146bb7c75eChris Craikstatic TestScene::Registrar _ShadowShader(TestScene::Info{ 220091181f32f023282205f74806dfa5146bb7c75eChris Craik "shadowshader", 230091181f32f023282205f74806dfa5146bb7c75eChris Craik "A set of overlapping shadowed areas with simple tessellation useful for" 240091181f32f023282205f74806dfa5146bb7c75eChris Craik " benchmarking shadow shader performance.", 250091181f32f023282205f74806dfa5146bb7c75eChris Craik TestScene::simpleCreateScene<ShadowShaderAnimation> 260091181f32f023282205f74806dfa5146bb7c75eChris Craik}); 270091181f32f023282205f74806dfa5146bb7c75eChris Craik 280091181f32f023282205f74806dfa5146bb7c75eChris Craikclass ShadowShaderAnimation : public TestScene { 290091181f32f023282205f74806dfa5146bb7c75eChris Craikpublic: 300091181f32f023282205f74806dfa5146bb7c75eChris Craik std::vector< sp<RenderNode> > cards; 310091181f32f023282205f74806dfa5146bb7c75eChris Craik void createContent(int width, int height, Canvas& canvas) override { 320091181f32f023282205f74806dfa5146bb7c75eChris Craik canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); 330091181f32f023282205f74806dfa5146bb7c75eChris Craik canvas.insertReorderBarrier(true); 340091181f32f023282205f74806dfa5146bb7c75eChris Craik 350091181f32f023282205f74806dfa5146bb7c75eChris Craik int outset = 50; 360091181f32f023282205f74806dfa5146bb7c75eChris Craik for (int i = 0; i < 10; i++) { 370091181f32f023282205f74806dfa5146bb7c75eChris Craik sp<RenderNode> card = createCard(outset, outset, 380091181f32f023282205f74806dfa5146bb7c75eChris Craik width - (outset * 2), height - (outset * 2)); 390091181f32f023282205f74806dfa5146bb7c75eChris Craik canvas.drawRenderNode(card.get()); 400091181f32f023282205f74806dfa5146bb7c75eChris Craik cards.push_back(card); 410091181f32f023282205f74806dfa5146bb7c75eChris Craik } 420091181f32f023282205f74806dfa5146bb7c75eChris Craik 430091181f32f023282205f74806dfa5146bb7c75eChris Craik canvas.insertReorderBarrier(false); 440091181f32f023282205f74806dfa5146bb7c75eChris Craik } 450091181f32f023282205f74806dfa5146bb7c75eChris Craik void doFrame(int frameNr) override { 460091181f32f023282205f74806dfa5146bb7c75eChris Craik int curFrame = frameNr % 10; 470091181f32f023282205f74806dfa5146bb7c75eChris Craik for (size_t ci = 0; ci < cards.size(); ci++) { 480091181f32f023282205f74806dfa5146bb7c75eChris Craik cards[ci]->mutateStagingProperties().setTranslationX(curFrame); 490091181f32f023282205f74806dfa5146bb7c75eChris Craik cards[ci]->mutateStagingProperties().setTranslationY(curFrame); 500091181f32f023282205f74806dfa5146bb7c75eChris Craik cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 510091181f32f023282205f74806dfa5146bb7c75eChris Craik } 520091181f32f023282205f74806dfa5146bb7c75eChris Craik } 530091181f32f023282205f74806dfa5146bb7c75eChris Craikprivate: 540091181f32f023282205f74806dfa5146bb7c75eChris Craik sp<RenderNode> createCard(int x, int y, int width, int height) { 550091181f32f023282205f74806dfa5146bb7c75eChris Craik return TestUtils::createNode(x, y, x + width, y + height, 560091181f32f023282205f74806dfa5146bb7c75eChris Craik [width, height](RenderProperties& props, Canvas& canvas) { 570091181f32f023282205f74806dfa5146bb7c75eChris Craik props.setElevation(1000); 580091181f32f023282205f74806dfa5146bb7c75eChris Craik 590091181f32f023282205f74806dfa5146bb7c75eChris Craik // Set 0 radius, no clipping, so shadow is easy to compute. Slightly transparent outline 600091181f32f023282205f74806dfa5146bb7c75eChris Craik // to signal contents aren't opaque (not necessary though, as elevation is so high, no 610091181f32f023282205f74806dfa5146bb7c75eChris Craik // inner content to cut out) 620091181f32f023282205f74806dfa5146bb7c75eChris Craik props.mutableOutline().setRoundRect(0, 0, width, height, 0, 0.99f); 630091181f32f023282205f74806dfa5146bb7c75eChris Craik props.mutableOutline().setShouldClip(false); 640091181f32f023282205f74806dfa5146bb7c75eChris Craik 650091181f32f023282205f74806dfa5146bb7c75eChris Craik // don't draw anything to card's canvas - we just want the shadow 660091181f32f023282205f74806dfa5146bb7c75eChris Craik }); 670091181f32f023282205f74806dfa5146bb7c75eChris Craik } 680091181f32f023282205f74806dfa5146bb7c75eChris Craik}; 69