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