Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
dl_test_snippets.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
11#if IMPELLER_SUPPORTS_RENDERING
14#endif
15#include "third_party/skia/include/core/SkFontMgr.h"
16#include "third_party/skia/include/core/SkTypeface.h"
17#include "txt/platform.h"
18
19namespace flutter {
20namespace testing {
21
22sk_sp<DisplayList> GetSampleDisplayList() {
23 DisplayListBuilder builder(DlRect::MakeWH(150, 100));
24 builder.DrawRect(DlRect::MakeXYWH(10, 10, 80, 80), DlPaint(DlColor::kRed()));
25 return builder.Build();
26}
27
28sk_sp<DisplayList> GetSampleNestedDisplayList() {
29 DisplayListBuilder builder(DlRect::MakeWH(150, 100));
30 DlPaint paint;
31 for (int y = 10; y <= 60; y += 10) {
32 for (int x = 10; x <= 60; x += 10) {
33 paint.setColor(((x + y) % 20) == 10 ? DlColor(SK_ColorRED)
34 : DlColor(SK_ColorBLUE));
35 builder.DrawRect(DlRect::MakeXYWH(x, y, 80, 80), paint);
36 }
37 }
38 DisplayListBuilder outer_builder(DlRect::MakeWH(150, 100));
39 outer_builder.DrawDisplayList(builder.Build());
40 return outer_builder.Build();
41}
42
43sk_sp<DisplayList> GetSampleDisplayList(int ops) {
44 DisplayListBuilder builder(DlRect::MakeWH(150, 100));
45 for (int i = 0; i < ops; i++) {
46 builder.DrawColor(DlColor::kRed(), DlBlendMode::kSrc);
47 }
48 return builder.Build();
49}
50
51sk_sp<DlImage> MakeTestImage(int w, int h, int checker_size) {
52 sk_sp<SkSurface> surface =
53 SkSurfaces::Raster(SkImageInfo::MakeN32Premul(w, h));
54 DlSkCanvasAdapter canvas(surface->getCanvas());
55 DlPaint p0, p1;
60 p1.setAlpha(128);
61 for (int y = 0; y < w; y += checker_size) {
62 for (int x = 0; x < h; x += checker_size) {
63 DlPaint& cellp = ((x + y) & 1) == 0 ? p0 : p1;
64 canvas.DrawRect(DlRect::MakeXYWH(x, y, checker_size, checker_size),
65 cellp);
66 }
67 }
68 return DlImageSkia::Make(surface->makeImageSnapshot());
69}
70
71sk_sp<DlImage> MakeTestImage(int w, int h, DlColor color) {
72 sk_sp<SkSurface> surface;
73 if (!color.isOpaque()) {
74 surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(w, h));
75 } else {
76 SkImageInfo info =
77 SkImageInfo::MakeN32(w, h, SkAlphaType::kOpaque_SkAlphaType);
78 surface = SkSurfaces::Raster(info);
79 }
80 SkCanvas* canvas = surface->getCanvas();
81 canvas->drawColor(color.argb());
82 return DlImageSkia::Make(surface->makeImageSnapshot());
83}
84
85// ---------------
86// Test Suite data
87// ---------------
88
89std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
90 return {
91 {"SetAntiAlias",
92 {
93 {0, 8, 0, [](DlOpReceiver& r) { r.setAntiAlias(true); }},
94
95 // Reset attribute to default as last entry
96 {0, 0, 0, [](DlOpReceiver& r) { r.setAntiAlias(false); }},
97 }},
98 {"SetInvertColors",
99 {
100 {0, 8, 0, [](DlOpReceiver& r) { r.setInvertColors(true); }},
101
102 // Reset attribute to default as last entry
103 {0, 0, 0, [](DlOpReceiver& r) { r.setInvertColors(false); }},
104 }},
105 {"SetStrokeCap",
106 {
107 {0, 8, 0,
108 [](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kRound); }},
109 {0, 8, 0,
110 [](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kSquare); }},
111
112 // Reset attribute to default as last entry
113 {0, 0, 0,
114 [](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kButt); }},
115 }},
116 {"SetStrokeJoin",
117 {
118 {0, 8, 0,
119 [](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kBevel); }},
120 {0, 8, 0,
121 [](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kRound); }},
122
123 // Reset attribute to default as last entry
124 {0, 0, 0,
125 [](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kMiter); }},
126 }},
127 {"SetStyle",
128 {
129 {0, 8, 0,
130 [](DlOpReceiver& r) { r.setDrawStyle(DlDrawStyle::kStroke); }},
131 {0, 8, 0,
132 [](DlOpReceiver& r) {
133 r.setDrawStyle(DlDrawStyle::kStrokeAndFill);
134 }},
135
136 // Reset attribute to default as last entry
137 {0, 0, 0,
138 [](DlOpReceiver& r) { r.setDrawStyle(DlDrawStyle::kFill); }},
139 }},
140 {"SetStrokeWidth",
141 {
142 {0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(1.0); }},
143 {0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(5.0); }},
144
145 // Reset attribute to default as last entry
146 {0, 0, 0, [](DlOpReceiver& r) { r.setStrokeWidth(0.0); }},
147 }},
148 {"SetStrokeMiter",
149 {
150 {0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(0.0); }},
151 {0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(5.0); }},
152
153 // Reset attribute to default as last entry
154 {0, 0, 0, [](DlOpReceiver& r) { r.setStrokeMiter(4.0); }},
155 }},
156 {"SetColor",
157 {
158 {0, 4 + sizeof(DlColor), 0,
159 [](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorGREEN)); }},
160 {0, 4 + sizeof(DlColor), 0,
161 [](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLUE)); }},
162
163 // Reset attribute to default as last entry
164 {0, 0, 0,
165 [](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLACK)); }},
166 }},
167 {"SetBlendMode",
168 {
169 {0, 8, 0,
170 [](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcIn); }},
171 {0, 8, 0,
172 [](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kDstIn); }},
173
174 // Reset attribute to default as last entry
175 {0, 0, 0,
176 [](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcOver); }},
177 }},
178 {"SetColorSource",
179 {
180 {0, 104, 0,
181 [](DlOpReceiver& r) { r.setColorSource(kTestSource1.get()); }},
182 {0, 176, 0,
183 [](DlOpReceiver& r) { r.setColorSource(kTestSource2.get()); }},
184 {0, 176, 0,
185 [](DlOpReceiver& r) { r.setColorSource(kTestSource3.get()); }},
186 {0, 184, 0,
187 [](DlOpReceiver& r) { r.setColorSource(kTestSource4.get()); }},
188 {0, 176, 0,
189 [](DlOpReceiver& r) { r.setColorSource(kTestSource5.get()); }},
190
191 // Reset attribute to default as last entry
192 {0, 0, 0, [](DlOpReceiver& r) { r.setColorSource(nullptr); }},
193 }},
194 {"SetImageFilter",
195 {
196 {0, 48, 0,
197 [](DlOpReceiver& r) { r.setImageFilter(&kTestBlurImageFilter1); }},
198 {0, 48, 0,
199 [](DlOpReceiver& r) { r.setImageFilter(&kTestBlurImageFilter2); }},
200 {0, 48, 0,
201 [](DlOpReceiver& r) { r.setImageFilter(&kTestBlurImageFilter3); }},
202 {0, 48, 0,
203 [](DlOpReceiver& r) { r.setImageFilter(&kTestBlurImageFilter4); }},
204 {0, 24, 0,
205 [](DlOpReceiver& r) {
206 r.setImageFilter(&kTestDilateImageFilter1);
207 }},
208 {0, 24, 0,
209 [](DlOpReceiver& r) {
210 r.setImageFilter(&kTestDilateImageFilter2);
211 }},
212 {0, 24, 0,
213 [](DlOpReceiver& r) {
214 r.setImageFilter(&kTestDilateImageFilter3);
215 }},
216 {0, 24, 0,
217 [](DlOpReceiver& r) { r.setImageFilter(&kTestErodeImageFilter1); }},
218 {0, 24, 0,
219 [](DlOpReceiver& r) { r.setImageFilter(&kTestErodeImageFilter2); }},
220 {0, 24, 0,
221 [](DlOpReceiver& r) { r.setImageFilter(&kTestErodeImageFilter3); }},
222 {0, 88, 0,
223 [](DlOpReceiver& r) {
224 r.setImageFilter(&kTestMatrixImageFilter1);
225 }},
226 {0, 88, 0,
227 [](DlOpReceiver& r) {
228 r.setImageFilter(&kTestMatrixImageFilter2);
229 }},
230 {0, 88, 0,
231 [](DlOpReceiver& r) {
232 r.setImageFilter(&kTestMatrixImageFilter3);
233 }},
234 {0, 24, 0,
235 [](DlOpReceiver& r) {
236 r.setImageFilter(&kTestComposeImageFilter1);
237 }},
238 {0, 24, 0,
239 [](DlOpReceiver& r) {
240 r.setImageFilter(&kTestComposeImageFilter2);
241 }},
242 {0, 24, 0,
243 [](DlOpReceiver& r) {
244 r.setImageFilter(&kTestComposeImageFilter3);
245 }},
246 {0, 24, 0,
247 [](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter1); }},
248 {0, 24, 0,
249 [](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter2); }},
250 {0, 24, 0,
251 [](DlOpReceiver& r) {
252 r.setImageFilter(
254 .makeWithLocalMatrix(DlMatrix::MakeTranslation({2, 2}))
255 .get());
256 }},
257
258 // Reset attribute to default as last entry
259 {0, 0, 0, [](DlOpReceiver& r) { r.setImageFilter(nullptr); }},
260 }},
261 {"SetColorFilter",
262 {
263 {0, 40, 0,
264 [](DlOpReceiver& r) {
265 r.setColorFilter(kTestBlendColorFilter1.get());
266 }},
267 {0, 40, 0,
268 [](DlOpReceiver& r) {
269 r.setColorFilter(kTestBlendColorFilter2.get());
270 }},
271 {0, 40, 0,
272 [](DlOpReceiver& r) {
273 r.setColorFilter(kTestBlendColorFilter3.get());
274 }},
275 {0, 96, 0,
276 [](DlOpReceiver& r) {
277 r.setColorFilter(kTestMatrixColorFilter1.get());
278 }},
279 {0, 96, 0,
280 [](DlOpReceiver& r) {
281 r.setColorFilter(kTestMatrixColorFilter2.get());
282 }},
283 {0, 16, 0,
284 [](DlOpReceiver& r) {
285 r.setColorFilter(DlColorFilter::MakeSrgbToLinearGamma().get());
286 }},
287 {0, 16, 0,
288 [](DlOpReceiver& r) {
289 r.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma().get());
290 }},
291
292 // Reset attribute to default as last entry
293 {0, 0, 0, [](DlOpReceiver& r) { r.setColorFilter(nullptr); }},
294 }},
295 {"SetMaskFilter",
296 {
297 {0, 32, 0,
298 [](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter1); }, 0u,
299 2u},
300 {0, 32, 0,
301 [](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter2); }, 0u,
302 2u},
303 {0, 32, 0,
304 [](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter3); }, 0u,
305 2u},
306 {0, 32, 0,
307 [](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter4); }, 0u,
308 2u},
309 {0, 32, 0,
310 [](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter5); }, 0u,
311 2u},
312
313 // Reset attribute to default as last entry
314 {0, 0, 0, [](DlOpReceiver& r) { r.setMaskFilter(nullptr); }, 0u, 1u},
315 }},
316 };
317}
318
319std::vector<DisplayListInvocationGroup> CreateAllSaveRestoreOps() {
320 return {
321 {"Save(Layer)+Restore",
322 {
323 // There are many reasons that save and restore can elide content,
324 // including whether or not there are any draw operations between
325 // them, whether or not there are any state changes to restore, and
326 // whether group rendering (opacity) optimizations can allow
327 // attributes to be distributed to the children. To prevent those
328 // cases we include at least one clip operation and 2 overlapping
329 // rendering primitives between each save/restore pair.
330 {5, 96, 2,
331 [](DlOpReceiver& r) {
332 r.save();
333 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
334 true);
335 r.drawRect(DlRect::MakeLTRB(5, 5, 15, 15));
336 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
337 r.restore();
338 }},
339 {5, 120, 3,
340 [](DlOpReceiver& r) {
341 r.saveLayer(nullptr, SaveLayerOptions::kNoAttributes);
342 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
343 true);
344 r.drawRect(DlRect::MakeLTRB(5, 5, 15, 15));
345 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
346 r.restore();
347 }},
348 {5, 120, 3,
349 [](DlOpReceiver& r) {
350 r.saveLayer(nullptr, SaveLayerOptions::kWithAttributes);
351 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
352 true);
353 r.drawRect(DlRect::MakeLTRB(5, 5, 15, 15));
354 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
355 r.restore();
356 }},
357 // For saveLayer calls with bounds, we need at least one unclipped
358 // draw command so that the bounds are not reduced in size to the
359 // clip dimensions on the re-dispatch.
360 {5, 120, 3,
361 [](DlOpReceiver& r) {
363 r.drawRect(kTestBounds);
364 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
365 true);
366 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
367 r.restore();
368 }},
369 {5, 120, 3,
370 [](DlOpReceiver& r) {
372 r.drawRect(kTestBounds);
373 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
374 true);
375 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
376 r.restore();
377 }},
378 {5, 152, 3,
379 [](DlOpReceiver& r) {
380 r.saveLayer(nullptr, SaveLayerOptions::kNoAttributes,
382 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
383 true);
384 r.drawRect(DlRect::MakeLTRB(5, 5, 15, 15));
385 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
386 r.restore();
387 }},
388 {5, 152, 3,
389 [](DlOpReceiver& r) {
390 r.saveLayer(nullptr, SaveLayerOptions::kWithAttributes,
392 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
393 true);
394 r.drawRect(DlRect::MakeLTRB(5, 5, 15, 15));
395 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
396 r.restore();
397 }},
398 {5, 152, 3,
399 [](DlOpReceiver& r) {
402 r.drawRect(kTestBounds);
403 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
404 true);
405 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
406 r.restore();
407 }},
408 {5, 152, 3,
409 [](DlOpReceiver& r) {
412 r.drawRect(kTestBounds);
413 r.clipRect(DlRect::MakeLTRB(0, 0, 25, 25), DlClipOp::kIntersect,
414 true);
415 r.drawRect(DlRect::MakeLTRB(10, 10, 20, 20));
416 r.restore();
417 }},
418 }},
419 };
420}
421
422std::vector<DisplayListInvocationGroup> CreateAllTransformOps() {
423 return {
424 {"Translate",
425 {
426 {1, 16, 0, [](DlOpReceiver& r) { r.translate(10, 10); }},
427 {1, 16, 0, [](DlOpReceiver& r) { r.translate(10, 15); }},
428 {1, 16, 0, [](DlOpReceiver& r) { r.translate(15, 10); }},
429 {0, 0, 0, [](DlOpReceiver& r) { r.translate(0, 0); }},
430 }},
431 {"Scale",
432 {
433 {1, 16, 0, [](DlOpReceiver& r) { r.scale(2, 2); }},
434 {1, 16, 0, [](DlOpReceiver& r) { r.scale(2, 3); }},
435 {1, 16, 0, [](DlOpReceiver& r) { r.scale(3, 2); }},
436 {0, 0, 0, [](DlOpReceiver& r) { r.scale(1, 1); }},
437 }},
438 {"Rotate",
439 {
440 {1, 8, 0, [](DlOpReceiver& r) { r.rotate(30); }},
441 {1, 8, 0, [](DlOpReceiver& r) { r.rotate(45); }},
442 {0, 0, 0, [](DlOpReceiver& r) { r.rotate(0); }},
443 {0, 0, 0, [](DlOpReceiver& r) { r.rotate(360); }},
444 }},
445 {"Skew",
446 {
447 {1, 16, 0, [](DlOpReceiver& r) { r.skew(0.1, 0.1); }},
448 {1, 16, 0, [](DlOpReceiver& r) { r.skew(0.1, 0.2); }},
449 {1, 16, 0, [](DlOpReceiver& r) { r.skew(0.2, 0.1); }},
450 {0, 0, 0, [](DlOpReceiver& r) { r.skew(0, 0); }},
451 }},
452 {"Transform2DAffine",
453 {
454 {1, 32, 0,
455 [](DlOpReceiver& r) { r.transform2DAffine(0, 1, 12, 1, 0, 33); }},
456 // r.transform(identity) is ignored
457 {0, 0, 0,
458 [](DlOpReceiver& r) { r.transform2DAffine(1, 0, 0, 0, 1, 0); }},
459 }},
460 {"TransformFullPerspective",
461 {
462 {1, 72, 0,
463 [](DlOpReceiver& r) {
464 r.transformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29,
465 0, 0, 0, 12);
466 }},
467 // r.transform(2D affine) is reduced to 2x3
468 {1, 32, 0,
469 [](DlOpReceiver& r) {
470 r.transformFullPerspective(2, 1, 0, 4, 1, 3, 0, 5, 0, 0, 1, 0, 0,
471 0, 0, 1);
472 }},
473 // r.transform(identity) is ignored
474 {0, 0, 0,
475 [](DlOpReceiver& r) {
476 r.transformFullPerspective(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
477 0, 0, 1);
478 }},
479 }},
480 };
481}
482
483std::vector<DisplayListInvocationGroup> CreateAllClipOps() {
484 return {
485 {"ClipRect",
486 {
487 {1, 24, 0,
488 [](DlOpReceiver& r) {
489 r.clipRect(kTestBounds, DlClipOp::kIntersect, true);
490 }},
491 {1, 24, 0,
492 [](DlOpReceiver& r) {
493 r.clipRect(kTestBounds.Shift(1, 1), DlClipOp::kIntersect, true);
494 }},
495 {1, 24, 0,
496 [](DlOpReceiver& r) {
497 r.clipRect(kTestBounds, DlClipOp::kIntersect, false);
498 }},
499 {1, 24, 0,
500 [](DlOpReceiver& r) {
501 r.clipRect(kTestBounds, DlClipOp::kDifference, true);
502 }},
503 {1, 24, 0,
504 [](DlOpReceiver& r) {
505 r.clipRect(kTestBounds, DlClipOp::kDifference, false);
506 }},
507 }},
508 {"ClipOval",
509 {
510 {1, 24, 0,
511 [](DlOpReceiver& r) {
512 r.clipOval(kTestBounds, DlClipOp::kIntersect, true);
513 }},
514 {1, 24, 0,
515 [](DlOpReceiver& r) {
516 r.clipOval(kTestBounds.Shift(1, 1), DlClipOp::kIntersect, true);
517 }},
518 {1, 24, 0,
519 [](DlOpReceiver& r) {
520 r.clipOval(kTestBounds, DlClipOp::kIntersect, false);
521 }},
522 {1, 24, 0,
523 [](DlOpReceiver& r) {
524 r.clipOval(kTestBounds, DlClipOp::kDifference, true);
525 }},
526 {1, 24, 0,
527 [](DlOpReceiver& r) {
528 r.clipOval(kTestBounds, DlClipOp::kDifference, false);
529 }},
530 }},
531 {"ClipRRect",
532 {
533 {1, 56, 0,
534 [](DlOpReceiver& r) {
535 r.clipRoundRect(kTestRRect, DlClipOp::kIntersect, true);
536 }},
537 {1, 56, 0,
538 [](DlOpReceiver& r) {
539 r.clipRoundRect(kTestRRect.Shift(1, 1), DlClipOp::kIntersect,
540 true);
541 }},
542 {1, 56, 0,
543 [](DlOpReceiver& r) {
544 r.clipRoundRect(kTestRRect, DlClipOp::kIntersect, false);
545 }},
546 {1, 56, 0,
547 [](DlOpReceiver& r) {
548 r.clipRoundRect(kTestRRect, DlClipOp::kDifference, true);
549 }},
550 {1, 56, 0,
551 [](DlOpReceiver& r) {
552 r.clipRoundRect(kTestRRect, DlClipOp::kDifference, false);
553 }},
554 }},
555 {"ClipRSuperellipse",
556 {
557 {1, 56, 0,
558 [](DlOpReceiver& r) {
559 r.clipRoundSuperellipse(kTestRSuperellipse, DlClipOp::kIntersect,
560 true);
561 }},
562 {1, 56, 0,
563 [](DlOpReceiver& r) {
564 r.clipRoundSuperellipse(kTestRSuperellipse.Shift(1, 1),
566 }},
567 {1, 56, 0,
568 [](DlOpReceiver& r) {
569 r.clipRoundSuperellipse(kTestRSuperellipse, DlClipOp::kIntersect,
570 false);
571 }},
572 {1, 56, 0,
573 [](DlOpReceiver& r) {
574 r.clipRoundSuperellipse(kTestRSuperellipse, DlClipOp::kDifference,
575 true);
576 }},
577 {1, 56, 0,
578 [](DlOpReceiver& r) {
579 r.clipRoundSuperellipse(kTestRSuperellipse, DlClipOp::kDifference,
580 false);
581 }},
582 }},
583 {"ClipPath",
584 {
585 {1, 32, 0,
586 [](DlOpReceiver& r) {
587 r.clipPath(kTestPath1, DlClipOp::kIntersect, true);
588 }},
589 {1, 32, 0,
590 [](DlOpReceiver& r) {
591 r.clipPath(kTestPath2, DlClipOp::kIntersect, true);
592 }},
593 {1, 32, 0,
594 [](DlOpReceiver& r) {
595 r.clipPath(kTestPath3, DlClipOp::kIntersect, true);
596 }},
597 {1, 32, 0,
598 [](DlOpReceiver& r) {
599 r.clipPath(kTestPath1, DlClipOp::kIntersect, false);
600 }},
601 {1, 32, 0,
602 [](DlOpReceiver& r) {
603 r.clipPath(kTestPath1, DlClipOp::kDifference, true);
604 }},
605 {1, 32, 0,
606 [](DlOpReceiver& r) {
607 r.clipPath(kTestPath1, DlClipOp::kDifference, false);
608 }},
609 // clipPath(rect) becomes clipRect
610 {1, 24, 0,
611 [](DlOpReceiver& r) {
612 r.clipPath(kTestPathRect, DlClipOp::kIntersect, true);
613 }},
614 // clipPath(oval) becomes clipOval
615 {1, 24, 0,
616 [](DlOpReceiver& r) {
617 r.clipPath(kTestPathOval, DlClipOp::kIntersect, true);
618 }},
619 // clipPath(rrect) becomes clipRRect
620 {1, 56, 0,
621 [](DlOpReceiver& r) {
622 r.clipPath(kTestPathRRect, DlClipOp::kIntersect, true);
623 }},
624 }},
625 };
626}
627
628std::vector<DisplayListInvocationGroup> CreateAllRenderingOps() {
629 return {
630 {"DrawPaint",
631 {
632 {1, 8, 1, [](DlOpReceiver& r) { r.drawPaint(); }},
633 }},
634 {"DrawColor",
635 {
636 {1, 32, 1,
637 [](DlOpReceiver& r) {
638 r.drawColor(DlColor(SK_ColorBLUE), DlBlendMode::kSrcIn);
639 }},
640 {1, 32, 1,
641 [](DlOpReceiver& r) {
642 r.drawColor(DlColor(SK_ColorBLUE), DlBlendMode::kDstOut);
643 }},
644 {1, 32, 1,
645 [](DlOpReceiver& r) {
646 r.drawColor(DlColor(SK_ColorCYAN), DlBlendMode::kSrcIn);
647 }},
648 }},
649 {"DrawLine",
650 {
651 {1, 24, 1, [](DlOpReceiver& r) { r.drawLine({0, 0}, {10, 10}); }},
652 {1, 24, 1, [](DlOpReceiver& r) { r.drawLine({1, 0}, {10, 10}); }},
653 {1, 24, 1, [](DlOpReceiver& r) { r.drawLine({0, 1}, {10, 10}); }},
654 {1, 24, 1, [](DlOpReceiver& r) { r.drawLine({0, 0}, {20, 10}); }},
655 {1, 24, 1, [](DlOpReceiver& r) { r.drawLine({0, 0}, {10, 20}); }},
656 }},
657 {"DrawDashedLine",
658 {
659 {1, 32, 1,
660 [](DlOpReceiver& r) {
661 r.drawDashedLine({0, 0}, {10, 10}, 4.0f, 2.0f);
662 }},
663 {1, 32, 1,
664 [](DlOpReceiver& r) {
665 r.drawDashedLine({1, 0}, {10, 10}, 4.0f, 2.0f);
666 }},
667 {1, 32, 1,
668 [](DlOpReceiver& r) {
669 r.drawDashedLine({0, 1}, {10, 10}, 4.0f, 2.0f);
670 }},
671 {1, 32, 1,
672 [](DlOpReceiver& r) {
673 r.drawDashedLine({0, 0}, {20, 10}, 4.0f, 2.0f);
674 }},
675 {1, 32, 1,
676 [](DlOpReceiver& r) {
677 r.drawDashedLine({0, 0}, {10, 20}, 4.0f, 2.0f);
678 }},
679 {1, 32, 1,
680 [](DlOpReceiver& r) {
681 r.drawDashedLine({0, 0}, {10, 10}, 5.0f, 2.0f);
682 }},
683 {1, 32, 1,
684 [](DlOpReceiver& r) {
685 r.drawDashedLine({0, 0}, {10, 10}, 4.0f, 3.0f);
686 }},
687 }},
688 {"DrawRect",
689 {
690 {1, 24, 1,
691 [](DlOpReceiver& r) {
692 r.drawRect(DlRect::MakeLTRB(0, 0, 10, 10));
693 }},
694 {1, 24, 1,
695 [](DlOpReceiver& r) {
696 r.drawRect(DlRect::MakeLTRB(0, 1, 10, 10));
697 }},
698 {1, 24, 1,
699 [](DlOpReceiver& r) {
700 r.drawRect(DlRect::MakeLTRB(0, 0, 20, 10));
701 }},
702 {1, 24, 1,
703 [](DlOpReceiver& r) {
704 r.drawRect(DlRect::MakeLTRB(0, 0, 10, 20));
705 }},
706 }},
707 {"DrawOval",
708 {
709 {1, 24, 1,
710 [](DlOpReceiver& r) {
711 r.drawOval(DlRect::MakeLTRB(0, 0, 10, 10));
712 }},
713 {1, 24, 1,
714 [](DlOpReceiver& r) {
715 r.drawOval(DlRect::MakeLTRB(0, 1, 10, 10));
716 }},
717 {1, 24, 1,
718 [](DlOpReceiver& r) {
719 r.drawOval(DlRect::MakeLTRB(0, 0, 20, 10));
720 }},
721 {1, 24, 1,
722 [](DlOpReceiver& r) {
723 r.drawOval(DlRect::MakeLTRB(0, 0, 10, 20));
724 }},
725 }},
726 {"DrawCircle",
727 {
728 {1, 16, 1, [](DlOpReceiver& r) { r.drawCircle({0, 0}, 10); }},
729 {1, 16, 1, [](DlOpReceiver& r) { r.drawCircle({0, 5}, 10); }},
730 {1, 16, 1, [](DlOpReceiver& r) { r.drawCircle({0, 0}, 20); }},
731 }},
732 {"DrawRRect",
733 {
734 {1, 56, 1, [](DlOpReceiver& r) { r.drawRoundRect(kTestRRect); }},
735 {1, 56, 1,
736 [](DlOpReceiver& r) { r.drawRoundRect(kTestRRect.Shift(5, 5)); }},
737 }},
738 // DrawRSuperellipse is omitted because the testing framework doesn't
739 // support flexible size.
740 // TODO(dkwingsmt): https://github.com/flutter/flutter/issues/166284
741 {"DrawDRRect",
742 {
743 {1, 104, 1,
744 [](DlOpReceiver& r) {
745 r.drawDiffRoundRect(kTestRRect, kTestInnerRRect);
746 }},
747 {1, 104, 1,
748 [](DlOpReceiver& r) {
749 r.drawDiffRoundRect(kTestRRect.Shift(5, 5),
750 kTestInnerRRect.Shift(4, 4));
751 }},
752 }},
753 {"DrawPath",
754 {
755 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPath1); }},
756 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPath2); }},
757 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPath3); }},
758 // oval, rect and rrect paths are left as drawPath
759 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPathRect); }},
760 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPathOval); }},
761 {1, 32, 1, [](DlOpReceiver& r) { r.drawPath(kTestPathRRect); }},
762 }},
763 {"DrawArc",
764 {
765 {1, 32, 1,
766 [](DlOpReceiver& r) { r.drawArc(kTestBounds, 45, 270, false); }},
767 {1, 32, 1,
768 [](DlOpReceiver& r) {
769 r.drawArc(kTestBounds.Shift(1, 1), 45, 270, false);
770 }},
771 {1, 32, 1,
772 [](DlOpReceiver& r) { r.drawArc(kTestBounds, 30, 270, false); }},
773 {1, 32, 1,
774 [](DlOpReceiver& r) { r.drawArc(kTestBounds, 45, 260, false); }},
775 {1, 32, 1,
776 [](DlOpReceiver& r) { r.drawArc(kTestBounds, 45, 270, true); }},
777 }},
778 {"DrawPoints",
779 {
780 {1, 8 + TestPointCount * 8, 1,
781 [](DlOpReceiver& r) {
783 }},
784 {1, 8 + (TestPointCount - 1) * 8, 1,
785 [](DlOpReceiver& r) {
788 }},
789 {1, 8 + TestPointCount * 8, 1,
790 [](DlOpReceiver& r) {
792 }},
793 {1, 8 + TestPointCount * 8, 1,
794 [](DlOpReceiver& r) {
796 }},
797 }},
798 {"DrawVertices",
799 {
800 {1, 24, 1,
801 [](DlOpReceiver& r) {
802 r.drawVertices(kTestVertices1, DlBlendMode::kSrcIn);
803 }},
804 {1, 24, 1,
805 [](DlOpReceiver& r) {
806 r.drawVertices(kTestVertices1, DlBlendMode::kDstIn);
807 }},
808 {1, 24, 1,
809 [](DlOpReceiver& r) {
810 r.drawVertices(kTestVertices2, DlBlendMode::kSrcIn);
811 }},
812 }},
813 {"DrawImage",
814 {
815 {1, 24, 1,
816 [](DlOpReceiver& r) {
817 r.drawImage(kTestImage1, {10, 10}, kNearestSampling, false);
818 }},
819 {1, 24, 1,
820 [](DlOpReceiver& r) {
821 r.drawImage(kTestImage1, {10, 10}, kNearestSampling, true);
822 }},
823 {1, 24, 1,
824 [](DlOpReceiver& r) {
825 r.drawImage(kTestImage1, {20, 10}, kNearestSampling, false);
826 }},
827 {1, 24, 1,
828 [](DlOpReceiver& r) {
829 r.drawImage(kTestImage1, {10, 20}, kNearestSampling, false);
830 }},
831 {1, 24, 1,
832 [](DlOpReceiver& r) {
833 r.drawImage(kTestImage1, {10, 10}, kLinearSampling, false);
834 }},
835 {1, 24, 1,
836 [](DlOpReceiver& r) {
837 r.drawImage(kTestImage2, {10, 10}, kNearestSampling, false);
838 }},
839 {1, 24, 1,
840 [](DlOpReceiver& r) {
841 auto dl_image = DlImageSkia::Make(kTestSkImage);
842 r.drawImage(dl_image, {10, 10}, kNearestSampling, false);
843 }},
844 }},
845 {"DrawImageRect",
846 {
847 {1, 56, 1,
848 [](DlOpReceiver& r) {
849 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 20, 20),
850 DlRect::MakeLTRB(10, 10, 80, 80),
851 kNearestSampling, false,
853 }},
854 {1, 56, 1,
855 [](DlOpReceiver& r) {
856 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 20, 20),
857 DlRect::MakeLTRB(10, 10, 80, 80),
858 kNearestSampling, true,
860 }},
861 {1, 56, 1,
862 [](DlOpReceiver& r) {
863 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 20, 20),
864 DlRect::MakeLTRB(10, 10, 80, 80),
865 kNearestSampling, false,
867 }},
868 {1, 56, 1,
869 [](DlOpReceiver& r) {
870 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 25, 20),
871 DlRect::MakeLTRB(10, 10, 80, 80),
872 kNearestSampling, false,
874 }},
875 {1, 56, 1,
876 [](DlOpReceiver& r) {
877 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 20, 20),
878 DlRect::MakeLTRB(10, 10, 85, 80),
879 kNearestSampling, false,
881 }},
882 {1, 56, 1,
883 [](DlOpReceiver& r) {
884 r.drawImageRect(kTestImage1, DlRect::MakeLTRB(10, 10, 20, 20),
885 DlRect::MakeLTRB(10, 10, 80, 80), kLinearSampling,
887 }},
888 {1, 56, 1,
889 [](DlOpReceiver& r) {
890 r.drawImageRect(kTestImage2, DlRect::MakeLTRB(10, 10, 15, 15),
891 DlRect::MakeLTRB(10, 10, 80, 80),
892 kNearestSampling, false,
894 }},
895 {1, 56, 1,
896 [](DlOpReceiver& r) {
897 auto dl_image = DlImageSkia::Make(kTestSkImage);
898 r.drawImageRect(dl_image, DlRect::MakeLTRB(10, 10, 15, 15),
899 DlRect::MakeLTRB(10, 10, 80, 80),
900 kNearestSampling, false,
902 }},
903 }},
904 {"DrawImageNine",
905 {
906 {1, 48, 9,
907 [](DlOpReceiver& r) {
908 r.drawImageNine(kTestImage1, DlIRect::MakeLTRB(10, 10, 20, 20),
909 DlRect::MakeLTRB(10, 10, 80, 80),
911 }},
912 {1, 48, 9,
913 [](DlOpReceiver& r) {
914 r.drawImageNine(kTestImage1, DlIRect::MakeLTRB(10, 10, 20, 20),
915 DlRect::MakeLTRB(10, 10, 80, 80),
917 }},
918 {1, 48, 9,
919 [](DlOpReceiver& r) {
920 r.drawImageNine(kTestImage1, DlIRect::MakeLTRB(10, 10, 25, 20),
921 DlRect::MakeLTRB(10, 10, 80, 80),
923 }},
924 {1, 48, 9,
925 [](DlOpReceiver& r) {
926 r.drawImageNine(kTestImage1, DlIRect::MakeLTRB(10, 10, 20, 20),
927 DlRect::MakeLTRB(10, 10, 85, 80),
929 }},
930 {1, 48, 9,
931 [](DlOpReceiver& r) {
932 r.drawImageNine(kTestImage1, DlIRect::MakeLTRB(10, 10, 20, 20),
933 DlRect::MakeLTRB(10, 10, 80, 80),
934 DlFilterMode::kLinear, false);
935 }},
936 {1, 48, 9,
937 [](DlOpReceiver& r) {
938 r.drawImageNine(kTestImage2, DlIRect::MakeLTRB(10, 10, 15, 15),
939 DlRect::MakeLTRB(10, 10, 80, 80),
941 }},
942 {1, 48, 9,
943 [](DlOpReceiver& r) {
944 auto dl_image = DlImageSkia::Make(kTestSkImage);
945 r.drawImageNine(dl_image, DlIRect::MakeLTRB(10, 10, 15, 15),
946 DlRect::MakeLTRB(10, 10, 80, 80),
948 }},
949 }},
950 {"DrawAtlas",
951 {
952 {1, 48 + 32 + 8, 1,
953 [](DlOpReceiver& r) {
954 static DlRSTransform xforms[] = {
955 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
956 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
957 };
958 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
959 DlRect::MakeLTRB(20, 20, 30, 30)};
960 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
961 DlBlendMode::kSrcIn, kNearestSampling, nullptr,
962 false);
963 }},
964 {1, 48 + 32 + 8, 1,
965 [](DlOpReceiver& r) {
966 static DlRSTransform xforms[] = {
967 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
968 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
969 };
970 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
971 DlRect::MakeLTRB(20, 20, 30, 30)};
972 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
973 DlBlendMode::kSrcIn, kNearestSampling, nullptr, true);
974 }},
975 {1, 48 + 32 + 8, 1,
976 [](DlOpReceiver& r) {
977 static DlRSTransform xforms[] = {
978 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
979 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(45)),
980 };
981 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
982 DlRect::MakeLTRB(20, 20, 30, 30)};
983 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
984 DlBlendMode::kSrcIn, kNearestSampling, nullptr,
985 false);
986 }},
987 {1, 48 + 32 + 8, 1,
988 [](DlOpReceiver& r) {
989 static DlRSTransform xforms[] = {
990 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
991 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
992 };
993 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
994 DlRect::MakeLTRB(20, 25, 30, 30)};
995 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
996 DlBlendMode::kSrcIn, kNearestSampling, nullptr,
997 false);
998 }},
999 {1, 48 + 32 + 8, 1,
1000 [](DlOpReceiver& r) {
1001 static DlRSTransform xforms[] = {
1002 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1003 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1004 };
1005 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1006 DlRect::MakeLTRB(20, 20, 30, 30)};
1007 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
1008 DlBlendMode::kSrcIn, kLinearSampling, nullptr, false);
1009 }},
1010 {1, 48 + 32 + 8, 1,
1011 [](DlOpReceiver& r) {
1012 static DlRSTransform xforms[] = {
1013 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1014 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1015 };
1016 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1017 DlRect::MakeLTRB(20, 20, 30, 30)};
1018 r.drawAtlas(kTestImage1, xforms, texs, nullptr, 2,
1019 DlBlendMode::kDstIn, kNearestSampling, nullptr,
1020 false);
1021 }},
1022 {1, 64 + 32 + 8, 1,
1023 [](DlOpReceiver& r) {
1024 static DlRSTransform xforms[] = {
1025 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1026 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1027 };
1028 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1029 DlRect::MakeLTRB(20, 20, 30, 30)};
1030 static DlRect cull_rect = DlRect::MakeLTRB(0, 0, 200, 200);
1031 r.drawAtlas(kTestImage2, xforms, texs, nullptr, 2,
1032 DlBlendMode::kSrcIn, kNearestSampling, &cull_rect,
1033 false);
1034 }},
1035 {1, 128, 1,
1036 [](DlOpReceiver& r) {
1037 static DlRSTransform xforms[] = {
1038 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1039 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1040 };
1041 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1042 DlRect::MakeLTRB(20, 20, 30, 30)};
1043 static DlColor colors[] = {DlColor::kBlue(), DlColor::kGreen()};
1044 r.drawAtlas(kTestImage1, xforms, texs, colors, 2,
1045 DlBlendMode::kSrcIn, kNearestSampling, nullptr,
1046 false);
1047 }},
1048 {1, 144, 1,
1049 [](DlOpReceiver& r) {
1050 static DlRSTransform xforms[] = {
1051 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1052 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1053 };
1054 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1055 DlRect::MakeLTRB(20, 20, 30, 30)};
1056 static DlColor colors[] = {DlColor::kBlue(), DlColor::kGreen()};
1057 static DlRect cull_rect = DlRect::MakeLTRB(0, 0, 200, 200);
1058 r.drawAtlas(kTestImage1, xforms, texs, colors, 2,
1059 DlBlendMode::kSrcIn, kNearestSampling, &cull_rect,
1060 false);
1061 }},
1062 {1, 48 + 32 + 8, 1,
1063 [](DlOpReceiver& r) {
1064 auto dl_image = DlImageSkia::Make(kTestSkImage);
1065 static DlRSTransform xforms[] = {
1066 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(0)),
1067 DlRSTransform::Make({0.0f, 0.0f}, 1.0f, DlDegrees(90)),
1068 };
1069 static DlRect texs[] = {DlRect::MakeLTRB(10, 10, 20, 20),
1070 DlRect::MakeLTRB(20, 20, 30, 30)};
1071 r.drawAtlas(dl_image, xforms, texs, nullptr, 2,
1072 DlBlendMode::kSrcIn, kNearestSampling, nullptr,
1073 false);
1074 }},
1075 }},
1076 {"DrawDisplayList",
1077 {
1078 {1, 16, 1,
1079 [](DlOpReceiver& r) { r.drawDisplayList(TestDisplayList1, 1.0); },
1080 1u},
1081 {1, 16, 1,
1082 [](DlOpReceiver& r) { r.drawDisplayList(TestDisplayList1, 0.5); },
1083 1u},
1084 {1, 16, 1,
1085 [](DlOpReceiver& r) { r.drawDisplayList(TestDisplayList2, 1.0); },
1086 1u},
1087 {1, 16, 1,
1088 [](DlOpReceiver& r) {
1089 r.drawDisplayList(MakeTestDisplayList(10, 10, SK_ColorRED), 1.0);
1090 },
1091 1u},
1092 }},
1093 {"DrawText",
1094 {
1095 {1, 32, 1,
1096 [](DlOpReceiver& r) {
1097 r.drawText(DlTextSkia::Make(GetTestTextBlob(1)), 10, 10);
1098 }},
1099 {1, 32, 1,
1100 [](DlOpReceiver& r) {
1101 r.drawText(DlTextSkia::Make(GetTestTextBlob(1)), 20, 10);
1102 }},
1103 {1, 32, 1,
1104 [](DlOpReceiver& r) {
1105 r.drawText(DlTextSkia::Make(GetTestTextBlob(1)), 10, 20);
1106 }},
1107 {1, 32, 1,
1108 [](DlOpReceiver& r) {
1109 r.drawText(DlTextSkia::Make(GetTestTextBlob(2)), 10, 10);
1110 }},
1111#if IMPELLER_SUPPORTS_RENDERING
1112 {1, 32, 1,
1113 [](DlOpReceiver& r) {
1114 r.drawText(DlTextImpeller::Make(GetTestTextFrame(1)), 10, 10);
1115 }},
1116 {1, 32, 1,
1117 [](DlOpReceiver& r) {
1118 r.drawText(DlTextImpeller::Make(GetTestTextFrame(1)), 20, 10);
1119 }},
1120 {1, 32, 1,
1121 [](DlOpReceiver& r) {
1122 r.drawText(DlTextImpeller::Make(GetTestTextFrame(1)), 10, 20);
1123 }},
1124 {1, 32, 1,
1125 [](DlOpReceiver& r) {
1126 r.drawText(DlTextImpeller::Make(GetTestTextFrame(2)), 10, 10);
1127 }},
1128#endif
1129 }},
1130 {"DrawShadow",
1131 {
1132 {1, 56, 1,
1133 [](DlOpReceiver& r) {
1134 r.drawShadow(kTestPath1, DlColor(SK_ColorGREEN), 1.0, false, 1.0);
1135 }},
1136 {1, 56, 1,
1137 [](DlOpReceiver& r) {
1138 r.drawShadow(kTestPath2, DlColor(SK_ColorGREEN), 1.0, false, 1.0);
1139 }},
1140 {1, 56, 1,
1141 [](DlOpReceiver& r) {
1142 r.drawShadow(kTestPath1, DlColor(SK_ColorBLUE), 1.0, false, 1.0);
1143 }},
1144 {1, 56, 1,
1145 [](DlOpReceiver& r) {
1146 r.drawShadow(kTestPath1, DlColor(SK_ColorGREEN), 2.0, false, 1.0);
1147 }},
1148 {1, 56, 1,
1149 [](DlOpReceiver& r) {
1150 r.drawShadow(kTestPath1, DlColor(SK_ColorGREEN), 1.0, true, 1.0);
1151 }},
1152 {1, 56, 1,
1153 [](DlOpReceiver& r) {
1154 r.drawShadow(kTestPath1, DlColor(SK_ColorGREEN), 1.0, false, 2.5);
1155 }},
1156 }},
1157 };
1158}
1159
1160std::vector<DisplayListInvocationGroup> CreateAllGroups() {
1161 std::vector<DisplayListInvocationGroup> result;
1162 auto all_attribute_ops = CreateAllAttributesOps();
1163 std::move(all_attribute_ops.begin(), all_attribute_ops.end(),
1164 std::back_inserter(result));
1165 auto all_save_restore_ops = CreateAllSaveRestoreOps();
1166 std::move(all_save_restore_ops.begin(), all_save_restore_ops.end(),
1167 std::back_inserter(result));
1168 auto all_transform_ops = CreateAllTransformOps();
1169 std::move(all_transform_ops.begin(), all_transform_ops.end(),
1170 std::back_inserter(result));
1171 auto all_clip_ops = CreateAllClipOps();
1172 std::move(all_clip_ops.begin(), all_clip_ops.end(),
1173 std::back_inserter(result));
1174 auto all_rendering_ops = CreateAllRenderingOps();
1175 std::move(all_rendering_ops.begin(), all_rendering_ops.end(),
1176 std::back_inserter(result));
1177 return result;
1178}
1179
1181 static constexpr const char* kTestFontFixture = "Roboto-Regular.ttf";
1182 auto mapping = flutter::testing::OpenFixtureAsSkData(kTestFontFixture);
1183 FML_CHECK(mapping);
1184 return SkFont{txt::GetDefaultFontManager()->makeFromData(mapping), scalar};
1185}
1186
1187sk_sp<SkTextBlob> GetTestTextBlob(int index) {
1188 static std::map<int, sk_sp<SkTextBlob>> text_blobs;
1189 auto it = text_blobs.find(index);
1190 if (it != text_blobs.end()) {
1191 return it->second;
1192 }
1193 std::string text = "TestBlob" + std::to_string(index);
1194 auto blob = GetTestTextBlob(text);
1195 text_blobs.insert(std::make_pair(index, blob));
1196 return blob;
1197}
1198
1199#if IMPELLER_SUPPORTS_RENDERING
1200std::shared_ptr<impeller::TextFrame> GetTestTextFrame(int index) {
1201 static std::map<int, std::shared_ptr<impeller::TextFrame>> text_frames;
1202 auto it = text_frames.find(index);
1203 if (it != text_frames.end()) {
1204 return it->second;
1205 }
1206 auto blob = GetTestTextBlob(index);
1207 auto frame = impeller::MakeTextFrameFromTextBlobSkia(blob);
1208 text_frames.insert(std::make_pair(index, frame));
1209 return frame;
1210}
1211#endif
1212
1213sk_sp<SkTextBlob> GetTestTextBlob(const std::string& text, DlScalar font_size) {
1214 return SkTextBlob::MakeFromText(text.c_str(), text.size(),
1216 SkTextEncoding::kUTF8);
1217}
1218
1219} // namespace testing
1220} // namespace flutter
void DrawColor(DlColor color, DlBlendMode mode) override
void DrawDisplayList(const sk_sp< DisplayList > display_list, DlScalar opacity=SK_Scalar1) override
sk_sp< DisplayList > Build()
void DrawRect(const DlRect &rect, const DlPaint &paint) override
static std::shared_ptr< const DlColorFilter > MakeLinearToSrgbGamma()
static std::shared_ptr< const DlColorFilter > MakeSrgbToLinearGamma()
static sk_sp< DlImage > Make(const SkImage *image)
Internal API for rendering recorded display lists to backends.
virtual void drawPoints(DlPointMode mode, uint32_t count, const DlPoint points[])=0
virtual void setColor(DlColor color)=0
DlPaint & setColor(DlColor color)
Definition dl_paint.h:70
DlPaint & setAlpha(uint8_t alpha)
Definition dl_paint.h:76
DlPaint & setDrawStyle(DlDrawStyle style)
Definition dl_paint.h:93
Backend implementation of |DlCanvas| for |SkCanvas|.
void DrawRect(const DlRect &rect, const DlPaint &paint) override
static std::shared_ptr< DlTextImpeller > Make(const std::shared_ptr< impeller::TextFrame > &frame)
static std::shared_ptr< DlTextSkia > Make(const sk_sp< SkTextBlob > &blob)
static const SaveLayerOptions kNoAttributes
static const SaveLayerOptions kWithAttributes
int32_t x
#define TestPointCount
VkSurfaceKHR surface
Definition main.cc:65
#define FML_CHECK(condition)
Definition logging.h:104
std::u16string text
double y
static const DlComposeImageFilter kTestComposeImageFilter2(kTestBlurImageFilter2, kTestMatrixImageFilter1)
static const DlPath kTestPathOval
std::vector< DisplayListInvocationGroup > CreateAllClipOps()
static const DlDilateImageFilter kTestDilateImageFilter2(6.0, 5.0)
std::vector< DisplayListInvocationGroup > CreateAllTransformOps()
static const std::shared_ptr< DlColorSource > kTestSource3
static const auto kTestMatrixColorFilter2
static auto kTestSkImage
static const DlBlurMaskFilter kTestMaskFilter1(DlBlurStyle::kNormal, 3.0)
static const DlPath kTestPathRect
SkFont CreateTestFontOfSize(DlScalar scalar)
std::vector< DisplayListInvocationGroup > CreateAllSaveRestoreOps()
static const std::shared_ptr< DlColorSource > kTestSource4
static const DlBlurMaskFilter kTestMaskFilter4(DlBlurStyle::kInner, 3.0)
static const DlComposeImageFilter kTestComposeImageFilter1(kTestBlurImageFilter1, kTestMatrixImageFilter1)
static const std::shared_ptr< DlVertices > kTestVertices2
static const DlColorFilterImageFilter kTestCFImageFilter2(kTestBlendColorFilter2)
static const DlRoundRect kTestInnerRRect
constexpr DlPoint kTestPoints[]
static const DlErodeImageFilter kTestErodeImageFilter2(4.0, 3.0)
static const auto kTestBlendColorFilter2
sk_sp< SkData > OpenFixtureAsSkData(const std::string &fixture_name)
Opens a fixture of the given file name and returns a Skia SkData holding its contents.
Definition testing.cc:63
static const DlBlurMaskFilter kTestMaskFilter3(DlBlurStyle::kSolid, 3.0)
static const DlMatrixImageFilter kTestMatrixImageFilter2(DlMatrix::MakeRotationZ(DlDegrees(85)), kNearestSampling)
static const DlPath kTestPath2
static const DlBlurImageFilter kTestBlurImageFilter4(5.0, 5.0, DlTileMode::kDecal)
static const DlErodeImageFilter kTestErodeImageFilter3(3.0, 4.0)
static const DlRoundSuperellipse kTestRSuperellipse
static const DlMatrixImageFilter kTestMatrixImageFilter1(DlMatrix::MakeRotationZ(DlDegrees(45)), kNearestSampling)
static const auto kTestMatrixColorFilter1
static const std::shared_ptr< DlColorSource > kTestSource1
constexpr DlRect kTestBounds
static const DlPath kTestPath1
static const DlColorFilterImageFilter kTestCFImageFilter1(kTestBlendColorFilter1)
static const DlPath kTestPath3
static const std::shared_ptr< DlColorSource > kTestSource5
std::vector< DisplayListInvocationGroup > CreateAllAttributesOps()
sk_sp< DlImage > MakeTestImage(int w, int h, int checker_size)
static const DlErodeImageFilter kTestErodeImageFilter1(4.0, 4.0)
sk_sp< DisplayList > GetSampleDisplayList()
static const std::shared_ptr< DlColorSource > kTestSource2
static const DlBlurMaskFilter kTestMaskFilter2(DlBlurStyle::kNormal, 5.0)
static const DlBlurImageFilter kTestBlurImageFilter2(6.0, 5.0, DlTileMode::kClamp)
static const auto kTestBlendColorFilter3
static const DlPath kTestPathRRect
static auto kTestImage1
static DlImageSampling kLinearSampling
static const auto kTestBlendColorFilter1
static sk_sp< DisplayList > TestDisplayList2
static const DlBlurImageFilter kTestBlurImageFilter3(5.0, 6.0, DlTileMode::kClamp)
static auto kTestImage2
std::vector< DisplayListInvocationGroup > CreateAllRenderingOps()
static const DlDilateImageFilter kTestDilateImageFilter1(5.0, 5.0)
sk_sp< DisplayList > GetSampleNestedDisplayList()
static DlImageSampling kNearestSampling
static const DlBlurMaskFilter kTestMaskFilter5(DlBlurStyle::kOuter, 3.0)
sk_sp< SkTextBlob > GetTestTextBlob(int index)
static const DlDilateImageFilter kTestDilateImageFilter3(5.0, 6.0)
static sk_sp< DisplayList > MakeTestDisplayList(int w, int h, SkColor color)
static const DlBlurImageFilter kTestBlurImageFilter1(5.0, 5.0, DlTileMode::kClamp)
std::vector< DisplayListInvocationGroup > CreateAllGroups()
static const DlComposeImageFilter kTestComposeImageFilter3(kTestBlurImageFilter1, kTestMatrixImageFilter2)
static const std::shared_ptr< DlVertices > kTestVertices1
static const DlRoundRect kTestRRect
static sk_sp< DisplayList > TestDisplayList1
static const DlMatrixImageFilter kTestMatrixImageFilter3(DlMatrix::MakeRotationZ(DlDegrees(45)), kLinearSampling)
impeller::Scalar DlScalar
@ kMiter
extends to miter limit
@ kBevel
connects outside edges
@ kRound
adds circle
@ kButt
no stroke extension
@ kSquare
adds square
impeller::Degrees DlDegrees
@ kLines
draw each separate pair of points as a line segment
@ kPolygon
draw each pair of overlapping points as a line segment
@ kPoints
draw each point separately
@ kStrokeAndFill
both strokes and fills shapes
@ kStroke
strokes boundary of shapes
@ kFill
fills interior of shapes
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 to the cache directory This is different from the persistent_cache_path in embedder h
Definition switch_defs.h:54
std::shared_ptr< TextFrame > MakeTextFrameFromTextBlobSkia(const sk_sp< SkTextBlob > &blob)
sk_sp< SkFontMgr > GetDefaultFontManager(uint32_t font_initialization_data)
Definition platform.cc:17
static constexpr DlColor kBlue()
Definition dl_color.h:73
static constexpr DlColor kRed()
Definition dl_color.h:71
static constexpr DlColor kGreen()
Definition dl_color.h:72
uint32_t argb() const
Definition dl_color.h:158
constexpr bool isOpaque() const
Definition dl_color.h:97
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition matrix.h:95
static RSTransform Make(Point origin, Scalar scale, Radians radians)
Definition rstransform.h:38
RoundRect Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
Definition round_rect.h:89
RoundSuperellipse Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
static constexpr TRect MakeWH(Type width, Type height)
Definition rect.h:140
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
Definition rect.h:136
constexpr TRect< T > Shift(T dx, T dy) const
Returns a new rectangle translated by the given offset.
Definition rect.h:636
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition rect.h:129
Scalar font_size