Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dl_op_spy_unittests.cc
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#include "flutter/display_list/display_list.h"
6#include "flutter/display_list/dl_builder.h"
7#include "flutter/display_list/testing/dl_test_snippets.h"
8#include "flutter/shell/common/dl_op_spy.h"
9#include "flutter/testing/testing.h"
13
14namespace flutter {
15namespace testing {
16
17// The following macros demonstrate that the DlOpSpy class is equivalent
18// to DisplayList::affects_transparent_surface() now that DisplayListBuilder
19// implements operation culling.
20// See https://github.com/flutter/flutter/issues/125403
21#define ASSERT_DID_DRAW(spy, dl) \
22 do { \
23 ASSERT_TRUE(spy.did_draw()); \
24 ASSERT_TRUE(dl->modifies_transparent_black()); \
25 } while (0)
26
27#define ASSERT_NO_DRAW(spy, dl) \
28 do { \
29 ASSERT_FALSE(spy.did_draw()); \
30 ASSERT_FALSE(dl->modifies_transparent_black()); \
31 } while (0)
32
33TEST(DlOpSpy, DidDrawIsFalseByDefault) {
34 DlOpSpy dl_op_spy;
35 ASSERT_FALSE(dl_op_spy.did_draw());
36}
37
38TEST(DlOpSpy, EmptyDisplayList) {
39 DisplayListBuilder builder;
40 sk_sp<DisplayList> dl = builder.Build();
41 DlOpSpy dl_op_spy;
42 dl->Dispatch(dl_op_spy);
43 ASSERT_NO_DRAW(dl_op_spy, dl);
44}
45
46TEST(DlOpSpy, SetColor) {
47 { // No Color set.
48 DisplayListBuilder builder;
50 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
51 sk_sp<DisplayList> dl = builder.Build();
52 DlOpSpy dl_op_spy;
53 dl->Dispatch(dl_op_spy);
54 ASSERT_DID_DRAW(dl_op_spy, dl);
55 }
56 { // Set transparent color.
57 DisplayListBuilder builder;
59 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
60 sk_sp<DisplayList> dl = builder.Build();
61 DlOpSpy dl_op_spy;
62 dl->Dispatch(dl_op_spy);
63 ASSERT_NO_DRAW(dl_op_spy, dl);
64 }
65 { // Set black color.
66 DisplayListBuilder builder;
68 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
69 sk_sp<DisplayList> dl = builder.Build();
70 DlOpSpy dl_op_spy;
71 dl->Dispatch(dl_op_spy);
72 ASSERT_DID_DRAW(dl_op_spy, dl);
73 }
74}
75
76TEST(DlOpSpy, SetColorSource) {
77 { // Set null source
78 DisplayListBuilder builder;
80 paint.setColorSource(nullptr);
81 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
82 sk_sp<DisplayList> dl = builder.Build();
83 DlOpSpy dl_op_spy;
84 dl->Dispatch(dl_op_spy);
85 ASSERT_DID_DRAW(dl_op_spy, dl);
86 }
87 { // Set transparent color.
88 DisplayListBuilder builder;
91 DlColorColorSource color_source_transparent(color);
92 paint.setColorSource(color_source_transparent.shared());
93 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
94 sk_sp<DisplayList> dl = builder.Build();
95 DlOpSpy dl_op_spy;
96 dl->Dispatch(dl_op_spy);
97 ASSERT_NO_DRAW(dl_op_spy, dl);
98 }
99 { // Set black color.
100 DisplayListBuilder builder;
102 auto color = DlColor::kBlack();
103 DlColorColorSource color_source_transparent(color);
104 paint.setColorSource(color_source_transparent.shared());
105 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
106 sk_sp<DisplayList> dl = builder.Build();
107 DlOpSpy dl_op_spy;
108 dl->Dispatch(dl_op_spy);
109 ASSERT_DID_DRAW(dl_op_spy, dl);
110 }
111}
112
113TEST(DlOpSpy, DrawColor) {
114 { // Black color source.
115 DisplayListBuilder builder;
116 auto color = DlColor::kBlack();
117 builder.DrawColor(color, DlBlendMode::kSrc);
118 sk_sp<DisplayList> dl = builder.Build();
119 DlOpSpy dl_op_spy;
120 dl->Dispatch(dl_op_spy);
121 ASSERT_DID_DRAW(dl_op_spy, dl);
122 }
123 { // Transparent color with kSrc.
124 DisplayListBuilder builder;
126 builder.DrawColor(color, DlBlendMode::kSrc);
127 sk_sp<DisplayList> dl = builder.Build();
128 DlOpSpy dl_op_spy;
129 dl->Dispatch(dl_op_spy);
130 ASSERT_NO_DRAW(dl_op_spy, dl);
131 }
132 { // Transparent color with kSrcOver.
133 DisplayListBuilder builder;
135 builder.DrawColor(color, DlBlendMode::kSrcOver);
136 sk_sp<DisplayList> dl = builder.Build();
137 DlOpSpy dl_op_spy;
138 dl->Dispatch(dl_op_spy);
139 ASSERT_NO_DRAW(dl_op_spy, dl);
140 }
141}
142
143TEST(DlOpSpy, DrawPaint) {
144 { // Transparent color in paint.
145 DisplayListBuilder builder;
147 builder.DrawPaint(paint);
148 sk_sp<DisplayList> dl = builder.Build();
149 DlOpSpy dl_op_spy;
150 dl->Dispatch(dl_op_spy);
151 ASSERT_NO_DRAW(dl_op_spy, dl);
152 }
153 { // black color in paint.
154 DisplayListBuilder builder;
156 builder.DrawPaint(paint);
157 sk_sp<DisplayList> dl = builder.Build();
158 DlOpSpy dl_op_spy;
159 dl->Dispatch(dl_op_spy);
160 ASSERT_DID_DRAW(dl_op_spy, dl);
161 }
162}
163
164TEST(DlOpSpy, DrawLine) {
165 { // black
166 DisplayListBuilder builder;
168 builder.DrawLine(SkPoint::Make(0, 1), SkPoint::Make(1, 2), paint);
169 sk_sp<DisplayList> dl = builder.Build();
170 DlOpSpy dl_op_spy;
171 dl->Dispatch(dl_op_spy);
172 ASSERT_DID_DRAW(dl_op_spy, dl);
173 }
174 { // transparent
175 DisplayListBuilder builder;
177 builder.DrawLine(SkPoint::Make(0, 1), SkPoint::Make(1, 2), paint);
178 sk_sp<DisplayList> dl = builder.Build();
179 DlOpSpy dl_op_spy;
180 dl->Dispatch(dl_op_spy);
181 ASSERT_NO_DRAW(dl_op_spy, dl);
182 }
183}
184
185TEST(DlOpSpy, DrawRect) {
186 { // black
187 DisplayListBuilder builder;
189 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
190 sk_sp<DisplayList> dl = builder.Build();
191 DlOpSpy dl_op_spy;
192 dl->Dispatch(dl_op_spy);
193 ASSERT_DID_DRAW(dl_op_spy, dl);
194 }
195 { // transparent
196 DisplayListBuilder builder;
198 builder.DrawRect(SkRect::MakeWH(5, 5), paint);
199 sk_sp<DisplayList> dl = builder.Build();
200 DlOpSpy dl_op_spy;
201 dl->Dispatch(dl_op_spy);
202 ASSERT_NO_DRAW(dl_op_spy, dl);
203 }
204}
205
206TEST(DlOpSpy, DrawOval) {
207 { // black
208 DisplayListBuilder builder;
210 builder.DrawOval(SkRect::MakeWH(5, 5), paint);
211 sk_sp<DisplayList> dl = builder.Build();
212 DlOpSpy dl_op_spy;
213 dl->Dispatch(dl_op_spy);
214 ASSERT_DID_DRAW(dl_op_spy, dl);
215 }
216 { // transparent
217 DisplayListBuilder builder;
219 builder.DrawOval(SkRect::MakeWH(5, 5), paint);
220 sk_sp<DisplayList> dl = builder.Build();
221 DlOpSpy dl_op_spy;
222 dl->Dispatch(dl_op_spy);
223 ASSERT_NO_DRAW(dl_op_spy, dl);
224 }
225}
226
227TEST(DlOpSpy, DrawCircle) {
228 { // black
229 DisplayListBuilder builder;
231 builder.DrawCircle(SkPoint::Make(5, 5), 1.0, paint);
232 sk_sp<DisplayList> dl = builder.Build();
233 DlOpSpy dl_op_spy;
234 dl->Dispatch(dl_op_spy);
235 ASSERT_DID_DRAW(dl_op_spy, dl);
236 }
237 { // transparent
238 DisplayListBuilder builder;
240 builder.DrawCircle(SkPoint::Make(5, 5), 1.0, paint);
241 sk_sp<DisplayList> dl = builder.Build();
242 DlOpSpy dl_op_spy;
243 dl->Dispatch(dl_op_spy);
244 ASSERT_NO_DRAW(dl_op_spy, dl);
245 }
246}
247
248TEST(DlOpSpy, DrawRRect) {
249 { // black
250 DisplayListBuilder builder;
252 builder.DrawRRect(SkRRect::MakeRect(SkRect::MakeWH(5, 5)), paint);
253 sk_sp<DisplayList> dl = builder.Build();
254 DlOpSpy dl_op_spy;
255 dl->Dispatch(dl_op_spy);
256 ASSERT_DID_DRAW(dl_op_spy, dl);
257 }
258 { // transparent
259 DisplayListBuilder builder;
261 builder.DrawRRect(SkRRect::MakeRect(SkRect::MakeWH(5, 5)), paint);
262 sk_sp<DisplayList> dl = builder.Build();
263 DlOpSpy dl_op_spy;
264 dl->Dispatch(dl_op_spy);
265 ASSERT_NO_DRAW(dl_op_spy, dl);
266 }
267}
268
269TEST(DlOpSpy, DrawPath) {
270 { // black line
271 DisplayListBuilder builder;
273 paint.setDrawStyle(DlDrawStyle::kStroke);
274 builder.DrawPath(SkPath::Line(SkPoint::Make(0, 1), SkPoint::Make(1, 1)),
275 paint);
276 sk_sp<DisplayList> dl = builder.Build();
277 DlOpSpy dl_op_spy;
278 dl->Dispatch(dl_op_spy);
279 ASSERT_DID_DRAW(dl_op_spy, dl);
280 }
281 { // triangle
282 DisplayListBuilder builder;
284 SkPath path;
285 path.moveTo({0, 0});
286 path.lineTo({1, 0});
287 path.lineTo({0, 1});
288 builder.DrawPath(path, paint);
289 sk_sp<DisplayList> dl = builder.Build();
290 DlOpSpy dl_op_spy;
291 dl->Dispatch(dl_op_spy);
292 ASSERT_DID_DRAW(dl_op_spy, dl);
293 }
294 { // transparent line
295 DisplayListBuilder builder;
297 paint.setDrawStyle(DlDrawStyle::kStroke);
298 builder.DrawPath(SkPath::Line(SkPoint::Make(0, 1), SkPoint::Make(1, 1)),
299 paint);
300 sk_sp<DisplayList> dl = builder.Build();
301 DlOpSpy dl_op_spy;
302 dl->Dispatch(dl_op_spy);
303 ASSERT_NO_DRAW(dl_op_spy, dl);
304 }
305}
306
307TEST(DlOpSpy, DrawArc) {
308 { // black
309 DisplayListBuilder builder;
311 builder.DrawArc(SkRect::MakeWH(5, 5), 0, 1, true, paint);
312 sk_sp<DisplayList> dl = builder.Build();
313 DlOpSpy dl_op_spy;
314 dl->Dispatch(dl_op_spy);
315 ASSERT_DID_DRAW(dl_op_spy, dl);
316 }
317 { // transparent
318 DisplayListBuilder builder;
320 builder.DrawArc(SkRect::MakeWH(5, 5), 0, 1, true, paint);
321 sk_sp<DisplayList> dl = builder.Build();
322 DlOpSpy dl_op_spy;
323 dl->Dispatch(dl_op_spy);
324 ASSERT_NO_DRAW(dl_op_spy, dl);
325 }
326}
327
328TEST(DlOpSpy, DrawPoints) {
329 { // black
330 DisplayListBuilder builder;
332 const SkPoint points[] = {SkPoint::Make(5, 4)};
333 builder.DrawPoints(DlCanvas::PointMode::kPoints, 1, points, paint);
334 sk_sp<DisplayList> dl = builder.Build();
335 DlOpSpy dl_op_spy;
336 dl->Dispatch(dl_op_spy);
337 ASSERT_DID_DRAW(dl_op_spy, dl);
338 }
339 { // transparent
340 DisplayListBuilder builder;
342 const SkPoint points[] = {SkPoint::Make(5, 4)};
343 builder.DrawPoints(DlCanvas::PointMode::kPoints, 1, points, paint);
344 sk_sp<DisplayList> dl = builder.Build();
345 DlOpSpy dl_op_spy;
346 dl->Dispatch(dl_op_spy);
347 ASSERT_NO_DRAW(dl_op_spy, dl);
348 }
349}
350
351TEST(DlOpSpy, DrawVertices) {
352 { // black
353 DisplayListBuilder builder;
355 const SkPoint vertices[] = {
356 SkPoint::Make(5, 5),
357 SkPoint::Make(5, 15),
358 SkPoint::Make(15, 5),
359 };
360 const SkPoint texture_coordinates[] = {
361 SkPoint::Make(5, 5),
362 SkPoint::Make(15, 5),
363 SkPoint::Make(5, 15),
364 };
365 const DlColor colors[] = {
369 };
370 auto dl_vertices = DlVertices::Make(DlVertexMode::kTriangles, 3, vertices,
371 texture_coordinates, colors, 0);
372 builder.DrawVertices(dl_vertices.get(), DlBlendMode::kSrc, paint);
373 sk_sp<DisplayList> dl = builder.Build();
374 DlOpSpy dl_op_spy;
375 dl->Dispatch(dl_op_spy);
376 ASSERT_DID_DRAW(dl_op_spy, dl);
377 }
378 { // transparent
379 DisplayListBuilder builder;
381 const SkPoint vertices[] = {
382 SkPoint::Make(5, 5),
383 SkPoint::Make(5, 15),
384 SkPoint::Make(15, 5),
385 };
386 const SkPoint texture_coordinates[] = {
387 SkPoint::Make(5, 5),
388 SkPoint::Make(15, 5),
389 SkPoint::Make(5, 15),
390 };
391 const DlColor colors[] = {
395 };
396 auto dl_vertices = DlVertices::Make(DlVertexMode::kTriangles, 3, vertices,
397 texture_coordinates, colors, 0);
398 builder.DrawVertices(dl_vertices.get(), DlBlendMode::kSrc, paint);
399 sk_sp<DisplayList> dl = builder.Build();
400 DlOpSpy dl_op_spy;
401 dl->Dispatch(dl_op_spy);
402 ASSERT_NO_DRAW(dl_op_spy, dl);
403 }
404}
405
406TEST(DlOpSpy, Images) {
407 { // DrawImage
408 DisplayListBuilder builder;
414 bitmap.allocPixels(info, 0);
415 auto sk_image = SkImages::RasterFromBitmap(bitmap);
416 builder.DrawImage(DlImage::Make(sk_image), SkPoint::Make(5, 5),
418 sk_sp<DisplayList> dl = builder.Build();
419 DlOpSpy dl_op_spy;
420 dl->Dispatch(dl_op_spy);
421 ASSERT_DID_DRAW(dl_op_spy, dl);
422 }
423 { // DrawImageRect
424 DisplayListBuilder builder;
430 bitmap.allocPixels(info, 0);
431 auto sk_image = SkImages::RasterFromBitmap(bitmap);
432 builder.DrawImageRect(DlImage::Make(sk_image), SkRect::MakeWH(5, 5),
434 sk_sp<DisplayList> dl = builder.Build();
435 DlOpSpy dl_op_spy;
436 dl->Dispatch(dl_op_spy);
437 ASSERT_DID_DRAW(dl_op_spy, dl);
438 }
439 { // DrawImageNine
440 DisplayListBuilder builder;
446 bitmap.allocPixels(info, 0);
447 auto sk_image = SkImages::RasterFromBitmap(bitmap);
448 builder.DrawImageNine(DlImage::Make(sk_image), SkIRect::MakeWH(5, 5),
450 sk_sp<DisplayList> dl = builder.Build();
451 DlOpSpy dl_op_spy;
452 dl->Dispatch(dl_op_spy);
453 ASSERT_DID_DRAW(dl_op_spy, dl);
454 }
455 { // DrawAtlas
456 DisplayListBuilder builder;
462 bitmap.allocPixels(info, 0);
463 auto sk_image = SkImages::RasterFromBitmap(bitmap);
464 const SkRSXform xform[] = {SkRSXform::Make(1, 0, 0, 0)};
465 const SkRect tex[] = {SkRect::MakeXYWH(10, 10, 10, 10)};
466 SkRect cull_rect = SkRect::MakeWH(5, 5);
467 builder.DrawAtlas(DlImage::Make(sk_image), xform, tex, nullptr, 1,
469 sk_sp<DisplayList> dl = builder.Build();
470 DlOpSpy dl_op_spy;
471 dl->Dispatch(dl_op_spy);
472 ASSERT_DID_DRAW(dl_op_spy, dl);
473 }
474}
475
476TEST(DlOpSpy, DrawDisplayList) {
477 { // Recursive Transparent DisplayList
478 DisplayListBuilder builder;
480 builder.DrawPaint(paint);
481 sk_sp<DisplayList> dl = builder.Build();
482
483 DisplayListBuilder builder_parent;
484 DlPaint paint_parent(DlColor::kTransparent());
485 builder_parent.DrawPaint(paint_parent);
486 builder_parent.DrawDisplayList(dl, 1);
487 sk_sp<DisplayList> dl2 = builder_parent.Build();
488
489 DlOpSpy dl_op_spy;
490 dl2->Dispatch(dl_op_spy);
491 ASSERT_NO_DRAW(dl_op_spy, dl2);
492 }
493 { // Sub non-transparent DisplayList,
494 DisplayListBuilder builder;
496 builder.DrawPaint(paint);
497 sk_sp<DisplayList> dl = builder.Build();
498
499 DisplayListBuilder builder_parent;
500 DlPaint paint_parent(DlColor::kTransparent());
501 builder_parent.DrawPaint(paint_parent);
502 builder_parent.DrawDisplayList(dl, 1);
503 sk_sp<DisplayList> dl2 = builder_parent.Build();
504
505 DlOpSpy dl_op_spy;
506 dl2->Dispatch(dl_op_spy);
507 ASSERT_DID_DRAW(dl_op_spy, dl2);
508 }
509
510 { // Sub non-transparent DisplayList, 0 opacity
511 DisplayListBuilder builder;
513 builder.DrawPaint(paint);
514 sk_sp<DisplayList> dl = builder.Build();
515
516 DisplayListBuilder builder_parent;
517 DlPaint paint_parent(DlColor::kTransparent());
518 builder_parent.DrawPaint(paint_parent);
519 builder_parent.DrawDisplayList(dl, 0);
520 sk_sp<DisplayList> dl2 = builder_parent.Build();
521
522 DlOpSpy dl_op_spy;
523 dl2->Dispatch(dl_op_spy);
524 ASSERT_NO_DRAW(dl_op_spy, dl2);
525 }
526
527 { // Parent non-transparent DisplayList
528 DisplayListBuilder builder;
530 builder.DrawPaint(paint);
531 sk_sp<DisplayList> dl = builder.Build();
532
533 DisplayListBuilder builder_parent;
534 DlPaint paint_parent(DlColor::kBlack());
535 builder_parent.DrawPaint(paint_parent);
536 builder_parent.DrawDisplayList(dl, 0);
537 sk_sp<DisplayList> dl2 = builder_parent.Build();
538
539 DlOpSpy dl_op_spy;
540 dl2->Dispatch(dl_op_spy);
541 ASSERT_DID_DRAW(dl_op_spy, dl2);
542 }
543}
544
545TEST(DlOpSpy, DrawTextBlob) {
546 { // Non-transparent color.
547 DisplayListBuilder builder;
549 std::string string = "xx";
550 SkFont font = CreateTestFontOfSize(12);
551 auto text_blob = SkTextBlob::MakeFromString(string.c_str(), font);
552 builder.DrawTextBlob(text_blob, 1, 1, paint);
553 sk_sp<DisplayList> dl = builder.Build();
554 DlOpSpy dl_op_spy;
555 dl->Dispatch(dl_op_spy);
556 ASSERT_DID_DRAW(dl_op_spy, dl);
557 }
558 { // transparent color.
559 DisplayListBuilder builder;
561 std::string string = "xx";
562 SkFont font = CreateTestFontOfSize(12);
563 auto text_blob = SkTextBlob::MakeFromString(string.c_str(), font);
564 builder.DrawTextBlob(text_blob, 1, 1, paint);
565 sk_sp<DisplayList> dl = builder.Build();
566 DlOpSpy dl_op_spy;
567 dl->Dispatch(dl_op_spy);
568 ASSERT_NO_DRAW(dl_op_spy, dl);
569 }
570}
571
572TEST(DlOpSpy, DrawShadow) {
573 { // valid shadow
574 DisplayListBuilder builder;
578 builder.DrawShadow(path, color, 1, false, 1);
579 sk_sp<DisplayList> dl = builder.Build();
580 DlOpSpy dl_op_spy;
581 dl->Dispatch(dl_op_spy);
582 ASSERT_DID_DRAW(dl_op_spy, dl);
583 }
584 { // transparent color
585 DisplayListBuilder builder;
589 builder.DrawShadow(path, color, 1, false, 1);
590 sk_sp<DisplayList> dl = builder.Build();
591 DlOpSpy dl_op_spy;
592 dl->Dispatch(dl_op_spy);
593 ASSERT_NO_DRAW(dl_op_spy, dl);
594 }
595}
596
597} // namespace testing
598} // namespace flutter
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
#define TEST(S, s, D, expected)
static const int points[]
SkColor4f color
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition SkAlphaType.h:29
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
Definition SkColorType.h:24
SkPath & moveTo(SkScalar x, SkScalar y)
Definition SkPath.cpp:678
SkPath & lineTo(SkScalar x, SkScalar y)
Definition SkPath.cpp:718
static SkPath Line(const SkPoint a, const SkPoint b)
Definition SkPath.h:106
static SkRRect MakeRect(const SkRect &r)
Definition SkRRect.h:149
static sk_sp< SkTextBlob > MakeFromString(const char *string, const SkFont &font, SkTextEncoding encoding=SkTextEncoding::kUTF8)
Definition SkTextBlob.h:115
void DrawPaint(const DlPaint &paint) override
sk_sp< DisplayList > Build()
Definition dl_builder.cc:67
void DrawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity=SK_Scalar1) override
@ kPoints
draw each point separately
std::shared_ptr< DlColorSource > shared() const override
static sk_sp< DlImage > Make(const SkImage *image)
Definition dl_image.cc:11
bool did_draw()
Returns true if any non transparent content has been drawn.
Definition dl_op_spy.cc:9
static std::shared_ptr< DlVertices > Make(DlVertexMode mode, int vertex_count, const SkPoint vertices[], const SkPoint texture_coordinates[], const DlColor colors[], int index_count=0, const uint16_t indices[]=nullptr)
Constructs a DlVector with compact inline storage for all of its required and optional lists of data.
const Paint & paint
#define ASSERT_DID_DRAW(spy, dl)
#define ASSERT_NO_DRAW(spy, dl)
SK_API sk_sp< SkImage > RasterFromBitmap(const SkBitmap &bitmap)
SkFont CreateTestFontOfSize(SkScalar scalar)
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
@ kTriangles
The vertices are taken 3 at a time to form a triangle.
@ kStroke
strokes boundary of shapes
@ kSrcOver
r = s + (1-sa)*d
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
Definition SkRect.h:56
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
static constexpr SkPoint Make(float x, float y)
static SkRSXform Make(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty)
Definition SkRSXform.h:24
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition SkRect.h:659
static constexpr SkRect MakeWH(float w, float h)
Definition SkRect.h:609
static constexpr DlColor kBlack()
Definition dl_color.h:22
static constexpr DlColor kTransparent()
Definition dl_color.h:21
static constexpr DlColor kRed()
Definition dl_color.h:24
static constexpr DlColor kGreen()
Definition dl_color.h:25