1e4db79de127cfe961195f52907af8451026eaa20Chris Craik/* 2e4db79de127cfe961195f52907af8451026eaa20Chris Craik * Copyright (C) 2015 The Android Open Source Project 3e4db79de127cfe961195f52907af8451026eaa20Chris Craik * 4e4db79de127cfe961195f52907af8451026eaa20Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5e4db79de127cfe961195f52907af8451026eaa20Chris Craik * you may not use this file except in compliance with the License. 6e4db79de127cfe961195f52907af8451026eaa20Chris Craik * You may obtain a copy of the License at 7e4db79de127cfe961195f52907af8451026eaa20Chris Craik * 8e4db79de127cfe961195f52907af8451026eaa20Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 9e4db79de127cfe961195f52907af8451026eaa20Chris Craik * 10e4db79de127cfe961195f52907af8451026eaa20Chris Craik * Unless required by applicable law or agreed to in writing, software 11e4db79de127cfe961195f52907af8451026eaa20Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12e4db79de127cfe961195f52907af8451026eaa20Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4db79de127cfe961195f52907af8451026eaa20Chris Craik * See the License for the specific language governing permissions and 14e4db79de127cfe961195f52907af8451026eaa20Chris Craik * limitations under the License. 15e4db79de127cfe961195f52907af8451026eaa20Chris Craik */ 16e4db79de127cfe961195f52907af8451026eaa20Chris Craik 17e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include "TestSceneBase.h" 18e4db79de127cfe961195f52907af8451026eaa20Chris Craik 19e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass ClippingAnimation; 20e4db79de127cfe961195f52907af8451026eaa20Chris Craik 21e4db79de127cfe961195f52907af8451026eaa20Chris Craikstatic TestScene::Registrar _RectGrid(TestScene::Info{ 221bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck "clip", 231bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck "Complex clip cases" 241bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck "Low CPU/GPU load.", 251bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck TestScene::simpleCreateScene<ClippingAnimation>}); 26e4db79de127cfe961195f52907af8451026eaa20Chris Craik 27e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass ClippingAnimation : public TestScene { 28e4db79de127cfe961195f52907af8451026eaa20Chris Craikpublic: 29e4db79de127cfe961195f52907af8451026eaa20Chris Craik sp<RenderNode> card; 3006152cdd06da50762716cd455dcf7ab0117f25b0Stan Iliev void createContent(int width, int height, Canvas& canvas) override { 31260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::White, SkBlendMode::kSrcOver); 321bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck card = TestUtils::createNode(0, 0, 200, 400, [](RenderProperties& props, Canvas& canvas) { 33eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.save(SaveFlags::MatrixClip); 34e4db79de127cfe961195f52907af8451026eaa20Chris Craik { 356c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect); 36e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(100, 100); 37e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.rotate(45); 38e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(-100, -100); 396c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect); 40260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver); 41e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 42e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.restore(); 43e4db79de127cfe961195f52907af8451026eaa20Chris Craik 44eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.save(SaveFlags::MatrixClip); 45e4db79de127cfe961195f52907af8451026eaa20Chris Craik { 46e4db79de127cfe961195f52907af8451026eaa20Chris Craik SkPath clipCircle; 47e4db79de127cfe961195f52907af8451026eaa20Chris Craik clipCircle.addCircle(100, 300, 100); 486c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipPath(&clipCircle, SkClipOp::kIntersect); 49260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); 50e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 51e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.restore(); 52e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 53e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // put on a layer, to test stencil attachment 54e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik props.mutateLayerProperties().setType(LayerType::RenderLayer); 55e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik props.setAlpha(0.9f); 56e4db79de127cfe961195f52907af8451026eaa20Chris Craik }); 57e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.drawRenderNode(card.get()); 58e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 59e4db79de127cfe961195f52907af8451026eaa20Chris Craik void doFrame(int frameNr) override { 60e4db79de127cfe961195f52907af8451026eaa20Chris Craik int curFrame = frameNr % 150; 61e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->mutateStagingProperties().setTranslationX(curFrame); 62e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->mutateStagingProperties().setTranslationY(curFrame); 63e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 64e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 65e4db79de127cfe961195f52907af8451026eaa20Chris Craik}; 66