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