Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
mock_canvas.h
Go to the documentation of this file.
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_TESTING_MOCK_CANVAS_H_
6#define FLUTTER_TESTING_MOCK_CANVAS_H_
7
8#include <ostream>
9#include <variant>
10#include <vector>
11
12#include "flutter/display_list/dl_canvas.h"
13#include "flutter/display_list/utils/dl_matrix_clip_tracker.h"
14#include "gtest/gtest.h"
26
27namespace flutter {
28namespace testing {
29
30static constexpr SkRect kEmptyRect = SkRect::MakeEmpty();
31
32// Mock |SkCanvas|, useful for writing tests that use Skia but do not interact
33// with the GPU.
34//
35// The |MockCanvas| stores a list of |DrawCall| that the test can later verify
36// against the expected list of primitives to be drawn.
37class MockCanvas final : public DlCanvas {
38 public:
43
44 struct SaveData {
46 };
47
51 std::shared_ptr<DlImageFilter> backdrop_filter;
53 };
54
55 struct RestoreData {
57 };
58
62
65 };
66
71
76
82
89
97
102
110
116
122
128
132
133 // Discriminated union of all the different |DrawCall| types. It is roughly
134 // equivalent to the different methods in |SkCanvas|' public API.
135 using DrawCallData = std::variant<SaveData,
151
152 // A single call made against this canvas.
157
158 MockCanvas();
159 MockCanvas(int width, int height);
160 ~MockCanvas();
161
162 const std::vector<DrawCall>& draw_calls() const { return draw_calls_; }
163 void reset_draw_calls() { draw_calls_.clear(); }
164
165 SkISize GetBaseLayerSize() const override;
166 SkImageInfo GetImageInfo() const override;
167
168 void Save() override;
169 void SaveLayer(const SkRect* bounds,
170 const DlPaint* paint = nullptr,
171 const DlImageFilter* backdrop = nullptr) override;
172 void Restore() override;
173 int GetSaveCount() const { return current_layer_; }
174 void RestoreToCount(int restore_count) {
175 while (current_layer_ > restore_count) {
176 Restore();
177 }
178 }
179
180 // clang-format off
181
182 // 2x3 2D affine subset of a 4x4 transform in row major order
183 void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt,
184 SkScalar myx, SkScalar myy, SkScalar myt) override;
185 // full 4x4 transform in row major order
187 SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt,
188 SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt,
189 SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt,
190 SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override;
191 // clang-format on
192
193 void Translate(SkScalar tx, SkScalar ty) override;
194 void Scale(SkScalar sx, SkScalar sy) override;
195 void Rotate(SkScalar degrees) override;
196 void Skew(SkScalar sx, SkScalar sy) override;
197 void TransformReset() override;
198 void Transform(const SkMatrix* matrix) override;
199 void Transform(const SkM44* matrix44) override;
200 void SetTransform(const SkMatrix* matrix) override;
201 void SetTransform(const SkM44* matrix44) override;
204
205 SkM44 GetTransformFullPerspective() const override;
206 SkMatrix GetTransform() const override;
207
208 void ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override;
209 void ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override;
210 void ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override;
211
212 SkRect GetDestinationClipBounds() const override;
213 SkRect GetLocalClipBounds() const override;
214 bool QuickReject(const SkRect& bounds) const override;
215
216 void DrawPaint(const DlPaint& paint) override;
217 void DrawColor(DlColor color, DlBlendMode mode) override;
218 void DrawLine(const SkPoint& p0,
219 const SkPoint& p1,
220 const DlPaint& paint) override;
221 void DrawRect(const SkRect& rect, const DlPaint& paint) override;
222 void DrawOval(const SkRect& bounds, const DlPaint& paint) override;
223 void DrawCircle(const SkPoint& center,
224 SkScalar radius,
225 const DlPaint& paint) override;
226 void DrawRRect(const SkRRect& rrect, const DlPaint& paint) override;
227 void DrawDRRect(const SkRRect& outer,
228 const SkRRect& inner,
229 const DlPaint& paint) override;
230 void DrawPath(const SkPath& path, const DlPaint& paint) override;
231 void DrawArc(const SkRect& bounds,
233 SkScalar sweep,
234 bool useCenter,
235 const DlPaint& paint) override;
237 uint32_t count,
238 const SkPoint pts[],
239 const DlPaint& paint) override;
240 void DrawVertices(const DlVertices* vertices,
242 const DlPaint& paint) override;
243
244 void DrawImage(const sk_sp<DlImage>& image,
245 const SkPoint point,
246 DlImageSampling sampling,
247 const DlPaint* paint = nullptr) override;
248 void DrawImageRect(
249 const sk_sp<DlImage>& image,
250 const SkRect& src,
251 const SkRect& dst,
252 DlImageSampling sampling,
253 const DlPaint* paint = nullptr,
254 SrcRectConstraint constraint = SrcRectConstraint::kFast) override;
256 const SkIRect& center,
257 const SkRect& dst,
258 DlFilterMode filter,
259 const DlPaint* paint = nullptr) override;
260 void DrawAtlas(const sk_sp<DlImage>& atlas,
261 const SkRSXform xform[],
262 const SkRect tex[],
263 const DlColor colors[],
264 int count,
266 DlImageSampling sampling,
267 const SkRect* cullRect,
268 const DlPaint* paint = nullptr) override;
269
270 void DrawDisplayList(const sk_sp<DisplayList> display_list,
271 SkScalar opacity) override;
272 void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
273 SkScalar x,
274 SkScalar y,
275 const DlPaint& paint) override;
276 void DrawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
277 SkScalar x,
278 SkScalar y,
279 const DlPaint& paint) override;
280 void DrawShadow(const SkPath& path,
281 const DlColor color,
282 const SkScalar elevation,
283 bool transparent_occluder,
284 SkScalar dpr) override;
285
286 void Flush() override;
287
288 private:
290 std::vector<DrawCall> draw_calls_;
291 int current_layer_;
292};
293
294extern bool operator==(const MockCanvas::SaveData& a,
295 const MockCanvas::SaveData& b);
296extern std::ostream& operator<<(std::ostream& os,
297 const MockCanvas::SaveData& data);
298extern bool operator==(const MockCanvas::SaveLayerData& a,
299 const MockCanvas::SaveLayerData& b);
300extern std::ostream& operator<<(std::ostream& os,
301 const MockCanvas::SaveLayerData& data);
302extern bool operator==(const MockCanvas::RestoreData& a,
303 const MockCanvas::RestoreData& b);
304extern std::ostream& operator<<(std::ostream& os,
305 const MockCanvas::RestoreData& data);
306extern bool operator==(const MockCanvas::ConcatMatrixData& a,
307 const MockCanvas::ConcatMatrixData& b);
308extern std::ostream& operator<<(std::ostream& os,
309 const MockCanvas::ConcatMatrixData& data);
310extern bool operator==(const MockCanvas::SetMatrixData& a,
311 const MockCanvas::SetMatrixData& b);
312extern std::ostream& operator<<(std::ostream& os,
313 const MockCanvas::SetMatrixData& data);
314extern bool operator==(const MockCanvas::DrawRectData& a,
315 const MockCanvas::DrawRectData& b);
316extern std::ostream& operator<<(std::ostream& os,
317 const MockCanvas::DrawRectData& data);
318extern bool operator==(const MockCanvas::DrawPathData& a,
319 const MockCanvas::DrawPathData& b);
320extern std::ostream& operator<<(std::ostream& os,
321 const MockCanvas::DrawPathData& data);
322extern bool operator==(const MockCanvas::DrawTextData& a,
323 const MockCanvas::DrawTextData& b);
324extern std::ostream& operator<<(std::ostream& os,
325 const MockCanvas::DrawTextData& data);
326extern bool operator==(const MockCanvas::DrawImageData& a,
327 const MockCanvas::DrawImageData& b);
328extern std::ostream& operator<<(std::ostream& os,
329 const MockCanvas::DrawImageData& data);
330extern bool operator==(const MockCanvas::DrawImageDataNoPaint& a,
331 const MockCanvas::DrawImageDataNoPaint& b);
332extern std::ostream& operator<<(std::ostream& os,
333 const MockCanvas::DrawImageDataNoPaint& data);
334extern bool operator==(const MockCanvas::DrawDisplayListData& a,
335 const MockCanvas::DrawDisplayListData& b);
336extern std::ostream& operator<<(std::ostream& os,
337 const MockCanvas::DrawDisplayListData& data);
338extern bool operator==(const MockCanvas::DrawShadowData& a,
339 const MockCanvas::DrawShadowData& b);
340extern std::ostream& operator<<(std::ostream& os,
341 const MockCanvas::DrawShadowData& data);
342extern bool operator==(const MockCanvas::ClipRectData& a,
343 const MockCanvas::ClipRectData& b);
344extern std::ostream& operator<<(std::ostream& os,
345 const MockCanvas::ClipRectData& data);
346extern bool operator==(const MockCanvas::ClipRRectData& a,
347 const MockCanvas::ClipRRectData& b);
348extern std::ostream& operator<<(std::ostream& os,
349 const MockCanvas::ClipRRectData& data);
350extern bool operator==(const MockCanvas::ClipPathData& a,
351 const MockCanvas::ClipPathData& b);
352extern std::ostream& operator<<(std::ostream& os,
353 const MockCanvas::ClipPathData& data);
354extern std::ostream& operator<<(std::ostream& os,
356extern bool operator==(const MockCanvas::DrawCall& a,
357 const MockCanvas::DrawCall& b);
358extern std::ostream& operator<<(std::ostream& os,
359 const MockCanvas::DrawCall& draw);
360extern bool operator==(const MockCanvas::DrawPaintData& a,
361 const MockCanvas::DrawPaintData& b);
362extern std::ostream& operator<<(std::ostream& os,
363 const MockCanvas::DrawPaintData& data);
364} // namespace testing
365} // namespace flutter
366
367#endif // FLUTTER_TESTING_MOCK_CANVAS_H_
int count
SkColor4f color
static SkScalar center(float pos0, float pos1)
static void draw(SkCanvas *canvas, SkRect &target, int x, int y)
Definition aaclip.cpp:27
Definition SkM44.h:150
Developer-facing API for rendering anything within the engine.
Definition dl_canvas.h:37
virtual void Transform(const SkMatrix *matrix)=0
virtual void SetTransform(const SkMatrix *matrix)=0
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
Definition dl_vertices.h:71
SkM44 GetTransformFullPerspective() const override
void TransformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override
void RestoreToCount(int restore_count)
void Translate(SkScalar tx, SkScalar ty) override
void DrawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override
void SetTransform(const SkMatrix *matrix) override
void DrawCircle(const SkPoint &center, SkScalar radius, const DlPaint &paint) override
SkMatrix GetTransform() const override
void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override
void DrawTextBlob(const sk_sp< SkTextBlob > &blob, SkScalar x, SkScalar y, const DlPaint &paint) override
SkRect GetLocalClipBounds() const override
SkRect GetDestinationClipBounds() const override
SkISize GetBaseLayerSize() const override
const std::vector< DrawCall > & draw_calls() const
void DrawImageNine(const sk_sp< DlImage > &image, const SkIRect &center, const SkRect &dst, DlFilterMode filter, const DlPaint *paint=nullptr) override
SkImageInfo GetImageInfo() const override
void ClipRRect(const SkRRect &rrect, ClipOp clip_op, bool is_aa) override
void Transform(const SkMatrix *matrix) override
void DrawPaint(const DlPaint &paint) override
void DrawLine(const SkPoint &p0, const SkPoint &p1, const DlPaint &paint) override
void DrawImage(const sk_sp< DlImage > &image, const SkPoint point, DlImageSampling sampling, const DlPaint *paint=nullptr) override
void Rotate(SkScalar degrees) override
void ClipPath(const SkPath &path, ClipOp clip_op, bool is_aa) override
void DrawImageRect(const sk_sp< DlImage > &image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, SrcRectConstraint constraint=SrcRectConstraint::kFast) override
void DrawColor(DlColor color, DlBlendMode mode) override
void DrawVertices(const DlVertices *vertices, DlBlendMode mode, const DlPaint &paint) override
std::variant< SaveData, SaveLayerData, RestoreData, ConcatMatrixData, SetMatrixData, DrawRectData, DrawPathData, DrawTextData, DrawImageDataNoPaint, DrawImageData, DrawDisplayListData, DrawShadowData, ClipRectData, ClipRRectData, ClipPathData, DrawPaintData > DrawCallData
void DrawRect(const SkRect &rect, const DlPaint &paint) override
void DrawPath(const SkPath &path, const DlPaint &paint) override
void DrawRRect(const SkRRect &rrect, const DlPaint &paint) override
void DrawPoints(PointMode mode, uint32_t count, const SkPoint pts[], const DlPaint &paint) override
void DrawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity) override
void DrawAtlas(const sk_sp< DlImage > &atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const SkRect *cullRect, const DlPaint *paint=nullptr) override
void DrawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y, const DlPaint &paint) override
void SaveLayer(const SkRect *bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr) override
void Skew(SkScalar sx, SkScalar sy) override
void DrawDRRect(const SkRRect &outer, const SkRRect &inner, const DlPaint &paint) override
bool QuickReject(const SkRect &bounds) const override
void DrawOval(const SkRect &bounds, const DlPaint &paint) override
void DrawArc(const SkRect &bounds, SkScalar start, SkScalar sweep, bool useCenter, const DlPaint &paint) override
const Paint & paint
sk_sp< SkImage > image
Definition examples.cpp:29
float SkScalar
Definition extension.cpp:12
static bool b
struct MyStruct a[10]
double y
double x
std::ostream & operator<<(std::ostream &os, const DisplayList &display_list)
bool operator==(const CGRect &lhs, const CGRect &rhs)
static constexpr SkRect kEmptyRect
Definition mock_canvas.h:30
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switches.h:57
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switches.h:41
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
Definition switches.h:228
int32_t height
int32_t width
static constexpr SkRect MakeEmpty()
Definition SkRect.h:595
std::shared_ptr< DlImageFilter > backdrop_filter
Definition mock_canvas.h:51