7 #include "flutter/display_list/dl_builder.h"
9 #include "flutter/testing/testing.h"
10 #include "gtest/gtest.h"
25 auto draw = [](DlCanvas* canvas,
26 const std::vector<std::unique_ptr<DlImage>>& images) {
27 canvas->Scale(0.2, 0.2);
29 paint.setColor(DlColor::kCyan());
30 canvas->DrawPaint(paint);
33 DisplayListBuilder builder;
36 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
40 auto draw = [](DlCanvas* canvas,
const std::vector<sk_sp<DlImage>>& images) {
41 FML_CHECK(images.size() >= 1);
43 paint.setColor(DlColor::kRed());
44 canvas->DrawImage(images[0], SkPoint::Make(100.0, 100.0),
45 DlImageSampling::kLinear, &paint);
48 DisplayListBuilder builder;
49 std::vector<sk_sp<DlImage>> images;
50 images.emplace_back(CreateDlImageForFixture(
"kalimba.jpg"));
51 draw(&builder, images);
53 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
59 Point content_scale = GetContentScale();
60 auto draw = [content_scale](DlCanvas* canvas,
61 const std::vector<sk_sp<DlImage>>& images) {
62 canvas->Scale(content_scale.x, content_scale.y);
64 paint.setColor(DlColor(0xfffef7ff));
65 canvas->DrawRect(SkRect::MakeLTRB(0, 0, 375, 667), paint);
66 paint.setColor(DlColor(0xffff9800));
67 canvas->DrawRect(SkRect::MakeLTRB(0, 0, 187.5, 333.5), paint);
68 paint.setColor(DlColor(0xff9c27b0));
69 canvas->DrawRect(SkRect::MakeLTRB(187.5, 0, 375, 333.5), paint);
70 paint.setColor(DlColor(0xff4caf50));
71 canvas->DrawRect(SkRect::MakeLTRB(0, 333.5, 187.5, 667), paint);
72 paint.setColor(DlColor(0xfff44336));
73 canvas->DrawRect(SkRect::MakeLTRB(187.5, 333.5, 375, 667), paint);
78 SkRRect::MakeOval(SkRect::MakeLTRB(201.25, 10, 361.25, 170)),
79 DlCanvas::ClipOp::kIntersect,
true);
80 SkRect save_layer_bounds = SkRect::MakeLTRB(201.25, 10, 361.25, 170);
81 DlMatrixImageFilter backdrop(SkMatrix::MakeAll(3, 0, -280,
84 DlImageSampling::kLinear);
85 canvas->SaveLayer(&save_layer_bounds,
nullptr, &backdrop);
87 canvas->Translate(201.25, 10);
88 auto paint = DlPaint()
90 .setColor(DlColor(0xff2196f3))
92 .setDrawStyle(DlDrawStyle::kStroke);
93 canvas->DrawCircle(SkPoint::Make(80, 80), 80, paint);
100 DisplayListBuilder builder;
101 std::vector<sk_sp<DlImage>> images;
102 draw(&builder, images);
104 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
108 void DrawBlurGrid(DlCanvas* canvas) {
110 paint.setColor(DlColor(0xfffef7ff));
114 std::vector<Scalar> blur_radii = {10, 30, 50};
115 for (
size_t i = 0; i < blur_radii.size(); ++i) {
117 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
119 paint.setMaskFilter(blur_filter);
121 Scalar yval = gap + i * (gap + height);
122 rrect.setNinePatch(SkRect::MakeXYWH(gap, yval, width, height), 10, 10, 10,
124 canvas->DrawRRect(rrect, paint);
125 rrect.setNinePatch(SkRect::MakeXYWH(2.0 * gap + width, yval, width, height),
127 canvas->DrawRRect(rrect, paint);
133 Point content_scale = GetContentScale();
134 auto draw = [content_scale](DlCanvas* canvas,
135 const std::vector<sk_sp<DlImage>>& images) {
136 canvas->Scale(content_scale.x, content_scale.y);
137 canvas->DrawPaint(DlPaint().setColor(DlColor(0xff112233)));
138 DrawBlurGrid(canvas);
141 DisplayListBuilder builder;
142 std::vector<sk_sp<DlImage>> images;
143 draw(&builder, images);
145 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
149 Point content_scale = GetContentScale();
150 auto draw = [content_scale](DlCanvas* canvas,
151 const std::vector<sk_sp<DlImage>>& images) {
152 canvas->Scale(content_scale.x, content_scale.y);
153 canvas->DrawPaint(DlPaint().setColor(DlColor(0xff112233)));
154 canvas->Scale(0.33, 0.33);
155 DrawBlurGrid(canvas);
158 DisplayListBuilder builder;
159 std::vector<sk_sp<DlImage>> images;
160 draw(&builder, images);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
166 Point content_scale = GetContentScale();
167 auto draw = [content_scale](DlCanvas* canvas,
168 const std::vector<sk_sp<DlImage>>& images) {
169 canvas->Scale(content_scale.x, content_scale.y);
170 canvas->Translate(200, 200);
171 canvas->DrawPaint(DlPaint().setColor(DlColor(0xff112233)));
172 canvas->Scale(0.33, 0.33);
173 canvas->Translate(300, 300);
175 canvas->Translate(-300, -300);
176 DrawBlurGrid(canvas);
179 DisplayListBuilder builder;
180 std::vector<sk_sp<DlImage>> images;
181 draw(&builder, images);
183 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
187 DisplayListBuilder builder;
188 builder.Scale(GetContentScale().x, GetContentScale().y);
189 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
191 auto blur_sigmas = std::array{5.0f, 10.0f, 20.0f};
192 auto blur_colors = std::array{
198 auto make_rrect_path = [](
const SkRect& rect,
DlScalar rx,
200 auto add_corner = [](SkPath& path, SkPoint rCorner, SkPoint rEnd) {
202 path.rCubicTo(rCorner.fX * (1.0f - magic), rCorner.fY * (1.0f - magic),
203 rCorner.fX + rEnd.fX * magic, rCorner.fY + rEnd.fY * magic,
204 rCorner.fX + rEnd.fX, rCorner.fY + rEnd.fY);
208 path.moveTo(rect.fRight - rx, rect.fTop);
209 add_corner(path, {rx, 0.0f}, {0.0f, ry});
210 path.lineTo(rect.fRight, rect.fBottom - ry);
211 add_corner(path, {0.0f, ry}, {-rx, 0.0f});
212 path.lineTo(rect.fLeft + rx, rect.fBottom);
213 add_corner(path, {-rx, 0.0f}, {0.0f, -ry});
214 path.lineTo(rect.fLeft, rect.fTop + ry);
215 add_corner(path, {0.0f, -ry}, {rx, 0.0f});
220 for (
size_t i = 0; i < blur_sigmas.size(); i++) {
221 auto rect = SkRect::MakeXYWH(i * 320.0f + 50.0f, 50.0f, 100.0f, 100.0f);
222 DlPaint paint = DlPaint()
223 .setColor(blur_colors[i])
224 .setMaskFilter(DlBlurMaskFilter::Make(
225 DlBlurStyle::kNormal, blur_sigmas[i]));
227 builder.DrawRRect(SkRRect::MakeRectXY(rect, 10.0f, 10.0f), paint);
228 rect = rect.makeOffset(150.0f, 0.0f);
229 builder.DrawPath(make_rrect_path(rect, 10.0f, 10.0f), paint);
230 rect = rect.makeOffset(-150.0f, 0.0f);
232 rect = rect.makeOffset(0.0f, 200.0f);
233 builder.DrawRRect(SkRRect::MakeRectXY(rect, 10.0f, 30.0f), paint);
234 rect = rect.makeOffset(150.0f, 0.0f);
235 builder.DrawPath(make_rrect_path(rect, 10.0f, 20.0f), paint);
236 rect = rect.makeOffset(-150.0f, 0.0f);
238 rect = rect.makeOffset(0.0f, 200.0f);
239 builder.DrawRRect(SkRRect::MakeRectXY(rect, 30.0f, 10.0f), paint);
240 rect = rect.makeOffset(150.0f, 0.0f);
241 builder.DrawPath(make_rrect_path(rect, 20.0f, 10.0f), paint);
242 rect = rect.makeOffset(-150.0f, 0.0f);
245 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
249 Point content_scale = GetContentScale();
250 auto draw = [content_scale](DlCanvas* canvas,
251 const std::vector<sk_sp<DlImage>>& images) {
252 canvas->Scale(content_scale.x, content_scale.y);
253 canvas->DrawPaint(DlPaint().setColor(DlColor::kWhite()));
255 auto draw_one = [canvas](DlStrokeCap cap,
Scalar x,
Scalar y,
260 DlPaint thick_paint = DlPaint()
261 .setColor(DlColor::kBlue())
263 .setStrokeWidth(8.0f);
264 DlPaint middle_paint = DlPaint()
265 .setColor(DlColor::kGreen())
267 .setStrokeWidth(5.0f);
268 DlPaint thin_paint = DlPaint()
269 .setColor(DlColor::kMagenta())
271 .setStrokeWidth(2.0f);
272 for (
int degrees = 0; degrees < 360; degrees += 30) {
274 canvas->DrawDashedLine(center + inner * delta, center + outer * delta,
275 dash_on, dash_off, thick_paint);
276 canvas->DrawDashedLine(center + inner * delta, center + outer * delta,
277 dash_on, dash_off, middle_paint);
278 canvas->DrawDashedLine(center + inner * delta, center + outer * delta,
279 dash_on, dash_off, thin_paint);
283 draw_one(DlStrokeCap::kButt, 150.0f, 150.0f, 15.0f, 10.0f);
284 draw_one(DlStrokeCap::kSquare, 400.0f, 150.0f, 15.0f, 10.0f);
285 draw_one(DlStrokeCap::kRound, 150.0f, 400.0f, 15.0f, 10.0f);
286 draw_one(DlStrokeCap::kRound, 400.0f, 400.0f, 0.0f, 11.0f);
290 SkPath clip_path = SkPath();
291 clip_path.moveTo(275.0f, 225.0f);
292 clip_path.lineTo(325.0f, 275.0f);
293 clip_path.lineTo(275.0f, 325.0f);
294 clip_path.lineTo(225.0f, 275.0f);
295 canvas->ClipPath(clip_path);
296 canvas->DrawColor(DlColor::kYellow());
297 draw_one(DlStrokeCap::kRound, 275.0f, 275.0f, 15.0f, 10.0f);
301 DisplayListBuilder builder;
302 std::vector<sk_sp<DlImage>> images;
303 draw(&builder, images);
305 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));