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