15abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck/* 25abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * Copyright (C) 2016 The Android Open Source Project 35abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * 45abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 55abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * you may not use this file except in compliance with the License. 65abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * You may obtain a copy of the License at 75abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * 85abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 95abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * 105abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * Unless required by applicable law or agreed to in writing, software 115abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 125abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * See the License for the specific language governing permissions and 145abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck * limitations under the License. 155abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck */ 165abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 175abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 185abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck#include "TestSceneBase.h" 195abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 205abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck#include <vector> 215abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 225abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reckclass RoundRectClippingAnimation : public TestScene { 235abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reckpublic: 245abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck int mSpacing, mSize; 255abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 265abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck RoundRectClippingAnimation(int spacing, int size) 275abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck : mSpacing(spacing), mSize(size) {} 285abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 295abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck std::vector< sp<RenderNode> > cards; 305abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck void createContent(int width, int height, Canvas& canvas) override { 31260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); 325abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck canvas.insertReorderBarrier(true); 335abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck int ci = 0; 345abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 355abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck for (int x = 0; x < width; x += mSpacing) { 365abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck for (int y = 0; y < height; y += mSpacing) { 375abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck auto color = BrightColors[ci++ % BrightColorsCount]; 385abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck auto card = TestUtils::createNode(x, y, x + mSize, y + mSize, 395abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck [&](RenderProperties& props, Canvas& canvas) { 40260ab726486317496bc12a57d599ea96dcde3284Mike Reed canvas.drawColor(color, SkBlendMode::kSrcOver); 415abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck props.mutableOutline().setRoundRect(0, 0, 425abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck props.getWidth(), props.getHeight(), mSize * .25, 1); 435abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck props.mutableOutline().setShouldClip(true); 445abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck }); 455abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck canvas.drawRenderNode(card.get()); 465abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck cards.push_back(card); 475abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 485abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 495abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 505abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck canvas.insertReorderBarrier(false); 515abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 525abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck void doFrame(int frameNr) override { 535abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck int curFrame = frameNr % 50; 545abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck if (curFrame > 25) curFrame = 50 - curFrame; 555abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck for (auto& card : cards) { 565abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck card->mutateStagingProperties().setTranslationX(curFrame); 575abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck card->mutateStagingProperties().setTranslationY(curFrame); 585abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 595abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 605abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 615abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck}; 625abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 635abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reckstatic TestScene::Registrar _RoundRectClippingGpu(TestScene::Info{ 645abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck "roundRectClipping-gpu", 655abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck "A bunch of RenderNodes with round rect clipping outlines that's GPU limited.", 665abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck [](const TestScene::Options&) -> test::TestScene* { 675abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck return new RoundRectClippingAnimation(dp(40), dp(200)); 685abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 695abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck}); 705abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck 715abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reckstatic TestScene::Registrar _RoundRectClippingCpu(TestScene::Info{ 725abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck "roundRectClipping-cpu", 735abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck "A bunch of RenderNodes with round rect clipping outlines that's CPU limited.", 745abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck [](const TestScene::Options&) -> test::TestScene* { 755abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck return new RoundRectClippingAnimation(dp(20), dp(20)); 765abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck } 775abc1fb1d4c3956f27948cb68e601675c8fea85cJohn Reck}); 78