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{ 22e4db79de127cfe961195f52907af8451026eaa20Chris Craik "clip", 23e4db79de127cfe961195f52907af8451026eaa20Chris Craik "Complex clip cases" 24e4db79de127cfe961195f52907af8451026eaa20Chris Craik "Low CPU/GPU load.", 25e4db79de127cfe961195f52907af8451026eaa20Chris Craik TestScene::simpleCreateScene<ClippingAnimation> 26e4db79de127cfe961195f52907af8451026eaa20Chris Craik}); 27e4db79de127cfe961195f52907af8451026eaa20Chris Craik 28e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass ClippingAnimation : public TestScene { 29e4db79de127cfe961195f52907af8451026eaa20Chris Craikpublic: 30e4db79de127cfe961195f52907af8451026eaa20Chris Craik sp<RenderNode> card; 3106152cdd06da50762716cd455dcf7ab0117f25b0Stan Iliev void createContent(int width, int height, Canvas& canvas) override { 32260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::White, SkBlendMode::kSrcOver); 33e4db79de127cfe961195f52907af8451026eaa20Chris Craik card = TestUtils::createNode(0, 0, 200, 400, 3406152cdd06da50762716cd455dcf7ab0117f25b0Stan Iliev [](RenderProperties& props, Canvas& canvas) { 35eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.save(SaveFlags::MatrixClip); 36e4db79de127cfe961195f52907af8451026eaa20Chris Craik { 376c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect); 38e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(100, 100); 39e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.rotate(45); 40e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(-100, -100); 416c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect); 42260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver); 43e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 44e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.restore(); 45e4db79de127cfe961195f52907af8451026eaa20Chris Craik 46eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.save(SaveFlags::MatrixClip); 47e4db79de127cfe961195f52907af8451026eaa20Chris Craik { 48e4db79de127cfe961195f52907af8451026eaa20Chris Craik SkPath clipCircle; 49e4db79de127cfe961195f52907af8451026eaa20Chris Craik clipCircle.addCircle(100, 300, 100); 506c67f1d04591f44bccb476d715a005ad5bbdf840Mike Reed canvas.clipPath(&clipCircle, SkClipOp::kIntersect); 51260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); 52e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 53e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.restore(); 54e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik 55e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik // put on a layer, to test stencil attachment 56e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik props.mutateLayerProperties().setType(LayerType::RenderLayer); 57e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik props.setAlpha(0.9f); 58e4db79de127cfe961195f52907af8451026eaa20Chris Craik }); 59e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.drawRenderNode(card.get()); 60e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 61e4db79de127cfe961195f52907af8451026eaa20Chris Craik void doFrame(int frameNr) override { 62e4db79de127cfe961195f52907af8451026eaa20Chris Craik int curFrame = frameNr % 150; 63e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->mutateStagingProperties().setTranslationX(curFrame); 64e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->mutateStagingProperties().setTranslationY(curFrame); 65e4db79de127cfe961195f52907af8451026eaa20Chris Craik card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 66e4db79de127cfe961195f52907af8451026eaa20Chris Craik } 67e4db79de127cfe961195f52907af8451026eaa20Chris Craik}; 68