ShapeAnimation.cpp revision c7fa84365698bca8467133c7f6a279c1d672fe4b
1c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik/* 2c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * Copyright (C) 2015 The Android Open Source Project 3c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * 4c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * you may not use this file except in compliance with the License. 6c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * You may obtain a copy of the License at 7c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * 8c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * 10c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * Unless required by applicable law or agreed to in writing, software 11c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * See the License for the specific language governing permissions and 14c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik * limitations under the License. 15c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik */ 16c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 17c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik#include "TestSceneBase.h" 18c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik#include "utils/Color.h" 19c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 20c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik#include <cstdio> 21c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 22c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craikclass ShapeAnimation; 23c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 24c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craikstatic TestScene::Registrar _Shapes(TestScene::Info{ 25c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik "shapes", 26c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik "A grid of shape drawing test cases.", 27c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik TestScene::simpleCreateScene<ShapeAnimation> 28c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik}); 29c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 30c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craikclass ShapeAnimation : public TestScene { 31c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craikpublic: 32c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik sp<RenderNode> card; 33c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik void createContent(int width, int height, TestCanvas& canvas) override { 34c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik card = TestUtils::createNode(0, 0, width, height, 35c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [width](RenderProperties& props, TestCanvas& canvas) { 36c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik std::function<void(TestCanvas&, float, const SkPaint&)> ops[] = { 37c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 38c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawArc(0, 0, size, size, 50, 189, true, paint); 39c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 40c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 41c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawOval(0, 0, size, size, paint); 42c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 43c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 44c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik SkPath diamondPath; 45c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik diamondPath.moveTo(size / 2, 0); 46c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik diamondPath.lineTo(size, size / 2); 47c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik diamondPath.lineTo(size / 2, size); 48c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik diamondPath.lineTo(0, size / 2); 49c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik diamondPath.close(); 50c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawPath(diamondPath, paint); 51c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 52c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 53c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik float data[] = {0, 0, size, size, 0, size, size, 0 }; 54c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawLines(data, sizeof(data) / sizeof(float), paint); 55c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 56c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 57c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik float data[] = {0, 0, size, size, 0, size, size, 0 }; 58c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawPoints(data, sizeof(data) / sizeof(float), paint); 59c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 60c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 61c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawRect(0, 0, size, size, paint); 62c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }, 63c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik [](TestCanvas& canvas, float size, const SkPaint& paint) { 64c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik float rad = size / 4; 65c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawRoundRect(0, 0, size, size, rad, rad, paint); 66c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 67c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }; 68c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik float cellSpace = dp(4); 69c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik float cellSize = floorf(width / 7 - cellSpace); 70c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 71c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik // each combination of strokeWidth + style gets a column 72c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik int outerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); 73c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik SkPaint paint; 74c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik paint.setAntiAlias(true); 75c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik SkPaint::Style styles[] = { 76c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik SkPaint::kStroke_Style, SkPaint::kFill_Style, SkPaint::kStrokeAndFill_Style }; 77c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik for (auto style : styles) { 78c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik paint.setStyle(style); 79c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik for (auto strokeWidth : { 0.0f, 0.5f, 8.0f }) { 80c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik paint.setStrokeWidth(strokeWidth); 81c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik // fill column with each op 82c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik int middleCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); 83c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik for (auto op : ops) { 84c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik int innerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); 85c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.clipRect(0, 0, cellSize, cellSize, SkRegion::kIntersect_Op); 86c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawColor(Color::White, SkXfermode::Mode::kSrcOver_Mode); 87c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik op(canvas, cellSize, paint); 88c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.restoreToCount(innerCount); 89c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.translate(cellSize + cellSpace, 0); 90c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 91c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.restoreToCount(middleCount); 92c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.translate(0, cellSize + cellSpace); 93c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 94c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 95c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.restoreToCount(outerCount); 96c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik }); 97c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawColor(Color::Grey_500, SkXfermode::Mode::kSrcOver_Mode); 98c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik canvas.drawRenderNode(card.get()); 99c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 100c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik 101c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik void doFrame(int frameNr) override { 102c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik card->mutateStagingProperties().setTranslationY(frameNr % 150); 103c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik card->setPropertyFieldsDirty(RenderNode::Y); 104c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik } 105c7fa84365698bca8467133c7f6a279c1d672fe4bChris Craik}; 106