blob: 78591450f10ad38d13f3e41f08d84684f9047345 [file] [log] [blame]
Stan Iliev021693b2016-10-17 16:26:15 -04001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Stan Iliev021693b2016-10-17 16:26:15 -040019#include <SkCanvas.h>
20#include <SkDrawable.h>
Derek Sollenbergerdf301aa2020-12-17 11:06:03 -050021#include <SkRuntimeEffect.h>
John Reck1bcacfd2017-11-03 10:12:19 -070022#include <utils/RefBase.h>
23#include "CanvasProperty.h"
Stan Iliev021693b2016-10-17 16:26:15 -040024
25namespace android {
26namespace uirenderer {
27namespace skiapipeline {
28
29class AnimatedRoundRect : public SkDrawable {
30public:
31 AnimatedRoundRect(uirenderer::CanvasPropertyPrimitive* left,
John Reck1bcacfd2017-11-03 10:12:19 -070032 uirenderer::CanvasPropertyPrimitive* top,
33 uirenderer::CanvasPropertyPrimitive* right,
34 uirenderer::CanvasPropertyPrimitive* bottom,
35 uirenderer::CanvasPropertyPrimitive* rx,
36 uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* p)
37 : mLeft(left), mTop(top), mRight(right), mBottom(bottom), mRx(rx), mRy(ry), mPaint(p) {}
Stan Iliev021693b2016-10-17 16:26:15 -040038
39protected:
40 virtual SkRect onGetBounds() override {
41 return SkRect::MakeLTRB(mLeft->value, mTop->value, mRight->value, mBottom->value);
42 }
43 virtual void onDraw(SkCanvas* canvas) override {
44 SkRect rect = SkRect::MakeLTRB(mLeft->value, mTop->value, mRight->value, mBottom->value);
45 canvas->drawRoundRect(rect, mRx->value, mRy->value, mPaint->value);
46 }
47
48private:
49 sp<uirenderer::CanvasPropertyPrimitive> mLeft;
50 sp<uirenderer::CanvasPropertyPrimitive> mTop;
51 sp<uirenderer::CanvasPropertyPrimitive> mRight;
52 sp<uirenderer::CanvasPropertyPrimitive> mBottom;
53 sp<uirenderer::CanvasPropertyPrimitive> mRx;
54 sp<uirenderer::CanvasPropertyPrimitive> mRy;
55 sp<uirenderer::CanvasPropertyPaint> mPaint;
56};
57
Derek Sollenbergerdf301aa2020-12-17 11:06:03 -050058class AnimatedRipple : public SkDrawable {
59public:
60 AnimatedRipple(uirenderer::CanvasPropertyPrimitive* x, uirenderer::CanvasPropertyPrimitive* y,
61 uirenderer::CanvasPropertyPrimitive* radius,
62 uirenderer::CanvasPropertyPaint* paint,
63 uirenderer::CanvasPropertyPrimitive* progress,
Derek Sollenberger783e5ae2021-01-11 15:44:46 -050064 const SkRuntimeShaderBuilder& effectBuilder)
Derek Sollenbergerdf301aa2020-12-17 11:06:03 -050065 : mX(x)
66 , mY(y)
67 , mRadius(radius)
68 , mPaint(paint)
69 , mProgress(progress)
Derek Sollenberger783e5ae2021-01-11 15:44:46 -050070 , mRuntimeEffectBuilder(effectBuilder) {}
Derek Sollenbergerdf301aa2020-12-17 11:06:03 -050071
72protected:
73 virtual SkRect onGetBounds() override {
74 const float x = mX->value;
75 const float y = mY->value;
76 const float radius = mRadius->value;
77 return SkRect::MakeLTRB(x - radius, y - radius, x + radius, y + radius);
78 }
79 virtual void onDraw(SkCanvas* canvas) override {
80 SkRuntimeShaderBuilder::BuilderUniform center = mRuntimeEffectBuilder.uniform("in_origin");
81 if (center.fVar != nullptr) {
82 center = SkV2{mX->value, mY->value};
83 }
84
85 SkRuntimeShaderBuilder::BuilderUniform radiusU =
Derek Sollenberger783e5ae2021-01-11 15:44:46 -050086 mRuntimeEffectBuilder.uniform("in_radius");
Derek Sollenbergerdf301aa2020-12-17 11:06:03 -050087 if (radiusU.fVar != nullptr) {
88 radiusU = mRadius->value;
89 }
90
91 SkRuntimeShaderBuilder::BuilderUniform progressU =
92 mRuntimeEffectBuilder.uniform("in_progress");
93 if (progressU.fVar != nullptr) {
94 progressU = mProgress->value;
95 }
96
97 SkPaint paint = mPaint->value;
98 paint.setShader(mRuntimeEffectBuilder.makeShader(nullptr, false));
99 canvas->drawCircle(mX->value, mY->value, mRadius->value, paint);
100 }
101
102private:
103 sp<uirenderer::CanvasPropertyPrimitive> mX;
104 sp<uirenderer::CanvasPropertyPrimitive> mY;
105 sp<uirenderer::CanvasPropertyPrimitive> mRadius;
106 sp<uirenderer::CanvasPropertyPaint> mPaint;
107 sp<uirenderer::CanvasPropertyPrimitive> mProgress;
108 SkRuntimeShaderBuilder mRuntimeEffectBuilder;
109};
110
Stan Iliev021693b2016-10-17 16:26:15 -0400111class AnimatedCircle : public SkDrawable {
112public:
113 AnimatedCircle(uirenderer::CanvasPropertyPrimitive* x, uirenderer::CanvasPropertyPrimitive* y,
John Reck1bcacfd2017-11-03 10:12:19 -0700114 uirenderer::CanvasPropertyPrimitive* radius,
115 uirenderer::CanvasPropertyPaint* paint)
116 : mX(x), mY(y), mRadius(radius), mPaint(paint) {}
Stan Iliev021693b2016-10-17 16:26:15 -0400117
118protected:
119 virtual SkRect onGetBounds() override {
120 const float x = mX->value;
121 const float y = mY->value;
122 const float radius = mRadius->value;
123 return SkRect::MakeLTRB(x - radius, y - radius, x + radius, y + radius);
124 }
125 virtual void onDraw(SkCanvas* canvas) override {
126 canvas->drawCircle(mX->value, mY->value, mRadius->value, mPaint->value);
127 }
128
129private:
130 sp<uirenderer::CanvasPropertyPrimitive> mX;
131 sp<uirenderer::CanvasPropertyPrimitive> mY;
132 sp<uirenderer::CanvasPropertyPrimitive> mRadius;
133 sp<uirenderer::CanvasPropertyPaint> mPaint;
134};
135
Chris Blume7b8a8082018-11-30 15:51:58 -0800136} // namespace skiapipeline
137} // namespace uirenderer
138} // namespace android