xref: /aosp_15_r20/frameworks/base/libs/hwui/canvas/CanvasOps.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #pragma once
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <SkAndroidFrameworkUtils.h>
20*d57664e9SAndroid Build Coastguard Worker #include <SkBlendMode.h>
21*d57664e9SAndroid Build Coastguard Worker #include <SkCanvas.h>
22*d57664e9SAndroid Build Coastguard Worker #include <SkClipOp.h>
23*d57664e9SAndroid Build Coastguard Worker #include <SkImage.h>
24*d57664e9SAndroid Build Coastguard Worker #include <SkPaint.h>
25*d57664e9SAndroid Build Coastguard Worker #include <SkPath.h>
26*d57664e9SAndroid Build Coastguard Worker #include <SkPicture.h>
27*d57664e9SAndroid Build Coastguard Worker #include <SkRRect.h>
28*d57664e9SAndroid Build Coastguard Worker #include <SkRect.h>
29*d57664e9SAndroid Build Coastguard Worker #include <SkRegion.h>
30*d57664e9SAndroid Build Coastguard Worker #include <SkRuntimeEffect.h>
31*d57664e9SAndroid Build Coastguard Worker #include <SkSamplingOptions.h>
32*d57664e9SAndroid Build Coastguard Worker #include <SkVertices.h>
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker #include <log/log.h>
35*d57664e9SAndroid Build Coastguard Worker 
36*d57664e9SAndroid Build Coastguard Worker #include "hwui/Bitmap.h"
37*d57664e9SAndroid Build Coastguard Worker #include "CanvasProperty.h"
38*d57664e9SAndroid Build Coastguard Worker #include "CanvasOpTypes.h"
39*d57664e9SAndroid Build Coastguard Worker #include "Layer.h"
40*d57664e9SAndroid Build Coastguard Worker #include "Points.h"
41*d57664e9SAndroid Build Coastguard Worker #include "RenderNode.h"
42*d57664e9SAndroid Build Coastguard Worker 
43*d57664e9SAndroid Build Coastguard Worker #include <experimental/type_traits>
44*d57664e9SAndroid Build Coastguard Worker #include <utility>
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker namespace android::uirenderer {
47*d57664e9SAndroid Build Coastguard Worker 
48*d57664e9SAndroid Build Coastguard Worker template <CanvasOpType T>
49*d57664e9SAndroid Build Coastguard Worker struct CanvasOp;
50*d57664e9SAndroid Build Coastguard Worker 
51*d57664e9SAndroid Build Coastguard Worker struct CanvasOpTraits {
52*d57664e9SAndroid Build Coastguard Worker     CanvasOpTraits() = delete;
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker     template<class T>
55*d57664e9SAndroid Build Coastguard Worker     using draw_t = decltype(std::integral_constant<void (T::*)(SkCanvas*) const, &T::draw>{});
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker     template <class T>
58*d57664e9SAndroid Build Coastguard Worker     static constexpr bool can_draw = std::experimental::is_detected_v<draw_t, T>;
59*d57664e9SAndroid Build Coastguard Worker };
60*d57664e9SAndroid Build Coastguard Worker 
61*d57664e9SAndroid Build Coastguard Worker #define ASSERT_DRAWABLE() private: constexpr void _check_drawable() \
62*d57664e9SAndroid Build Coastguard Worker     { static_assert(CanvasOpTraits::can_draw<std::decay_t<decltype(*this)>>); }
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------
65*d57664e9SAndroid Build Coastguard Worker //   State Ops
66*d57664e9SAndroid Build Coastguard Worker //  ---------------------------------------------
67*d57664e9SAndroid Build Coastguard Worker 
68*d57664e9SAndroid Build Coastguard Worker template <>
69*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::Save> {
70*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->save(); }
71*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
72*d57664e9SAndroid Build Coastguard Worker };
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker template <>
75*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::SaveLayer> {
76*d57664e9SAndroid Build Coastguard Worker     SkCanvas::SaveLayerRec saveLayerRec;
77*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->saveLayer(saveLayerRec); }
78*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
79*d57664e9SAndroid Build Coastguard Worker };
80*d57664e9SAndroid Build Coastguard Worker 
81*d57664e9SAndroid Build Coastguard Worker template <>
82*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::SaveBehind> {
83*d57664e9SAndroid Build Coastguard Worker     SkRect bounds;
84*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { SkAndroidFrameworkUtils::SaveBehind(canvas, &bounds); }
85*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
86*d57664e9SAndroid Build Coastguard Worker };
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker template <>
89*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::Restore> {
90*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->restore(); }
91*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
92*d57664e9SAndroid Build Coastguard Worker };
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker template <>
95*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::BeginZ> {
96*d57664e9SAndroid Build Coastguard Worker };
97*d57664e9SAndroid Build Coastguard Worker template <>
98*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::EndZ> {};
99*d57664e9SAndroid Build Coastguard Worker 
100*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------
101*d57664e9SAndroid Build Coastguard Worker //   Clip Ops
102*d57664e9SAndroid Build Coastguard Worker //  ---------------------------------------------
103*d57664e9SAndroid Build Coastguard Worker 
104*d57664e9SAndroid Build Coastguard Worker template <>
105*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::ClipRect> {
106*d57664e9SAndroid Build Coastguard Worker     SkRect rect;
107*d57664e9SAndroid Build Coastguard Worker     SkClipOp clipOp;
108*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->clipRect(rect, clipOp); }
109*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
110*d57664e9SAndroid Build Coastguard Worker };
111*d57664e9SAndroid Build Coastguard Worker 
112*d57664e9SAndroid Build Coastguard Worker template <>
113*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::ClipPath> {
114*d57664e9SAndroid Build Coastguard Worker     SkPath path;
115*d57664e9SAndroid Build Coastguard Worker     SkClipOp op;
116*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->clipPath(path, op, true); }
117*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
118*d57664e9SAndroid Build Coastguard Worker };
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------
121*d57664e9SAndroid Build Coastguard Worker //   Drawing Ops
122*d57664e9SAndroid Build Coastguard Worker //  ---------------------------------------------
123*d57664e9SAndroid Build Coastguard Worker 
124*d57664e9SAndroid Build Coastguard Worker template<>
125*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRoundRectProperty> {
126*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> left;
127*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> top;
128*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> right;
129*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> bottom;
130*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> rx;
131*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> ry;
132*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPaint> paint;
133*d57664e9SAndroid Build Coastguard Worker 
134*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
135*d57664e9SAndroid Build Coastguard Worker         SkRect rect = SkRect::MakeLTRB(left->value, top->value, right->value, bottom->value);
136*d57664e9SAndroid Build Coastguard Worker         canvas->drawRoundRect(rect, rx->value, ry->value, paint->value);
137*d57664e9SAndroid Build Coastguard Worker     }
138*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
139*d57664e9SAndroid Build Coastguard Worker };
140*d57664e9SAndroid Build Coastguard Worker 
141*d57664e9SAndroid Build Coastguard Worker template<>
142*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawCircleProperty> {
143*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> x;
144*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> y;
145*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPrimitive> radius;
146*d57664e9SAndroid Build Coastguard Worker     sp<uirenderer::CanvasPropertyPaint> paint;
147*d57664e9SAndroid Build Coastguard Worker 
148*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
149*d57664e9SAndroid Build Coastguard Worker         canvas->drawCircle(x->value, y->value, radius->value, paint->value);
150*d57664e9SAndroid Build Coastguard Worker     }
151*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
152*d57664e9SAndroid Build Coastguard Worker };
153*d57664e9SAndroid Build Coastguard Worker 
154*d57664e9SAndroid Build Coastguard Worker template <>
155*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRippleDrawable> {
156*d57664e9SAndroid Build Coastguard Worker     skiapipeline::RippleDrawableParams params;
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
159*d57664e9SAndroid Build Coastguard Worker         skiapipeline::AnimatedRippleDrawable::draw(canvas, params);
160*d57664e9SAndroid Build Coastguard Worker     }
161*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
162*d57664e9SAndroid Build Coastguard Worker };
163*d57664e9SAndroid Build Coastguard Worker 
164*d57664e9SAndroid Build Coastguard Worker template <>
165*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawColor> {
166*d57664e9SAndroid Build Coastguard Worker     SkColor4f color;
167*d57664e9SAndroid Build Coastguard Worker     SkBlendMode mode;
168*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawColor(color, mode); }
169*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
170*d57664e9SAndroid Build Coastguard Worker };
171*d57664e9SAndroid Build Coastguard Worker 
172*d57664e9SAndroid Build Coastguard Worker template <>
173*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawPaint> {
174*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
175*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawPaint(paint); }
176*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
177*d57664e9SAndroid Build Coastguard Worker };
178*d57664e9SAndroid Build Coastguard Worker 
179*d57664e9SAndroid Build Coastguard Worker template <>
180*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawPoint> {
181*d57664e9SAndroid Build Coastguard Worker     float x;
182*d57664e9SAndroid Build Coastguard Worker     float y;
183*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
184*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawPoint(x, y, paint); }
185*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
186*d57664e9SAndroid Build Coastguard Worker };
187*d57664e9SAndroid Build Coastguard Worker 
188*d57664e9SAndroid Build Coastguard Worker template <>
189*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawPoints> {
190*d57664e9SAndroid Build Coastguard Worker     size_t count;
191*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
192*d57664e9SAndroid Build Coastguard Worker     sk_sp<Points> points;
193*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
194*d57664e9SAndroid Build Coastguard Worker         canvas->drawPoints(
195*d57664e9SAndroid Build Coastguard Worker             SkCanvas::kPoints_PointMode,
196*d57664e9SAndroid Build Coastguard Worker             count,
197*d57664e9SAndroid Build Coastguard Worker             points->data(),
198*d57664e9SAndroid Build Coastguard Worker             paint
199*d57664e9SAndroid Build Coastguard Worker         );
200*d57664e9SAndroid Build Coastguard Worker     }
201*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
202*d57664e9SAndroid Build Coastguard Worker };
203*d57664e9SAndroid Build Coastguard Worker 
204*d57664e9SAndroid Build Coastguard Worker template <>
205*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRect> {
206*d57664e9SAndroid Build Coastguard Worker     SkRect rect;
207*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
208*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawRect(rect, paint); }
209*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
210*d57664e9SAndroid Build Coastguard Worker };
211*d57664e9SAndroid Build Coastguard Worker 
212*d57664e9SAndroid Build Coastguard Worker template <>
213*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRegion> {
214*d57664e9SAndroid Build Coastguard Worker     SkRegion region;
215*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
216*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawRegion(region, paint); }
217*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
218*d57664e9SAndroid Build Coastguard Worker };
219*d57664e9SAndroid Build Coastguard Worker 
220*d57664e9SAndroid Build Coastguard Worker template<>
221*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRoundRect> {
222*d57664e9SAndroid Build Coastguard Worker     SkRect rect;
223*d57664e9SAndroid Build Coastguard Worker     SkScalar rx;
224*d57664e9SAndroid Build Coastguard Worker     SkScalar ry;
225*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
226*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
227*d57664e9SAndroid Build Coastguard Worker         canvas->drawRoundRect(rect, rx, ry, paint);
228*d57664e9SAndroid Build Coastguard Worker     }
229*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
230*d57664e9SAndroid Build Coastguard Worker };
231*d57664e9SAndroid Build Coastguard Worker 
232*d57664e9SAndroid Build Coastguard Worker template<>
233*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawDoubleRoundRect> {
234*d57664e9SAndroid Build Coastguard Worker     SkRRect outer;
235*d57664e9SAndroid Build Coastguard Worker     SkRRect inner;
236*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
237*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
238*d57664e9SAndroid Build Coastguard Worker         canvas->drawDRRect(outer, inner, paint);
239*d57664e9SAndroid Build Coastguard Worker     }
240*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
241*d57664e9SAndroid Build Coastguard Worker };
242*d57664e9SAndroid Build Coastguard Worker 
243*d57664e9SAndroid Build Coastguard Worker template<>
244*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawCircle> {
245*d57664e9SAndroid Build Coastguard Worker     SkScalar cx;
246*d57664e9SAndroid Build Coastguard Worker     SkScalar cy;
247*d57664e9SAndroid Build Coastguard Worker     SkScalar radius;
248*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
249*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
250*d57664e9SAndroid Build Coastguard Worker         canvas->drawCircle(cx, cy, radius, paint);
251*d57664e9SAndroid Build Coastguard Worker     }
252*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
253*d57664e9SAndroid Build Coastguard Worker };
254*d57664e9SAndroid Build Coastguard Worker 
255*d57664e9SAndroid Build Coastguard Worker template<>
256*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawOval> {
257*d57664e9SAndroid Build Coastguard Worker     SkRect oval;
258*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
259*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
260*d57664e9SAndroid Build Coastguard Worker         canvas->drawOval(oval, paint);
261*d57664e9SAndroid Build Coastguard Worker     }
262*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
263*d57664e9SAndroid Build Coastguard Worker };
264*d57664e9SAndroid Build Coastguard Worker 
265*d57664e9SAndroid Build Coastguard Worker template<>
266*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawArc> {
267*d57664e9SAndroid Build Coastguard Worker     SkRect oval;
268*d57664e9SAndroid Build Coastguard Worker     SkScalar startAngle;
269*d57664e9SAndroid Build Coastguard Worker     SkScalar sweepAngle;
270*d57664e9SAndroid Build Coastguard Worker     bool useCenter;
271*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
272*d57664e9SAndroid Build Coastguard Worker 
273*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
274*d57664e9SAndroid Build Coastguard Worker         canvas->drawArc(oval, startAngle, sweepAngle, useCenter, paint);
275*d57664e9SAndroid Build Coastguard Worker     }
276*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
277*d57664e9SAndroid Build Coastguard Worker };
278*d57664e9SAndroid Build Coastguard Worker 
279*d57664e9SAndroid Build Coastguard Worker template<>
280*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawPath> {
281*d57664e9SAndroid Build Coastguard Worker     SkPath path;
282*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
283*d57664e9SAndroid Build Coastguard Worker 
284*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const { canvas->drawPath(path, paint); }
285*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
286*d57664e9SAndroid Build Coastguard Worker };
287*d57664e9SAndroid Build Coastguard Worker 
288*d57664e9SAndroid Build Coastguard Worker template<>
289*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawLine> {
290*d57664e9SAndroid Build Coastguard Worker     float startX;
291*d57664e9SAndroid Build Coastguard Worker     float startY;
292*d57664e9SAndroid Build Coastguard Worker     float endX;
293*d57664e9SAndroid Build Coastguard Worker     float endY;
294*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
295*d57664e9SAndroid Build Coastguard Worker 
296*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
297*d57664e9SAndroid Build Coastguard Worker         canvas->drawLine(startX, startY, endX, endY, paint);
298*d57664e9SAndroid Build Coastguard Worker     }
299*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
300*d57664e9SAndroid Build Coastguard Worker };
301*d57664e9SAndroid Build Coastguard Worker 
302*d57664e9SAndroid Build Coastguard Worker template<>
303*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawLines> {
304*d57664e9SAndroid Build Coastguard Worker     size_t count;
305*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
306*d57664e9SAndroid Build Coastguard Worker     sk_sp<Points> points;
307*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
308*d57664e9SAndroid Build Coastguard Worker         canvas->drawPoints(
309*d57664e9SAndroid Build Coastguard Worker             SkCanvas::kLines_PointMode,
310*d57664e9SAndroid Build Coastguard Worker             count,
311*d57664e9SAndroid Build Coastguard Worker             points->data(),
312*d57664e9SAndroid Build Coastguard Worker             paint
313*d57664e9SAndroid Build Coastguard Worker         );
314*d57664e9SAndroid Build Coastguard Worker     }
315*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
316*d57664e9SAndroid Build Coastguard Worker };
317*d57664e9SAndroid Build Coastguard Worker 
318*d57664e9SAndroid Build Coastguard Worker template<>
319*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawVertices> {
320*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkVertices> vertices;
321*d57664e9SAndroid Build Coastguard Worker     SkBlendMode mode;
322*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
323*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
324*d57664e9SAndroid Build Coastguard Worker         canvas->drawVertices(vertices, mode, paint);
325*d57664e9SAndroid Build Coastguard Worker     }
326*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
327*d57664e9SAndroid Build Coastguard Worker };
328*d57664e9SAndroid Build Coastguard Worker 
329*d57664e9SAndroid Build Coastguard Worker template<>
330*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawImage> {
331*d57664e9SAndroid Build Coastguard Worker 
332*d57664e9SAndroid Build Coastguard Worker     CanvasOp(
333*d57664e9SAndroid Build Coastguard Worker         const sk_sp<Bitmap>& bitmap,
334*d57664e9SAndroid Build Coastguard Worker         float left,
335*d57664e9SAndroid Build Coastguard Worker         float top,
336*d57664e9SAndroid Build Coastguard Worker         SkFilterMode filter,
337*d57664e9SAndroid Build Coastguard Worker         SkPaint paint
338*d57664e9SAndroid Build Coastguard Worker     ) : left(left),
339*d57664e9SAndroid Build Coastguard Worker         top(top),
340*d57664e9SAndroid Build Coastguard Worker         filter(filter),
341*d57664e9SAndroid Build Coastguard Worker         paint(std::move(paint)),
342*d57664e9SAndroid Build Coastguard Worker         bitmap(bitmap),
343*d57664e9SAndroid Build Coastguard Worker         image(bitmap->makeImage()) { }
344*d57664e9SAndroid Build Coastguard Worker 
345*d57664e9SAndroid Build Coastguard Worker     float left;
346*d57664e9SAndroid Build Coastguard Worker     float top;
347*d57664e9SAndroid Build Coastguard Worker     SkFilterMode filter;
348*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
349*d57664e9SAndroid Build Coastguard Worker     sk_sp<Bitmap> bitmap;
350*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkImage> image;
351*d57664e9SAndroid Build Coastguard Worker 
352*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
353*d57664e9SAndroid Build Coastguard Worker         canvas->drawImage(image, left, top, SkSamplingOptions(filter), &paint);
354*d57664e9SAndroid Build Coastguard Worker     }
355*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
356*d57664e9SAndroid Build Coastguard Worker };
357*d57664e9SAndroid Build Coastguard Worker 
358*d57664e9SAndroid Build Coastguard Worker template<>
359*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawImageRect> {
360*d57664e9SAndroid Build Coastguard Worker 
361*d57664e9SAndroid Build Coastguard Worker     CanvasOp(
362*d57664e9SAndroid Build Coastguard Worker         const sk_sp<Bitmap>& bitmap,
363*d57664e9SAndroid Build Coastguard Worker         SkRect src,
364*d57664e9SAndroid Build Coastguard Worker         SkRect dst,
365*d57664e9SAndroid Build Coastguard Worker         SkFilterMode filter,
366*d57664e9SAndroid Build Coastguard Worker         SkPaint paint
367*d57664e9SAndroid Build Coastguard Worker     ) : src(src),
368*d57664e9SAndroid Build Coastguard Worker         dst(dst),
369*d57664e9SAndroid Build Coastguard Worker         filter(filter),
370*d57664e9SAndroid Build Coastguard Worker         paint(std::move(paint)),
371*d57664e9SAndroid Build Coastguard Worker         bitmap(bitmap),
372*d57664e9SAndroid Build Coastguard Worker         image(bitmap->makeImage()) { }
373*d57664e9SAndroid Build Coastguard Worker 
374*d57664e9SAndroid Build Coastguard Worker     SkRect src;
375*d57664e9SAndroid Build Coastguard Worker     SkRect dst;
376*d57664e9SAndroid Build Coastguard Worker     SkFilterMode filter;
377*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
378*d57664e9SAndroid Build Coastguard Worker     sk_sp<Bitmap> bitmap;
379*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkImage> image;
380*d57664e9SAndroid Build Coastguard Worker 
381*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
382*d57664e9SAndroid Build Coastguard Worker         canvas->drawImageRect(image,
383*d57664e9SAndroid Build Coastguard Worker                 src,
384*d57664e9SAndroid Build Coastguard Worker                 dst,
385*d57664e9SAndroid Build Coastguard Worker                 SkSamplingOptions(filter),
386*d57664e9SAndroid Build Coastguard Worker                 &paint,
387*d57664e9SAndroid Build Coastguard Worker                 SkCanvas::kFast_SrcRectConstraint
388*d57664e9SAndroid Build Coastguard Worker         );
389*d57664e9SAndroid Build Coastguard Worker     }
390*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
391*d57664e9SAndroid Build Coastguard Worker };
392*d57664e9SAndroid Build Coastguard Worker 
393*d57664e9SAndroid Build Coastguard Worker template<>
394*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawImageLattice> {
395*d57664e9SAndroid Build Coastguard Worker 
396*d57664e9SAndroid Build Coastguard Worker     CanvasOp(
397*d57664e9SAndroid Build Coastguard Worker         const sk_sp<Bitmap>& bitmap,
398*d57664e9SAndroid Build Coastguard Worker         SkRect dst,
399*d57664e9SAndroid Build Coastguard Worker         SkCanvas::Lattice lattice,
400*d57664e9SAndroid Build Coastguard Worker         SkFilterMode filter,
401*d57664e9SAndroid Build Coastguard Worker         SkPaint  paint
402*d57664e9SAndroid Build Coastguard Worker     ):  dst(dst),
403*d57664e9SAndroid Build Coastguard Worker         lattice(lattice),
404*d57664e9SAndroid Build Coastguard Worker         filter(filter),
405*d57664e9SAndroid Build Coastguard Worker         bitmap(bitmap),
406*d57664e9SAndroid Build Coastguard Worker         image(bitmap->makeImage()),
407*d57664e9SAndroid Build Coastguard Worker         paint(std::move(paint)) {}
408*d57664e9SAndroid Build Coastguard Worker 
409*d57664e9SAndroid Build Coastguard Worker     SkRect dst;
410*d57664e9SAndroid Build Coastguard Worker     SkCanvas::Lattice lattice;
411*d57664e9SAndroid Build Coastguard Worker     SkFilterMode filter;
412*d57664e9SAndroid Build Coastguard Worker     const sk_sp<Bitmap> bitmap;
413*d57664e9SAndroid Build Coastguard Worker     const sk_sp<SkImage> image;
414*d57664e9SAndroid Build Coastguard Worker 
415*d57664e9SAndroid Build Coastguard Worker     SkPaint paint;
416*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
417*d57664e9SAndroid Build Coastguard Worker         canvas->drawImageLattice(image.get(), lattice, dst, filter, &paint);
418*d57664e9SAndroid Build Coastguard Worker     }
419*d57664e9SAndroid Build Coastguard Worker     ASSERT_DRAWABLE()
420*d57664e9SAndroid Build Coastguard Worker };
421*d57664e9SAndroid Build Coastguard Worker 
422*d57664e9SAndroid Build Coastguard Worker template<>
423*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawPicture> {
424*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkPicture> picture;
425*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) const {
426*d57664e9SAndroid Build Coastguard Worker         picture->playback(canvas);
427*d57664e9SAndroid Build Coastguard Worker     }
428*d57664e9SAndroid Build Coastguard Worker };
429*d57664e9SAndroid Build Coastguard Worker 
430*d57664e9SAndroid Build Coastguard Worker template<>
431*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawLayer> {
432*d57664e9SAndroid Build Coastguard Worker     sp<Layer> layer;
433*d57664e9SAndroid Build Coastguard Worker };
434*d57664e9SAndroid Build Coastguard Worker 
435*d57664e9SAndroid Build Coastguard Worker template<>
436*d57664e9SAndroid Build Coastguard Worker struct CanvasOp<CanvasOpType::DrawRenderNode> {
437*d57664e9SAndroid Build Coastguard Worker     sp<RenderNode> renderNode;
438*d57664e9SAndroid Build Coastguard Worker };
439*d57664e9SAndroid Build Coastguard Worker 
440*d57664e9SAndroid Build Coastguard Worker // cleanup our macros
441*d57664e9SAndroid Build Coastguard Worker #undef ASSERT_DRAWABLE
442*d57664e9SAndroid Build Coastguard Worker 
443*d57664e9SAndroid Build Coastguard Worker }  // namespace android::uirenderer
444