1f6a409067c5df1593c8c6b94304c70220d37901cChris Craik/* 2f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * Copyright (C) 2017 The Android Open Source Project 3f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * 4f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * you may not use this file except in compliance with the License. 6f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * You may obtain a copy of the License at 7f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * 8f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * 10f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * Unless required by applicable law or agreed to in writing, software 11f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * See the License for the specific language governing permissions and 14f6a409067c5df1593c8c6b94304c70220d37901cChris Craik * limitations under the License. 15f6a409067c5df1593c8c6b94304c70220d37901cChris Craik */ 16f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 17f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 18f6a409067c5df1593c8c6b94304c70220d37901cChris Craik#include "TestSceneBase.h" 19f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 20f6a409067c5df1593c8c6b94304c70220d37901cChris Craik#include <SkGradientShader.h> 21f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 22f6a409067c5df1593c8c6b94304c70220d37901cChris Craikclass SimpleGradientAnimation; 23f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 24f6a409067c5df1593c8c6b94304c70220d37901cChris Craikstatic TestScene::Registrar _SimpleGradient(TestScene::Info{ 25f6a409067c5df1593c8c6b94304c70220d37901cChris Craik "simpleGradient", 26f6a409067c5df1593c8c6b94304c70220d37901cChris Craik "A benchmark of shader performance of linear, 2 color gradients with black in them.", 27f6a409067c5df1593c8c6b94304c70220d37901cChris Craik TestScene::simpleCreateScene<SimpleGradientAnimation> 28f6a409067c5df1593c8c6b94304c70220d37901cChris Craik}); 29f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 30f6a409067c5df1593c8c6b94304c70220d37901cChris Craikclass SimpleGradientAnimation : public TestScene { 31f6a409067c5df1593c8c6b94304c70220d37901cChris Craikpublic: 32f6a409067c5df1593c8c6b94304c70220d37901cChris Craik std::vector< sp<RenderNode> > cards; 33f6a409067c5df1593c8c6b94304c70220d37901cChris Craik void createContent(int width, int height, Canvas& canvas) override { 34f6a409067c5df1593c8c6b94304c70220d37901cChris Craik canvas.drawColor(Color::White, SkBlendMode::kSrcOver); 35f6a409067c5df1593c8c6b94304c70220d37901cChris Craik 36f6a409067c5df1593c8c6b94304c70220d37901cChris Craik sp<RenderNode> card = createCard(0, 0, width, height); 37f6a409067c5df1593c8c6b94304c70220d37901cChris Craik canvas.drawRenderNode(card.get()); 38f6a409067c5df1593c8c6b94304c70220d37901cChris Craik cards.push_back(card); 39f6a409067c5df1593c8c6b94304c70220d37901cChris Craik } 40f6a409067c5df1593c8c6b94304c70220d37901cChris Craik void doFrame(int frameNr) override { 41f6a409067c5df1593c8c6b94304c70220d37901cChris Craik int curFrame = frameNr % 20; 42f6a409067c5df1593c8c6b94304c70220d37901cChris Craik for (size_t ci = 0; ci < cards.size(); ci++) { 43f6a409067c5df1593c8c6b94304c70220d37901cChris Craik cards[ci]->mutateStagingProperties().setTranslationX(curFrame); 44f6a409067c5df1593c8c6b94304c70220d37901cChris Craik cards[ci]->mutateStagingProperties().setTranslationY(curFrame); 45f6a409067c5df1593c8c6b94304c70220d37901cChris Craik cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 46f6a409067c5df1593c8c6b94304c70220d37901cChris Craik } 47f6a409067c5df1593c8c6b94304c70220d37901cChris Craik } 48f6a409067c5df1593c8c6b94304c70220d37901cChris Craikprivate: 49f6a409067c5df1593c8c6b94304c70220d37901cChris Craik sp<RenderNode> createCard(int x, int y, int width, int height) { 50f6a409067c5df1593c8c6b94304c70220d37901cChris Craik return TestUtils::createNode(x, y, x + width, y + height, 51f6a409067c5df1593c8c6b94304c70220d37901cChris Craik [width, height](RenderProperties& props, Canvas& canvas) { 52f6a409067c5df1593c8c6b94304c70220d37901cChris Craik float pos[] = { 0, 1 }; 53f6a409067c5df1593c8c6b94304c70220d37901cChris Craik SkPoint pts[] = { SkPoint::Make(0, 0), SkPoint::Make(width, height) }; 54f6a409067c5df1593c8c6b94304c70220d37901cChris Craik SkPaint paint; 55f6a409067c5df1593c8c6b94304c70220d37901cChris Craik // overdraw several times to emphasize shader cost 56f6a409067c5df1593c8c6b94304c70220d37901cChris Craik for (int i = 0; i < 10; i++) { 57f6a409067c5df1593c8c6b94304c70220d37901cChris Craik // use i%2 start position to pick 2 color combo with black in it 58f6a409067c5df1593c8c6b94304c70220d37901cChris Craik SkColor colors[3] = { Color::Transparent, Color::Black, Color::Cyan_500 }; 59f6a409067c5df1593c8c6b94304c70220d37901cChris Craik paint.setShader(SkGradientShader::MakeLinear(pts, colors + (i % 2), pos, 2, 60f6a409067c5df1593c8c6b94304c70220d37901cChris Craik SkShader::kClamp_TileMode)); 61f6a409067c5df1593c8c6b94304c70220d37901cChris Craik canvas.drawRect(i, i, width, height, paint); 62f6a409067c5df1593c8c6b94304c70220d37901cChris Craik } 63f6a409067c5df1593c8c6b94304c70220d37901cChris Craik }); 64f6a409067c5df1593c8c6b94304c70220d37901cChris Craik } 65f6a409067c5df1593c8c6b94304c70220d37901cChris Craik}; 66