Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions display_list/display_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,28 +75,23 @@ namespace flutter {
V(SetColor) \
V(SetBlendMode) \
\
V(SetSkPathEffect) \
V(SetPodPathEffect) \
V(ClearPathEffect) \
\
V(ClearColorFilter) \
V(SetPodColorFilter) \
V(SetSkColorFilter) \
\
V(ClearColorSource) \
V(SetPodColorSource) \
V(SetSkColorSource) \
V(SetImageColorSource) \
V(SetRuntimeEffectColorSource) \
\
V(ClearImageFilter) \
V(SetPodImageFilter) \
V(SetSkImageFilter) \
V(SetSharedImageFilter) \
\
V(ClearMaskFilter) \
V(SetPodMaskFilter) \
V(SetSkMaskFilter) \
\
V(Save) \
V(SaveLayer) \
Expand Down
42 changes: 11 additions & 31 deletions display_list/display_list_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,6 @@ void DisplayListBuilder::onSetColorSource(const DlColorSource* source) {
break;
}
#endif // IMPELLER_ENABLE_3D
case DlColorSourceType::kUnknown:
Push<SetSkColorSourceOp>(0, 0, source->skia_object());
break;
}
}
}
Expand Down Expand Up @@ -259,10 +256,6 @@ void DisplayListBuilder::onSetImageFilter(const DlImageFilter* filter) {
Push<SetSharedImageFilterOp>(0, 0, filter);
break;
}
case DlImageFilterType::kUnknown: {
Push<SetSkImageFilterOp>(0, 0, filter->skia_object());
break;
}
}
}
}
Expand Down Expand Up @@ -297,10 +290,6 @@ void DisplayListBuilder::onSetColorFilter(const DlColorFilter* filter) {
new (pod) DlLinearToSrgbGammaColorFilter();
break;
}
case DlColorFilterType::kUnknown: {
Push<SetSkColorFilterOp>(0, 0, filter->skia_object());
break;
}
}
}
UpdateCurrentOpacityCompatibility();
Expand All @@ -318,10 +307,6 @@ void DisplayListBuilder::onSetPathEffect(const DlPathEffect* effect) {
new (pod) DlDashPathEffect(dash_effect);
break;
}
case DlPathEffectType::kUnknown: {
Push<SetSkPathEffectOp>(0, 0, effect->skia_object());
break;
}
}
}
}
Expand All @@ -339,9 +324,6 @@ void DisplayListBuilder::onSetMaskFilter(const DlMaskFilter* filter) {
new (pod) DlBlurMaskFilter(blur_filter);
break;
}
case DlMaskFilterType::kUnknown:
Push<SetSkMaskFilterOp>(0, 0, filter->skia_object());
break;
}
}
}
Expand Down Expand Up @@ -1183,9 +1165,11 @@ bool DisplayListBuilder::AdjustBoundsForPaint(SkRect& bounds,
}

