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

Commit 065cd41

Browse files
committed
rename some methods, consolidate state, add attribute interaction unit tests
1 parent 265f52e commit 065cd41

8 files changed

+258
-52
lines changed

display_list/display_list_color_filter.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class DlColorFilter
6060
// Return a boolean indicating whether the color filtering operation can
6161
// be applied either before or after modulating the pixels with an opacity
6262
// value without changing the operation.
63-
virtual bool can_commute_with_alpha() const { return false; }
63+
virtual bool can_commute_with_opacity() const { return false; }
6464

6565
// Return a DlBlendColorFilter pointer to this object iff it is a Blend
6666
// type of ColorFilter, otherwise return nullptr.
@@ -155,7 +155,7 @@ class DlMatrixColorFilter final : public DlColorFilter {
155155
sk_filter->filterColor(SK_ColorTRANSPARENT) != SK_ColorTRANSPARENT;
156156
}
157157

158-
bool can_commute_with_alpha() const override {
158+
bool can_commute_with_opacity() const override {
159159
return matrix_[3] == 0 && matrix_[8] == 0 && matrix_[13] == 0 &&
160160
matrix_[15] == 0 && matrix_[16] == 0 && matrix_[17] == 0 &&
161161
(matrix_[18] >= 0.0 && matrix_[18] <= 1.0) && matrix_[19] == 0;
@@ -204,6 +204,7 @@ class DlSrgbToLinearGammaColorFilter final : public DlColorFilter {
204204
}
205205
size_t size() const override { return sizeof(*this); }
206206
bool modifies_transparent_black() const override { return false; }
207+
bool can_commute_with_opacity() const override { return true; }
207208

208209
std::shared_ptr<DlColorFilter> shared() const override { return instance; }
209210
sk_sp<SkColorFilter> skia_object() const override { return sk_filter_; }
@@ -236,6 +237,7 @@ class DlLinearToSrgbGammaColorFilter final : public DlColorFilter {
236237
}
237238
size_t size() const override { return sizeof(*this); }
238239
bool modifies_transparent_black() const override { return false; }
240+
bool can_commute_with_opacity() const override { return true; }
239241

240242
std::shared_ptr<DlColorFilter> shared() const override { return instance; }
241243
sk_sp<SkColorFilter> skia_object() const override { return sk_filter_; }

flow/layers/color_filter_layer.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,13 @@ void ColorFilterLayer::Preroll(PrerollContext* context,
5555
// However, some color filters can commute themselves with an opacity
5656
// modulation so in that case we can apply the opacity on behalf of our
5757
// ancestors - otherwise we can apply no attributes.
58-
if (filter_ && filter_->can_commute_with_alpha()) {
59-
context->renderable_state_flags = LayerStateStack::CALLER_CAN_APPLY_OPACITY;
58+
if (filter_) {
59+
context->renderable_state_flags =
60+
filter_->can_commute_with_opacity()
61+
? LayerStateStack::CALLER_CAN_APPLY_OPACITY
62+
: 0;
6063
}
64+
// else - we can apply whatever our children can apply.
6165
}
6266

6367
void ColorFilterLayer::Paint(PaintContext& context) const {

flow/layers/layer_state_stack.cc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,30 @@ namespace flutter {
1111
using AutoRestore = LayerStateStack::AutoRestore;
1212
using MutatorContext = LayerStateStack::MutatorContext;
1313

14-
void LayerStateStack::clear_delegates() {
14+
void LayerStateStack::clear_delegate() {
1515
if (canvas_) {
16-
canvas_->restoreToCount(canvas_restore_count_);
16+
canvas_->restoreToCount(restore_count_);
1717
canvas_ = nullptr;
1818
}
1919
if (builder_) {
20-
builder_->restoreToCount(builder_restore_count_);
20+
builder_->restoreToCount(restore_count_);
2121
builder_ = nullptr;
2222
}
2323
}
2424

25-
void LayerStateStack::set_canvas_delegate(SkCanvas* canvas) {
26-
clear_delegates();
25+
void LayerStateStack::set_delegate(SkCanvas* canvas) {
26+
clear_delegate();
2727
if (canvas) {
28-
canvas_restore_count_ = canvas->getSaveCount();
28+
restore_count_ = canvas->getSaveCount();
2929
canvas_ = canvas;
3030
reapply_all(canvas, nullptr);
3131
}
3232
}
3333

34-
void LayerStateStack::set_builder_delegate(DisplayListBuilder* builder) {
35-
clear_delegates();
34+
void LayerStateStack::set_delegate(DisplayListBuilder* builder) {
35+
clear_delegate();
3636
if (builder) {
37-
builder_restore_count_ = builder->getSaveCount();
37+
restore_count_ = builder->getSaveCount();
3838
builder_ = builder;
3939
reapply_all(nullptr, builder);
4040
}
@@ -358,7 +358,7 @@ void LayerStateStack::maybe_save_layer(
358358
const std::shared_ptr<const DlColorFilter>& filter) {
359359
if (outstanding_.color_filter || outstanding_.image_filter ||
360360
(outstanding_.opacity < SK_Scalar1 &&
361-
!filter->can_commute_with_alpha())) {
361+
!filter->can_commute_with_opacity())) {
362362
// TBD: compose the 2 color filters together.
363363
save_layer(outstanding_.save_layer_bounds);
364364
}

flow/layers/layer_state_stack.h

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,35 @@ class LayerStateStack {
2020
}
2121

2222
// Clears out any old delegate to make room for a new one.
23-
void clear_delegates();
23+
void clear_delegate();
2424

25+
// Return the SkCanvas delegate if the state stack has such a delegate.
26+
// The state stack will only have either an SkCanvas or a Builder
27+
// delegate at any given time.
28+
// See also |builder_delegate|.
2529
SkCanvas* canvas_delegate() { return canvas_; }
30+
31+
// Return the DisplayListBuilder delegate if the state stack has such a
32+
// delegate.
33+
// The state stack will only have either an SkCanvas or a Builder
34+
// delegate at any given time.
35+
// See also |builder_delegate|.
36+
DisplayListBuilder* builder_delegate() { return builder_; }
37+
2638
// Clears the old delegate and sets the canvas delegate to the indicated
2739
// canvas (if not nullptr). This ensures that only one delegate - either
2840
// a canvas or a builder - is present at any one time.
29-
void set_canvas_delegate(SkCanvas* canvas);
41+
void set_delegate(SkCanvas* canvas);
3042

31-
DisplayListBuilder* builder_delegate() { return builder_; }
3243
// Clears the old delegate and sets the builder delegate to the indicated
3344
// buider (if not nullptr). This ensures that only one delegate - either
3445
// a canvas or a builder - is present at any one time.
35-
void set_builder_delegate(DisplayListBuilder* builder);
36-
void set_builder_delegate(sk_sp<DisplayListBuilder> builder) {
37-
set_builder_delegate(builder.get());
46+
void set_delegate(DisplayListBuilder* builder);
47+
void set_delegate(sk_sp<DisplayListBuilder> builder) {
48+
set_delegate(builder.get());
3849
}
39-
void set_builder_delegate(DisplayListCanvasRecorder& recorder) {
40-
set_builder_delegate(recorder.builder().get());
50+
void set_delegate(DisplayListCanvasRecorder& recorder) {
51+
set_delegate(recorder.builder().get());
4152
}
4253

4354
class AutoRestore {
@@ -484,9 +495,8 @@ class LayerStateStack {
484495
friend class MutatorContext;
485496

486497
SkCanvas* canvas_ = nullptr;
487-
int canvas_restore_count_ = 0.0;
498+
int restore_count_ = 0;
488499
DisplayListBuilder* builder_ = nullptr;
489-
int builder_restore_count_ = 0.0;
490500
RenderingAttributes outstanding_;
491501

492502
bool do_checkerboard_ = false;

0 commit comments

Comments
 (0)