Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 21f055f

Browse files
Reverts "[Impeller] add support for Skia concept of RRect::isSimple needed for DL dispatching" (#47821)
Reverts #47736 Initiated by: zanderso This change reverts the following previous change: Original Description: Fixes flutter/flutter#133793
1 parent f0133f5 commit 21f055f

11 files changed

+62
-143
lines changed

impeller/aiks/aiks_unittests.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2407,9 +2407,9 @@ TEST_P(AiksTest, DrawRectAbsorbsClears) {
24072407

24082408
TEST_P(AiksTest, DrawRectAbsorbsClearsNegativeRRect) {
24092409
Canvas canvas;
2410-
canvas.DrawRRect(Rect::MakeXYWH(0, 0, 300, 300), {5.0, 5.0},
2410+
canvas.DrawRRect(Rect::MakeXYWH(0, 0, 300, 300), 5.0,
24112411
{.color = Color::Red(), .blend_mode = BlendMode::kSource});
2412-
canvas.DrawRRect(Rect::MakeXYWH(0, 0, 300, 300), {5.0, 5.0},
2412+
canvas.DrawRRect(Rect::MakeXYWH(0, 0, 300, 300), 5.0,
24132413
{.color = Color::CornflowerBlue().WithAlpha(0.75),
24142414
.blend_mode = BlendMode::kSourceOver});
24152415

@@ -3077,7 +3077,7 @@ TEST_P(AiksTest, CanRenderBackdropBlurInteractive) {
30773077
canvas.DrawCircle({300, 200}, 100, {.color = Color::GreenYellow()});
30783078
canvas.DrawCircle({140, 170}, 75, {.color = Color::DarkMagenta()});
30793079
canvas.DrawCircle({180, 120}, 100, {.color = Color::OrangeRed()});
3080-
canvas.ClipRRect(Rect::MakeLTRB(a.x, a.y, b.x, b.y), {20, 20});
3080+
canvas.ClipRRect(Rect::MakeLTRB(a.x, a.y, b.x, b.y), 20);
30813081
canvas.SaveLayer({.blend_mode = BlendMode::kSource}, std::nullopt,
30823082
ImageFilter::MakeBlur(Sigma(20.0), Sigma(20.0),
30833083
FilterContents::BlurStyle::kNormal,
@@ -3096,7 +3096,7 @@ TEST_P(AiksTest, CanRenderBackdropBlur) {
30963096
canvas.DrawCircle({300, 200}, 100, {.color = Color::GreenYellow()});
30973097
canvas.DrawCircle({140, 170}, 75, {.color = Color::DarkMagenta()});
30983098
canvas.DrawCircle({180, 120}, 100, {.color = Color::OrangeRed()});
3099-
canvas.ClipRRect(Rect::MakeLTRB(75, 50, 375, 275), {20, 20});
3099+
canvas.ClipRRect(Rect::MakeLTRB(75, 50, 375, 275), 20);
31003100
canvas.SaveLayer({.blend_mode = BlendMode::kSource}, std::nullopt,
31013101
ImageFilter::MakeBlur(Sigma(30.0), Sigma(30.0),
31023102
FilterContents::BlurStyle::kNormal,
@@ -3202,7 +3202,7 @@ TEST_P(AiksTest, CanRenderClippedRuntimeEffects) {
32023202

32033203
Canvas canvas;
32043204
canvas.Save();
3205-
canvas.ClipRRect(Rect::MakeXYWH(0, 0, 400, 400), {10.0, 10.0},
3205+
canvas.ClipRRect(Rect::MakeXYWH(0, 0, 400, 400), 10.0,
32063206
Entity::ClipOperation::kIntersect);
32073207
canvas.DrawRect(Rect::MakeXYWH(0, 0, 400, 400), paint);
32083208
canvas.Restore();
@@ -3480,7 +3480,7 @@ TEST_P(AiksTest, DrawPictureWithText) {
34803480

34813481
TEST_P(AiksTest, DrawPictureClipped) {
34823482
Canvas subcanvas;
3483-
subcanvas.ClipRRect(Rect::MakeLTRB(100, 100, 400, 400), {15, 15});
3483+
subcanvas.ClipRRect(Rect::MakeLTRB(100, 100, 400, 400), 15);
34843484
subcanvas.DrawPaint({.color = Color::Red()});
34853485
auto picture = subcanvas.EndRecordingAsPicture();
34863486

@@ -3492,7 +3492,7 @@ TEST_P(AiksTest, DrawPictureClipped) {
34923492

34933493
// Draw over the picture with a larger green rectangle, completely covering it
34943494
// up.
3495-
canvas.ClipRRect(Rect::MakeLTRB(100, 100, 400, 400).Expand(20), {15, 15});
3495+
canvas.ClipRRect(Rect::MakeLTRB(100, 100, 400, 400).Expand(20), 15);
34963496
canvas.DrawPaint({.color = Color::Green()});
34973497

34983498
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));

impeller/aiks/canvas.cc

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,13 @@ void Canvas::DrawRect(Rect rect, const Paint& paint) {
246246
GetCurrentPass().AddEntity(entity);
247247
}
248248

249-
void Canvas::DrawRRect(Rect rect, Point corner_radii, const Paint& paint) {
250-
if (corner_radii.x == corner_radii.y &&
251-
AttemptDrawBlurredRRect(rect, corner_radii.x, paint)) {
249+
void Canvas::DrawRRect(Rect rect, Scalar corner_radius, const Paint& paint) {
250+
if (AttemptDrawBlurredRRect(rect, corner_radius, paint)) {
252251
return;
253252
}
254253
auto path = PathBuilder{}
255254
.SetConvexity(Convexity::kConvex)
256-
.AddRoundedRect(rect, corner_radii)
255+
.AddRoundedRect(rect, corner_radius)
257256
.SetBounds(rect)
258257
.TakePath();
259258
if (paint.style == Paint::Style::kFill) {
@@ -319,20 +318,20 @@ void Canvas::ClipRect(const Rect& rect, Entity::ClipOperation clip_op) {
319318
}
320319

321320
void Canvas::ClipRRect(const Rect& rect,
322-
Point corner_radii,
321+
Scalar corner_radius,
323322
Entity::ClipOperation clip_op) {
324323
auto path = PathBuilder{}
325324
.SetConvexity(Convexity::kConvex)
326-
.AddRoundedRect(rect, corner_radii)
325+
.AddRoundedRect(rect, corner_radius)
327326
.SetBounds(rect)
328327
.TakePath();
329328

330329
auto size = rect.GetSize();
331330
// Does the rounded rect have a flat part on the top/bottom or left/right?
332-
bool flat_on_TB = corner_radii.x * 2 < size.width;
333-
bool flat_on_LR = corner_radii.y * 2 < size.height;
331+
bool flat_on_TB = corner_radius * 2 < size.width;
332+
bool flat_on_LR = corner_radius * 2 < size.height;
334333
std::optional<Rect> inner_rect = (flat_on_LR && flat_on_TB)
335-
? rect.Expand(-corner_radii)
334+
? rect.Expand(-corner_radius)
336335
: std::make_optional<Rect>();
337336
auto geometry = Geometry::MakeFillPath(path, inner_rect);
338337
auto& cull_rect = xformation_stack_.back().cull_rect;
@@ -349,7 +348,7 @@ void Canvas::ClipRRect(const Rect& rect,
349348
IntersectCulling(rect);
350349
break;
351350
case Entity::ClipOperation::kDifference:
352-
if (corner_radii.x <= 0.0 || corner_radii.y <= 0) {
351+
if (corner_radius <= 0) {
353352
SubtractCulling(rect);
354353
} else {
355354
// We subtract the inner "tall" and "wide" rectangle pieces
@@ -358,10 +357,14 @@ void Canvas::ClipRRect(const Rect& rect,
358357
// Since this is a subtract operation, we can subtract each
359358
// rectangle piece individually without fear of interference.
360359
if (flat_on_TB) {
361-
SubtractCulling(rect.Expand({-corner_radii.x, 0.0}));
360+
SubtractCulling(Rect::MakeLTRB(
361+
rect.GetLeft() + corner_radius, rect.GetTop(),
362+
rect.GetRight() - corner_radius, rect.GetBottom()));
362363
}
363364
if (flat_on_LR) {
364-
SubtractCulling(rect.Expand({0.0, -corner_radii.y}));
365+
SubtractCulling(Rect::MakeLTRB(
366+
rect.GetLeft(), rect.GetTop() + corner_radius, //
367+
rect.GetRight(), rect.GetBottom() - corner_radius));
365368
}
366369
}
367370
break;

impeller/aiks/canvas.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class Canvas {
105105

106106
void DrawRect(Rect rect, const Paint& paint);
107107

108-
void DrawRRect(Rect rect, Point corner_radii, const Paint& paint);
108+
void DrawRRect(Rect rect, Scalar corner_radius, const Paint& paint);
109109

110110
void DrawCircle(Point center, Scalar radius, const Paint& paint);
111111

@@ -135,7 +135,7 @@ class Canvas {
135135

136136
void ClipRRect(
137137
const Rect& rect,
138-
Point corner_radii,
138+
Scalar corner_radius,
139139
Entity::ClipOperation clip_op = Entity::ClipOperation::kIntersect);
140140

141141
void DrawPicture(const Picture& picture);

impeller/aiks/canvas_recorder.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,9 @@ class CanvasRecorder {
182182
paint);
183183
}
184184

185-
void DrawRRect(Rect rect, Point corner_radii, const Paint& paint) {
185+
void DrawRRect(Rect rect, Scalar corner_radius, const Paint& paint) {
186186
return ExecuteAndSerialize(FLT_CANVAS_RECORDER_OP_ARG(DrawRRect), rect,
187-
corner_radii, paint);
187+
corner_radius, paint);
188188
}
189189

190190
void DrawCircle(Point center, Scalar radius, const Paint& paint) {
@@ -233,10 +233,10 @@ class CanvasRecorder {
233233

234234
void ClipRRect(
235235
const Rect& rect,
236-
Point corner_radii,
236+
Scalar corner_radius,
237237
Entity::ClipOperation clip_op = Entity::ClipOperation::kIntersect) {
238238
return ExecuteAndSerialize(FLT_CANVAS_RECORDER_OP_ARG(ClipRRect), rect,
239-
corner_radii, clip_op);
239+
corner_radius, clip_op);
240240
}
241241

242242
void DrawPicture(const Picture& picture) {

impeller/aiks/canvas_recorder_unittests.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ TEST(CanvasRecorder, DrawRect) {
160160

161161
TEST(CanvasRecorder, DrawRRect) {
162162
CanvasRecorder<Serializer> recorder;
163-
recorder.DrawRRect(Rect(), {}, Paint());
163+
recorder.DrawRRect(Rect(), 0, Paint());
164164
ASSERT_EQ(recorder.GetSerializer().last_op_, CanvasRecorderOp::DrawRRect);
165165
}
166166

@@ -202,7 +202,7 @@ TEST(CanvasRecorder, ClipRect) {
202202

203203
TEST(CanvasRecorder, ClipRRect) {
204204
CanvasRecorder<Serializer> recorder;
205-
recorder.ClipRRect({}, {});
205+
recorder.ClipRRect({}, 0);
206206
ASSERT_EQ(recorder.GetSerializer().last_op_, CanvasRecorderOp::ClipRRect);
207207
}
208208

impeller/aiks/canvas_unittests.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ TEST(AiksCanvasTest, RRectClipIntersectAgainstEmptyCullRect) {
170170
Rect rect_clip = Rect::MakeXYWH(5, 5, 10, 10);
171171

172172
Canvas canvas;
173-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kIntersect);
173+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kIntersect);
174174

175175
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
176176
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), rect_clip);
@@ -180,7 +180,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstEmptyCullRect) {
180180
Rect rect_clip = Rect::MakeXYWH(5, 5, 10, 10);
181181

182182
Canvas canvas;
183-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
183+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
184184

185185
ASSERT_FALSE(canvas.GetCurrentLocalCullingBounds().has_value());
186186
}
@@ -191,7 +191,7 @@ TEST(AiksCanvasTest, RRectClipIntersectAgainstCullRect) {
191191
Rect result_cull = Rect::MakeXYWH(5, 5, 5, 5);
192192

193193
Canvas canvas(initial_cull);
194-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kIntersect);
194+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kIntersect);
195195

196196
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
197197
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);
@@ -203,7 +203,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstNonCoveredCullRect) {
203203
Rect result_cull = Rect::MakeXYWH(0, 0, 10, 10);
204204

205205
Canvas canvas(initial_cull);
206-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
206+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
207207

208208
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
209209
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);
@@ -215,7 +215,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstVPartiallyCoveredCullRect) {
215215
Rect result_cull = Rect::MakeXYWH(0, 0, 6, 10);
216216

217217
Canvas canvas(initial_cull);
218-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
218+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
219219

220220
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
221221
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);
@@ -227,7 +227,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstVFullyCoveredCullRect) {
227227
Rect result_cull = Rect::MakeXYWH(0, 0, 5, 10);
228228

229229
Canvas canvas(initial_cull);
230-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
230+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
231231

232232
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
233233
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);
@@ -239,7 +239,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstHPartiallyCoveredCullRect) {
239239
Rect result_cull = Rect::MakeXYWH(0, 0, 10, 6);
240240

241241
Canvas canvas(initial_cull);
242-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
242+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
243243

244244
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
245245
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);
@@ -251,7 +251,7 @@ TEST(AiksCanvasTest, RRectClipDiffAgainstHFullyCoveredCullRect) {
251251
Rect result_cull = Rect::MakeXYWH(0, 0, 10, 5);
252252

253253
Canvas canvas(initial_cull);
254-
canvas.ClipRRect(rect_clip, {1, 1}, Entity::ClipOperation::kDifference);
254+
canvas.ClipRRect(rect_clip, 1, Entity::ClipOperation::kDifference);
255255

256256
ASSERT_TRUE(canvas.GetCurrentLocalCullingBounds().has_value());
257257
ASSERT_EQ(canvas.GetCurrentLocalCullingBounds().value(), result_cull);

impeller/display_list/dl_dispatcher.cc

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -726,13 +726,9 @@ void DlDispatcher::clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) {
726726

727727
// |flutter::DlOpReceiver|
728728
void DlDispatcher::clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) {
729-
if (rrect.isRect()) {
730-
canvas_.ClipRect(skia_conversions::ToRect(rrect.rect()),
731-
ToClipOperation(clip_op));
732-
} else if (rrect.isSimple()) {
729+
if (rrect.isSimple()) {
733730
canvas_.ClipRRect(skia_conversions::ToRect(rrect.rect()),
734-
skia_conversions::ToPoint(rrect.getSimpleRadii()),
735-
ToClipOperation(clip_op));
731+
rrect.getSimpleRadii().fX, ToClipOperation(clip_op));
736732
} else {
737733
canvas_.ClipPath(skia_conversions::ToPath(rrect), ToClipOperation(clip_op));
738734
}
@@ -797,8 +793,7 @@ void DlDispatcher::drawCircle(const SkPoint& center, SkScalar radius) {
797793
void DlDispatcher::drawRRect(const SkRRect& rrect) {
798794
if (rrect.isSimple()) {
799795
canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
800-
skia_conversions::ToPoint(rrect.getSimpleRadii()),
801-
paint_);
796+
rrect.getSimpleRadii().fX, paint_);
802797
} else {
803798
canvas_.DrawPath(skia_conversions::ToPath(rrect), paint_);
804799
}
@@ -814,36 +809,30 @@ void DlDispatcher::drawDRRect(const SkRRect& outer, const SkRRect& inner) {
814809

815810
// |flutter::DlOpReceiver|
816811
void DlDispatcher::drawPath(const SkPath& path) {
817-
SimplifyOrDrawPath(canvas_, path, paint_);
818-
}
819-
820-
void DlDispatcher::SimplifyOrDrawPath(CanvasType& canvas,
821-
const SkPath& path,
822-
const Paint& paint) {
823812
SkRect rect;
824813

825814
// We can't "optimize" a path into a rectangle if it's open.
826815
bool closed;
827816
if (path.isRect(&rect, &closed) && closed) {
828-
canvas.DrawRect(skia_conversions::ToRect(rect), paint);
817+
canvas_.DrawRect(skia_conversions::ToRect(rect), paint_);
829818
return;
830819
}
831820

832821
SkRRect rrect;
833822
if (path.isRRect(&rrect) && rrect.isSimple()) {
834-
canvas.DrawRRect(skia_conversions::ToRect(rrect.rect()),
835-
skia_conversions::ToPoint(rrect.getSimpleRadii()), paint);
823+
canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
824+
rrect.getSimpleRadii().fX, paint_);
836825
return;
837826
}
838827

839828
SkRect oval;
840829
if (path.isOval(&oval) && oval.width() == oval.height()) {
841-
canvas.DrawCircle(skia_conversions::ToPoint(oval.center()),
842-
oval.width() * 0.5, paint);
830+
canvas_.DrawCircle(skia_conversions::ToPoint(oval.center()),
831+
oval.width() * 0.5, paint_);
843832
return;
844833
}
845834

846-
canvas.DrawPath(skia_conversions::ToPath(path), paint);
835+
canvas_.DrawPath(skia_conversions::ToPath(path), paint_);
847836
}
848837

849838
// |flutter::DlOpReceiver|
@@ -1111,7 +1100,20 @@ void DlDispatcher::drawShadow(const SkPath& path,
11111100
canvas_.PreConcat(
11121101
Matrix::MakeTranslation(Vector2(0, -occluder_z * light_position.y)));
11131102

1114-
SimplifyOrDrawPath(canvas_, path, paint);
1103+
SkRect rect;
1104+
SkRRect rrect;
1105+
SkRect oval;
1106+
if (path.isRect(&rect)) {
1107+
canvas_.DrawRect(skia_conversions::ToRect(rect), paint);
1108+
} else if (path.isRRect(&rrect) && rrect.isSimple()) {
1109+
canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
1110+
rrect.getSimpleRadii().fX, paint);
1111+
} else if (path.isOval(&oval) && oval.width() == oval.height()) {
1112+
canvas_.DrawCircle(skia_conversions::ToPoint(oval.center()),
1113+
oval.width() * 0.5, paint);
1114+
} else {
1115+
canvas_.DrawPath(skia_conversions::ToPath(path), paint);
1116+
}
11151117

11161118
canvas_.Restore();
11171119
}

impeller/display_list/dl_dispatcher.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,6 @@ class DlDispatcher final : public flutter::DlOpReceiver {
226226
CanvasType canvas_;
227227
Matrix initial_matrix_;
228228

229-
static void SimplifyOrDrawPath(CanvasType& canvas,
230-
const SkPath& path,
231-
const Paint& paint);
232-
233229
DlDispatcher(const DlDispatcher&) = delete;
234230

235231
DlDispatcher& operator=(const DlDispatcher&) = delete;

0 commit comments

Comments
 (0)