if (flags.is_geometric()) {
bool is_stroked = flags.is_stroked(current_.getDrawStyle());

// Path effect occurs before stroking...
DisplayListSpecialGeometryFlags special_flags =
flags.WithPathEffect(current_.getPathEffectPtr());
flags.WithPathEffect(current_.getPathEffectPtr(), is_stroked);
if (current_.getPathEffect()) {
auto effect_bounds = current_.getPathEffect()->effect_bounds(bounds);
if (!effect_bounds.has_value()) {
Expand All @@ -1194,7 +1178,7 @@ bool DisplayListBuilder::AdjustBoundsForPaint(SkRect& bounds,
bounds = effect_bounds.value();
}

if (flags.is_stroked(current_.getDrawStyle())) {
if (is_stroked) {
// Determine the max multiplier to the stroke width first.
SkScalar pad = 1.0f;
if (current_.getStrokeJoin() == DlStrokeJoin::kMiter &&
Expand All @@ -1212,18 +1196,14 @@ bool DisplayListBuilder::AdjustBoundsForPaint(SkRect& bounds,
}

if (flags.applies_mask_filter()) {
if (current_.getMaskFilter()) {
const DlBlurMaskFilter* blur_filter = current_.getMaskFilter()->asBlur();
if (blur_filter) {
SkScalar mask_sigma_pad = blur_filter->sigma() * 3.0;
bounds.outset(mask_sigma_pad, mask_sigma_pad);
} else {
SkPaint p;
p.setMaskFilter(current_.getMaskFilter()->skia_object());
if (!p.canComputeFastBounds()) {
return false;
auto filter = current_.getMaskFilter();
if (filter) {
switch (filter->type()) {
case DlMaskFilterType::kBlur: {
FML_DCHECK(filter->asBlur());
SkScalar mask_sigma_pad = filter->asBlur()->sigma() * 3.0;
bounds.outset(mask_sigma_pad, mask_sigma_pad);
}
bounds = p.computeFastBounds(bounds, &bounds);
}
}
}
Expand Down
117 changes: 38 additions & 79 deletions display_list/display_list_canvas_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@
#include "flutter/testing/testing.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/effects/SkDashPathEffect.h"
#include "third_party/skia/include/effects/SkDiscretePathEffect.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "third_party/skia/include/effects/SkImageFilters.h"

namespace flutter {
namespace testing {
Expand Down Expand Up @@ -668,21 +664,22 @@ class TestParameters {
return false;
}

bool is_stroked = flags_.is_stroked(attr.getDrawStyle());
if (flags_.is_stroked(ref_attr.getDrawStyle()) != is_stroked) {
return false;
}
DisplayListSpecialGeometryFlags geo_flags =
flags_.WithPathEffect(attr.getPathEffect().get());
flags_.WithPathEffect(attr.getPathEffect().get(), is_stroked);
if (flags_.applies_path_effect() && //
ref_attr.getPathEffect() != attr.getPathEffect()) {
if (attr.getPathEffect()->asDash() == nullptr) {
return false;
}
if (!ignores_dashes()) {
return false;
switch (attr.getPathEffect()->type()) {
case DlPathEffectType::kDash: {
if (is_stroked && !ignores_dashes()) {
return false;
}
}
}
}
bool is_stroked = flags_.is_stroked(ref_attr.getDrawStyle());
if (flags_.is_stroked(attr.getDrawStyle()) != is_stroked) {
return false;
}
if (!is_stroked) {
return true;
}
Expand Down Expand Up @@ -766,7 +763,7 @@ class TestParameters {
auto path_effect = paint.getPathEffect();

DisplayListSpecialGeometryFlags geo_flags =
flags_.WithPathEffect(path_effect.get());
flags_.WithPathEffect(path_effect.get(), true);
if (paint.getStrokeCap() == DlStrokeCap::kButt &&
!geo_flags.butt_cap_becomes_square()) {
adjust = std::max(adjust, half_width);
Expand Down Expand Up @@ -1117,10 +1114,18 @@ class CanvasCompareTester {
.with_restore(sk_safe_restore, dl_safe_restore, true));
}
}

{
sk_sp<SkImageFilter> sk_filter = SkImageFilters::Arithmetic(
0.1, 0.1, 0.1, 0.25, true, nullptr, nullptr);
DlUnknownImageFilter filter(sk_filter);
// clang-format off
constexpr float color_matrix[20] = {
0.5, 0, 0, 0, 0.5,
0, 0.5, 0, 0, 0.5,
0, 0, 0.5, 0, 0.5,
0, 0, 0, 1, 0,
};
// clang-format on
DlMatrixColorFilter color_filter(color_matrix);
DlColorFilterImageFilter filter(color_filter);
{
RenderWith(testP, env, tolerance,
CaseParameters(
Expand Down Expand Up @@ -1463,67 +1468,6 @@ class CanvasCompareTester {
}
}

{
sk_sp<SkPathEffect> effect = SkDiscretePathEffect::Make(3, 5);
{
// Discrete path effects need a stroke width for drawPointsAsPoints
// to do something realistic
// And a Discrete(3, 5) effect produces miters that are near
// maximal for a miter limit of 3.0.
BoundsTolerance discrete_tolerance =
tolerance
// register the discrete offset so adjusters can compensate
.addDiscreteOffset(5)
// the miters in the 3-5 discrete effect don't always fill
// their conservative bounds, so tolerate a couple of pixels
.addBoundsPadding(2, 2);
RenderWith(testP, env, discrete_tolerance,
CaseParameters(
"PathEffect == Discrete-3-5",
[=](SkCanvas*, SkPaint& p) {
p.setStrokeWidth(5.0);
p.setStrokeMiter(3.0);
p.setPathEffect(effect);
},
[=](DlCanvas*, DlPaint& p) {
p.setStrokeWidth(5.0);
p.setStrokeMiter(3.0);
p.setPathEffect(DlPathEffect::From(effect));
}));
}
EXPECT_TRUE(testP.is_draw_text_blob() || effect->unique())
<< "PathEffect == Discrete-3-5 Cleanup";
effect = SkDiscretePathEffect::Make(2, 3);
{
// Discrete path effects need a stroke width for drawPointsAsPoints
// to do something realistic
// And a Discrete(2, 3) effect produces miters that are near
// maximal for a miter limit of 2.5.
BoundsTolerance discrete_tolerance =
tolerance
// register the discrete offset so adjusters can compensate
.addDiscreteOffset(3)
// the miters in the 3-5 discrete effect don't always fill
// their conservative bounds, so tolerate a couple of pixels
.addBoundsPadding(2, 2);
RenderWith(testP, env, discrete_tolerance,
CaseParameters(
"PathEffect == Discrete-2-3",
[=](SkCanvas*, SkPaint& p) {
p.setStrokeWidth(5.0);
p.setStrokeMiter(2.5);
p.setPathEffect(effect);
},
[=](DlCanvas*, DlPaint& p) {
p.setStrokeWidth(5.0);
p.setStrokeMiter(2.5);
p.setPathEffect(DlPathEffect::From(effect));
}));
}
EXPECT_TRUE(testP.is_draw_text_blob() || effect->unique())
<< "PathEffect == Discrete-2-3 Cleanup";
}

{
const DlBlurMaskFilter filter(kNormal_SkBlurStyle, 5.0);
BoundsTolerance blur_5_tolerance = tolerance.addBoundsPadding(4, 4);
Expand Down Expand Up @@ -1754,6 +1698,21 @@ class CanvasCompareTester {
const SkScalar test_dashes_1[] = {29.0, 2.0};
const SkScalar test_dashes_2[] = {17.0, 1.5};
auto effect = DlDashPathEffect::Make(test_dashes_1, 2, 0.0f);
{
RenderWith(testP, stroke_base_env, tolerance,
CaseParameters(
"PathEffect without forced stroking == Dash-29-2",
[=](SkCanvas*, SkPaint& p) {
// Provide some non-trivial stroke size to get dashed
p.setStrokeWidth(5.0);
p.setPathEffect(effect->skia_object());
},
[=](DlCanvas*, DlPaint& p) {
// Provide some non-trivial stroke size to get dashed
p.setStrokeWidth(5.0);
p.setPathEffect(effect);
}));
}
{
RenderWith(testP, stroke_base_env, tolerance,
CaseParameters(
Expand Down
28 changes: 0 additions & 28 deletions display_list/display_list_color_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,6 @@

namespace flutter {

std::shared_ptr<DlColorFilter> DlColorFilter::From(SkColorFilter* sk_filter) {
if (sk_filter == nullptr) {
return nullptr;
}
if (sk_filter == DlSrgbToLinearGammaColorFilter::sk_filter_.get()) {
// Skia implements these filters as a singleton.
return DlSrgbToLinearGammaColorFilter::instance;
}
if (sk_filter == DlLinearToSrgbGammaColorFilter::sk_filter_.get()) {
// Skia implements these filters as a singleton.
return DlLinearToSrgbGammaColorFilter::instance;
}
{
SkColor color;
SkBlendMode mode;
if (sk_filter->asAColorMode(&color, &mode)) {
return std::make_shared<DlBlendColorFilter>(color, ToDl(mode));
}
}
{
float matrix[20];
if (sk_filter->asAColorMatrix(matrix)) {
return std::make_shared<DlMatrixColorFilter>(matrix);
}
}
return std::make_shared<DlUnknownColorFilter>(sk_ref_sp(sk_filter));
}

const std::shared_ptr<DlSrgbToLinearGammaColorFilter>
DlSrgbToLinearGammaColorFilter::instance =
std::make_shared<DlSrgbToLinearGammaColorFilter>();
Expand Down
Loading