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

Commit 16dba68

Browse files
authored
[Impeller] Only apply the rrect blur fast path for solid Colors (#37594)
1 parent 965f87d commit 16dba68

File tree

3 files changed

+62
-17
lines changed

3 files changed

+62
-17
lines changed

impeller/aiks/canvas.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,17 @@ void Canvas::DrawPaint(const Paint& paint) {
160160
bool Canvas::AttemptDrawBlurredRRect(const Rect& rect,
161161
Scalar corner_radius,
162162
const Paint& paint) {
163-
// TODO(114184): This should return false when the paint's ColorSource is not
164-
// color.
165-
if (!paint.mask_blur_descriptor.has_value() ||
166-
paint.mask_blur_descriptor->style != FilterContents::BlurStyle::kNormal ||
163+
if (paint.color_source == nullptr ||
164+
paint.color_source_type != Paint::ColorSourceType::kColor ||
167165
paint.style != Paint::Style::kFill) {
168166
return false;
169167
}
170168

169+
if (!paint.mask_blur_descriptor.has_value() ||
170+
paint.mask_blur_descriptor->style != FilterContents::BlurStyle::kNormal) {
171+
return false;
172+
}
173+
171174
Paint new_paint = paint;
172175

173176
// For symmetrically mask blurred solid RRects, absorb the mask blur and use

impeller/aiks/paint.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ struct Paint {
3636
kStroke,
3737
};
3838

39+
enum class ColorSourceType {
40+
kColor,
41+
kImage,
42+
kLinearGradient,
43+
kRadialGradient,
44+
kConicalGradient,
45+
kSweepGradient,
46+
kRuntimeEffect,
47+
};
48+
3949
struct MaskBlurDescriptor {
4050
FilterContents::BlurStyle style;
4151
Sigma sigma;
@@ -48,6 +58,7 @@ struct Paint {
4858

4959
Color color = Color::Black();
5060
std::optional<ColorSourceProc> color_source;
61+
ColorSourceType color_source_type = ColorSourceType::kColor;
5162

5263
Scalar stroke_width = 0.0;
5364
Cap stroke_cap = Cap::kButt;

impeller/display_list/display_list_dispatcher.cc

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -320,23 +320,58 @@ static void ConvertStops(T* gradient,
320320
}
321321
}
322322

323+
static std::optional<Paint::ColorSourceType> ToColorSourceType(
324+
flutter::DlColorSourceType type) {
325+
switch (type) {
326+
case flutter::DlColorSourceType::kColor:
327+
return Paint::ColorSourceType::kColor;
328+
case flutter::DlColorSourceType::kImage:
329+
return Paint::ColorSourceType::kImage;
330+
case flutter::DlColorSourceType::kLinearGradient:
331+
return Paint::ColorSourceType::kLinearGradient;
332+
case flutter::DlColorSourceType::kRadialGradient:
333+
return Paint::ColorSourceType::kRadialGradient;
334+
case flutter::DlColorSourceType::kConicalGradient:
335+
return Paint::ColorSourceType::kConicalGradient;
336+
case flutter::DlColorSourceType::kSweepGradient:
337+
return Paint::ColorSourceType::kSweepGradient;
338+
case flutter::DlColorSourceType::kRuntimeEffect:
339+
return Paint::ColorSourceType::kRuntimeEffect;
340+
case flutter::DlColorSourceType::kUnknown:
341+
return std::nullopt;
342+
}
343+
}
344+
323345
// |flutter::Dispatcher|
324346
void DisplayListDispatcher::setColorSource(
325347
const flutter::DlColorSource* source) {
326348
if (!source) {
327349
paint_.color_source = std::nullopt;
350+
paint_.color_source_type = Paint::ColorSourceType::kColor;
328351
return;
329352
}
330353

331-
switch (source->type()) {
332-
case flutter::DlColorSourceType::kColor: {
354+
std::optional<Paint::ColorSourceType> type =
355+
ToColorSourceType(source->type());
356+
357+
if (!type.has_value()) {
358+
FML_LOG(ERROR) << "Requested ColorSourceType::kUnknown";
359+
paint_.color_source = std::nullopt;
360+
paint_.color_source_type = Paint::ColorSourceType::kColor;
361+
return;
362+
}
363+
364+
paint_.color_source_type = type.value();
365+
366+
switch (type.value()) {
367+
case Paint::ColorSourceType::kColor: {
333368
const flutter::DlColorColorSource* color = source->asColor();
334369
paint_.color_source = std::nullopt;
335370
setColor(color->color());
336371
FML_DCHECK(color);
337372
return;
338373
}
339-
case flutter::DlColorSourceType::kLinearGradient: {
374+
case Paint::ColorSourceType::kLinearGradient: {
340375
const flutter::DlLinearGradientColorSource* linear =
341376
source->asLinearGradient();
342377
FML_DCHECK(linear);
@@ -360,7 +395,7 @@ void DisplayListDispatcher::setColorSource(
360395
};
361396
return;
362397
}
363-
case flutter::DlColorSourceType::kRadialGradient: {
398+
case Paint::ColorSourceType::kRadialGradient: {
364399
const flutter::DlRadialGradientColorSource* radialGradient =
365400
source->asRadialGradient();
366401
FML_DCHECK(radialGradient);
@@ -384,7 +419,7 @@ void DisplayListDispatcher::setColorSource(
384419
};
385420
return;
386421
}
387-
case flutter::DlColorSourceType::kSweepGradient: {
422+
case Paint::ColorSourceType::kSweepGradient: {
388423
const flutter::DlSweepGradientColorSource* sweepGradient =
389424
source->asSweepGradient();
390425
FML_DCHECK(sweepGradient);
@@ -411,7 +446,7 @@ void DisplayListDispatcher::setColorSource(
411446
};
412447
return;
413448
}
414-
case flutter::DlColorSourceType::kImage: {
449+
case Paint::ColorSourceType::kImage: {
415450
const flutter::DlImageColorSource* image_color_source = source->asImage();
416451
FML_DCHECK(image_color_source &&
417452
image_color_source->image()->impeller_texture());
@@ -431,7 +466,7 @@ void DisplayListDispatcher::setColorSource(
431466
};
432467
return;
433468
}
434-
case flutter::DlColorSourceType::kRuntimeEffect: {
469+
case Paint::ColorSourceType::kRuntimeEffect: {
435470
const flutter::DlRuntimeEffectColorSource* runtime_effect_color_source =
436471
source->asRuntimeEffect();
437472
auto runtime_stage =
@@ -466,14 +501,10 @@ void DisplayListDispatcher::setColorSource(
466501
};
467502
return;
468503
}
469-
case flutter::DlColorSourceType::kConicalGradient:
470-
case flutter::DlColorSourceType::kUnknown:
504+
case Paint::ColorSourceType::kConicalGradient:
471505
UNIMPLEMENTED;
472506
break;
473507
}
474-
475-
// Needs https://github.com/flutter/flutter/issues/95434
476-
UNIMPLEMENTED;
477508
}
478509

479510
static std::optional<Paint::ColorFilterProc> ToColorFilterProc(
@@ -509,7 +540,7 @@ static std::optional<Paint::ColorFilterProc> ToColorFilterProc(
509540
return ColorFilterContents::MakeLinearToSrgbFilter({std::move(input)});
510541
};
511542
case flutter::DlColorFilterType::kUnknown:
512-
FML_LOG(ERROR) << "requested DlColorFilterType::kUnknown";
543+
FML_LOG(ERROR) << "Requested DlColorFilterType::kUnknown";
513544
UNIMPLEMENTED;
514545
}
515546
return std::nullopt;

0 commit comments

Comments
 (0)