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; 31e4db79de127cfe961195f52907af8451026eaa20Chris Craik void createContent(int width, int height, TestCanvas& canvas) override { 32e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); 33e4db79de127cfe961195f52907af8451026eaa20Chris Craik card = TestUtils::createNode(0, 0, 200, 400, 34e4db79de127cfe961195f52907af8451026eaa20Chris Craik [](RenderProperties& props, TestCanvas& canvas) { 35eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita canvas.save(SaveFlags::MatrixClip); 36e4db79de127cfe961195f52907af8451026eaa20Chris Craik { 37e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.clipRect(0, 0, 200, 200, SkRegion::kIntersect_Op); 38e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(100, 100); 39e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.rotate(45); 40e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.translate(-100, -100); 41e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.clipRect(0, 0, 200, 200, SkRegion::kIntersect_Op); 42e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.drawColor(Color::Blue_500, SkXfermode::kSrcOver_Mode); 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); 50e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.clipPath(&clipCircle, SkRegion::kIntersect_Op); 51e4db79de127cfe961195f52907af8451026eaa20Chris Craik canvas.drawColor(Color::Red_500, SkXfermode::kSrcOver_Mode); 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