1 | // Copyright 2013 The Flutter Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | #ifndef FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ |
6 | #define FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ |
7 | |
8 | #include "flutter/display_list/dl_canvas.h" |
9 | #include "flutter/display_list/skia/dl_sk_types.h" |
10 | |
11 | namespace flutter { |
12 | |
13 | // An adapter to receive DlCanvas calls and dispatch them into |
14 | // an SkCanvas. |
15 | class DlSkCanvasAdapter final : public virtual DlCanvas { |
16 | public: |
17 | DlSkCanvasAdapter() : delegate_(nullptr) {} |
18 | explicit DlSkCanvasAdapter(SkCanvas* canvas) : delegate_(canvas) {} |
19 | ~DlSkCanvasAdapter() override = default; |
20 | |
21 | void set_canvas(SkCanvas* canvas); |
22 | SkCanvas* canvas() { return delegate_; } |
23 | |
24 | SkISize GetBaseLayerSize() const override; |
25 | SkImageInfo GetImageInfo() const override; |
26 | |
27 | void Save() override; |
28 | void SaveLayer(const SkRect* bounds, |
29 | const DlPaint* paint = nullptr, |
30 | const DlImageFilter* backdrop = nullptr) override; |
31 | void Restore() override; |
32 | int GetSaveCount() const override; |
33 | void RestoreToCount(int restore_count) override; |
34 | |
35 | void Translate(SkScalar tx, SkScalar ty) override; |
36 | void Scale(SkScalar sx, SkScalar sy) override; |
37 | void Rotate(SkScalar degrees) override; |
38 | void Skew(SkScalar sx, SkScalar sy) override; |
39 | |
40 | // clang-format off |
41 | |
42 | // 2x3 2D affine subset of a 4x4 transform in row major order |
43 | void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, |
44 | SkScalar myx, SkScalar myy, SkScalar myt) override; |
45 | // full 4x4 transform in row major order |
46 | void TransformFullPerspective( |
47 | SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, |
48 | SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, |
49 | SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, |
50 | SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override; |
51 | // clang-format on |
52 | void TransformReset() override; |
53 | void Transform(const SkMatrix* matrix) override; |
54 | void Transform(const SkM44* matrix44) override; |
55 | void SetTransform(const SkMatrix* matrix) override; |
56 | void SetTransform(const SkM44* matrix44) override; |
57 | using DlCanvas::SetTransform; |
58 | using DlCanvas::Transform; |
59 | |
60 | /// Returns the 4x4 full perspective transform representing all transform |
61 | /// operations executed so far in this DisplayList within the enclosing |
62 | /// save stack. |
63 | SkM44 GetTransformFullPerspective() const override; |
64 | /// Returns the 3x3 partial perspective transform representing all transform |
65 | /// operations executed so far in this DisplayList within the enclosing |
66 | /// save stack. |
67 | SkMatrix GetTransform() const override; |
68 | |
69 | void ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; |
70 | void ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; |
71 | void ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; |
72 | |
73 | /// Conservative estimate of the bounds of all outstanding clip operations |
74 | /// measured in the coordinate space within which this DisplayList will |
75 | /// be rendered. |
76 | SkRect GetDestinationClipBounds() const override; |
77 | /// Conservative estimate of the bounds of all outstanding clip operations |
78 | /// transformed into the local coordinate space in which currently |
79 | /// recorded rendering operations are interpreted. |
80 | SkRect GetLocalClipBounds() const override; |
81 | |
82 | /// Return true iff the supplied bounds are easily shown to be outside |
83 | /// of the current clip bounds. This method may conservatively return |
84 | /// false if it cannot make the determination. |
85 | bool QuickReject(const SkRect& bounds) const override; |
86 | |
87 | void DrawPaint(const DlPaint& paint) override; |
88 | void DrawColor(DlColor color, DlBlendMode mode) override; |
89 | void DrawLine(const SkPoint& p0, |
90 | const SkPoint& p1, |
91 | const DlPaint& paint) override; |
92 | void DrawRect(const SkRect& rect, const DlPaint& paint) override; |
93 | void DrawOval(const SkRect& bounds, const DlPaint& paint) override; |
94 | void DrawCircle(const SkPoint& center, |
95 | SkScalar radius, |
96 | const DlPaint& paint) override; |
97 | void DrawRRect(const SkRRect& rrect, const DlPaint& paint) override; |
98 | void DrawDRRect(const SkRRect& outer, |
99 | const SkRRect& inner, |
100 | const DlPaint& paint) override; |
101 | void DrawPath(const SkPath& path, const DlPaint& paint) override; |
102 | void DrawArc(const SkRect& bounds, |
103 | SkScalar start, |
104 | SkScalar sweep, |
105 | bool useCenter, |
106 | const DlPaint& paint) override; |
107 | void DrawPoints(PointMode mode, |
108 | uint32_t count, |
109 | const SkPoint pts[], |
110 | const DlPaint& paint) override; |
111 | void DrawVertices(const DlVertices* vertices, |
112 | DlBlendMode mode, |
113 | const DlPaint& paint) override; |
114 | void DrawImage(const sk_sp<DlImage>& image, |
115 | const SkPoint point, |
116 | DlImageSampling sampling, |
117 | const DlPaint* paint = nullptr) override; |
118 | void DrawImageRect( |
119 | const sk_sp<DlImage>& image, |
120 | const SkRect& src, |
121 | const SkRect& dst, |
122 | DlImageSampling sampling, |
123 | const DlPaint* paint = nullptr, |
124 | SrcRectConstraint constraint = SrcRectConstraint::kFast) override; |
125 | void DrawImageNine(const sk_sp<DlImage>& image, |
126 | const SkIRect& center, |
127 | const SkRect& dst, |
128 | DlFilterMode filter, |
129 | const DlPaint* paint = nullptr) override; |
130 | void DrawAtlas(const sk_sp<DlImage>& atlas, |
131 | const SkRSXform xform[], |
132 | const SkRect tex[], |
133 | const DlColor colors[], |
134 | int count, |
135 | DlBlendMode mode, |
136 | DlImageSampling sampling, |
137 | const SkRect* cullRect, |
138 | const DlPaint* paint = nullptr) override; |
139 | void DrawDisplayList(const sk_sp<DisplayList> display_list, |
140 | SkScalar opacity = SK_Scalar1) override; |
141 | void DrawTextBlob(const sk_sp<SkTextBlob>& blob, |
142 | SkScalar x, |
143 | SkScalar y, |
144 | const DlPaint& paint) override; |
145 | void DrawShadow(const SkPath& path, |
146 | const DlColor color, |
147 | const SkScalar elevation, |
148 | bool transparent_occluder, |
149 | SkScalar dpr) override; |
150 | |
151 | void Flush() override; |
152 | |
153 | private: |
154 | SkCanvas* delegate_; |
155 | }; |
156 | |
157 | } // namespace flutter |
158 | |
159 | #endif // FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ |
160 | |