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