Revert "[Impeller] DlCanvas implementation wrapping Aiks canvas" (#44466)
This reverts commit 6e904465383bae53740a5188d035b66c1ac55bde.
See https://github.com/flutter/flutter/issues/132071
diff --git a/ci/licenses_golden/excluded_files b/ci/licenses_golden/excluded_files
index a4ce479..4b8573d 100644
--- a/ci/licenses_golden/excluded_files
+++ b/ci/licenses_golden/excluded_files
@@ -32,7 +32,6 @@
../../../flutter/display_list/benchmarking/dl_complexity_unittests.cc
../../../flutter/display_list/display_list_unittests.cc
../../../flutter/display_list/dl_color_unittests.cc
-../../../flutter/display_list/dl_op_spy_unittests.cc
../../../flutter/display_list/dl_paint_unittests.cc
../../../flutter/display_list/dl_vertices_unittests.cc
../../../flutter/display_list/effects/dl_color_filter_unittests.cc
@@ -218,6 +217,7 @@
../../../flutter/runtime/type_conversions_unittests.cc
../../../flutter/shell/common/animator_unittests.cc
../../../flutter/shell/common/context_options_unittests.cc
+../../../flutter/shell/common/dl_op_spy_unittests.cc
../../../flutter/shell/common/engine_unittests.cc
../../../flutter/shell/common/fixtures
../../../flutter/shell/common/input_events_unittests.cc
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 7cf45a5..9931e3a 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -731,8 +731,6 @@
ORIGIN: ../../../flutter/display_list/dl_op_receiver.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_op_records.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_op_records.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/display_list/dl_op_spy.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/display_list/dl_op_spy.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_paint.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_paint.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_sampling_options.h + ../../../flutter/LICENSE
@@ -789,8 +787,6 @@
ORIGIN: ../../../flutter/flow/instrumentation.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/flow/layer_snapshot_store.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/flow/layer_snapshot_store.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/flow/layers/aiks_layer.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/flow/layers/aiks_layer.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/flow/layers/backdrop_filter_layer.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/flow/layers/backdrop_filter_layer.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/flow/layers/cacheable_layer.cc + ../../../flutter/LICENSE
@@ -1157,8 +1153,6 @@
ORIGIN: ../../../flutter/impeller/core/texture_descriptor.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/core/vertex_buffer.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/core/vertex_buffer.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/impeller/display_list/dl_aiks_canvas.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/impeller/display_list/dl_aiks_canvas.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/display_list/dl_dispatcher.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/display_list/dl_dispatcher.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/display_list/dl_image_impeller.cc + ../../../flutter/LICENSE
@@ -2220,6 +2214,8 @@
ORIGIN: ../../../flutter/shell/common/display.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/common/display_manager.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/common/display_manager.h + ../../../flutter/LICENSE
+ORIGIN: ../../../flutter/shell/common/dl_op_spy.cc + ../../../flutter/LICENSE
+ORIGIN: ../../../flutter/shell/common/dl_op_spy.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/common/engine.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/common/engine.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/common/pipeline.cc + ../../../flutter/LICENSE
@@ -3451,8 +3447,6 @@
FILE: ../../../flutter/display_list/dl_op_receiver.h
FILE: ../../../flutter/display_list/dl_op_records.cc
FILE: ../../../flutter/display_list/dl_op_records.h
-FILE: ../../../flutter/display_list/dl_op_spy.cc
-FILE: ../../../flutter/display_list/dl_op_spy.h
FILE: ../../../flutter/display_list/dl_paint.cc
FILE: ../../../flutter/display_list/dl_paint.h
FILE: ../../../flutter/display_list/dl_sampling_options.h
@@ -3509,8 +3503,6 @@
FILE: ../../../flutter/flow/instrumentation.h
FILE: ../../../flutter/flow/layer_snapshot_store.cc
FILE: ../../../flutter/flow/layer_snapshot_store.h
-FILE: ../../../flutter/flow/layers/aiks_layer.cc
-FILE: ../../../flutter/flow/layers/aiks_layer.h
FILE: ../../../flutter/flow/layers/backdrop_filter_layer.cc
FILE: ../../../flutter/flow/layers/backdrop_filter_layer.h
FILE: ../../../flutter/flow/layers/cacheable_layer.cc
@@ -3877,8 +3869,6 @@
FILE: ../../../flutter/impeller/core/texture_descriptor.h
FILE: ../../../flutter/impeller/core/vertex_buffer.cc
FILE: ../../../flutter/impeller/core/vertex_buffer.h
-FILE: ../../../flutter/impeller/display_list/dl_aiks_canvas.cc
-FILE: ../../../flutter/impeller/display_list/dl_aiks_canvas.h
FILE: ../../../flutter/impeller/display_list/dl_dispatcher.cc
FILE: ../../../flutter/impeller/display_list/dl_dispatcher.h
FILE: ../../../flutter/impeller/display_list/dl_image_impeller.cc
@@ -4945,6 +4935,8 @@
FILE: ../../../flutter/shell/common/display.h
FILE: ../../../flutter/shell/common/display_manager.cc
FILE: ../../../flutter/shell/common/display_manager.h
+FILE: ../../../flutter/shell/common/dl_op_spy.cc
+FILE: ../../../flutter/shell/common/dl_op_spy.h
FILE: ../../../flutter/shell/common/engine.cc
FILE: ../../../flutter/shell/common/engine.h
FILE: ../../../flutter/shell/common/pipeline.cc
diff --git a/display_list/BUILD.gn b/display_list/BUILD.gn
index 07067e3..97c9683 100644
--- a/display_list/BUILD.gn
+++ b/display_list/BUILD.gn
@@ -39,8 +39,6 @@
"dl_op_receiver.h",
"dl_op_records.cc",
"dl_op_records.h",
- "dl_op_spy.cc",
- "dl_op_spy.h",
"dl_paint.cc",
"dl_paint.h",
"dl_sampling_options.h",
@@ -109,7 +107,6 @@
"benchmarking/dl_complexity_unittests.cc",
"display_list_unittests.cc",
"dl_color_unittests.cc",
- "dl_op_spy_unittests.cc",
"dl_paint_unittests.cc",
"dl_vertices_unittests.cc",
"effects/dl_color_filter_unittests.cc",
diff --git a/display_list/display_list.cc b/display_list/display_list.cc
index 73f593d..e06bcf2 100644
--- a/display_list/display_list.cc
+++ b/display_list/display_list.cc
@@ -34,7 +34,7 @@
bool can_apply_group_opacity,
bool is_ui_thread_safe,
bool modifies_transparent_black,
- std::shared_ptr<const DlRTree> rtree)
+ sk_sp<const DlRTree> rtree)
: storage_(std::move(storage)),
byte_count_(byte_count),
op_count_(op_count),
diff --git a/display_list/display_list.h b/display_list/display_list.h
index 5b6c2e3..668a247 100644
--- a/display_list/display_list.h
+++ b/display_list/display_list.h
@@ -254,7 +254,7 @@
const SkRect& bounds() const { return bounds_; }
bool has_rtree() const { return rtree_ != nullptr; }
- std::shared_ptr<const DlRTree> rtree() const { return rtree_; }
+ sk_sp<const DlRTree> rtree() const { return rtree_; }
bool Equals(const DisplayList* other) const;
bool Equals(const DisplayList& other) const { return Equals(&other); }
@@ -288,7 +288,7 @@
bool can_apply_group_opacity,
bool is_ui_thread_safe,
bool modifies_transparent_black,
- std::shared_ptr<const DlRTree> rtree);
+ sk_sp<const DlRTree> rtree);
static uint32_t next_unique_id();
@@ -308,7 +308,7 @@
const bool is_ui_thread_safe_;
const bool modifies_transparent_black_;
- const std::shared_ptr<const DlRTree> rtree_;
+ const sk_sp<const DlRTree> rtree_;
void Dispatch(DlOpReceiver& ctx,
uint8_t* ptr,
diff --git a/display_list/display_list_unittests.cc b/display_list/display_list_unittests.cc
index db84b0b..bef888b 100644
--- a/display_list/display_list_unittests.cc
+++ b/display_list/display_list_unittests.cc
@@ -2130,7 +2130,7 @@
}
}
-static void test_rtree(const std::shared_ptr<const DlRTree>& rtree,
+static void test_rtree(const sk_sp<const DlRTree>& rtree,
const SkRect& query,
std::vector<SkRect> expected_rects,
const std::vector<int>& expected_indices) {
diff --git a/display_list/dl_builder.cc b/display_list/dl_builder.cc
index abddd1c..b78145c 100644
--- a/display_list/dl_builder.cc
+++ b/display_list/dl_builder.cc
@@ -1208,13 +1208,6 @@
}
}
-void DisplayListBuilder::DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity) {
- FML_LOG(ERROR) << "Cannot draw Impeller Picture in to a a display list.";
- FML_DCHECK(false);
-}
-
void DisplayListBuilder::DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity) {
if (!SkScalarIsFinite(opacity) || opacity <= SK_ScalarNearlyZero ||
diff --git a/display_list/dl_builder.h b/display_list/dl_builder.h
index 90a1159..ab0bce0 100644
--- a/display_list/dl_builder.h
+++ b/display_list/dl_builder.h
@@ -216,12 +216,6 @@
DlImageSampling sampling,
const SkRect* cullRect,
const DlPaint* paint = nullptr) override;
-
- // |DlCanvas|
- void DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity = SK_Scalar1) override;
-
// |DlCanvas|
void DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity = SK_Scalar1) override;
@@ -707,7 +701,7 @@
return accumulator_->bounds();
}
- std::shared_ptr<DlRTree> rtree() {
+ sk_sp<DlRTree> rtree() {
FML_DCHECK(layer_stack_.size() == 1);
if (is_unbounded()) {
FML_LOG(INFO) << "returning partial rtree for unbounded DisplayList";
diff --git a/display_list/dl_canvas.h b/display_list/dl_canvas.h
index af2c5a7..8fad40d 100644
--- a/display_list/dl_canvas.h
+++ b/display_list/dl_canvas.h
@@ -18,10 +18,6 @@
#include "third_party/skia/include/core/SkRect.h"
#include "third_party/skia/include/core/SkTextBlob.h"
-namespace impeller {
-struct Picture;
-} // namespace impeller
-
namespace flutter {
// The primary class used to express rendering operations in the
@@ -63,12 +59,7 @@
const DlImageFilter* backdrop = nullptr) = 0;
virtual void Restore() = 0;
virtual int GetSaveCount() const = 0;
- virtual void RestoreToCount(int restore_count) {
- FML_DCHECK(restore_count <= GetSaveCount());
- while (restore_count < GetSaveCount() && GetSaveCount() > 1) {
- Restore();
- }
- }
+ virtual void RestoreToCount(int restore_count) = 0;
virtual void Translate(SkScalar tx, SkScalar ty) = 0;
virtual void Scale(SkScalar sx, SkScalar sy) = 0;
@@ -208,9 +199,6 @@
const DlPaint* paint = nullptr) = 0;
virtual void DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity = SK_Scalar1) = 0;
- virtual void DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity = SK_Scalar1) = 0;
virtual void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
SkScalar x,
SkScalar y,
diff --git a/display_list/geometry/dl_rtree.h b/display_list/geometry/dl_rtree.h
index 31f22ee..f12486e 100644
--- a/display_list/geometry/dl_rtree.h
+++ b/display_list/geometry/dl_rtree.h
@@ -25,7 +25,7 @@
/// - Query for a set of non-overlapping rectangles that are joined
/// from the original rectangles that intersect a query rect
/// @see |searchAndConsolidateRects|
-class DlRTree {
+class DlRTree : public SkRefCnt {
private:
static constexpr int kMaxChildren = 11;
diff --git a/display_list/skia/dl_sk_canvas.cc b/display_list/skia/dl_sk_canvas.cc
index a7a3c9f..842f459 100644
--- a/display_list/skia/dl_sk_canvas.cc
+++ b/display_list/skia/dl_sk_canvas.cc
@@ -335,13 +335,6 @@
ToSk(sampling), cullRect, sk_paint());
}
-void DlSkCanvasAdapter::DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity) {
- FML_LOG(ERROR) << "Cannot draw Impeller Picture in to a Skia canvas.";
- FML_DCHECK(false);
-}
-
void DlSkCanvasAdapter::DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity) {
const int restore_count = delegate_->getSaveCount();
diff --git a/display_list/skia/dl_sk_canvas.h b/display_list/skia/dl_sk_canvas.h
index f253d0a..af774b7 100644
--- a/display_list/skia/dl_sk_canvas.h
+++ b/display_list/skia/dl_sk_canvas.h
@@ -136,9 +136,6 @@
DlImageSampling sampling,
const SkRect* cullRect,
const DlPaint* paint = nullptr) override;
- void DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity = SK_Scalar1) override;
void DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity = SK_Scalar1) override;
void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
diff --git a/display_list/utils/dl_bounds_accumulator.cc b/display_list/utils/dl_bounds_accumulator.cc
index e609dc4..34750ed 100644
--- a/display_list/utils/dl_bounds_accumulator.cc
+++ b/display_list/utils/dl_bounds_accumulator.cc
@@ -125,11 +125,10 @@
return accumulator.bounds();
}
-std::shared_ptr<DlRTree> RTreeBoundsAccumulator::rtree() const {
+sk_sp<DlRTree> RTreeBoundsAccumulator::rtree() const {
FML_DCHECK(saved_offsets_.empty());
- return std::make_shared<DlRTree>(rects_.data(), rects_.size(),
- rect_indices_.data(),
- [](int id) { return id >= 0; });
+ return sk_make_sp<DlRTree>(rects_.data(), rects_.size(), rect_indices_.data(),
+ [](int id) { return id >= 0; });
}
} // namespace flutter
diff --git a/display_list/utils/dl_bounds_accumulator.h b/display_list/utils/dl_bounds_accumulator.h
index 5e2067f..db4ceda 100644
--- a/display_list/utils/dl_bounds_accumulator.h
+++ b/display_list/utils/dl_bounds_accumulator.h
@@ -84,7 +84,7 @@
virtual SkRect bounds() const = 0;
- virtual std::shared_ptr<DlRTree> rtree() const = 0;
+ virtual sk_sp<DlRTree> rtree() const = 0;
virtual BoundsAccumulatorType type() const = 0;
};
@@ -112,7 +112,7 @@
return BoundsAccumulatorType::kRect;
}
- std::shared_ptr<DlRTree> rtree() const override { return nullptr; }
+ sk_sp<DlRTree> rtree() const override { return nullptr; }
private:
class AccumulationRect {
@@ -151,7 +151,7 @@
SkRect bounds() const override;
- std::shared_ptr<DlRTree> rtree() const override;
+ sk_sp<DlRTree> rtree() const override;
BoundsAccumulatorType type() const override {
return BoundsAccumulatorType::kRTree;
diff --git a/flow/BUILD.gn b/flow/BUILD.gn
index e5a215e..a394ea0 100644
--- a/flow/BUILD.gn
+++ b/flow/BUILD.gn
@@ -22,8 +22,6 @@
"instrumentation.h",
"layer_snapshot_store.cc",
"layer_snapshot_store.h",
- "layers/aiks_layer.cc",
- "layers/aiks_layer.h",
"layers/backdrop_filter_layer.cc",
"layers/backdrop_filter_layer.h",
"layers/cacheable_layer.cc",
diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc
index 90ba06b..086882b 100644
--- a/flow/embedded_views.cc
+++ b/flow/embedded_views.cc
@@ -3,45 +3,9 @@
// found in the LICENSE file.
#include "flutter/flow/embedded_views.h"
-#include "flutter/display_list/dl_op_spy.h"
namespace flutter {
-#if IMPELLER_SUPPORTS_RENDERING
-ImpellerEmbedderViewSlice::ImpellerEmbedderViewSlice(SkRect view_bounds) {
- canvas_ = std::make_unique<impeller::DlAiksCanvas>(
- /*bounds=*/view_bounds);
-}
-
-DlCanvas* ImpellerEmbedderViewSlice::canvas() {
- return canvas_ ? canvas_.get() : nullptr;
-}
-
-void ImpellerEmbedderViewSlice::end_recording() {
- picture_ =
- std::make_shared<impeller::Picture>(canvas_->EndRecordingAsPicture());
- canvas_.reset();
-}
-
-std::list<SkRect> ImpellerEmbedderViewSlice::searchNonOverlappingDrawnRects(
- const SkRect& query) const {
- FML_DCHECK(picture_);
- return picture_->rtree->searchAndConsolidateRects(query);
-}
-
-void ImpellerEmbedderViewSlice::render_into(DlCanvas* canvas) {
- canvas->DrawImpellerPicture(picture_);
-}
-
-bool ImpellerEmbedderViewSlice::recording_ended() {
- return canvas_ == nullptr;
-}
-
-bool ImpellerEmbedderViewSlice::renders_anything() {
- return !picture_->rtree->bounds().isEmpty();
-}
-#endif // IMPELLER_SUPPORTS_RENDERING
-
DisplayListEmbedderViewSlice::DisplayListEmbedderViewSlice(SkRect view_bounds) {
builder_ = std::make_unique<DisplayListBuilder>(
/*bounds=*/view_bounds,
@@ -66,6 +30,10 @@
canvas->DrawDisplayList(display_list_);
}
+void DisplayListEmbedderViewSlice::dispatch(DlOpReceiver& receiver) {
+ display_list_->Dispatch(receiver);
+}
+
bool DisplayListEmbedderViewSlice::is_empty() {
return display_list_->bounds().isEmpty();
}
@@ -74,12 +42,6 @@
return builder_ == nullptr;
}
-bool DisplayListEmbedderViewSlice::renders_anything() {
- DlOpSpy dl_op_spy;
- display_list_->Dispatch(dl_op_spy);
- return dl_op_spy.did_draw() && !is_empty();
-}
-
void ExternalViewEmbedder::SubmitFrame(
GrDirectContext* context,
const std::shared_ptr<impeller::AiksContext>& aiks_context,
diff --git a/flow/embedded_views.h b/flow/embedded_views.h
index ccaac58..6985c37 100644
--- a/flow/embedded_views.h
+++ b/flow/embedded_views.h
@@ -340,33 +340,11 @@
virtual std::list<SkRect> searchNonOverlappingDrawnRects(
const SkRect& query) const = 0;
virtual void render_into(DlCanvas* canvas) = 0;
- virtual bool recording_ended() = 0;
- virtual bool renders_anything() = 0;
};
-#if IMPELLER_SUPPORTS_RENDERING
-class ImpellerEmbedderViewSlice : public EmbedderViewSlice {
- public:
- explicit ImpellerEmbedderViewSlice(SkRect view_bounds);
- ~ImpellerEmbedderViewSlice() override = default;
-
- DlCanvas* canvas() override;
- void end_recording() override;
- std::list<SkRect> searchNonOverlappingDrawnRects(
- const SkRect& query) const override;
- void render_into(DlCanvas* canvas) override;
- bool recording_ended() override;
- bool renders_anything() override;
-
- private:
- std::unique_ptr<impeller::DlAiksCanvas> canvas_;
- std::shared_ptr<const impeller::Picture> picture_;
-};
-#endif
-
class DisplayListEmbedderViewSlice : public EmbedderViewSlice {
public:
- explicit DisplayListEmbedderViewSlice(SkRect view_bounds);
+ DisplayListEmbedderViewSlice(SkRect view_bounds);
~DisplayListEmbedderViewSlice() override = default;
DlCanvas* canvas() override;
@@ -374,9 +352,9 @@
std::list<SkRect> searchNonOverlappingDrawnRects(
const SkRect& query) const override;
void render_into(DlCanvas* canvas) override;
+ void dispatch(DlOpReceiver& receiver);
bool is_empty();
- bool recording_ended() override;
- bool renders_anything() override;
+ bool recording_ended();
private:
std::unique_ptr<DisplayListBuilder> builder_;
diff --git a/flow/layers/aiks_layer.cc b/flow/layers/aiks_layer.cc
deleted file mode 100644
index 652c735..0000000
--- a/flow/layers/aiks_layer.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "flutter/flow/layers/aiks_layer.h"
-
-#include <utility>
-
-namespace flutter {
-
-AiksLayer::AiksLayer(const SkPoint& offset,
- const std::shared_ptr<const impeller::Picture>& picture)
- : offset_(offset), picture_(picture) {
-#if IMPELLER_SUPPORTS_RENDERING
- if (picture_) {
- auto bounds = picture_->pass->GetElementsCoverage(std::nullopt)
- .value_or(impeller::Rect());
- bounds_ = SkRect::MakeXYWH(bounds.origin.x + offset_.x(),
- bounds.origin.y + offset.y(), bounds.size.width,
- bounds.size.height);
- }
-#endif
-}
-
-void AiksLayer::Diff(DiffContext* context, const Layer* old_layer) {
- DiffContext::AutoSubtreeRestore subtree(context);
- context->PushTransform(SkMatrix::Translate(offset_.x(), offset_.y()));
- context->AddLayerBounds(bounds_);
- context->SetLayerPaintRegion(this, context->CurrentSubtreeRegion());
-}
-
-void AiksLayer::Preroll(PrerollContext* frame) {
- // There is no opacity peepholing to do here because Impeller handles that
- // in the Entities, and this layer will never participate in raster caching.
- FML_DCHECK(!frame->raster_cache);
- set_paint_bounds(bounds_);
-}
-
-void AiksLayer::Paint(PaintContext& context) const {
- FML_DCHECK(needs_painting(context));
-
- auto mutator = context.state_stack.save();
- mutator.translate(offset_.x(), offset_.y());
-
- FML_DCHECK(!context.raster_cache);
-
- SkScalar opacity = context.state_stack.outstanding_opacity();
-
- if (context.enable_leaf_layer_tracing) {
- // TODO(dnfield): Decide if we need to capture this for Impeller.
- // We can't do this the same way as on the Skia backend, because Impeller
- // does not expose primitives for flushing things down to the GPU without
- // also allocating a texture.
- // https://github.com/flutter/flutter/issues/131941
- FML_LOG(ERROR) << "Leaf layer tracing unsupported for Impeller.";
- }
-
- context.canvas->DrawImpellerPicture(picture_, opacity);
-}
-
-} // namespace flutter
diff --git a/flow/layers/aiks_layer.h b/flow/layers/aiks_layer.h
deleted file mode 100644
index 17c467e..0000000
--- a/flow/layers/aiks_layer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <memory>
-
-#include "flutter/flow/layers/layer.h"
-
-#if IMPELLER_SUPPORTS_RENDERING
-#include "impeller/aiks/picture.h" // nogncheck
-#else // IMPELLER_SUPPORTS_RENDERING
-namespace impeller {
-struct Picture;
-} // namespace impeller
-#endif // !IMPELLER_SUPPORTS_RENDERING
-
-namespace flutter {
-
-class AiksLayer : public Layer {
- public:
- AiksLayer(const SkPoint& offset,
- const std::shared_ptr<const impeller::Picture>& picture);
-
- void Diff(DiffContext* context, const Layer* old_layer) override;
-
- void Preroll(PrerollContext* frame) override;
-
- void Paint(PaintContext& context) const override;
-
- private:
- SkPoint offset_;
- SkRect bounds_;
- std::shared_ptr<const impeller::Picture> picture_;
-
- FML_DISALLOW_COPY_AND_ASSIGN(AiksLayer);
-};
-
-} // namespace flutter
diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc
index 68ca2bd..e8aea74 100644
--- a/flow/layers/layer_tree.cc
+++ b/flow/layers/layer_tree.cc
@@ -155,69 +155,6 @@
}
}
-std::shared_ptr<const impeller::Picture> LayerTree::FlattenToImpellerPicture(
- const SkRect& bounds,
- const std::shared_ptr<TextureRegistry>& texture_registry) {
-#if IMPELLER_SUPPORTS_RENDERING
- TRACE_EVENT0("flutter", "LayerTree::FlattenToImpellerPicture");
-
- impeller::DlAiksCanvas canvas(bounds);
-
- const FixedRefreshRateStopwatch unused_stopwatch;
-
- LayerStateStack preroll_state_stack;
- // No root surface transformation. So assume identity.
- preroll_state_stack.set_preroll_delegate(bounds);
- PrerollContext preroll_context{
- // clang-format off
- .raster_cache = nullptr,
- .gr_context = nullptr,
- .view_embedder = nullptr,
- .state_stack = preroll_state_stack,
- .dst_color_space = nullptr,
- .surface_needs_readback = false,
- .raster_time = unused_stopwatch,
- .ui_time = unused_stopwatch,
- .texture_registry = texture_registry,
- // clang-format on
- };
-
- LayerStateStack paint_state_stack;
- paint_state_stack.set_delegate(&canvas);
- PaintContext paint_context = {
- // clang-format off
- .state_stack = paint_state_stack,
- .canvas = &canvas,
- .gr_context = nullptr,
- .dst_color_space = nullptr,
- .view_embedder = nullptr,
- .raster_time = unused_stopwatch,
- .ui_time = unused_stopwatch,
- .texture_registry = texture_registry,
- .raster_cache = nullptr,
- .layer_snapshot_store = nullptr,
- .enable_leaf_layer_tracing = false,
- // clang-format on
- };
-
- // Even if we don't have a root layer, we still need to create an empty
- // picture.
- if (root_layer_) {
- root_layer_->Preroll(&preroll_context);
-
- // The needs painting flag may be set after the preroll. So check it after.
- if (root_layer_->needs_painting(paint_context)) {
- root_layer_->Paint(paint_context);
- }
- }
-
- return std::make_shared<const impeller::Picture>(
- canvas.EndRecordingAsPicture());
-#else // IMPELLER_SUPPORTS_RENDERING
- return nullptr;
-#endif // !IMPELLER_SUPPORTS_RENDERING
-}
-
sk_sp<DisplayList> LayerTree::Flatten(
const SkRect& bounds,
const std::shared_ptr<TextureRegistry>& texture_registry,
diff --git a/flow/layers/layer_tree.h b/flow/layers/layer_tree.h
index c4f204a..5f573da 100644
--- a/flow/layers/layer_tree.h
+++ b/flow/layers/layer_tree.h
@@ -54,10 +54,6 @@
const std::shared_ptr<TextureRegistry>& texture_registry = nullptr,
GrDirectContext* gr_context = nullptr);
- std::shared_ptr<const impeller::Picture> FlattenToImpellerPicture(
- const SkRect& bounds,
- const std::shared_ptr<TextureRegistry>& texture_registry);
-
Layer* root_layer() const { return root_layer_.get(); }
const SkISize& frame_size() const { return frame_size_; }
diff --git a/flow/raster_cache.cc b/flow/raster_cache.cc
index 9932ac5..92f22f8 100644
--- a/flow/raster_cache.cc
+++ b/flow/raster_cache.cc
@@ -27,7 +27,7 @@
RasterCacheResult::RasterCacheResult(sk_sp<DlImage> image,
const SkRect& logical_rect,
const char* type,
- std::shared_ptr<const DlRTree> rtree)
+ sk_sp<const DlRTree> rtree)
: image_(std::move(image)),
logical_rect_(logical_rect),
flow_(type),
@@ -77,7 +77,7 @@
/// @note Procedure doesn't copy all closures.
std::unique_ptr<RasterCacheResult> RasterCache::Rasterize(
const RasterCache::Context& context,
- std::shared_ptr<const DlRTree> rtree,
+ sk_sp<const DlRTree> rtree,
const std::function<void(DlCanvas*)>& draw_function,
const std::function<void(DlCanvas*, const SkRect& rect)>& draw_checkerboard)
const {
@@ -119,7 +119,7 @@
const RasterCacheKeyID& id,
const Context& raster_cache_context,
const std::function<void(DlCanvas*)>& render_function,
- std::shared_ptr<const DlRTree> rtree) const {
+ sk_sp<const DlRTree> rtree) const {
RasterCacheKey key = RasterCacheKey(id, raster_cache_context.matrix);
Entry& entry = cache_[key];
if (!entry.image) {
diff --git a/flow/raster_cache.h b/flow/raster_cache.h
index acda626..a00508f 100644
--- a/flow/raster_cache.h
+++ b/flow/raster_cache.h
@@ -29,7 +29,7 @@
RasterCacheResult(sk_sp<DlImage> image,
const SkRect& logical_rect,
const char* type,
- std::shared_ptr<const DlRTree> rtree = nullptr);
+ sk_sp<const DlRTree> rtree = nullptr);
virtual ~RasterCacheResult() = default;
@@ -49,7 +49,7 @@
sk_sp<DlImage> image_;
SkRect logical_rect_;
fml::tracing::TraceFlow flow_;
- std::shared_ptr<const DlRTree> rtree_;
+ sk_sp<const DlRTree> rtree_;
};
class Layer;
@@ -129,7 +129,7 @@
std::unique_ptr<RasterCacheResult> Rasterize(
const RasterCache::Context& context,
- std::shared_ptr<const DlRTree> rtree,
+ sk_sp<const DlRTree> rtree,
const std::function<void(DlCanvas*)>& draw_function,
const std::function<void(DlCanvas*, const SkRect& rect)>&
draw_checkerboard) const;
@@ -244,7 +244,7 @@
bool UpdateCacheEntry(const RasterCacheKeyID& id,
const Context& raster_cache_context,
const std::function<void(DlCanvas*)>& render_function,
- std::shared_ptr<const DlRTree> rtree = nullptr) const;
+ sk_sp<const DlRTree> rtree = nullptr) const;
private:
struct Entry {
diff --git a/flow/surface_frame.cc b/flow/surface_frame.cc
index 8741525..dd1b98d 100644
--- a/flow/surface_frame.cc
+++ b/flow/surface_frame.cc
@@ -5,7 +5,6 @@
#include "flutter/flow/surface_frame.h"
#include <limits>
-#include <memory>
#include <utility>
#include "flutter/fml/logging.h"
@@ -32,13 +31,9 @@
canvas_ = &adapter_;
} else if (display_list_fallback) {
FML_DCHECK(!frame_size.isEmpty());
-#if IMPELLER_SUPPORTS_RENDERING
- aiks_canvas_ =
- std::make_shared<impeller::DlAiksCanvas>(SkRect::Make(frame_size));
- canvas_ = aiks_canvas_.get();
-#else
- FML_DCHECK(false);
-#endif // IMPELLER_SUPPORTS_RENDERING
+ dl_builder_ =
+ sk_make_sp<DisplayListBuilder>(SkRect::Make(frame_size), true);
+ canvas_ = dl_builder_.get();
}
}
@@ -77,14 +72,9 @@
return false;
}
-std::shared_ptr<const impeller::Picture> SurfaceFrame::GetImpellerPicture() {
-#if IMPELLER_SUPPORTS_RENDERING
- return std::make_shared<impeller::Picture>(
- aiks_canvas_->EndRecordingAsPicture());
-#else
- FML_DCHECK(false);
- return nullptr;
-#endif // IMPELLER_SUPPORTS_RENDERING
+sk_sp<DisplayList> SurfaceFrame::BuildDisplayList() {
+ TRACE_EVENT0("impeller", "SurfaceFrame::BuildDisplayList");
+ return dl_builder_ ? dl_builder_->Build() : nullptr;
}
} // namespace flutter
diff --git a/flow/surface_frame.h b/flow/surface_frame.h
index b653729..1abf75e 100644
--- a/flow/surface_frame.h
+++ b/flow/surface_frame.h
@@ -14,14 +14,6 @@
#include "flutter/fml/macros.h"
#include "flutter/fml/time/time_point.h"
-#if IMPELLER_SUPPORTS_RENDERING
-#include "impeller/display_list/dl_aiks_canvas.h" // nogncheck
-#else // IMPELLER_SUPPORTS_RENDERINGƒ
-namespace impeller {
-class DlAiksCanvas;
-} // namespace impeller
-#endif // !IMPELLER_SUPPORTS_RENDERING
-
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
@@ -105,14 +97,14 @@
}
const SubmitInfo& submit_info() const { return submit_info_; }
- std::shared_ptr<const impeller::Picture> GetImpellerPicture();
+ sk_sp<DisplayList> BuildDisplayList();
private:
bool submitted_ = false;
DlSkCanvasAdapter adapter_;
+ sk_sp<DisplayListBuilder> dl_builder_;
sk_sp<SkSurface> surface_;
- std::shared_ptr<impeller::DlAiksCanvas> aiks_canvas_;
DlCanvas* canvas_ = nullptr;
FramebufferInfo framebuffer_info_;
SubmitInfo submit_info_;
diff --git a/flow/surface_frame_unittests.cc b/flow/surface_frame_unittests.cc
index 540981b..0f6f9ba 100644
--- a/flow/surface_frame_unittests.cc
+++ b/flow/surface_frame_unittests.cc
@@ -22,7 +22,6 @@
surface_frame.reset();
}
-#if IMPELLER_SUPPORTS_RENDERING
TEST(FlowTest, SurfaceFrameDoesNotHaveEmptyCanvas) {
SurfaceFrame::FramebufferInfo framebuffer_info;
SurfaceFrame frame(
@@ -34,6 +33,5 @@
EXPECT_FALSE(frame.Canvas()->GetLocalClipBounds().isEmpty());
EXPECT_FALSE(frame.Canvas()->QuickReject(SkRect::MakeLTRB(10, 10, 50, 50)));
}
-#endif // IMPELLER_SUPPORTS_RENDERING
} // namespace flutter
diff --git a/impeller/aiks/BUILD.gn b/impeller/aiks/BUILD.gn
index c760dfc..d63facb 100644
--- a/impeller/aiks/BUILD.gn
+++ b/impeller/aiks/BUILD.gn
@@ -32,10 +32,7 @@
"../geometry",
]
- deps = [
- "//flutter/display_list",
- "//flutter/fml",
- ]
+ deps = [ "//flutter/fml" ]
}
impeller_component("aiks_playground") {
diff --git a/impeller/aiks/canvas.cc b/impeller/aiks/canvas.cc
index b582081..84cb754 100644
--- a/impeller/aiks/canvas.cc
+++ b/impeller/aiks/canvas.cc
@@ -8,7 +8,6 @@
#include <optional>
#include <utility>
-#include "display_list/geometry/dl_rtree.h"
#include "flutter/fml/logging.h"
#include "impeller/aiks/paint_pass_delegate.h"
#include "impeller/entity/contents/atlas_contents.h"
@@ -20,7 +19,6 @@
#include "impeller/entity/contents/vertices_contents.h"
#include "impeller/entity/geometry/geometry.h"
#include "impeller/geometry/path_builder.h"
-#include "include/core/SkRect.h"
namespace impeller {
@@ -495,19 +493,6 @@
Picture picture;
picture.pass = std::move(base_pass_);
- std::vector<SkRect> rects;
- picture.pass->IterateAllEntities([&rects](const Entity& entity) {
- auto coverage = entity.GetCoverage();
- if (coverage.has_value()) {
- rects.push_back(SkRect::MakeLTRB(coverage->GetLeft(), coverage->GetTop(),
- coverage->GetRight(),
- coverage->GetBottom()));
- }
- return true;
- });
- picture.rtree =
- std::make_shared<flutter::DlRTree>(rects.data(), rects.size());
-
Reset();
Initialize(initial_cull_rect_);
diff --git a/impeller/aiks/canvas.h b/impeller/aiks/canvas.h
index 9854c01..84f1c48 100644
--- a/impeller/aiks/canvas.h
+++ b/impeller/aiks/canvas.h
@@ -64,8 +64,6 @@
~Canvas();
- std::optional<Rect> BaseCullRect() const { return initial_cull_rect_; }
-
void Save();
void SaveLayer(const Paint& paint,
diff --git a/impeller/aiks/picture.h b/impeller/aiks/picture.h
index bb76900..f4e8a64 100644
--- a/impeller/aiks/picture.h
+++ b/impeller/aiks/picture.h
@@ -8,7 +8,6 @@
#include <memory>
#include <optional>
-#include "display_list/geometry/dl_rtree.h"
#include "flutter/fml/macros.h"
#include "impeller/aiks/aiks_context.h"
#include "impeller/aiks/image.h"
@@ -19,7 +18,6 @@
struct Picture {
std::unique_ptr<EntityPass> pass;
- std::shared_ptr<const flutter::DlRTree> rtree;
std::optional<Snapshot> Snapshot(AiksContext& context);
diff --git a/impeller/display_list/BUILD.gn b/impeller/display_list/BUILD.gn
index 177401d..f27e8f5 100644
--- a/impeller/display_list/BUILD.gn
+++ b/impeller/display_list/BUILD.gn
@@ -22,8 +22,6 @@
impeller_component("display_list") {
sources = [
- "dl_aiks_canvas.cc",
- "dl_aiks_canvas.h",
"dl_dispatcher.cc",
"dl_dispatcher.h",
"dl_image_impeller.cc",
diff --git a/impeller/display_list/dl_aiks_canvas.cc b/impeller/display_list/dl_aiks_canvas.cc
deleted file mode 100644
index 004fc4b..0000000
--- a/impeller/display_list/dl_aiks_canvas.cc
+++ /dev/null
@@ -1,1191 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "impeller/display_list/dl_aiks_canvas.h"
-
-#include <algorithm>
-#include <cstring>
-#include <memory>
-#include <optional>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-#include "flutter/fml/logging.h"
-#include "flutter/fml/trace_event.h"
-#include "impeller/aiks/color_filter.h"
-#include "impeller/core/formats.h"
-#include "impeller/display_list/dl_image_impeller.h"
-#include "impeller/display_list/dl_vertices_geometry.h"
-#include "impeller/display_list/nine_patch_converter.h"
-#include "impeller/display_list/skia_conversions.h"
-#include "impeller/entity/contents/conical_gradient_contents.h"
-#include "impeller/entity/contents/filters/filter_contents.h"
-#include "impeller/entity/contents/filters/inputs/filter_input.h"
-#include "impeller/entity/contents/linear_gradient_contents.h"
-#include "impeller/entity/contents/radial_gradient_contents.h"
-#include "impeller/entity/contents/runtime_effect_contents.h"
-#include "impeller/entity/contents/scene_contents.h"
-#include "impeller/entity/contents/sweep_gradient_contents.h"
-#include "impeller/entity/contents/tiled_texture_contents.h"
-#include "impeller/entity/entity.h"
-#include "impeller/entity/geometry/geometry.h"
-#include "impeller/geometry/path.h"
-#include "impeller/geometry/path_builder.h"
-#include "impeller/geometry/scalar.h"
-#include "impeller/geometry/sigma.h"
-#include "impeller/typographer/backends/skia/text_frame_skia.h"
-
-namespace impeller {
-
-#define UNIMPLEMENTED \
- FML_DLOG(ERROR) << "Unimplemented detail in " << __FUNCTION__;
-
-DlAiksCanvas::DlAiksCanvas(const SkRect& cull_rect, bool prepare_rtree)
- : canvas_(skia_conversions::ToRect(cull_rect)) {
- if (prepare_rtree) {
- accumulator_ = std::make_unique<flutter::RTreeBoundsAccumulator>();
- }
-}
-
-DlAiksCanvas::DlAiksCanvas(const SkIRect& cull_rect, bool prepare_rtree)
- : DlAiksCanvas(SkRect::Make(cull_rect), prepare_rtree) {}
-
-DlAiksCanvas::~DlAiksCanvas() = default;
-
-static Paint::Style ToStyle(flutter::DlDrawStyle style) {
- switch (style) {
- case flutter::DlDrawStyle::kFill:
- return Paint::Style::kFill;
- case flutter::DlDrawStyle::kStroke:
- return Paint::Style::kStroke;
- case flutter::DlDrawStyle::kStrokeAndFill:
- UNIMPLEMENTED;
- break;
- }
- return Paint::Style::kFill;
-}
-
-static Cap ToStrokeCap(flutter::DlStrokeCap cap) {
- switch (cap) {
- case flutter::DlStrokeCap::kButt:
- return Cap::kButt;
- case flutter::DlStrokeCap::kRound:
- return Cap::kRound;
- case flutter::DlStrokeCap::kSquare:
- return Cap::kSquare;
- }
- FML_UNREACHABLE();
-}
-
-static Matrix ToMatrix(const SkMatrix& m) {
- return Matrix{
- // clang-format off
- m[0], m[3], 0, m[6],
- m[1], m[4], 0, m[7],
- 0, 0, 1, 0,
- m[2], m[5], 0, m[8],
- // clang-format on
- };
-}
-
-static Matrix ToMatrix(const SkM44& m) {
- return Matrix{
- // clang-format off
- m.rc(0, 0), m.rc(1, 0), m.rc(2, 0), m.rc(3, 0),
- m.rc(0, 1), m.rc(1, 1), m.rc(2, 1), m.rc(3, 1),
- m.rc(0, 2), m.rc(1, 2), m.rc(2, 2), m.rc(3, 2),
- m.rc(0, 3), m.rc(1, 3), m.rc(2, 3), m.rc(3, 3),
- // clang-format on
- };
-}
-
-static Join ToStrokeJoin(flutter::DlStrokeJoin join) {
- switch (join) {
- case flutter::DlStrokeJoin::kMiter:
- return Join::kMiter;
- case flutter::DlStrokeJoin::kRound:
- return Join::kRound;
- case flutter::DlStrokeJoin::kBevel:
- return Join::kBevel;
- }
- FML_UNREACHABLE();
-}
-
-static impeller::SamplerDescriptor ToSamplerDescriptor(
- const flutter::DlImageSampling options) {
- impeller::SamplerDescriptor desc;
- switch (options) {
- case flutter::DlImageSampling::kNearestNeighbor:
- desc.min_filter = desc.mag_filter = impeller::MinMagFilter::kNearest;
- desc.label = "Nearest Sampler";
- break;
- case flutter::DlImageSampling::kLinear:
- // Impeller doesn't support cubic sampling, but linear is closer to correct
- // than nearest for this case.
- case flutter::DlImageSampling::kCubic:
- desc.min_filter = desc.mag_filter = impeller::MinMagFilter::kLinear;
- desc.label = "Linear Sampler";
- break;
- case flutter::DlImageSampling::kMipmapLinear:
- desc.min_filter = desc.mag_filter = impeller::MinMagFilter::kLinear;
- desc.mip_filter = impeller::MipFilter::kLinear;
- desc.label = "Mipmap Linear Sampler";
- break;
- }
- return desc;
-}
-
-static impeller::SamplerDescriptor ToSamplerDescriptor(
- const flutter::DlFilterMode options) {
- impeller::SamplerDescriptor desc;
- switch (options) {
- case flutter::DlFilterMode::kNearest:
- desc.min_filter = desc.mag_filter = impeller::MinMagFilter::kNearest;
- desc.label = "Nearest Sampler";
- break;
- case flutter::DlFilterMode::kLinear:
- desc.min_filter = desc.mag_filter = impeller::MinMagFilter::kLinear;
- desc.label = "Linear Sampler";
- break;
- default:
- break;
- }
- return desc;
-}
-
-static FilterContents::BlurStyle ToBlurStyle(flutter::DlBlurStyle blur_style) {
- switch (blur_style) {
- case flutter::DlBlurStyle::kNormal:
- return FilterContents::BlurStyle::kNormal;
- case flutter::DlBlurStyle::kSolid:
- return FilterContents::BlurStyle::kSolid;
- case flutter::DlBlurStyle::kOuter:
- return FilterContents::BlurStyle::kOuter;
- case flutter::DlBlurStyle::kInner:
- return FilterContents::BlurStyle::kInner;
- }
-}
-
-static std::optional<Paint::MaskBlurDescriptor> ToMaskBlurDescriptor(
- const flutter::DlMaskFilter* filter) {
- if (filter == nullptr) {
- return std::nullopt;
- }
- switch (filter->type()) {
- case flutter::DlMaskFilterType::kBlur: {
- auto blur = filter->asBlur();
-
- return Paint::MaskBlurDescriptor{
- .style = ToBlurStyle(blur->style()),
- .sigma = Sigma(blur->sigma()),
- };
- }
- }
-
- return std::nullopt;
-}
-
-static BlendMode ToBlendMode(flutter::DlBlendMode mode) {
- switch (mode) {
- case flutter::DlBlendMode::kClear:
- return BlendMode::kClear;
- case flutter::DlBlendMode::kSrc:
- return BlendMode::kSource;
- case flutter::DlBlendMode::kDst:
- return BlendMode::kDestination;
- case flutter::DlBlendMode::kSrcOver:
- return BlendMode::kSourceOver;
- case flutter::DlBlendMode::kDstOver:
- return BlendMode::kDestinationOver;
- case flutter::DlBlendMode::kSrcIn:
- return BlendMode::kSourceIn;
- case flutter::DlBlendMode::kDstIn:
- return BlendMode::kDestinationIn;
- case flutter::DlBlendMode::kSrcOut:
- return BlendMode::kSourceOut;
- case flutter::DlBlendMode::kDstOut:
- return BlendMode::kDestinationOut;
- case flutter::DlBlendMode::kSrcATop:
- return BlendMode::kSourceATop;
- case flutter::DlBlendMode::kDstATop:
- return BlendMode::kDestinationATop;
- case flutter::DlBlendMode::kXor:
- return BlendMode::kXor;
- case flutter::DlBlendMode::kPlus:
- return BlendMode::kPlus;
- case flutter::DlBlendMode::kModulate:
- return BlendMode::kModulate;
- case flutter::DlBlendMode::kScreen:
- return BlendMode::kScreen;
- case flutter::DlBlendMode::kOverlay:
- return BlendMode::kOverlay;
- case flutter::DlBlendMode::kDarken:
- return BlendMode::kDarken;
- case flutter::DlBlendMode::kLighten:
- return BlendMode::kLighten;
- case flutter::DlBlendMode::kColorDodge:
- return BlendMode::kColorDodge;
- case flutter::DlBlendMode::kColorBurn:
- return BlendMode::kColorBurn;
- case flutter::DlBlendMode::kHardLight:
- return BlendMode::kHardLight;
- case flutter::DlBlendMode::kSoftLight:
- return BlendMode::kSoftLight;
- case flutter::DlBlendMode::kDifference:
- return BlendMode::kDifference;
- case flutter::DlBlendMode::kExclusion:
- return BlendMode::kExclusion;
- case flutter::DlBlendMode::kMultiply:
- return BlendMode::kMultiply;
- case flutter::DlBlendMode::kHue:
- return BlendMode::kHue;
- case flutter::DlBlendMode::kSaturation:
- return BlendMode::kSaturation;
- case flutter::DlBlendMode::kColor:
- return BlendMode::kColor;
- case flutter::DlBlendMode::kLuminosity:
- return BlendMode::kLuminosity;
- }
- FML_UNREACHABLE();
-}
-
-static Entity::TileMode ToTileMode(flutter::DlTileMode tile_mode) {
- switch (tile_mode) {
- case flutter::DlTileMode::kClamp:
- return Entity::TileMode::kClamp;
- case flutter::DlTileMode::kRepeat:
- return Entity::TileMode::kRepeat;
- case flutter::DlTileMode::kMirror:
- return Entity::TileMode::kMirror;
- case flutter::DlTileMode::kDecal:
- return Entity::TileMode::kDecal;
- }
-}
-
-static Color ToColor(const flutter::DlColor& color) {
- return {
- color.getRedF(),
- color.getGreenF(),
- color.getBlueF(),
- color.getAlphaF(),
- };
-}
-
-static std::vector<Color> ToColors(const flutter::DlColor colors[], int count) {
- auto result = std::vector<Color>();
- if (colors == nullptr) {
- return result;
- }
- for (int i = 0; i < count; i++) {
- result.push_back(skia_conversions::ToColor(colors[i]));
- }
- return result;
-}
-
-// Convert display list colors + stops into impeller colors and stops, taking
-// care to ensure that the stops always start with 0.0 and end with 1.0.
-template <typename T>
-static void ConvertStops(T* gradient,
- std::vector<Color>* colors,
- std::vector<float>* stops) {
- FML_DCHECK(gradient->stop_count() >= 2);
-
- auto* dl_colors = gradient->colors();
- auto* dl_stops = gradient->stops();
- if (dl_stops[0] != 0.0) {
- colors->emplace_back(skia_conversions::ToColor(dl_colors[0]));
- stops->emplace_back(0);
- }
- for (auto i = 0; i < gradient->stop_count(); i++) {
- colors->emplace_back(skia_conversions::ToColor(dl_colors[i]));
- stops->emplace_back(dl_stops[i]);
- }
- if (stops->back() != 1.0) {
- colors->emplace_back(colors->back());
- stops->emplace_back(1.0);
- }
-}
-
-static std::optional<ColorSource::Type> ToColorSourceType(
- flutter::DlColorSourceType type) {
- switch (type) {
- case flutter::DlColorSourceType::kColor:
- return ColorSource::Type::kColor;
- case flutter::DlColorSourceType::kImage:
- return ColorSource::Type::kImage;
- case flutter::DlColorSourceType::kLinearGradient:
- return ColorSource::Type::kLinearGradient;
- case flutter::DlColorSourceType::kRadialGradient:
- return ColorSource::Type::kRadialGradient;
- case flutter::DlColorSourceType::kConicalGradient:
- return ColorSource::Type::kConicalGradient;
- case flutter::DlColorSourceType::kSweepGradient:
- return ColorSource::Type::kSweepGradient;
- case flutter::DlColorSourceType::kRuntimeEffect:
- return ColorSource::Type::kRuntimeEffect;
-#ifdef IMPELLER_ENABLE_3D
- case flutter::DlColorSourceType::kScene:
- return ColorSource::Type::kScene;
-#endif // IMPELLER_ENABLE_3D
- }
-}
-
-ColorSource ToColorSource(const flutter::DlColorSource* source, Paint* paint) {
- if (!source) {
- return ColorSource::MakeColor();
- }
-
- std::optional<ColorSource::Type> type = ToColorSourceType(source->type());
-
- if (!type.has_value()) {
- FML_LOG(ERROR) << "Requested ColorSourceType::kUnknown";
- return ColorSource::MakeColor();
- }
-
- switch (type.value()) {
- case ColorSource::Type::kColor: {
- const flutter::DlColorColorSource* color = source->asColor();
- FML_DCHECK(color);
- FML_DCHECK(paint);
- paint->color = ToColor(color->color());
- return ColorSource::MakeColor();
- }
- case ColorSource::Type::kLinearGradient: {
- const flutter::DlLinearGradientColorSource* linear =
- source->asLinearGradient();
- FML_DCHECK(linear);
- auto start_point = skia_conversions::ToPoint(linear->start_point());
- auto end_point = skia_conversions::ToPoint(linear->end_point());
- std::vector<Color> colors;
- std::vector<float> stops;
- ConvertStops(linear, &colors, &stops);
-
- auto tile_mode = ToTileMode(linear->tile_mode());
- auto matrix = ToMatrix(linear->matrix());
-
- return ColorSource::MakeLinearGradient(
- start_point, end_point, std::move(colors), std::move(stops),
- tile_mode, matrix);
- }
- case ColorSource::Type::kConicalGradient: {
- const flutter::DlConicalGradientColorSource* conical_gradient =
- source->asConicalGradient();
- FML_DCHECK(conical_gradient);
- Point center = skia_conversions::ToPoint(conical_gradient->end_center());
- SkScalar radius = conical_gradient->end_radius();
- Point focus_center =
- skia_conversions::ToPoint(conical_gradient->start_center());
- SkScalar focus_radius = conical_gradient->start_radius();
- std::vector<Color> colors;
- std::vector<float> stops;
- ConvertStops(conical_gradient, &colors, &stops);
-
- auto tile_mode = ToTileMode(conical_gradient->tile_mode());
- auto matrix = ToMatrix(conical_gradient->matrix());
-
- return ColorSource::MakeConicalGradient(center, radius, std::move(colors),
- std::move(stops), focus_center,
- focus_radius, tile_mode, matrix);
- }
- case ColorSource::Type::kRadialGradient: {
- const flutter::DlRadialGradientColorSource* radialGradient =
- source->asRadialGradient();
- FML_DCHECK(radialGradient);
- auto center = skia_conversions::ToPoint(radialGradient->center());
- auto radius = radialGradient->radius();
- std::vector<Color> colors;
- std::vector<float> stops;
- ConvertStops(radialGradient, &colors, &stops);
-
- auto tile_mode = ToTileMode(radialGradient->tile_mode());
- auto matrix = ToMatrix(radialGradient->matrix());
- return ColorSource::MakeRadialGradient(center, radius, std::move(colors),
- std::move(stops), tile_mode,
- matrix);
- }
- case ColorSource::Type::kSweepGradient: {
- const flutter::DlSweepGradientColorSource* sweepGradient =
- source->asSweepGradient();
- FML_DCHECK(sweepGradient);
-
- auto center = skia_conversions::ToPoint(sweepGradient->center());
- auto start_angle = Degrees(sweepGradient->start());
- auto end_angle = Degrees(sweepGradient->end());
- std::vector<Color> colors;
- std::vector<float> stops;
- ConvertStops(sweepGradient, &colors, &stops);
-
- auto tile_mode = ToTileMode(sweepGradient->tile_mode());
- auto matrix = ToMatrix(sweepGradient->matrix());
- return ColorSource::MakeSweepGradient(center, start_angle, end_angle,
- std::move(colors), std::move(stops),
- tile_mode, matrix);
- }
- case ColorSource::Type::kImage: {
- const flutter::DlImageColorSource* image_color_source = source->asImage();
- FML_DCHECK(image_color_source &&
- image_color_source->image()->impeller_texture());
- auto texture = image_color_source->image()->impeller_texture();
- auto x_tile_mode = ToTileMode(image_color_source->horizontal_tile_mode());
- auto y_tile_mode = ToTileMode(image_color_source->vertical_tile_mode());
- auto desc = ToSamplerDescriptor(image_color_source->sampling());
- auto matrix = ToMatrix(image_color_source->matrix());
- return ColorSource::MakeImage(texture, x_tile_mode, y_tile_mode, desc,
- matrix);
- }
- case ColorSource::Type::kRuntimeEffect: {
- const flutter::DlRuntimeEffectColorSource* runtime_effect_color_source =
- source->asRuntimeEffect();
- auto runtime_stage =
- runtime_effect_color_source->runtime_effect()->runtime_stage();
- auto uniform_data = runtime_effect_color_source->uniform_data();
- auto samplers = runtime_effect_color_source->samplers();
-
- std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
-
- for (auto& sampler : samplers) {
- if (sampler == nullptr) {
- return ColorSource::MakeColor();
- }
- auto* image = sampler->asImage();
- if (!sampler->asImage()) {
- UNIMPLEMENTED;
- return ColorSource::MakeColor();
- }
- FML_DCHECK(image->image()->impeller_texture());
- texture_inputs.push_back({
- .sampler_descriptor = ToSamplerDescriptor(image->sampling()),
- .texture = image->image()->impeller_texture(),
- });
- }
-
- return ColorSource::MakeRuntimeEffect(runtime_stage, uniform_data,
- texture_inputs);
- }
- case ColorSource::Type::kScene: {
-#ifdef IMPELLER_ENABLE_3D
- const flutter::DlSceneColorSource* scene_color_source = source->asScene();
- std::shared_ptr<scene::Node> scene_node =
- scene_color_source->scene_node();
- Matrix camera_transform = scene_color_source->camera_matrix();
-
- return ColorSource::MakeScene(scene_node, camera_transform);
-#else // IMPELLER_ENABLE_3D
- FML_LOG(ERROR) << "ColorSourceType::kScene can only be used if Impeller "
- "Scene is enabled.";
- return ColorSource::MakeColor();
-#endif // IMPELLER_ENABLE_3D
- }
- }
-}
-
-static std::shared_ptr<ColorFilter> ToColorFilter(
- const flutter::DlColorFilter* filter) {
- if (filter == nullptr) {
- return nullptr;
- }
- switch (filter->type()) {
- case flutter::DlColorFilterType::kBlend: {
- auto dl_blend = filter->asBlend();
- auto blend_mode = ToBlendMode(dl_blend->mode());
- auto color = skia_conversions::ToColor(dl_blend->color());
- return ColorFilter::MakeBlend(blend_mode, color);
- }
- case flutter::DlColorFilterType::kMatrix: {
- const flutter::DlMatrixColorFilter* dl_matrix = filter->asMatrix();
- impeller::ColorMatrix color_matrix;
- dl_matrix->get_matrix(color_matrix.array);
- return ColorFilter::MakeMatrix(color_matrix);
- }
- case flutter::DlColorFilterType::kSrgbToLinearGamma:
- return ColorFilter::MakeSrgbToLinear();
- case flutter::DlColorFilterType::kLinearToSrgbGamma:
- return ColorFilter::MakeLinearToSrgb();
- }
- return nullptr;
-}
-
-static Paint::ImageFilterProc ToImageFilterProc(
- const flutter::DlImageFilter* filter) {
- if (filter == nullptr) {
- return nullptr;
- }
-
- switch (filter->type()) {
- case flutter::DlImageFilterType::kBlur: {
- auto blur = filter->asBlur();
- auto sigma_x = Sigma(blur->sigma_x());
- auto sigma_y = Sigma(blur->sigma_y());
- auto tile_mode = ToTileMode(blur->tile_mode());
-
- return [sigma_x, sigma_y, tile_mode](const FilterInput::Ref& input,
- const Matrix& effect_transform,
- bool is_subpass) {
- return FilterContents::MakeGaussianBlur(
- input, sigma_x, sigma_y, FilterContents::BlurStyle::kNormal,
- tile_mode, effect_transform);
- };
-
- break;
- }
- case flutter::DlImageFilterType::kDilate: {
- auto dilate = filter->asDilate();
- FML_DCHECK(dilate);
- if (dilate->radius_x() < 0 || dilate->radius_y() < 0) {
- return nullptr;
- }
- auto radius_x = Radius(dilate->radius_x());
- auto radius_y = Radius(dilate->radius_y());
- return [radius_x, radius_y](FilterInput::Ref input,
- const Matrix& effect_transform,
- bool is_subpass) {
- return FilterContents::MakeMorphology(
- std::move(input), radius_x, radius_y,
- FilterContents::MorphType::kDilate, effect_transform);
- };
- break;
- }
- case flutter::DlImageFilterType::kErode: {
- auto erode = filter->asErode();
- FML_DCHECK(erode);
- if (erode->radius_x() < 0 || erode->radius_y() < 0) {
- return nullptr;
- }
- auto radius_x = Radius(erode->radius_x());
- auto radius_y = Radius(erode->radius_y());
- return [radius_x, radius_y](FilterInput::Ref input,
- const Matrix& effect_transform,
- bool is_subpass) {
- return FilterContents::MakeMorphology(
- std::move(input), radius_x, radius_y,
- FilterContents::MorphType::kErode, effect_transform);
- };
- break;
- }
- case flutter::DlImageFilterType::kMatrix: {
- auto matrix_filter = filter->asMatrix();
- FML_DCHECK(matrix_filter);
- auto matrix = ToMatrix(matrix_filter->matrix());
- auto desc = ToSamplerDescriptor(matrix_filter->sampling());
- return [matrix, desc](FilterInput::Ref input,
- const Matrix& effect_transform, bool is_subpass) {
- return FilterContents::MakeMatrixFilter(std::move(input), matrix, desc,
- effect_transform, is_subpass);
- };
- break;
- }
- case flutter::DlImageFilterType::kCompose: {
- auto compose = filter->asCompose();
- FML_DCHECK(compose);
- auto outer = compose->outer();
- auto inner = compose->inner();
- auto outer_proc = ToImageFilterProc(outer.get());
- auto inner_proc = ToImageFilterProc(inner.get());
- if (!outer_proc) {
- return inner_proc;
- }
- if (!inner_proc) {
- return outer_proc;
- }
- FML_DCHECK(outer_proc && inner_proc);
- return [outer_filter = outer_proc, inner_filter = inner_proc](
- FilterInput::Ref input, const Matrix& effect_transform,
- bool is_subpass) {
- auto contents =
- inner_filter(std::move(input), effect_transform, is_subpass);
- contents = outer_filter(FilterInput::Make(contents), effect_transform,
- is_subpass);
- return contents;
- };
- break;
- }
- case flutter::DlImageFilterType::kColorFilter: {
- auto color_filter_image_filter = filter->asColorFilter();
- FML_DCHECK(color_filter_image_filter);
- auto color_filter =
- ToColorFilter(color_filter_image_filter->color_filter().get());
- if (!color_filter) {
- return nullptr;
- }
- return [color_filter](FilterInput::Ref input,
- const Matrix& effect_transform, bool is_subpass) {
- // When color filters are used as image filters, set the color filter's
- // "absorb opacity" flag to false. For image filters, the snapshot
- // opacity needs to be deferred until the result of the filter chain is
- // being blended with the layer.
- return color_filter->WrapWithGPUColorFilter(std::move(input), false);
- };
- break;
- }
- case flutter::DlImageFilterType::kLocalMatrix: {
- auto local_matrix_filter = filter->asLocalMatrix();
- FML_DCHECK(local_matrix_filter);
- auto internal_filter = local_matrix_filter->image_filter();
- FML_DCHECK(internal_filter);
-
- auto image_filter_proc = ToImageFilterProc(internal_filter.get());
- if (!image_filter_proc) {
- return nullptr;
- }
-
- auto matrix = ToMatrix(local_matrix_filter->matrix());
-
- return [matrix, filter_proc = image_filter_proc](
- FilterInput::Ref input, const Matrix& effect_transform,
- bool is_subpass) {
- std::shared_ptr<FilterContents> filter =
- filter_proc(std::move(input), effect_transform, is_subpass);
- return FilterContents::MakeLocalMatrixFilter(FilterInput::Make(filter),
- matrix);
- };
- break;
- }
- }
-}
-
-static Paint ToPaint(const flutter::DlPaint& dl_paint) {
- Paint paint;
- paint.style = ToStyle(dl_paint.getDrawStyle());
- paint.color = ToColor(dl_paint.getColor());
- paint.stroke_width = dl_paint.getStrokeWidth();
- paint.stroke_miter = dl_paint.getStrokeMiter();
- paint.stroke_cap = ToStrokeCap(dl_paint.getStrokeCap());
- paint.stroke_join = ToStrokeJoin(dl_paint.getStrokeJoin());
- paint.color_source = ToColorSource(dl_paint.getColorSourcePtr(), &paint);
- paint.color_filter = ToColorFilter(dl_paint.getColorFilterPtr());
- paint.invert_colors = dl_paint.isInvertColors();
- paint.blend_mode = ToBlendMode(dl_paint.getBlendMode());
- if (dl_paint.getPathEffect()) {
- UNIMPLEMENTED;
- }
- paint.mask_blur_descriptor =
- ToMaskBlurDescriptor(dl_paint.getMaskFilterPtr());
- paint.image_filter = ToImageFilterProc(dl_paint.getImageFilterPtr());
- return paint;
-}
-
-static Paint ToPaint(const flutter::DlPaint* dl_paint) {
- if (!dl_paint) {
- return Paint();
- }
- return ToPaint(*dl_paint);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Save() {
- canvas_.Save();
- if (accumulator_) {
- accumulator_->save();
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::SaveLayer(const SkRect* bounds,
- const flutter::DlPaint* paint,
- const flutter::DlImageFilter* backdrop) {
- if (!paint) {
- return;
- }
- canvas_.SaveLayer(ToPaint(paint), skia_conversions::ToRect(bounds),
- ToImageFilterProc(backdrop));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Restore() {
- canvas_.Restore();
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Translate(SkScalar tx, SkScalar ty) {
- canvas_.Translate({tx, ty, 0.0});
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Scale(SkScalar sx, SkScalar sy) {
- canvas_.Scale({sx, sy, 1.0});
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Rotate(SkScalar degrees) {
- canvas_.Rotate(Degrees{degrees});
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Skew(SkScalar sx, SkScalar sy) {
- canvas_.Skew(sx, sy);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Transform2DAffine(SkScalar mxx,
- SkScalar mxy,
- SkScalar mxt,
- SkScalar myx,
- SkScalar myy,
- SkScalar myt) {
- // clang-format off
- TransformFullPerspective(
- mxx, mxy, 0, mxt,
- myx, myy, 0, myt,
- 0 , 0, 1, 0,
- 0 , 0, 0, 1
- );
- // clang-format on
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::TransformFullPerspective(SkScalar mxx,
- SkScalar mxy,
- SkScalar mxz,
- SkScalar mxt,
- SkScalar myx,
- SkScalar myy,
- SkScalar myz,
- SkScalar myt,
- SkScalar mzx,
- SkScalar mzy,
- SkScalar mzz,
- SkScalar mzt,
- SkScalar mwx,
- SkScalar mwy,
- SkScalar mwz,
- SkScalar mwt) {
- // The order of arguments is row-major but Impeller matrices are
- // column-major.
- // clang-format off
- auto xformation = Matrix{
- mxx, myx, mzx, mwx,
- mxy, myy, mzy, mwy,
- mxz, myz, mzz, mwz,
- mxt, myt, mzt, mwt
- };
- // clang-format on
- canvas_.Transform(xformation);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::TransformReset() {
- canvas_.ResetTransform();
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::Transform(const SkMatrix* matrix) {
- if (!matrix) {
- return;
- }
- canvas_.Transform(ToMatrix(*matrix));
-}
-
-void DlAiksCanvas::Transform(const SkM44* matrix44) {
- if (!matrix44) {
- return;
- }
- canvas_.Transform(ToMatrix(*matrix44));
-}
-
-static Entity::ClipOperation ToClipOperation(
- flutter::DlCanvas::ClipOp clip_op) {
- switch (clip_op) {
- case flutter::DlCanvas::ClipOp::kDifference:
- return Entity::ClipOperation::kDifference;
- case flutter::DlCanvas::ClipOp::kIntersect:
- return Entity::ClipOperation::kIntersect;
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) {
- canvas_.ClipRect(skia_conversions::ToRect(rect), ToClipOperation(clip_op));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) {
- if (rrect.isSimple()) {
- canvas_.ClipRRect(skia_conversions::ToRect(rrect.rect()),
- rrect.getSimpleRadii().fX, ToClipOperation(clip_op));
- } else {
- canvas_.ClipPath(skia_conversions::ToPath(rrect), ToClipOperation(clip_op));
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) {
- canvas_.ClipPath(skia_conversions::ToPath(path), ToClipOperation(clip_op));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawColor(flutter::DlColor color,
- flutter::DlBlendMode dl_mode) {
- Paint paint;
- paint.color = skia_conversions::ToColor(color);
- paint.blend_mode = ToBlendMode(dl_mode);
- canvas_.DrawPaint(paint);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawPaint(const flutter::DlPaint& paint) {
- canvas_.DrawPaint(ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawLine(const SkPoint& p0,
- const SkPoint& p1,
- const flutter::DlPaint& paint) {
- auto path =
- PathBuilder{}
- .AddLine(skia_conversions::ToPoint(p0), skia_conversions::ToPoint(p1))
- .SetConvexity(Convexity::kConvex)
- .TakePath();
- auto aiks_paint = ToPaint(paint);
- aiks_paint.style = Paint::Style::kStroke;
- canvas_.DrawPath(path, aiks_paint);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawRect(const SkRect& rect, const flutter::DlPaint& paint) {
- canvas_.DrawRect(skia_conversions::ToRect(rect), ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawOval(const SkRect& bounds,
- const flutter::DlPaint& paint) {
- if (bounds.width() == bounds.height()) {
- canvas_.DrawCircle(skia_conversions::ToPoint(bounds.center()),
- bounds.width() * 0.5, ToPaint(paint));
- } else {
- auto path = PathBuilder{}
- .AddOval(skia_conversions::ToRect(bounds))
- .SetConvexity(Convexity::kConvex)
- .TakePath();
- canvas_.DrawPath(path, ToPaint(paint));
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawCircle(const SkPoint& center,
- SkScalar radius,
- const flutter::DlPaint& paint) {
- canvas_.DrawCircle(skia_conversions::ToPoint(center), radius, ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawRRect(const SkRRect& rrect,
- const flutter::DlPaint& paint) {
- if (rrect.isSimple()) {
- canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
- rrect.getSimpleRadii().fX, ToPaint(paint));
- } else {
- canvas_.DrawPath(skia_conversions::ToPath(rrect), ToPaint(paint));
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawDRRect(const SkRRect& outer,
- const SkRRect& inner,
- const flutter::DlPaint& paint) {
- PathBuilder builder;
- builder.AddPath(skia_conversions::ToPath(outer));
- builder.AddPath(skia_conversions::ToPath(inner));
- canvas_.DrawPath(builder.TakePath(FillType::kOdd), ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawPath(const SkPath& path, const flutter::DlPaint& paint) {
- SkRect rect;
- SkRRect rrect;
- SkRect oval;
- if (path.isRect(&rect)) {
- canvas_.DrawRect(skia_conversions::ToRect(rect), ToPaint(paint));
- } else if (path.isRRect(&rrect) && rrect.isSimple()) {
- canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
- rrect.getSimpleRadii().fX, ToPaint(paint));
- } else if (path.isOval(&oval) && oval.width() == oval.height()) {
- canvas_.DrawCircle(skia_conversions::ToPoint(oval.center()),
- oval.width() * 0.5, ToPaint(paint));
- } else {
- canvas_.DrawPath(skia_conversions::ToPath(path), ToPaint(paint));
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawArc(const SkRect& oval_bounds,
- SkScalar start_degrees,
- SkScalar sweep_degrees,
- bool use_center,
- const flutter::DlPaint& paint) {
- PathBuilder builder;
- builder.AddArc(skia_conversions::ToRect(oval_bounds), Degrees(start_degrees),
- Degrees(sweep_degrees), use_center);
- canvas_.DrawPath(builder.TakePath(), ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawPoints(PointMode mode,
- uint32_t count,
- const SkPoint points[],
- const flutter::DlPaint& paint) {
- auto aiks_paint = ToPaint(paint);
- switch (mode) {
- case flutter::DlCanvas::PointMode::kPoints: {
- // Cap::kButt is also treated as a square.
- auto point_style = aiks_paint.stroke_cap == Cap::kRound
- ? PointStyle::kRound
- : PointStyle::kSquare;
- auto radius = aiks_paint.stroke_width;
- if (radius > 0) {
- radius /= 2.0;
- }
- canvas_.DrawPoints(skia_conversions::ToPoints(points, count), radius,
- aiks_paint, point_style);
- } break;
- case flutter::DlCanvas::PointMode::kLines:
- for (uint32_t i = 1; i < count; i += 2) {
- Point p0 = skia_conversions::ToPoint(points[i - 1]);
- Point p1 = skia_conversions::ToPoint(points[i]);
- auto path = PathBuilder{}.AddLine(p0, p1).TakePath();
- canvas_.DrawPath(path, aiks_paint);
- }
- break;
- case flutter::DlCanvas::PointMode::kPolygon:
- if (count > 1) {
- Point p0 = skia_conversions::ToPoint(points[0]);
- for (uint32_t i = 1; i < count; i++) {
- Point p1 = skia_conversions::ToPoint(points[i]);
- auto path = PathBuilder{}.AddLine(p0, p1).TakePath();
- canvas_.DrawPath(path, aiks_paint);
- p0 = p1;
- }
- }
- break;
- }
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawVertices(const flutter::DlVertices* vertices,
- flutter::DlBlendMode dl_mode,
- const flutter::DlPaint& paint) {
- canvas_.DrawVertices(DlVerticesGeometry::MakeVertices(vertices),
- ToBlendMode(dl_mode), ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawImage(const sk_sp<flutter::DlImage>& image,
- const SkPoint point,
- flutter::DlImageSampling sampling,
- const flutter::DlPaint* paint) {
- if (!image) {
- return;
- }
-
- auto texture = image->impeller_texture();
- if (!texture) {
- return;
- }
-
- const auto size = texture->GetSize();
- const auto src = SkRect::MakeWH(size.width, size.height);
- const auto dest =
- SkRect::MakeXYWH(point.fX, point.fY, size.width, size.height);
-
- DrawImageRect(image, // image
- src, // source rect
- dest, // destination rect
- sampling, // sampling options
- paint, // paint
- SrcRectConstraint::kStrict // constraint
- );
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawImageRect(const sk_sp<flutter::DlImage>& image,
- const SkRect& src,
- const SkRect& dst,
- flutter::DlImageSampling sampling,
- const flutter::DlPaint* paint,
- SrcRectConstraint constraint) {
- canvas_.DrawImageRect(
- std::make_shared<Image>(image->impeller_texture()), // image
- skia_conversions::ToRect(src), // source rect
- skia_conversions::ToRect(dst), // destination rect
- ToPaint(paint), // paint
- ToSamplerDescriptor(sampling) // sampling
- );
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawImageNine(const sk_sp<flutter::DlImage>& image,
- const SkIRect& center,
- const SkRect& dst,
- flutter::DlFilterMode filter,
- const flutter::DlPaint* paint) {
- NinePatchConverter converter = {};
- auto aiks_paint = ToPaint(paint);
- converter.DrawNinePatch(
- std::make_shared<Image>(image->impeller_texture()),
- Rect::MakeLTRB(center.fLeft, center.fTop, center.fRight, center.fBottom),
- skia_conversions::ToRect(dst), ToSamplerDescriptor(filter), &canvas_,
- &aiks_paint);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawAtlas(const sk_sp<flutter::DlImage>& atlas,
- const SkRSXform xform[],
- const SkRect tex[],
- const flutter::DlColor colors[],
- int count,
- flutter::DlBlendMode mode,
- flutter::DlImageSampling sampling,
- const SkRect* cull_rect,
- const flutter::DlPaint* paint) {
- canvas_.DrawAtlas(std::make_shared<Image>(atlas->impeller_texture()),
- skia_conversions::ToRSXForms(xform, count),
- skia_conversions::ToRects(tex, count),
- ToColors(colors, count), ToBlendMode(mode),
- ToSamplerDescriptor(sampling),
- skia_conversions::ToRect(cull_rect), ToPaint(paint));
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawDisplayList(
- const sk_sp<flutter::DisplayList> display_list,
- SkScalar opacity) {
- FML_DCHECK(false);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity) {
- if (!picture) {
- return;
- }
- FML_DCHECK(opacity == 1);
- canvas_.DrawPicture(*picture);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawTextBlob(const sk_sp<SkTextBlob>& blob,
- SkScalar x,
- SkScalar y,
- const flutter::DlPaint& paint) {
- canvas_.DrawTextFrame(TextFrameFromTextBlob(blob), //
- impeller::Point{x, y}, //
- ToPaint(paint) //
- );
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::DrawShadow(const SkPath& path,
- const flutter::DlColor color,
- const SkScalar elevation,
- bool transparent_occluder,
- SkScalar dpr) {
- Color spot_color = skia_conversions::ToColor(color);
- spot_color.alpha *= 0.25;
-
- // Compute the spot color -- ported from SkShadowUtils::ComputeTonalColors.
- {
- Scalar max =
- std::max(std::max(spot_color.red, spot_color.green), spot_color.blue);
- Scalar min =
- std::min(std::min(spot_color.red, spot_color.green), spot_color.blue);
- Scalar luminance = (min + max) * 0.5;
-
- Scalar alpha_adjust =
- (2.6f + (-2.66667f + 1.06667f * spot_color.alpha) * spot_color.alpha) *
- spot_color.alpha;
- Scalar color_alpha =
- (3.544762f + (-4.891428f + 2.3466f * luminance) * luminance) *
- luminance;
- color_alpha = std::clamp(alpha_adjust * color_alpha, 0.0f, 1.0f);
-
- Scalar greyscale_alpha =
- std::clamp(spot_color.alpha * (1 - 0.4f * luminance), 0.0f, 1.0f);
-
- Scalar color_scale = color_alpha * (1 - greyscale_alpha);
- Scalar tonal_alpha = color_scale + greyscale_alpha;
- Scalar unpremul_scale = tonal_alpha != 0 ? color_scale / tonal_alpha : 0;
- spot_color = Color(unpremul_scale * spot_color.red,
- unpremul_scale * spot_color.green,
- unpremul_scale * spot_color.blue, tonal_alpha);
- }
-
- Vector3 light_position(0, -1, 1);
- Scalar occluder_z = dpr * elevation;
-
- constexpr Scalar kLightRadius = 800 / 600; // Light radius / light height
-
- Paint paint;
- paint.style = Paint::Style::kFill;
- paint.color = spot_color;
- paint.mask_blur_descriptor = Paint::MaskBlurDescriptor{
- .style = FilterContents::BlurStyle::kNormal,
- .sigma = Radius{kLightRadius * occluder_z /
- canvas_.GetCurrentTransformation().GetScale().y},
- };
-
- canvas_.Save();
- canvas_.PreConcat(
- Matrix::MakeTranslation(Vector2(0, -occluder_z * light_position.y)));
-
- SkRect rect;
- SkRRect rrect;
- SkRect oval;
- if (path.isRect(&rect)) {
- canvas_.DrawRect(skia_conversions::ToRect(rect), paint);
- } else if (path.isRRect(&rrect) && rrect.isSimple()) {
- canvas_.DrawRRect(skia_conversions::ToRect(rrect.rect()),
- rrect.getSimpleRadii().fX, paint);
- } else if (path.isOval(&oval) && oval.width() == oval.height()) {
- canvas_.DrawCircle(skia_conversions::ToPoint(oval.center()),
- oval.width() * 0.5, paint);
- } else {
- canvas_.DrawPath(skia_conversions::ToPath(path), paint);
- }
-
- canvas_.Restore();
-}
-
-// |flutter::DlCanvas|
-bool DlAiksCanvas::QuickReject(const SkRect& bounds) const {
- auto maybe_cull_rect = canvas_.GetCurrentLocalCullingBounds();
- if (!maybe_cull_rect.has_value()) {
- return false;
- }
- auto cull_rect = maybe_cull_rect.value();
- if (cull_rect.IsEmpty() || bounds.isEmpty()) {
- return true;
- }
- auto transform = canvas_.GetCurrentTransformation();
- // There are no fast paths right now to checking whther impeller::Matrix can
- // be inverted. Skip that check.
- if (transform.HasPerspective()) {
- return false;
- }
-
- return !skia_conversions::ToRect(bounds).IntersectsWithRect(cull_rect);
-}
-
-// |flutter::DlCanvas|
-void DlAiksCanvas::RestoreToCount(int restore_count) {
- canvas_.RestoreToCount(restore_count);
-}
-
-// |flutter::DlCanvas|
-SkISize DlAiksCanvas::GetBaseLayerSize() const {
- auto size = canvas_.BaseCullRect().value_or(Rect::Giant()).size.Round();
- return SkISize::Make(size.width, size.height);
-}
-
-// |flutter::DlCanvas|
-SkImageInfo DlAiksCanvas::GetImageInfo() const {
- SkISize size = GetBaseLayerSize();
- return SkImageInfo::MakeUnknown(size.width(), size.height());
-}
-
-Picture DlAiksCanvas::EndRecordingAsPicture() {
- return canvas_.EndRecordingAsPicture();
-}
-
-} // namespace impeller
diff --git a/impeller/display_list/dl_aiks_canvas.h b/impeller/display_list/dl_aiks_canvas.h
deleted file mode 100644
index e4878c5..0000000
--- a/impeller/display_list/dl_aiks_canvas.h
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include "flutter/display_list/dl_canvas.h"
-#include "flutter/display_list/geometry/dl_rtree.h"
-#include "flutter/display_list/utils/dl_bounds_accumulator.h"
-#include "flutter/fml/macros.h"
-#include "impeller/aiks/canvas.h"
-#include "impeller/aiks/paint.h"
-#include "impeller/display_list/skia_conversions.h"
-
-namespace impeller {
-
-class DlAiksCanvas final : public flutter::DlCanvas {
- public:
- DlAiksCanvas();
-
- explicit DlAiksCanvas(const SkRect& cull_rect, bool prepare_tree = false);
-
- explicit DlAiksCanvas(const SkIRect& cull_rect, bool prepare_rtree = false);
-
- ~DlAiksCanvas();
-
- Picture EndRecordingAsPicture();
-
- // |DlCanvas|
- SkISize GetBaseLayerSize() const override;
- // |DlCanvas|
- SkImageInfo GetImageInfo() const override;
-
- // |DlCanvas|
- void Save() override;
-
- // |DlCanvas|
- void SaveLayer(const SkRect* bounds,
- const flutter::DlPaint* paint = nullptr,
- const flutter::DlImageFilter* backdrop = nullptr) override;
- // |DlCanvas|
- void Restore() override;
- // |DlCanvas|
- int GetSaveCount() const override { return canvas_.GetSaveCount(); }
- // |DlCanvas|
- void RestoreToCount(int restore_count) override;
-
- // |DlCanvas|
- void Translate(SkScalar tx, SkScalar ty) override;
- // |DlCanvas|
- void Scale(SkScalar sx, SkScalar sy) override;
- // |DlCanvas|
- void Rotate(SkScalar degrees) override;
- // |DlCanvas|
- void Skew(SkScalar sx, SkScalar sy) override;
-
- // clang-format off
- // 2x3 2D affine subset of a 4x4 transform in row major order
- // |DlCanvas|
- void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt,
- SkScalar myx, SkScalar myy, SkScalar myt) override;
- // full 4x4 transform in row major order
- // |DlCanvas|
- void TransformFullPerspective(
- SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt,
- SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt,
- SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt,
- SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override;
- // clang-format on
- // |DlCanvas|
- void TransformReset() override;
- // |DlCanvas|
- void Transform(const SkMatrix* matrix) override;
- // |DlCanvas|
- void Transform(const SkM44* matrix44) override;
- // |DlCanvas|
- void SetTransform(const SkMatrix* matrix) override {
- TransformReset();
- Transform(matrix);
- }
- // |DlCanvas|
- void SetTransform(const SkM44* matrix44) override {
- TransformReset();
- Transform(matrix44);
- }
- using flutter::DlCanvas::Transform;
-
- /// Returns the 4x4 full perspective transform representing all transform
- /// operations executed so far in this DisplayList within the enclosing
- /// save stack.
- // |DlCanvas|
- SkM44 GetTransformFullPerspective() const override {
- return skia_conversions::ToSkM44(canvas_.GetCurrentTransformation());
- }
- /// Returns the 3x3 partial perspective transform representing all transform
- /// operations executed so far in this DisplayList within the enclosing
- /// save stack.
- // |DlCanvas|
- SkMatrix GetTransform() const override {
- return skia_conversions::ToSkMatrix(canvas_.GetCurrentTransformation());
- }
-
- // |DlCanvas|
- void ClipRect(const SkRect& rect,
- ClipOp clip_op = ClipOp::kIntersect,
- bool is_aa = false) override;
- // |DlCanvas|
- void ClipRRect(const SkRRect& rrect,
- ClipOp clip_op = ClipOp::kIntersect,
- bool is_aa = false) override;
- // |DlCanvas|
- void ClipPath(const SkPath& path,
- ClipOp clip_op = ClipOp::kIntersect,
- bool is_aa = false) override;
-
- /// Conservative estimate of the bounds of all outstanding clip operations
- /// measured in the coordinate space within which this DisplayList will
- /// be rendered.
- // |DlCanvas|
- SkRect GetDestinationClipBounds() const override {
- auto rect = canvas_.GetCurrentLocalCullingBounds().value_or(Rect::Giant());
- return SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(), rect.GetRight(),
- rect.GetBottom());
- }
- /// Conservative estimate of the bounds of all outstanding clip operations
- /// transformed into the local coordinate space in which currently
- /// recorded rendering operations are interpreted.
- // |DlCanvas|
- SkRect GetLocalClipBounds() const override {
- auto rect = canvas_.GetCurrentLocalCullingBounds().value_or(Rect::Giant());
- return SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(), rect.GetRight(),
- rect.GetBottom());
- }
-
- /// Return true iff the supplied bounds are easily shown to be outside
- /// of the current clip bounds. This method may conservatively return
- /// false if it cannot make the determination.
- // |DlCanvas|
- bool QuickReject(const SkRect& bounds) const override;
-
- // |DlCanvas|
- void DrawPaint(const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawColor(flutter::DlColor color, flutter::DlBlendMode mode) override;
- // |DlCanvas|
- void DrawLine(const SkPoint& p0,
- const SkPoint& p1,
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawRect(const SkRect& rect, const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawOval(const SkRect& bounds, const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawCircle(const SkPoint& center,
- SkScalar radius,
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawRRect(const SkRRect& rrect, const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawDRRect(const SkRRect& outer,
- const SkRRect& inner,
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawPath(const SkPath& path, const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawArc(const SkRect& bounds,
- SkScalar start,
- SkScalar sweep,
- bool useCenter,
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawPoints(PointMode mode,
- uint32_t count,
- const SkPoint pts[],
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawVertices(const flutter::DlVertices* vertices,
- flutter::DlBlendMode mode,
- const flutter::DlPaint& paint) override;
- using flutter::DlCanvas::DrawVertices;
- // |DlCanvas|
- void DrawImage(const sk_sp<flutter::DlImage>& image,
- const SkPoint point,
- flutter::DlImageSampling sampling,
- const flutter::DlPaint* paint = nullptr) override;
- // |DlCanvas|
- void DrawImageRect(
- const sk_sp<flutter::DlImage>& image,
- const SkRect& src,
- const SkRect& dst,
- flutter::DlImageSampling sampling,
- const flutter::DlPaint* paint = nullptr,
- SrcRectConstraint constraint = SrcRectConstraint::kFast) override;
- using flutter::DlCanvas::DrawImageRect;
- // |DlCanvas|
- void DrawImageNine(const sk_sp<flutter::DlImage>& image,
- const SkIRect& center,
- const SkRect& dst,
- flutter::DlFilterMode filter,
- const flutter::DlPaint* paint = nullptr) override;
- // |DlCanvas|
- void DrawAtlas(const sk_sp<flutter::DlImage>& atlas,
- const SkRSXform xform[],
- const SkRect tex[],
- const flutter::DlColor colors[],
- int count,
- flutter::DlBlendMode mode,
- flutter::DlImageSampling sampling,
- const SkRect* cullRect,
- const flutter::DlPaint* paint = nullptr) override;
- // |DlCanvas|
- void DrawDisplayList(const sk_sp<flutter::DisplayList> display_list,
- SkScalar opacity = SK_Scalar1) override;
-
- // |DlCanvas|
- void DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity = SK_Scalar1) override;
-
- // |DlCanvas|
- void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
- SkScalar x,
- SkScalar y,
- const flutter::DlPaint& paint) override;
- // |DlCanvas|
- void DrawShadow(const SkPath& path,
- const flutter::DlColor color,
- const SkScalar elevation,
- bool transparent_occluder,
- SkScalar dpr) override;
-
- // |DlCanvas|
- void Flush() override {}
-
- private:
- Canvas canvas_;
- std::unique_ptr<flutter::BoundsAccumulator> accumulator_;
-
- FML_DISALLOW_COPY_AND_ASSIGN(DlAiksCanvas);
-};
-
-} // namespace impeller
diff --git a/impeller/display_list/skia_conversions.h b/impeller/display_list/skia_conversions.h
index 286edaa..c56cf29 100644
--- a/impeller/display_list/skia_conversions.h
+++ b/impeller/display_list/skia_conversions.h
@@ -7,15 +7,12 @@
#include "display_list/dl_color.h"
#include "impeller/core/formats.h"
#include "impeller/geometry/color.h"
-#include "impeller/geometry/matrix.h"
#include "impeller/geometry/path.h"
#include "impeller/geometry/path_builder.h"
#include "impeller/geometry/point.h"
#include "impeller/geometry/rect.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkColorType.h"
-#include "third_party/skia/include/core/SkM44.h"
-#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkPoint.h"
#include "third_party/skia/include/core/SkRRect.h"
@@ -49,29 +46,5 @@
std::optional<impeller::PixelFormat> ToPixelFormat(SkColorType type);
-constexpr SkM44 ToSkM44(const Matrix& matrix) {
- // SkM44 construction is in row major order (even though it stores the data in
- // column major).
- // clang-format off
- return SkM44(
- matrix.vec[0].x, matrix.vec[1].x, matrix.vec[2].x, matrix.vec[3].x,
- matrix.vec[0].y, matrix.vec[1].y, matrix.vec[2].y, matrix.vec[3].y,
- matrix.vec[0].z, matrix.vec[1].z, matrix.vec[2].z, matrix.vec[3].z,
- matrix.vec[0].w, matrix.vec[1].w, matrix.vec[2].w, matrix.vec[3].w
- );
- // clang-format on
-}
-
-constexpr SkMatrix ToSkMatrix(const Matrix& matrix) {
- // SkMatrix is in row major order.
- // clang-format off
- return SkMatrix::MakeAll(
- matrix.vec[0].x, matrix.vec[1].x, matrix.vec[3].x,
- matrix.vec[0].y, matrix.vec[1].y, matrix.vec[3].y,
- matrix.vec[0].w, matrix.vec[1].w, matrix.vec[3].w
- );
- /// clang-format on
-}
-
} // namespace skia_conversions
} // namespace impeller
diff --git a/impeller/entity/entity_pass.h b/impeller/entity/entity_pass.h
index 6afcaaf..54eb84d 100644
--- a/impeller/entity/entity_pass.h
+++ b/impeller/entity/entity_pass.h
@@ -31,6 +31,7 @@
/// When the element is a child `EntityPass`, it may be rendered to an
/// offscreen texture and converted into an `Entity` that draws the texture
/// into the current pass, or its children may be collapsed into the current
+ ///
/// `EntityPass`. Elements are converted to Entities in
/// `GetEntityForElement()`.
using Element = std::variant<Entity, std::unique_ptr<EntityPass>>;
diff --git a/impeller/geometry/rect.h b/impeller/geometry/rect.h
index 03c7874..0bda614 100644
--- a/impeller/geometry/rect.h
+++ b/impeller/geometry/rect.h
@@ -72,11 +72,6 @@
return TRect::MakeLTRB(left, top, right, bottom);
}
- constexpr static TRect Giant() {
- // See flutter::kGiantRect.
- return TRect::MakeLTRB(-1E9, -1E9, 1E9, 1E9);
- }
-
constexpr static TRect MakeMaximum() {
return TRect::MakeLTRB(-std::numeric_limits<Type>::infinity(),
-std::numeric_limits<Type>::infinity(),
diff --git a/impeller/geometry/sigma.h b/impeller/geometry/sigma.h
index c66b570..c909128 100644
--- a/impeller/geometry/sigma.h
+++ b/impeller/geometry/sigma.h
@@ -20,7 +20,7 @@
/// quality blurs (with exponentially diminishing returns for the same sigma
/// input). Making this value any lower results in a noticable loss of
/// quality in the blur.
-constexpr static float kKernelRadiusPerSigma = 1.73205080757f;
+constexpr static float kKernelRadiusPerSigma = 1.73205080757;
struct Radius;
@@ -29,7 +29,7 @@
/// the filter input. In other words, this determines how wide the
/// distribution stretches.
struct Sigma {
- Scalar sigma = 0.0f;
+ Scalar sigma = 0.0;
constexpr Sigma() = default;
@@ -45,7 +45,7 @@
/// relationship with `Sigma`. See `kKernelRadiusPerSigma` for
/// details on how this relationship works.
struct Radius {
- Scalar radius = 0.0f;
+ Scalar radius = 0.0;
constexpr Radius() = default;
diff --git a/impeller/tools/impeller.gni b/impeller/tools/impeller.gni
index 04cc324..2c20acf 100644
--- a/impeller/tools/impeller.gni
+++ b/impeller/tools/impeller.gni
@@ -12,15 +12,13 @@
flutter_runtime_mode == "debug" || flutter_runtime_mode == "profile"
# Whether the Metal backend is enabled.
- impeller_enable_metal = (is_mac || is_ios) && target_os != "fuchsia"
+ impeller_enable_metal = is_mac || is_ios
# Whether the OpenGLES backend is enabled.
- impeller_enable_opengles =
- (is_linux || is_win || is_android) && target_os != "fuchsia"
+ impeller_enable_opengles = is_linux || is_win || is_android
# Whether the Vulkan backend is enabled.
- impeller_enable_vulkan =
- (is_linux || is_win || is_android) && target_os != "fuchsia"
+ impeller_enable_vulkan = is_linux || is_win || is_android
# Whether to use a prebuilt impellerc.
# If this is the empty string, impellerc will be built.
diff --git a/lib/ui/compositing/scene.cc b/lib/ui/compositing/scene.cc
index fd76614..17d00ea 100644
--- a/lib/ui/compositing/scene.cc
+++ b/lib/ui/compositing/scene.cc
@@ -89,13 +89,13 @@
bool impeller,
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
+ fml::RefPtr<fml::TaskRunner> raster_task_runner,
fml::RefPtr<SkiaUnrefQueue> unref_queue) {
#if IMPELLER_SUPPORTS_RENDERING
if (impeller) {
return DlDeferredImageGPUImpeller::Make(std::move(layer_tree),
std::move(snapshot_delegate),
- raster_task_runner);
+ std::move(raster_task_runner));
}
#endif // IMPELLER_SUPPORTS_RENDERING
@@ -122,7 +122,8 @@
auto image = CanvasImage::Create();
auto dl_image = CreateDeferredImage(
dart_state->IsImpellerEnabled(), BuildLayerTree(width, height),
- std::move(snapshot_delegate), raster_task_runner, std::move(unref_queue));
+ std::move(snapshot_delegate), std::move(raster_task_runner),
+ std::move(unref_queue));
image->set_image(dl_image);
image->AssociateWithDartWrapper(raw_image_handle);
}
diff --git a/lib/ui/compositing/scene_builder.cc b/lib/ui/compositing/scene_builder.cc
index e47a429..ec0d59c 100644
--- a/lib/ui/compositing/scene_builder.cc
+++ b/lib/ui/compositing/scene_builder.cc
@@ -4,7 +4,6 @@
#include "flutter/lib/ui/compositing/scene_builder.h"
-#include "flutter/flow/layers/aiks_layer.h"
#include "flutter/flow/layers/backdrop_filter_layer.h"
#include "flutter/flow/layers/clip_path_layer.h"
#include "flutter/flow/layers/clip_rect_layer.h"
@@ -227,15 +226,6 @@
SkPoint::Make(SafeNarrow(dx), SafeNarrow(dy)), picture->display_list(),
!!(hints & 1), !!(hints & 2));
AddLayer(std::move(layer));
- return;
- }
-
- auto impeller_picture = picture->impeller_picture();
- if (impeller_picture) {
- auto layer = std::make_unique<flutter::AiksLayer>(
- SkPoint::Make(SafeNarrow(dx), SafeNarrow(dy)),
- std::move(impeller_picture));
- AddLayer(std::move(layer));
}
}
diff --git a/lib/ui/painting/canvas.cc b/lib/ui/painting/canvas.cc
index 7a8c9b6..403a4c3 100644
--- a/lib/ui/painting/canvas.cc
+++ b/lib/ui/painting/canvas.cc
@@ -6,7 +6,7 @@
#include <cmath>
-#include "flutter/display_list/dl_canvas.h"
+#include "flutter/display_list/dl_builder.h"
#include "flutter/lib/ui/floating_point.h"
#include "flutter/lib/ui/painting/image.h"
#include "flutter/lib/ui/painting/image_filter.h"
@@ -39,18 +39,18 @@
fml::MakeRefCounted<Canvas>(recorder->BeginRecording(
SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top), SafeNarrow(right),
SafeNarrow(bottom))));
- FML_DCHECK(canvas->dl_canvas_);
recorder->set_canvas(canvas);
canvas->AssociateWithDartWrapper(wrapper);
}
-Canvas::Canvas(DlCanvas* canvas) : dl_canvas_(canvas) {}
+Canvas::Canvas(sk_sp<DisplayListBuilder> builder)
+ : display_list_builder_(std::move(builder)) {}
Canvas::~Canvas() {}
void Canvas::save() {
- if (dl_canvas_) {
- dl_canvas_->Save();
+ if (display_list_builder_) {
+ builder()->Save();
}
}
@@ -59,12 +59,12 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
const DlPaint* save_paint = paint.paint(dl_paint, kSaveLayerWithPaintFlags);
FML_DCHECK(save_paint);
TRACE_EVENT0("flutter", "ui.Canvas::saveLayer (Recorded)");
- dl_canvas_->SaveLayer(nullptr, save_paint);
+ builder()->SaveLayer(nullptr, save_paint);
}
}
@@ -79,65 +79,65 @@
FML_DCHECK(paint.isNotNull());
SkRect bounds = SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
SafeNarrow(right), SafeNarrow(bottom));
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
const DlPaint* save_paint = paint.paint(dl_paint, kSaveLayerWithPaintFlags);
FML_DCHECK(save_paint);
TRACE_EVENT0("flutter", "ui.Canvas::saveLayer (Recorded)");
- dl_canvas_->SaveLayer(&bounds, save_paint);
+ builder()->SaveLayer(&bounds, save_paint);
}
}
void Canvas::restore() {
- if (dl_canvas_) {
- dl_canvas_->Restore();
+ if (display_list_builder_) {
+ builder()->Restore();
}
}
int Canvas::getSaveCount() {
- if (dl_canvas_) {
- return dl_canvas_->GetSaveCount();
+ if (display_list_builder_) {
+ return builder()->GetSaveCount();
} else {
return 0;
}
}
void Canvas::restoreToCount(int count) {
- if (dl_canvas_ && count < getSaveCount()) {
- dl_canvas_->RestoreToCount(count);
+ if (display_list_builder_ && count < getSaveCount()) {
+ builder()->RestoreToCount(count);
}
}
void Canvas::translate(double dx, double dy) {
- if (dl_canvas_) {
- dl_canvas_->Translate(SafeNarrow(dx), SafeNarrow(dy));
+ if (display_list_builder_) {
+ builder()->Translate(SafeNarrow(dx), SafeNarrow(dy));
}
}
void Canvas::scale(double sx, double sy) {
- if (dl_canvas_) {
- dl_canvas_->Scale(SafeNarrow(sx), SafeNarrow(sy));
+ if (display_list_builder_) {
+ builder()->Scale(SafeNarrow(sx), SafeNarrow(sy));
}
}
void Canvas::rotate(double radians) {
- if (dl_canvas_) {
- dl_canvas_->Rotate(SafeNarrow(radians) * 180.0f / static_cast<float>(M_PI));
+ if (display_list_builder_) {
+ builder()->Rotate(SafeNarrow(radians) * 180.0f / static_cast<float>(M_PI));
}
}
void Canvas::skew(double sx, double sy) {
- if (dl_canvas_) {
- dl_canvas_->Skew(SafeNarrow(sx), SafeNarrow(sy));
+ if (display_list_builder_) {
+ builder()->Skew(SafeNarrow(sx), SafeNarrow(sy));
}
}
void Canvas::transform(const tonic::Float64List& matrix4) {
// The Float array stored by Dart Matrix4 is in column-major order
// Both DisplayList and SkM44 constructor take row-major matrix order
- if (dl_canvas_) {
+ if (display_list_builder_) {
// clang-format off
- dl_canvas_->TransformFullPerspective(
+ builder()->TransformFullPerspective(
SafeNarrow(matrix4[ 0]), SafeNarrow(matrix4[ 4]), SafeNarrow(matrix4[ 8]), SafeNarrow(matrix4[12]),
SafeNarrow(matrix4[ 1]), SafeNarrow(matrix4[ 5]), SafeNarrow(matrix4[ 9]), SafeNarrow(matrix4[13]),
SafeNarrow(matrix4[ 2]), SafeNarrow(matrix4[ 6]), SafeNarrow(matrix4[10]), SafeNarrow(matrix4[14]),
@@ -147,8 +147,8 @@
}
void Canvas::getTransform(Dart_Handle matrix4_handle) {
- if (dl_canvas_) {
- SkM44 sk_m44 = dl_canvas_->GetTransformFullPerspective();
+ if (display_list_builder_) {
+ SkM44 sk_m44 = builder()->GetTransformFullPerspective();
SkScalar m44_values[16];
// The Float array stored by Dart Matrix4 is in column-major order
sk_m44.getColMajor(m44_values);
@@ -165,18 +165,17 @@
double bottom,
DlCanvas::ClipOp clipOp,
bool doAntiAlias) {
- if (dl_canvas_) {
- dl_canvas_->ClipRect(
- SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top), SafeNarrow(right),
- SafeNarrow(bottom)),
- clipOp, doAntiAlias);
+ if (display_list_builder_) {
+ builder()->ClipRect(SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
+ SafeNarrow(right), SafeNarrow(bottom)),
+ clipOp, doAntiAlias);
}
}
void Canvas::clipRRect(const RRect& rrect, bool doAntiAlias) {
- if (dl_canvas_) {
- dl_canvas_->ClipRRect(rrect.sk_rrect, DlCanvas::ClipOp::kIntersect,
- doAntiAlias);
+ if (display_list_builder_) {
+ builder()->ClipRRect(rrect.sk_rrect, DlCanvas::ClipOp::kIntersect,
+ doAntiAlias);
}
}
@@ -186,16 +185,16 @@
ToDart("Canvas.clipPath called with non-genuine Path."));
return;
}
- if (dl_canvas_) {
- dl_canvas_->ClipPath(path->path(), DlCanvas::ClipOp::kIntersect,
- doAntiAlias);
+ if (display_list_builder_) {
+ builder()->ClipPath(path->path(), DlCanvas::ClipOp::kIntersect,
+ doAntiAlias);
}
}
void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) {
- if (dl_canvas_) {
+ if (display_list_builder_) {
auto rect = tonic::Float64List(rect_handle);
- SkRect bounds = dl_canvas_->GetDestinationClipBounds();
+ SkRect bounds = builder()->GetDestinationClipBounds();
rect[0] = bounds.fLeft;
rect[1] = bounds.fTop;
rect[2] = bounds.fRight;
@@ -204,9 +203,9 @@
}
void Canvas::getLocalClipBounds(Dart_Handle rect_handle) {
- if (dl_canvas_) {
+ if (display_list_builder_) {
auto rect = tonic::Float64List(rect_handle);
- SkRect bounds = dl_canvas_->GetLocalClipBounds();
+ SkRect bounds = builder()->GetLocalClipBounds();
rect[0] = bounds.fLeft;
rect[1] = bounds.fTop;
rect[2] = bounds.fRight;
@@ -215,8 +214,8 @@
}
void Canvas::drawColor(SkColor color, DlBlendMode blend_mode) {
- if (dl_canvas_) {
- dl_canvas_->DrawColor(color, blend_mode);
+ if (display_list_builder_) {
+ builder()->DrawColor(color, blend_mode);
}
}
@@ -229,12 +228,12 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawLineFlags);
- dl_canvas_->DrawLine(SkPoint::Make(SafeNarrow(x1), SafeNarrow(y1)),
- SkPoint::Make(SafeNarrow(x2), SafeNarrow(y2)),
- dl_paint);
+ builder()->DrawLine(SkPoint::Make(SafeNarrow(x1), SafeNarrow(y1)),
+ SkPoint::Make(SafeNarrow(x2), SafeNarrow(y2)),
+ dl_paint);
}
}
@@ -242,7 +241,7 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawPaintFlags);
std::shared_ptr<const DlImageFilter> filter = dl_paint.getImageFilter();
@@ -251,7 +250,7 @@
// present that cannot be replaced by an SkColorFilter.
TRACE_EVENT0("flutter", "ui.Canvas::saveLayer (Recorded)");
}
- dl_canvas_->DrawPaint(dl_paint);
+ builder()->DrawPaint(dl_paint);
}
}
@@ -264,13 +263,12 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawRectFlags);
- dl_canvas_->DrawRect(
- SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top), SafeNarrow(right),
- SafeNarrow(bottom)),
- dl_paint);
+ builder()->DrawRect(SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
+ SafeNarrow(right), SafeNarrow(bottom)),
+ dl_paint);
}
}
@@ -280,10 +278,10 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawRRectFlags);
- dl_canvas_->DrawRRect(rrect.sk_rrect, dl_paint);
+ builder()->DrawRRect(rrect.sk_rrect, dl_paint);
}
}
@@ -294,10 +292,10 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawDRRectFlags);
- dl_canvas_->DrawDRRect(outer.sk_rrect, inner.sk_rrect, dl_paint);
+ builder()->DrawDRRect(outer.sk_rrect, inner.sk_rrect, dl_paint);
}
}
@@ -310,13 +308,12 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawOvalFlags);
- dl_canvas_->DrawOval(
- SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top), SafeNarrow(right),
- SafeNarrow(bottom)),
- dl_paint);
+ builder()->DrawOval(SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
+ SafeNarrow(right), SafeNarrow(bottom)),
+ dl_paint);
}
}
@@ -328,11 +325,11 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawCircleFlags);
- dl_canvas_->DrawCircle(SkPoint::Make(SafeNarrow(x), SafeNarrow(y)),
- SafeNarrow(radius), dl_paint);
+ builder()->DrawCircle(SkPoint::Make(SafeNarrow(x), SafeNarrow(y)),
+ SafeNarrow(radius), dl_paint);
}
}
@@ -348,12 +345,12 @@
Paint paint(paint_objects, paint_data);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, useCenter //
? kDrawArcWithCenterFlags
: kDrawArcNoCenterFlags);
- dl_canvas_->DrawArc(
+ builder()->DrawArc(
SkRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top), SafeNarrow(right),
SafeNarrow(bottom)),
SafeNarrow(startAngle) * 180.0f / static_cast<float>(M_PI),
@@ -373,10 +370,10 @@
ToDart("Canvas.drawPath called with non-genuine Path."));
return;
}
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawPathFlags);
- dl_canvas_->DrawPath(path->path(), dl_paint);
+ builder()->DrawPath(path->path(), dl_paint);
}
}
@@ -403,11 +400,11 @@
}
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
const DlPaint* opt_paint = paint.paint(dl_paint, kDrawImageWithPaintFlags);
- dl_canvas_->DrawImage(dl_image, SkPoint::Make(SafeNarrow(x), SafeNarrow(y)),
- sampling, opt_paint);
+ builder()->DrawImage(dl_image, SkPoint::Make(SafeNarrow(x), SafeNarrow(y)),
+ sampling, opt_paint);
}
return Dart_Null();
}
@@ -445,12 +442,12 @@
SkRect dst = SkRect::MakeLTRB(SafeNarrow(dst_left), SafeNarrow(dst_top),
SafeNarrow(dst_right), SafeNarrow(dst_bottom));
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
const DlPaint* opt_paint =
paint.paint(dl_paint, kDrawImageRectWithPaintFlags);
- dl_canvas_->DrawImageRect(dl_image, src, dst, sampling, opt_paint,
- DlCanvas::SrcRectConstraint::kFast);
+ builder()->DrawImageRect(dl_image, src, dst, sampling, opt_paint,
+ DlCanvas::SrcRectConstraint::kFast);
}
return Dart_Null();
}
@@ -490,11 +487,11 @@
SkRect dst = SkRect::MakeLTRB(SafeNarrow(dst_left), SafeNarrow(dst_top),
SafeNarrow(dst_right), SafeNarrow(dst_bottom));
auto filter = ImageFilter::FilterModeFromIndex(bitmapSamplingIndex);
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
const DlPaint* opt_paint =
paint.paint(dl_paint, kDrawImageNineWithPaintFlags);
- dl_canvas_->DrawImageNine(dl_image, icenter, dst, filter, opt_paint);
+ builder()->DrawImageNine(dl_image, icenter, dst, filter, opt_paint);
}
return Dart_Null();
}
@@ -505,20 +502,12 @@
ToDart("Canvas.drawPicture called with non-genuine Picture."));
return;
}
-
- if (!dl_canvas_) {
- return;
- }
-
if (picture->display_list()) {
- dl_canvas_->DrawDisplayList(picture->display_list());
- } else {
- auto impeller_picture = picture->impeller_picture();
- if (impeller_picture) {
- dl_canvas_->DrawImpellerPicture(impeller_picture);
- } else {
- FML_DCHECK(false);
+ if (display_list_builder_) {
+ builder()->DrawDisplayList(picture->display_list());
}
+ } else {
+ FML_DCHECK(false);
}
}
@@ -532,7 +521,7 @@
"SkPoint doesn't use floats.");
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
switch (point_mode) {
case DlCanvas::PointMode::kPoints:
@@ -545,10 +534,10 @@
paint.paint(dl_paint, kDrawPointsAsPolygonFlags);
break;
}
- dl_canvas_->DrawPoints(point_mode,
- points.num_elements() / 2, // SkPoints have 2 floats
- reinterpret_cast<const SkPoint*>(points.data()),
- dl_paint);
+ builder()->DrawPoints(point_mode,
+ points.num_elements() / 2, // SkPoints have 2 floats
+ reinterpret_cast<const SkPoint*>(points.data()),
+ dl_paint);
}
}
@@ -564,10 +553,10 @@
return;
}
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
DlPaint dl_paint;
paint.paint(dl_paint, kDrawVerticesFlags);
- dl_canvas_->DrawVertices(vertices->vertices(), blend_mode, dl_paint);
+ builder()->DrawVertices(vertices->vertices(), blend_mode, dl_paint);
}
}
@@ -602,7 +591,7 @@
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
FML_DCHECK(paint.isNotNull());
- if (dl_canvas_) {
+ if (display_list_builder_) {
tonic::Float32List transforms(transforms_handle);
tonic::Float32List rects(rects_handle);
tonic::Int32List colors(colors_handle);
@@ -610,7 +599,7 @@
DlPaint dl_paint;
const DlPaint* opt_paint = paint.paint(dl_paint, kDrawAtlasWithPaintFlags);
- dl_canvas_->DrawAtlas(
+ builder()->DrawAtlas(
dl_image, reinterpret_cast<const SkRSXform*>(transforms.data()),
reinterpret_cast<const SkRect*>(rects.data()),
reinterpret_cast<const DlColor*>(colors.data()),
@@ -637,7 +626,7 @@
->get_window(0)
->viewport_metrics()
.device_pixel_ratio);
- if (dl_canvas_) {
+ if (display_list_builder_) {
// The DrawShadow mechanism results in non-public operations to be
// performed on the canvas involving an SkDrawShadowRec. Since we
// cannot include the header that defines that structure, we cannot
@@ -645,13 +634,13 @@
// that situation we bypass the canvas interface and inject the
// shadow parameters directly into the underlying DisplayList.
// See: https://bugs.chromium.org/p/skia/issues/detail?id=12125
- dl_canvas_->DrawShadow(path->path(), color, SafeNarrow(elevation),
- transparentOccluder, dpr);
+ builder()->DrawShadow(path->path(), color, SafeNarrow(elevation),
+ transparentOccluder, dpr);
}
}
void Canvas::Invalidate() {
- dl_canvas_ = nullptr;
+ display_list_builder_ = nullptr;
if (dart_wrapper()) {
ClearDartWrapper();
}
diff --git a/lib/ui/painting/canvas.h b/lib/ui/painting/canvas.h
index d735e87..20ab1c9 100644
--- a/lib/ui/painting/canvas.h
+++ b/lib/ui/painting/canvas.h
@@ -186,12 +186,12 @@
void Invalidate();
- DlCanvas* dl_canvas() { return dl_canvas_; }
+ DisplayListBuilder* builder() { return display_list_builder_.get(); }
private:
- explicit Canvas(DlCanvas* canvas);
+ explicit Canvas(sk_sp<DisplayListBuilder> builder);
- DlCanvas* dl_canvas_;
+ sk_sp<DisplayListBuilder> display_list_builder_;
};
} // namespace flutter
diff --git a/lib/ui/painting/display_list_deferred_image_gpu_impeller.cc b/lib/ui/painting/display_list_deferred_image_gpu_impeller.cc
index 11692cd..0c2a7de 100644
--- a/lib/ui/painting/display_list_deferred_image_gpu_impeller.cc
+++ b/lib/ui/painting/display_list_deferred_image_gpu_impeller.cc
@@ -6,7 +6,6 @@
#include <utility>
-#include "display_list_deferred_image_gpu_impeller.h"
#include "flutter/fml/make_copyable.h"
namespace flutter {
@@ -14,33 +13,22 @@
sk_sp<DlDeferredImageGPUImpeller> DlDeferredImageGPUImpeller::Make(
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
+ fml::RefPtr<fml::TaskRunner> raster_task_runner) {
return sk_sp<DlDeferredImageGPUImpeller>(new DlDeferredImageGPUImpeller(
DlDeferredImageGPUImpeller::ImageWrapper::Make(
std::move(layer_tree), std::move(snapshot_delegate),
- raster_task_runner)));
+ std::move(raster_task_runner))));
}
sk_sp<DlDeferredImageGPUImpeller> DlDeferredImageGPUImpeller::Make(
sk_sp<DisplayList> display_list,
const SkISize& size,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
+ fml::RefPtr<fml::TaskRunner> raster_task_runner) {
return sk_sp<DlDeferredImageGPUImpeller>(new DlDeferredImageGPUImpeller(
DlDeferredImageGPUImpeller::ImageWrapper::Make(
std::move(display_list), size, std::move(snapshot_delegate),
- raster_task_runner)));
-}
-
-sk_sp<DlDeferredImageGPUImpeller> DlDeferredImageGPUImpeller::Make(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- const SkISize& size,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- return sk_sp<DlDeferredImageGPUImpeller>(new DlDeferredImageGPUImpeller(
- DlDeferredImageGPUImpeller::ImageWrapper::Make(
- impeller_picture, size, std::move(snapshot_delegate),
- raster_task_runner)));
+ std::move(raster_task_runner))));
}
DlDeferredImageGPUImpeller::DlDeferredImageGPUImpeller(
@@ -108,41 +96,22 @@
sk_sp<DisplayList> display_list,
const SkISize& size,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- auto wrapper = std::shared_ptr<ImageWrapper>(
- new ImageWrapper(std::move(display_list), size,
- std::move(snapshot_delegate), raster_task_runner));
+ fml::RefPtr<fml::TaskRunner> raster_task_runner) {
+ auto wrapper = std::shared_ptr<ImageWrapper>(new ImageWrapper(
+ std::move(display_list), size, std::move(snapshot_delegate),
+ std::move(raster_task_runner)));
wrapper->SnapshotDisplayList();
return wrapper;
}
std::shared_ptr<DlDeferredImageGPUImpeller::ImageWrapper>
DlDeferredImageGPUImpeller::ImageWrapper::Make(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- const SkISize& size,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- auto wrapper = std::shared_ptr<ImageWrapper>(new ImageWrapper(size));
- wrapper->SnapshotPicture(impeller_picture, std::move(snapshot_delegate),
- raster_task_runner);
- return wrapper;
-}
-
-std::shared_ptr<DlDeferredImageGPUImpeller::ImageWrapper>
-DlDeferredImageGPUImpeller::ImageWrapper::Make(
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- if (layer_tree) {
- auto wrapper = std::shared_ptr<ImageWrapper>(
- new ImageWrapper(layer_tree->frame_size()));
- wrapper->SnapshotLayer(std::move(layer_tree), std::move(snapshot_delegate),
- raster_task_runner);
- return wrapper;
- }
- auto wrapper = std::shared_ptr<ImageWrapper>(
- new ImageWrapper(sk_sp<DisplayList>(), layer_tree->frame_size(),
- std::move(snapshot_delegate), raster_task_runner));
+ fml::RefPtr<fml::TaskRunner> raster_task_runner) {
+ auto wrapper = std::shared_ptr<ImageWrapper>(new ImageWrapper(
+ nullptr, layer_tree->frame_size(), std::move(snapshot_delegate),
+ std::move(raster_task_runner)));
wrapper->SnapshotDisplayList(std::move(layer_tree));
return wrapper;
}
@@ -157,84 +126,14 @@
snapshot_delegate_(std::move(snapshot_delegate)),
raster_task_runner_(std::move(raster_task_runner)) {}
-DlDeferredImageGPUImpeller::ImageWrapper::ImageWrapper(const SkISize& size)
- : size_(size) {}
-
-void DlDeferredImageGPUImpeller::ImageWrapper::SnapshotPicture(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- fml::TaskRunner::RunNowOrPostTask(
- raster_task_runner,
- fml::MakeCopyable([weak_this = weak_from_this(), impeller_picture,
- snapshot_delegate = std::move(snapshot_delegate)]() {
- TRACE_EVENT0("flutter", "SnapshotPicture (impeller)");
- auto wrapper = weak_this.lock();
- if (!wrapper) {
- return;
- }
- if (!snapshot_delegate) {
- return;
- }
-
- wrapper->texture_registry_ = snapshot_delegate->GetTextureRegistry();
-
- auto snapshot = snapshot_delegate->MakeRasterSnapshot(impeller_picture,
- wrapper->size_);
- if (!snapshot) {
- std::scoped_lock lock(wrapper->error_mutex_);
- wrapper->error_ = "Failed to create snapshot.";
- return;
- }
- wrapper->texture_ = snapshot->impeller_texture();
- }));
-}
-
-void DlDeferredImageGPUImpeller::ImageWrapper::SnapshotLayer(
- std::unique_ptr<LayerTree> layer_tree,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner) {
- fml::TaskRunner::RunNowOrPostTask(
- raster_task_runner,
- fml::MakeCopyable([weak_this = weak_from_this(),
- layer_tree = std::move(layer_tree),
- snapshot_delegate = std::move(snapshot_delegate)]() {
- TRACE_EVENT0("flutter", "SnapshotLayer (impeller)");
- auto wrapper = weak_this.lock();
- if (!wrapper) {
- return;
- }
- if (!snapshot_delegate) {
- return;
- }
-
- wrapper->texture_registry_ = snapshot_delegate->GetTextureRegistry();
-
- auto impeller_picture = layer_tree->FlattenToImpellerPicture(
- SkRect::MakeWH(wrapper->size_.width(), wrapper->size_.height()),
- wrapper->texture_registry_);
- auto snapshot = snapshot_delegate->MakeRasterSnapshot(impeller_picture,
- wrapper->size_);
- if (!snapshot) {
- std::scoped_lock lock(wrapper->error_mutex_);
- wrapper->error_ = "Failed to create snapshot.";
- return;
- }
- wrapper->texture_ = snapshot->impeller_texture();
- }));
-}
-
DlDeferredImageGPUImpeller::ImageWrapper::~ImageWrapper() {
- if (display_list_) {
- fml::TaskRunner::RunNowOrPostTask(
- raster_task_runner_,
- [id = reinterpret_cast<uintptr_t>(this),
- texture_registry = std::move(texture_registry_)]() {
- if (texture_registry) {
- texture_registry->UnregisterContextListener(id);
- }
- });
- }
+ fml::TaskRunner::RunNowOrPostTask(
+ raster_task_runner_, [id = reinterpret_cast<uintptr_t>(this),
+ texture_registry = std::move(texture_registry_)]() {
+ if (texture_registry) {
+ texture_registry->UnregisterContextListener(id);
+ }
+ });
}
void DlDeferredImageGPUImpeller::ImageWrapper::OnGrContextCreated() {
@@ -243,9 +142,8 @@
}
void DlDeferredImageGPUImpeller::ImageWrapper::OnGrContextDestroyed() {
- if (display_list_) {
- texture_.reset();
- }
+ // Impeller textures do not have threading requirements for deletion, and
+ texture_.reset();
}
bool DlDeferredImageGPUImpeller::ImageWrapper::isTextureBacked() const {
@@ -254,7 +152,6 @@
void DlDeferredImageGPUImpeller::ImageWrapper::SnapshotDisplayList(
std::unique_ptr<LayerTree> layer_tree) {
- FML_DCHECK(display_list_ || layer_tree);
fml::TaskRunner::RunNowOrPostTask(
raster_task_runner_,
fml::MakeCopyable([weak_this = weak_from_this(),
diff --git a/lib/ui/painting/display_list_deferred_image_gpu_impeller.h b/lib/ui/painting/display_list_deferred_image_gpu_impeller.h
index 2e57f1b..caed73a7c 100644
--- a/lib/ui/painting/display_list_deferred_image_gpu_impeller.h
+++ b/lib/ui/painting/display_list_deferred_image_gpu_impeller.h
@@ -20,19 +20,13 @@
static sk_sp<DlDeferredImageGPUImpeller> Make(
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
+ fml::RefPtr<fml::TaskRunner> raster_task_runner);
static sk_sp<DlDeferredImageGPUImpeller> Make(
sk_sp<DisplayList> display_list,
const SkISize& size,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
-
- static sk_sp<DlDeferredImageGPUImpeller> Make(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- const SkISize& size,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
+ fml::RefPtr<fml::TaskRunner> raster_task_runner);
// |DlImage|
~DlDeferredImageGPUImpeller() override;
@@ -73,18 +67,12 @@
sk_sp<DisplayList> display_list,
const SkISize& size,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
-
- static std::shared_ptr<ImageWrapper> Make(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- const SkISize& size,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
+ fml::RefPtr<fml::TaskRunner> raster_task_runner);
static std::shared_ptr<ImageWrapper> Make(
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
+ fml::RefPtr<fml::TaskRunner> raster_task_runner);
bool isTextureBacked() const;
@@ -113,18 +101,6 @@
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
fml::RefPtr<fml::TaskRunner> raster_task_runner);
- explicit ImageWrapper(const SkISize& size);
-
- void SnapshotPicture(
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
-
- void SnapshotLayer(
- std::unique_ptr<LayerTree> layer_tree,
- fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner);
-
// If a layer tree is provided, it will be flattened during the raster
// thread task spawned by this method. After being flattened into a display
// list, the image wrapper will be updated to hold this display list and the
diff --git a/lib/ui/painting/picture.cc b/lib/ui/painting/picture.cc
index 08c1ceb..74c7b0d 100644
--- a/lib/ui/painting/picture.cc
+++ b/lib/ui/painting/picture.cc
@@ -16,6 +16,9 @@
#endif // IMPELLER_SUPPORTS_RENDERING
#include "flutter/lib/ui/painting/display_list_image_gpu.h"
#include "third_party/tonic/converter/dart_converter.h"
+#include "third_party/tonic/dart_args.h"
+#include "third_party/tonic/dart_binding_macros.h"
+#include "third_party/tonic/dart_library_natives.h"
#include "third_party/tonic/dart_persistent_value.h"
#include "third_party/tonic/logging/dart_invoke.h"
@@ -24,53 +27,48 @@
IMPLEMENT_WRAPPERTYPEINFO(ui, Picture);
fml::RefPtr<Picture> Picture::Create(Dart_Handle dart_handle,
- DisplayListOrPicture picture) {
- auto canvas_picture = fml::MakeRefCounted<Picture>(std::move(picture));
+ sk_sp<DisplayList> display_list) {
+ FML_DCHECK(display_list->isUIThreadSafe());
+ auto canvas_picture = fml::MakeRefCounted<Picture>(std::move(display_list));
canvas_picture->AssociateWithDartWrapper(dart_handle);
return canvas_picture;
}
-Picture::Picture(DisplayListOrPicture picture) : picture_(std::move(picture)) {}
+Picture::Picture(sk_sp<DisplayList> display_list)
+ : display_list_(std::move(display_list)) {}
Picture::~Picture() = default;
Dart_Handle Picture::toImage(uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback) {
- if (!impeller_picture() && !display_list()) {
+ if (!display_list_) {
return tonic::ToDart("Picture is null");
}
- return RasterizeToImage(width, height, raw_image_callback);
+ return RasterizeToImage(display_list_, width, height, raw_image_callback);
}
void Picture::toImageSync(uint32_t width,
uint32_t height,
Dart_Handle raw_image_handle) {
- FML_DCHECK(impeller_picture() || display_list());
- RasterizeToImageSync(width, height, raw_image_handle);
+ FML_DCHECK(display_list_);
+ RasterizeToImageSync(display_list_, width, height, raw_image_handle);
}
static sk_sp<DlImage> CreateDeferredImage(
bool impeller,
sk_sp<DisplayList> display_list,
- const std::shared_ptr<const impeller::Picture>& impeller_picture,
uint32_t width,
uint32_t height,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
+ fml::RefPtr<fml::TaskRunner> raster_task_runner,
fml::RefPtr<SkiaUnrefQueue> unref_queue) {
#if IMPELLER_SUPPORTS_RENDERING
if (impeller) {
- if (display_list) {
- return DlDeferredImageGPUImpeller::Make(
- std::move(display_list), SkISize::Make(width, height),
- std::move(snapshot_delegate), raster_task_runner);
- }
- FML_DCHECK(impeller_picture);
return DlDeferredImageGPUImpeller::Make(
- impeller_picture, SkISize::Make(width, height),
- std::move(snapshot_delegate), raster_task_runner);
+ std::move(display_list), SkISize::Make(width, height),
+ std::move(snapshot_delegate), std::move(raster_task_runner));
}
#endif // IMPELLER_SUPPORTS_RENDERING
@@ -81,126 +79,66 @@
raster_task_runner, std::move(unref_queue));
}
-void Picture::RasterizeToImageSync(uint32_t width,
+// static
+void Picture::RasterizeToImageSync(sk_sp<DisplayList> display_list,
+ uint32_t width,
uint32_t height,
Dart_Handle raw_image_handle) {
auto* dart_state = UIDartState::Current();
if (!dart_state) {
return;
}
- auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
auto unref_queue = dart_state->GetSkiaUnrefQueue();
auto snapshot_delegate = dart_state->GetSnapshotDelegate();
+ auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
auto image = CanvasImage::Create();
auto dl_image = CreateDeferredImage(
- dart_state->IsImpellerEnabled(), display_list(), impeller_picture(),
- width, height, std::move(snapshot_delegate), raster_task_runner,
+ dart_state->IsImpellerEnabled(), std::move(display_list), width, height,
+ std::move(snapshot_delegate), std::move(raster_task_runner),
std::move(unref_queue));
-
image->set_image(dl_image);
image->AssociateWithDartWrapper(raw_image_handle);
}
void Picture::dispose() {
- picture_ = sk_sp<DisplayList>(nullptr);
+ display_list_.reset();
ClearDartWrapper();
}
size_t Picture::GetAllocationSize() const {
- auto size = sizeof(Picture);
- if (display_list()) {
- size += display_list()->bytes();
+ if (display_list_) {
+ return display_list_->bytes() + sizeof(Picture);
+ } else {
+ return sizeof(Picture);
}
- // TODO(dnfield): Add support to EntityPass to get its allocation size.
- return size;
}
-Dart_Handle Picture::RasterizeToImage(uint32_t width,
+Dart_Handle Picture::RasterizeToImage(const sk_sp<DisplayList>& display_list,
+ uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback) {
- return DoRasterizeToImage(width, height, raw_image_callback);
+ return DoRasterizeToImage(display_list, nullptr, width, height,
+ raw_image_callback);
}
Dart_Handle Picture::RasterizeLayerTreeToImage(
std::unique_ptr<LayerTree> layer_tree,
Dart_Handle raw_image_callback) {
FML_DCHECK(layer_tree != nullptr);
- auto* dart_state = UIDartState::Current();
- auto image_callback = std::make_unique<tonic::DartPersistentValue>(
- dart_state, raw_image_callback);
- auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
- auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
-
- auto unref_queue = dart_state->GetSkiaUnrefQueue();
- auto snapshot_delegate = dart_state->GetSnapshotDelegate();
-
- // We can't create an image on this task runner because we don't have a
- // graphics context. Even if we did, it would be slow anyway. Also, this
- // thread owns the sole reference to the layer tree. So we do it in the
- // raster thread.
-
- auto ui_task =
- // The static leak checker gets confused by the use of
- // fml::MakeCopyable.
- // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
- fml::MakeCopyable([image_callback = std::move(image_callback),
- unref_queue](sk_sp<DlImage> image) mutable {
- auto dart_state = image_callback->dart_state().lock();
- if (!dart_state) {
- // The root isolate could have died in the meantime.
- return;
- }
- tonic::DartState::Scope scope(dart_state);
-
- if (!image) {
- tonic::DartInvoke(image_callback->Get(), {Dart_Null()});
- return;
- }
-
- if (!image->isUIThreadSafe()) {
- // All images with impeller textures should already be safe.
- FML_DCHECK(image->impeller_texture() == nullptr);
- image =
- DlImageGPU::Make({image->skia_image(), std::move(unref_queue)});
- }
-
- auto dart_image = CanvasImage::Create();
- dart_image->set_image(image);
- auto* raw_dart_image = tonic::ToDart(dart_image);
-
- // All done!
- tonic::DartInvoke(image_callback->Get(), {raw_dart_image});
-
- // image_callback is associated with the Dart isolate and must be
- // deleted on the UI thread.
- image_callback.reset();
- });
-
- // Kick things off on the raster rask runner.
- fml::TaskRunner::RunNowOrPostTask(
- raster_task_runner,
- fml::MakeCopyable([ui_task_runner, snapshot_delegate, ui_task,
- layer_tree = std::move(layer_tree)]() mutable {
- sk_sp<DlImage> image;
- auto display_list = layer_tree->Flatten(
- SkRect::MakeXYWH(0, 0, layer_tree->frame_size().width(),
- layer_tree->frame_size().height()),
- snapshot_delegate->GetTextureRegistry(),
- snapshot_delegate->GetGrContext());
-
- image = snapshot_delegate->MakeRasterSnapshot(display_list,
- layer_tree->frame_size());
- fml::TaskRunner::RunNowOrPostTask(
- ui_task_runner, [ui_task, image]() { ui_task(image); });
- }));
-
- return Dart_Null();
+ auto frame_size = layer_tree->frame_size();
+ return DoRasterizeToImage(nullptr, std::move(layer_tree), frame_size.width(),
+ frame_size.height(), raw_image_callback);
}
-Dart_Handle Picture::DoRasterizeToImage(uint32_t width,
+Dart_Handle Picture::DoRasterizeToImage(const sk_sp<DisplayList>& display_list,
+ std::unique_ptr<LayerTree> layer_tree,
+ uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback) {
+ // Either display_list or layer_tree should be provided.
+ FML_DCHECK((display_list == nullptr) != (layer_tree == nullptr));
+
if (Dart_IsNull(raw_image_callback) || !Dart_IsClosure(raw_image_callback)) {
return tonic::ToDart("Image callback was invalid");
}
@@ -212,10 +150,9 @@
auto* dart_state = UIDartState::Current();
auto image_callback = std::make_unique<tonic::DartPersistentValue>(
dart_state, raw_image_callback);
+ auto unref_queue = dart_state->GetSkiaUnrefQueue();
auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
-
- auto unref_queue = dart_state->GetSkiaUnrefQueue();
auto snapshot_delegate = dart_state->GetSnapshotDelegate();
// We can't create an image on this task runner because we don't have a
@@ -224,8 +161,7 @@
// raster thread.
auto ui_task =
- // The static leak checker gets confused by the use of
- // fml::MakeCopyable.
+ // The static leak checker gets confused by the use of fml::MakeCopyable.
// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
fml::MakeCopyable([image_callback = std::move(image_callback),
unref_queue](sk_sp<DlImage> image) mutable {
@@ -263,18 +199,22 @@
// Kick things off on the raster rask runner.
fml::TaskRunner::RunNowOrPostTask(
raster_task_runner,
- fml::MakeCopyable([ui_task_runner, snapshot_delegate,
- display_list = display_list(),
- impeller_picture = impeller_picture(), width, height,
- ui_task]() mutable {
+ fml::MakeCopyable([ui_task_runner, snapshot_delegate, display_list, width,
+ height, ui_task,
+ layer_tree = std::move(layer_tree)]() mutable {
auto picture_bounds = SkISize::Make(width, height);
sk_sp<DlImage> image;
- if (display_list) {
+ if (layer_tree) {
+ FML_DCHECK(picture_bounds == layer_tree->frame_size());
+ auto display_list =
+ layer_tree->Flatten(SkRect::MakeWH(width, height),
+ snapshot_delegate->GetTextureRegistry(),
+ snapshot_delegate->GetGrContext());
+
image = snapshot_delegate->MakeRasterSnapshot(display_list,
picture_bounds);
} else {
- FML_DCHECK(impeller_picture);
- image = snapshot_delegate->MakeRasterSnapshot(impeller_picture,
+ image = snapshot_delegate->MakeRasterSnapshot(display_list,
picture_bounds);
}
diff --git a/lib/ui/painting/picture.h b/lib/ui/painting/picture.h
index 696de61..6d41cbe 100644
--- a/lib/ui/painting/picture.h
+++ b/lib/ui/painting/picture.h
@@ -5,29 +5,15 @@
#ifndef FLUTTER_LIB_UI_PAINTING_PICTURE_H_
#define FLUTTER_LIB_UI_PAINTING_PICTURE_H_
-#include <variant>
-
#include "flutter/display_list/display_list.h"
#include "flutter/flow/layers/layer_tree.h"
#include "flutter/lib/ui/dart_wrapper.h"
#include "flutter/lib/ui/painting/image.h"
#include "flutter/lib/ui/ui_dart_state.h"
-#include "third_party/skia/include/core/SkPicture.h"
-
-#if IMPELLER_SUPPORTS_RENDERING
-#include "impeller/aiks/picture.h" // nogncheck
-#else // IMPELLER_SUPPORTS_RENDERING
-namespace impeller {
-struct Picture;
-} // namespace impeller
-#endif // !IMPELLER_SUPPORTS_RENDERING
namespace flutter {
class Canvas;
-using DisplayListOrPicture =
- std::variant<sk_sp<DisplayList>, std::shared_ptr<const impeller::Picture>>;
-
class Picture : public RefCountedDartWrappable<Picture> {
DEFINE_WRAPPERTYPEINFO();
FML_FRIEND_MAKE_REF_COUNTED(Picture);
@@ -35,22 +21,9 @@
public:
~Picture() override;
static fml::RefPtr<Picture> Create(Dart_Handle dart_handle,
- DisplayListOrPicture picture);
+ sk_sp<DisplayList> display_list);
- const sk_sp<DisplayList> display_list() const {
- if (std::holds_alternative<sk_sp<DisplayList>>(picture_)) {
- return std::get<sk_sp<DisplayList>>(picture_);
- }
- return nullptr;
- }
-
- std::shared_ptr<const impeller::Picture> impeller_picture() const {
- if (std::holds_alternative<std::shared_ptr<const impeller::Picture>>(
- picture_)) {
- return std::get<std::shared_ptr<const impeller::Picture>>(picture_);
- }
- return nullptr;
- }
+ sk_sp<DisplayList> display_list() const { return display_list_; }
Dart_Handle toImage(uint32_t width,
uint32_t height,
@@ -64,26 +37,34 @@
size_t GetAllocationSize() const;
+ static void RasterizeToImageSync(sk_sp<DisplayList> display_list,
+ uint32_t width,
+ uint32_t height,
+ Dart_Handle raw_image_handle);
+
+ static Dart_Handle RasterizeToImage(const sk_sp<DisplayList>& display_list,
+ uint32_t width,
+ uint32_t height,
+ Dart_Handle raw_image_callback);
+
static Dart_Handle RasterizeLayerTreeToImage(
std::unique_ptr<LayerTree> layer_tree,
Dart_Handle raw_image_callback);
+ // Callers may provide either a display list or a layer tree, but not both.
+ //
+ // If a layer tree is provided, it will be flattened on the raster thread, and
+ // picture_bounds should be the layer tree's frame_size().
+ static Dart_Handle DoRasterizeToImage(const sk_sp<DisplayList>& display_list,
+ std::unique_ptr<LayerTree> layer_tree,
+ uint32_t width,
+ uint32_t height,
+ Dart_Handle raw_image_callback);
+
private:
- explicit Picture(DisplayListOrPicture picture);
+ explicit Picture(sk_sp<DisplayList> display_list);
- DisplayListOrPicture picture_;
-
- void RasterizeToImageSync(uint32_t width,
- uint32_t height,
- Dart_Handle raw_image_handle);
-
- Dart_Handle RasterizeToImage(uint32_t width,
- uint32_t height,
- Dart_Handle raw_image_callback);
-
- Dart_Handle DoRasterizeToImage(uint32_t width,
- uint32_t height,
- Dart_Handle raw_image_callback);
+ sk_sp<DisplayList> display_list_;
};
} // namespace flutter
diff --git a/lib/ui/painting/picture_recorder.cc b/lib/ui/painting/picture_recorder.cc
index 88e1e68..a99b5e5 100644
--- a/lib/ui/painting/picture_recorder.cc
+++ b/lib/ui/painting/picture_recorder.cc
@@ -6,7 +6,6 @@
#include "flutter/lib/ui/painting/canvas.h"
#include "flutter/lib/ui/painting/picture.h"
-#include "impeller/display_list/skia_conversions.h" // nogncheck
#include "third_party/tonic/converter/dart_converter.h"
#include "third_party/tonic/dart_args.h"
#include "third_party/tonic/dart_binding_macros.h"
@@ -26,39 +25,21 @@
PictureRecorder::~PictureRecorder() {}
-DlCanvas* PictureRecorder::BeginRecording(SkRect bounds) {
-#if IMPELLER_SUPPORTS_RENDERING
- if (UIDartState::Current()->IsImpellerEnabled()) {
- dl_aiks_canvas_ = std::make_shared<impeller::DlAiksCanvas>(bounds);
- return dl_aiks_canvas_.get();
- } else {
-#endif // IMPELLER_SUPPORTS_RENDERING
- builder_ = sk_make_sp<DisplayListBuilder>(bounds, /*prepare_rtree=*/true);
- return builder_.get();
-#if IMPELLER_SUPPORTS_RENDERING
- }
-#endif // IMPELLER_SUPPORTS_RENDERING
+sk_sp<DisplayListBuilder> PictureRecorder::BeginRecording(SkRect bounds) {
+ display_list_builder_ =
+ sk_make_sp<DisplayListBuilder>(bounds, /*prepare_rtree=*/true);
+ return display_list_builder_;
}
fml::RefPtr<Picture> PictureRecorder::endRecording(Dart_Handle dart_picture) {
if (!canvas_) {
return nullptr;
}
+
fml::RefPtr<Picture> picture;
-#if IMPELLER_SUPPORTS_RENDERING
- if (UIDartState::Current()->IsImpellerEnabled()) {
- picture = Picture::Create(dart_picture,
- std::make_shared<impeller::Picture>(
- dl_aiks_canvas_->EndRecordingAsPicture()));
- dl_aiks_canvas_ = nullptr;
- } else {
-#endif
- picture = Picture::Create(dart_picture, builder_->Build());
- builder_ = nullptr;
-#if IMPELLER_SUPPORTS_RENDERING
- }
-#endif // IMPELLER_SUPPORTS_RENDERING
+ picture = Picture::Create(dart_picture, display_list_builder_->Build());
+ display_list_builder_ = nullptr;
canvas_->Invalidate();
canvas_ = nullptr;
diff --git a/lib/ui/painting/picture_recorder.h b/lib/ui/painting/picture_recorder.h
index ff0c379..c5046a4 100644
--- a/lib/ui/painting/picture_recorder.h
+++ b/lib/ui/painting/picture_recorder.h
@@ -5,19 +5,9 @@
#ifndef FLUTTER_LIB_UI_PAINTING_PICTURE_RECORDER_H_
#define FLUTTER_LIB_UI_PAINTING_PICTURE_RECORDER_H_
-#include <variant>
-
#include "flutter/display_list/dl_builder.h"
#include "flutter/lib/ui/dart_wrapper.h"
-#if IMPELLER_SUPPORTS_RENDERING
-#include "impeller/display_list/dl_aiks_canvas.h" // nogncheck
-#else // IMPELLER_SUPPORTS_RENDERING
-namespace impeller {
-class DlAiksCanvas;
-} // namespace impeller
-#endif // !IMPELLER_SUPPORTS_RENDERING
-
namespace flutter {
class Canvas;
class Picture;
@@ -31,7 +21,7 @@
~PictureRecorder() override;
- DlCanvas* BeginRecording(SkRect bounds);
+ sk_sp<DisplayListBuilder> BeginRecording(SkRect bounds);
fml::RefPtr<Picture> endRecording(Dart_Handle dart_picture);
void set_canvas(fml::RefPtr<Canvas> canvas) { canvas_ = std::move(canvas); }
@@ -39,8 +29,7 @@
private:
PictureRecorder();
- std::shared_ptr<impeller::DlAiksCanvas> dl_aiks_canvas_;
- sk_sp<DisplayListBuilder> builder_;
+ sk_sp<DisplayListBuilder> display_list_builder_;
fml::RefPtr<Canvas> canvas_;
};
diff --git a/lib/ui/snapshot_delegate.h b/lib/ui/snapshot_delegate.h
index d82f39e..2c3677d 100644
--- a/lib/ui/snapshot_delegate.h
+++ b/lib/ui/snapshot_delegate.h
@@ -70,10 +70,6 @@
virtual sk_sp<DlImage> MakeRasterSnapshot(sk_sp<DisplayList> display_list,
SkISize picture_size) = 0;
- virtual sk_sp<DlImage> MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize picture_size) = 0;
-
virtual sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) = 0;
};
diff --git a/lib/ui/text/paragraph.cc b/lib/ui/text/paragraph.cc
index 4c75bde..624ed14 100644
--- a/lib/ui/text/paragraph.cc
+++ b/lib/ui/text/paragraph.cc
@@ -64,9 +64,9 @@
return;
}
- DlCanvas* dl_canvas = canvas->dl_canvas();
- if (dl_canvas) {
- m_paragraph->Paint(dl_canvas, x, y);
+ DisplayListBuilder* builder = canvas->builder();
+ if (builder) {
+ m_paragraph->Paint(builder, x, y);
}
}
diff --git a/shell/common/BUILD.gn b/shell/common/BUILD.gn
index 978aaa7..c5a4db9 100644
--- a/shell/common/BUILD.gn
+++ b/shell/common/BUILD.gn
@@ -85,6 +85,8 @@
"context_options.h",
"display_manager.cc",
"display_manager.h",
+ "dl_op_spy.cc",
+ "dl_op_spy.h",
"engine.cc",
"engine.h",
"pipeline.cc",
@@ -292,6 +294,7 @@
sources = [
"animator_unittests.cc",
"context_options_unittests.cc",
+ "dl_op_spy_unittests.cc",
"engine_unittests.cc",
"input_events_unittests.cc",
"persistent_cache_unittests.cc",
diff --git a/display_list/dl_op_spy.cc b/shell/common/dl_op_spy.cc
similarity index 98%
rename from display_list/dl_op_spy.cc
rename to shell/common/dl_op_spy.cc
index 6597bfd..15910fc 100644
--- a/display_list/dl_op_spy.cc
+++ b/shell/common/dl_op_spy.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "flutter/display_list/dl_op_spy.h"
+#include "flutter/shell/common/dl_op_spy.h"
namespace flutter {
diff --git a/display_list/dl_op_spy.h b/shell/common/dl_op_spy.h
similarity index 96%
rename from display_list/dl_op_spy.h
rename to shell/common/dl_op_spy.h
index 30a0578..1cb29ff 100644
--- a/display_list/dl_op_spy.h
+++ b/shell/common/dl_op_spy.h
@@ -2,7 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#pragma once
+#ifndef FLUTTER_DISPLAY_LIST_DL_OP_SPY_H_
+#define FLUTTER_DISPLAY_LIST_DL_OP_SPY_H_
#include "flutter/display_list/dl_op_receiver.h"
#include "flutter/display_list/utils/dl_receiver_utils.h"
@@ -104,3 +105,5 @@
};
} // namespace flutter
+
+#endif // FLUTTER_DISPLAY_LIST_DL_OP_SPY_H_
diff --git a/display_list/dl_op_spy_unittests.cc b/shell/common/dl_op_spy_unittests.cc
similarity index 99%
rename from display_list/dl_op_spy_unittests.cc
rename to shell/common/dl_op_spy_unittests.cc
index b1d6598..7aaac1c 100644
--- a/display_list/dl_op_spy_unittests.cc
+++ b/shell/common/dl_op_spy_unittests.cc
@@ -4,7 +4,7 @@
#include "flutter/display_list/display_list.h"
#include "flutter/display_list/dl_builder.h"
-#include "flutter/display_list/dl_op_spy.h"
+#include "flutter/shell/common/dl_op_spy.h"
#include "flutter/testing/testing.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkRSXform.h"
diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc
index 0674299..d7d1338 100644
--- a/shell/common/rasterizer.cc
+++ b/shell/common/rasterizer.cc
@@ -372,12 +372,6 @@
return snapshot_controller_->MakeRasterSnapshot(display_list, picture_size);
}
-sk_sp<DlImage> Rasterizer::MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize picture_size) {
- return snapshot_controller_->MakeRasterSnapshot(picture, picture_size);
-}
-
sk_sp<SkImage> Rasterizer::ConvertToRasterImage(sk_sp<SkImage> image) {
TRACE_EVENT0("flutter", __FUNCTION__);
return snapshot_controller_->ConvertToRasterImage(image);
diff --git a/shell/common/rasterizer.h b/shell/common/rasterizer.h
index f6783c5..b172423 100644
--- a/shell/common/rasterizer.h
+++ b/shell/common/rasterizer.h
@@ -510,11 +510,6 @@
SkISize picture_size) override;
// |SnapshotDelegate|
- sk_sp<DlImage> MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize picture_size) override;
-
- // |SnapshotDelegate|
sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) override;
// |Stopwatch::Delegate|
diff --git a/shell/common/snapshot_controller.h b/shell/common/snapshot_controller.h
index a5709f9..c402c3e 100644
--- a/shell/common/snapshot_controller.h
+++ b/shell/common/snapshot_controller.h
@@ -42,10 +42,6 @@
virtual sk_sp<DlImage> MakeRasterSnapshot(sk_sp<DisplayList> display_list,
SkISize size) = 0;
- virtual sk_sp<DlImage> MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize size) = 0;
-
virtual sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) = 0;
protected:
diff --git a/shell/common/snapshot_controller_impeller.cc b/shell/common/snapshot_controller_impeller.cc
index 79c3bf5..ea68bd9 100644
--- a/shell/common/snapshot_controller_impeller.cc
+++ b/shell/common/snapshot_controller_impeller.cc
@@ -30,36 +30,13 @@
return result;
}
-sk_sp<DlImage> SnapshotControllerImpeller::MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize size) {
- sk_sp<DlImage> result;
- if (!picture) {
- return result;
- }
- GetDelegate().GetIsGpuDisabledSyncSwitch()->Execute(
- fml::SyncSwitch::Handlers()
- .SetIfTrue([&] {
- // Do nothing.
- })
- .SetIfFalse([&] { result = DoMakeRasterSnapshot(*picture, size); }));
-
- return result;
-}
-
sk_sp<DlImage> SnapshotControllerImpeller::DoMakeRasterSnapshot(
const sk_sp<DisplayList>& display_list,
SkISize size) {
TRACE_EVENT0("flutter", __FUNCTION__);
impeller::DlDispatcher dispatcher;
display_list->Dispatch(dispatcher);
- return DoMakeRasterSnapshot(dispatcher.EndRecordingAsPicture(), size);
-}
-
-sk_sp<DlImage> SnapshotControllerImpeller::DoMakeRasterSnapshot(
- const impeller::Picture& picture,
- SkISize size) {
- TRACE_EVENT0("flutter", __FUNCTION__);
+ impeller::Picture picture = dispatcher.EndRecordingAsPicture();
auto context = GetDelegate().GetAiksContext();
if (context) {
auto max_size = context->GetContext()
diff --git a/shell/common/snapshot_controller_impeller.h b/shell/common/snapshot_controller_impeller.h
index 5bd40a9..d9f1d63 100644
--- a/shell/common/snapshot_controller_impeller.h
+++ b/shell/common/snapshot_controller_impeller.h
@@ -18,19 +18,12 @@
sk_sp<DlImage> MakeRasterSnapshot(sk_sp<DisplayList> display_list,
SkISize size) override;
- sk_sp<DlImage> MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize size) override;
-
sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) override;
private:
sk_sp<DlImage> DoMakeRasterSnapshot(const sk_sp<DisplayList>& display_list,
SkISize size);
- sk_sp<DlImage> DoMakeRasterSnapshot(const impeller::Picture& picture,
- SkISize size);
-
FML_DISALLOW_COPY_AND_ASSIGN(SnapshotControllerImpeller);
};
diff --git a/shell/common/snapshot_controller_skia.cc b/shell/common/snapshot_controller_skia.cc
index 096dfac..fe7897f 100644
--- a/shell/common/snapshot_controller_skia.cc
+++ b/shell/common/snapshot_controller_skia.cc
@@ -137,13 +137,6 @@
});
}
-sk_sp<DlImage> SnapshotControllerSkia::MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize size) {
- FML_DCHECK(false);
- return sk_sp<DlImage>();
-}
-
sk_sp<SkImage> SnapshotControllerSkia::ConvertToRasterImage(
sk_sp<SkImage> image) {
// If the rasterizer does not have a surface with a GrContext, then it will
diff --git a/shell/common/snapshot_controller_skia.h b/shell/common/snapshot_controller_skia.h
index 09a48a4..8be1d8e 100644
--- a/shell/common/snapshot_controller_skia.h
+++ b/shell/common/snapshot_controller_skia.h
@@ -18,10 +18,6 @@
sk_sp<DlImage> MakeRasterSnapshot(sk_sp<DisplayList> display_list,
SkISize size) override;
- sk_sp<DlImage> MakeRasterSnapshot(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkISize size) override;
-
virtual sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) override;
private:
diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc
index 8b6f335..8437294 100644
--- a/shell/gpu/gpu_surface_gl_impeller.cc
+++ b/shell/gpu/gpu_surface_gl_impeller.cc
@@ -5,6 +5,7 @@
#include "flutter/shell/gpu/gpu_surface_gl_impeller.h"
#include "flutter/fml/make_copyable.h"
+#include "flutter/impeller/display_list/dl_dispatcher.h"
#include "flutter/impeller/renderer/backend/gles/surface_gles.h"
#include "flutter/impeller/renderer/renderer.h"
@@ -99,14 +100,27 @@
return false;
}
- auto picture = surface_frame.GetImpellerPicture();
+ auto display_list = surface_frame.BuildDisplayList();
+ if (!display_list) {
+ FML_LOG(ERROR) << "Could not build display list for surface frame.";
+ return false;
+ }
+
+ auto cull_rect =
+ surface->GetTargetRenderPassDescriptor().GetRenderTargetSize();
+ impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect);
+ impeller::DlDispatcher impeller_dispatcher(dl_cull_rect);
+ display_list->Dispatch(
+ impeller_dispatcher,
+ SkIRect::MakeWH(cull_rect.width, cull_rect.height));
+ auto picture = impeller_dispatcher.EndRecordingAsPicture();
return renderer->Render(
std::move(surface),
fml::MakeCopyable(
[aiks_context, picture = std::move(picture)](
impeller::RenderTarget& render_target) -> bool {
- return aiks_context->Render(*picture, render_target);
+ return aiks_context->Render(picture, render_target);
}));
});
diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm
index d20e2ed..32b2f28 100644
--- a/shell/gpu/gpu_surface_metal_impeller.mm
+++ b/shell/gpu/gpu_surface_metal_impeller.mm
@@ -11,6 +11,7 @@
#include "flutter/fml/make_copyable.h"
#include "flutter/fml/mapping.h"
#include "flutter/fml/trace_event.h"
+#include "flutter/impeller/display_list/dl_dispatcher.h"
#include "flutter/impeller/renderer/backend/metal/surface_mtl.h"
static_assert(!__has_feature(objc_arc), "ARC must be disabled.");
@@ -112,6 +113,12 @@
return false;
}
+ auto display_list = surface_frame.BuildDisplayList();
+ if (!display_list) {
+ FML_LOG(ERROR) << "Could not build display list for surface frame.";
+ return false;
+ }
+
if (!disable_partial_repaint_) {
uintptr_t texture = reinterpret_cast<uintptr_t>(last_texture);
@@ -141,13 +148,17 @@
return surface->Present();
}
- auto picture = surface_frame.GetImpellerPicture();
+ impeller::IRect cull_rect = surface->coverage();
+ SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.size.width, cull_rect.size.height);
+ impeller::DlDispatcher impeller_dispatcher(cull_rect);
+ display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
+ auto picture = impeller_dispatcher.EndRecordingAsPicture();
return renderer->Render(
std::move(surface),
fml::MakeCopyable([aiks_context, picture = std::move(picture)](
impeller::RenderTarget& render_target) -> bool {
- return aiks_context->Render(*picture, render_target);
+ return aiks_context->Render(picture, render_target);
}));
});
@@ -200,6 +211,12 @@
return false;
}
+ auto display_list = surface_frame.BuildDisplayList();
+ if (!display_list) {
+ FML_LOG(ERROR) << "Could not build display list for surface frame.";
+ return false;
+ }
+
if (!disable_partial_repaint_) {
uintptr_t texture_ptr = reinterpret_cast<uintptr_t>(mtl_texture);
@@ -229,13 +246,17 @@
return surface->Present();
}
- auto picture = surface_frame.GetImpellerPicture();
+ impeller::IRect cull_rect = surface->coverage();
+ SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.size.width, cull_rect.size.height);
+ impeller::DlDispatcher impeller_dispatcher(cull_rect);
+ display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
+ auto picture = impeller_dispatcher.EndRecordingAsPicture();
return renderer->Render(
std::move(surface),
fml::MakeCopyable([aiks_context, picture = std::move(picture)](
impeller::RenderTarget& render_target) -> bool {
- return aiks_context->Render(*picture, render_target);
+ return aiks_context->Render(picture, render_target);
}));
delegate->PresentTexture(texture_info);
diff --git a/shell/gpu/gpu_surface_vulkan_impeller.cc b/shell/gpu/gpu_surface_vulkan_impeller.cc
index d182b00..42c5f1d 100644
--- a/shell/gpu/gpu_surface_vulkan_impeller.cc
+++ b/shell/gpu/gpu_surface_vulkan_impeller.cc
@@ -5,6 +5,7 @@
#include "flutter/shell/gpu/gpu_surface_vulkan_impeller.h"
#include "flutter/fml/make_copyable.h"
+#include "flutter/impeller/display_list/dl_dispatcher.h"
#include "flutter/impeller/renderer/renderer.h"
#include "impeller/renderer/backend/vulkan/surface_context_vk.h"
#include "impeller/renderer/surface.h"
@@ -66,14 +67,27 @@
return false;
}
- auto picture = surface_frame.GetImpellerPicture();
+ auto display_list = surface_frame.BuildDisplayList();
+ if (!display_list) {
+ FML_LOG(ERROR) << "Could not build display list for surface frame.";
+ return false;
+ }
+
+ auto cull_rect =
+ surface->GetTargetRenderPassDescriptor().GetRenderTargetSize();
+ impeller::Rect dl_cull_rect = impeller::Rect::MakeSize(cull_rect);
+ impeller::DlDispatcher impeller_dispatcher(dl_cull_rect);
+ display_list->Dispatch(
+ impeller_dispatcher,
+ SkIRect::MakeWH(cull_rect.width, cull_rect.height));
+ auto picture = impeller_dispatcher.EndRecordingAsPicture();
return renderer->Render(
std::move(surface),
fml::MakeCopyable(
[aiks_context, picture = std::move(picture)](
impeller::RenderTarget& render_target) -> bool {
- return aiks_context->Render(*picture, render_target);
+ return aiks_context->Render(picture, render_target);
}));
});
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.cc b/shell/platform/android/external_view_embedder/external_view_embedder.cc
index 10fc5fc..d29a80e 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder.cc
+++ b/shell/platform/android/external_view_embedder/external_view_embedder.cc
@@ -12,15 +12,13 @@
const AndroidContext& android_context,
std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
std::shared_ptr<AndroidSurfaceFactory> surface_factory,
- const TaskRunners& task_runners,
- bool enable_impeller)
+ const TaskRunners& task_runners)
: ExternalViewEmbedder(),
android_context_(android_context),
jni_facade_(std::move(jni_facade)),
surface_factory_(std::move(surface_factory)),
surface_pool_(std::make_unique<SurfacePool>()),
- task_runners_(task_runners),
- enable_impeller_(enable_impeller) {}
+ task_runners_(task_runners) {}
// |ExternalViewEmbedder|
void AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView(
@@ -31,11 +29,7 @@
SkRect view_bounds = SkRect::Make(frame_size_);
std::unique_ptr<EmbedderViewSlice> view;
- if (enable_impeller_) {
- view = std::make_unique<ImpellerEmbedderViewSlice>(view_bounds);
- } else {
- view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
- }
+ view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
slices_.insert_or_assign(view_id, std::move(view));
composition_order_.push_back(view_id);
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.h b/shell/platform/android/external_view_embedder/external_view_embedder.h
index 0f1d69e..400b43f 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder.h
+++ b/shell/platform/android/external_view_embedder/external_view_embedder.h
@@ -32,8 +32,7 @@
const AndroidContext& android_context,
std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
std::shared_ptr<AndroidSurfaceFactory> surface_factory,
- const TaskRunners& task_runners,
- bool enable_impeller);
+ const TaskRunners& task_runners);
// |ExternalViewEmbedder|
void PrerollCompositeEmbeddedView(
@@ -124,8 +123,6 @@
// The number of platform views in the previous frame.
int64_t previous_frame_view_count_;
- bool enable_impeller_ = false;
-
// Destroys the surfaces created from the surface factory.
// This method schedules a task on the platform thread, and waits for
// the task until it completes.
diff --git a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
index 40d9e9f..e6417a0 100644
--- a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
+++ b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc
@@ -107,7 +107,7 @@
TEST(AndroidExternalViewEmbedder, CompositeEmbeddedView) {
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, nullptr, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, nullptr, nullptr, GetTaskRunnersForFixture());
ASSERT_EQ(nullptr, embedder->CompositeEmbeddedView(0));
embedder->PrerollCompositeEmbeddedView(
@@ -123,7 +123,7 @@
TEST(AndroidExternalViewEmbedder, CancelFrame) {
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, nullptr, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, nullptr, nullptr, GetTaskRunnersForFixture());
embedder->PrerollCompositeEmbeddedView(
0, std::make_unique<EmbeddedViewParams>());
@@ -136,7 +136,7 @@
auto jni_mock = std::make_shared<JNIMock>();
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
@@ -170,7 +170,7 @@
auto jni_mock = std::make_shared<JNIMock>();
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
@@ -191,7 +191,7 @@
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
GetThreadMergerFromPlatformThread(&rasterizer_thread);
@@ -219,7 +219,7 @@
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
GetThreadMergerFromPlatformThread(&rasterizer_thread);
@@ -295,8 +295,7 @@
return android_surface_mock;
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
auto raster_thread_merger = GetThreadMergerFromPlatformThread();
@@ -495,8 +494,7 @@
return android_surface_mock;
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
auto raster_thread_merger = GetThreadMergerFromPlatformThread();
@@ -594,8 +592,7 @@
return android_surface_mock;
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
auto raster_thread_merger = GetThreadMergerFromPlatformThread();
@@ -698,8 +695,7 @@
return android_surface_mock;
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
auto raster_thread_merger = GetThreadMergerFromPlatformThread();
@@ -739,7 +735,7 @@
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
// While on the raster thread, don't make JNI calls as these methods can only
// run on the platform thread.
@@ -788,8 +784,7 @@
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
GetThreadMergerFromPlatformThread(&rasterizer_thread);
@@ -877,8 +872,7 @@
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
// ------------------ First frame ------------------ //
{
@@ -936,7 +930,7 @@
auto jni_mock = std::make_shared<JNIMock>();
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
ASSERT_TRUE(embedder->SupportsDynamicThreadMerging());
}
@@ -944,7 +938,7 @@
auto jni_mock = std::make_shared<JNIMock>();
auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
fml::Thread platform_thread("platform");
auto raster_thread_merger = GetThreadMergerFromRasterThread(&platform_thread);
@@ -1000,8 +994,7 @@
});
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture(),
- false);
+ *android_context, jni_mock, surface_factory, GetTaskRunnersForFixture());
fml::Thread rasterizer_thread("rasterizer");
auto raster_thread_merger =
GetThreadMergerFromPlatformThread(&rasterizer_thread);
@@ -1044,7 +1037,7 @@
auto android_context =
std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
- *android_context, jni_mock, nullptr, GetTaskRunnersForFixture(), false);
+ *android_context, jni_mock, nullptr, GetTaskRunnersForFixture());
EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces()).Times(0);
embedder->Teardown();
diff --git a/shell/platform/android/platform_view_android.cc b/shell/platform/android/platform_view_android.cc
index fa5ca62..ff941ef 100644
--- a/shell/platform/android/platform_view_android.cc
+++ b/shell/platform/android/platform_view_android.cc
@@ -336,8 +336,7 @@
std::shared_ptr<ExternalViewEmbedder>
PlatformViewAndroid::CreateExternalViewEmbedder() {
return std::make_shared<AndroidExternalViewEmbedder>(
- *android_context_, jni_facade_, surface_factory_, task_runners_,
- delegate_.OnPlatformViewGetSettings().enable_impeller);
+ *android_context_, jni_facade_, surface_factory_, task_runners_);
}
// |PlatformView|
diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc
index 5bedef5..b5a2931 100644
--- a/shell/platform/embedder/embedder.cc
+++ b/shell/platform/embedder/embedder.cc
@@ -1309,7 +1309,7 @@
return {std::make_unique<flutter::EmbedderExternalViewEmbedder>(
avoid_backing_store_cache, create_render_target_callback,
- present_callback, enable_impeller),
+ present_callback),
false};
}
diff --git a/shell/platform/embedder/embedder_external_view.cc b/shell/platform/embedder/embedder_external_view.cc
index fcb4368..4075b38 100644
--- a/shell/platform/embedder/embedder_external_view.cc
+++ b/shell/platform/embedder/embedder_external_view.cc
@@ -4,8 +4,13 @@
#include "flutter/shell/platform/embedder/embedder_external_view.h"
-#include "flow/embedded_views.h"
+#include "flutter/display_list/dl_builder.h"
#include "flutter/fml/trace_event.h"
+#include "flutter/shell/common/dl_op_spy.h"
+
+#ifdef IMPELLER_SUPPORTS_RENDERING
+#include "impeller/display_list/dl_dispatcher.h" // nogncheck
+#endif // IMPELLER_SUPPORTS_RENDERING
namespace flutter {
@@ -18,37 +23,21 @@
EmbedderExternalView::EmbedderExternalView(
const SkISize& frame_size,
- const SkMatrix& surface_transformation,
- bool enable_impeller)
- : EmbedderExternalView(frame_size,
- surface_transformation,
- {},
- nullptr,
- enable_impeller) {}
+ const SkMatrix& surface_transformation)
+ : EmbedderExternalView(frame_size, surface_transformation, {}, nullptr) {}
EmbedderExternalView::EmbedderExternalView(
const SkISize& frame_size,
const SkMatrix& surface_transformation,
ViewIdentifier view_identifier,
- std::unique_ptr<EmbeddedViewParams> params,
- bool enable_impeller)
+ std::unique_ptr<EmbeddedViewParams> params)
: render_surface_size_(
TransformedSurfaceSize(frame_size, surface_transformation)),
surface_transformation_(surface_transformation),
view_identifier_(view_identifier),
- embedded_view_params_(std::move(params)) {
-#if IMPELLER_SUPPORTS_RENDERING
- if (enable_impeller) {
- slice_ =
- std::make_unique<ImpellerEmbedderViewSlice>(SkRect::Make(frame_size));
- } else {
-#endif // IMPELLER_SUPPORTS_RENDERING
- slice_ = std::make_unique<DisplayListEmbedderViewSlice>(
- SkRect::Make(frame_size));
-#if IMPELLER_SUPPORTS_RENDERING
- }
-#endif // IMPELLER_SUPPORTS_RENDERING
-}
+ embedded_view_params_(std::move(params)),
+ slice_(std::make_unique<DisplayListEmbedderViewSlice>(
+ SkRect::Make(frame_size))) {}
EmbedderExternalView::~EmbedderExternalView() = default;
@@ -78,7 +67,9 @@
return has_engine_rendered_contents_.value();
}
TryEndRecording();
- has_engine_rendered_contents_ = slice_->renders_anything();
+ DlOpSpy dl_op_spy;
+ slice_->dispatch(dl_op_spy);
+ has_engine_rendered_contents_ = dl_op_spy.did_draw() && !slice_->is_empty();
return has_engine_rendered_contents_.value();
}
@@ -103,12 +94,13 @@
if (impeller_target) {
auto aiks_context = render_target.GetAiksContext();
- impeller::DlAiksCanvas dl_canvas(
- SkRect::Make(render_target.GetRenderTargetSize()));
- dl_canvas.SetTransform(&surface_transformation_);
- slice_->render_into(&dl_canvas);
+ auto dl_builder = DisplayListBuilder();
+ dl_builder.SetTransform(&surface_transformation_);
+ slice_->render_into(&dl_builder);
- return aiks_context->Render(dl_canvas.EndRecordingAsPicture(),
+ auto dispatcher = impeller::DlDispatcher();
+ dispatcher.drawDisplayList(dl_builder.Build(), 1);
+ return aiks_context->Render(dispatcher.EndRecordingAsPicture(),
*impeller_target);
}
#endif // IMPELLER_SUPPORTS_RENDERING
diff --git a/shell/platform/embedder/embedder_external_view.h b/shell/platform/embedder/embedder_external_view.h
index e4187b4..2b8e26d 100644
--- a/shell/platform/embedder/embedder_external_view.h
+++ b/shell/platform/embedder/embedder_external_view.h
@@ -82,14 +82,12 @@
ViewIdentifier::Equal>;
EmbedderExternalView(const SkISize& frame_size,
- const SkMatrix& surface_transformation,
- bool enable_impeller);
+ const SkMatrix& surface_transformation);
EmbedderExternalView(const SkISize& frame_size,
const SkMatrix& surface_transformation,
ViewIdentifier view_identifier,
- std::unique_ptr<EmbeddedViewParams> params,
- bool enable_impeller);
+ std::unique_ptr<EmbeddedViewParams> params);
~EmbedderExternalView();
@@ -120,7 +118,7 @@
const SkMatrix surface_transformation_;
ViewIdentifier view_identifier_;
std::unique_ptr<EmbeddedViewParams> embedded_view_params_;
- std::unique_ptr<EmbedderViewSlice> slice_;
+ std::unique_ptr<DisplayListEmbedderViewSlice> slice_;
std::optional<bool> has_engine_rendered_contents_;
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderExternalView);
diff --git a/shell/platform/embedder/embedder_external_view_embedder.cc b/shell/platform/embedder/embedder_external_view_embedder.cc
index 1b328ff..f87d451 100644
--- a/shell/platform/embedder/embedder_external_view_embedder.cc
+++ b/shell/platform/embedder/embedder_external_view_embedder.cc
@@ -16,10 +16,8 @@
EmbedderExternalViewEmbedder::EmbedderExternalViewEmbedder(
bool avoid_backing_store_cache,
const CreateRenderTargetCallback& create_render_target_callback,
- const PresentCallback& present_callback,
- bool enable_impeller)
- : enable_impeller_(enable_impeller),
- avoid_backing_store_cache_(avoid_backing_store_cache),
+ const PresentCallback& present_callback)
+ : avoid_backing_store_cache_(avoid_backing_store_cache),
create_render_target_callback_(create_render_target_callback),
present_callback_(present_callback) {
FML_DCHECK(create_render_target_callback_);
@@ -67,7 +65,7 @@
EmbedderExternalView::ViewIdentifier{};
pending_views_[kRootViewIdentifier] = std::make_unique<EmbedderExternalView>(
- pending_frame_size_, pending_surface_transformation_, enable_impeller_);
+ pending_frame_size_, pending_surface_transformation_);
composition_order_.push_back(kRootViewIdentifier);
}
@@ -82,8 +80,7 @@
pending_frame_size_, // frame size
pending_surface_transformation_, // surface xformation
vid, // view identifier
- std::move(params), // embedded view params
- enable_impeller_ // enable_impeller
+ std::move(params) // embedded view params
);
composition_order_.push_back(vid);
}
diff --git a/shell/platform/embedder/embedder_external_view_embedder.h b/shell/platform/embedder/embedder_external_view_embedder.h
index 6446fa0..014f739 100644
--- a/shell/platform/embedder/embedder_external_view_embedder.h
+++ b/shell/platform/embedder/embedder_external_view_embedder.h
@@ -58,8 +58,7 @@
EmbedderExternalViewEmbedder(
bool avoid_backing_store_cache,
const CreateRenderTargetCallback& create_render_target_callback,
- const PresentCallback& present_callback,
- bool enable_impeller);
+ const PresentCallback& present_callback);
//----------------------------------------------------------------------------
/// @brief Collects the external view embedder.
@@ -105,7 +104,6 @@
DlCanvas* GetRootCanvas() override;
private:
- bool enable_impeller_ = false;
const bool avoid_backing_store_cache_;
const CreateRenderTargetCallback create_render_target_callback_;
const PresentCallback present_callback_;
diff --git a/testing/mock_canvas.cc b/testing/mock_canvas.cc
index bd9d321..75b0310 100644
--- a/testing/mock_canvas.cc
+++ b/testing/mock_canvas.cc
@@ -193,14 +193,6 @@
}
}
-void MockCanvas::DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity) {
- draw_calls_.emplace_back(
- DrawCall{.layer = current_layer_,
- .data = DrawImpellerPictureData{picture, opacity}});
-}
-
void MockCanvas::DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity) {
draw_calls_.emplace_back(
@@ -470,16 +462,6 @@
<< data.options;
}
-bool operator==(const MockCanvas::DrawImpellerPictureData& a,
- const MockCanvas::DrawImpellerPictureData& b) {
- return a.picture == b.picture && a.opacity == b.opacity;
-}
-
-std::ostream& operator<<(std::ostream& os,
- const MockCanvas::DrawImpellerPictureData& data) {
- return os << "[Impeller picture] " << data.opacity;
-}
-
bool operator==(const MockCanvas::DrawDisplayListData& a,
const MockCanvas::DrawDisplayListData& b) {
return a.display_list->Equals(b.display_list) && a.opacity == b.opacity;
diff --git a/testing/mock_canvas.h b/testing/mock_canvas.h
index 64d9a72..71260d5 100644
--- a/testing/mock_canvas.h
+++ b/testing/mock_canvas.h
@@ -95,11 +95,6 @@
DlPaint paint;
};
- struct DrawImpellerPictureData {
- std::shared_ptr<const impeller::Picture> picture;
- SkScalar opacity;
- };
-
struct DrawDisplayListData {
sk_sp<DisplayList> display_list;
SkScalar opacity;
@@ -147,7 +142,6 @@
DrawTextData,
DrawImageDataNoPaint,
DrawImageData,
- DrawImpellerPictureData,
DrawDisplayListData,
DrawShadowData,
ClipRectData,
@@ -272,9 +266,7 @@
DlImageSampling sampling,
const SkRect* cullRect,
const DlPaint* paint = nullptr) override;
- void DrawImpellerPicture(
- const std::shared_ptr<const impeller::Picture>& picture,
- SkScalar opacity = SK_Scalar1) override;
+
void DrawDisplayList(const sk_sp<DisplayList> display_list,
SkScalar opacity) override;
void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
@@ -335,11 +327,6 @@
const MockCanvas::DrawImageDataNoPaint& b);
extern std::ostream& operator<<(std::ostream& os,
const MockCanvas::DrawImageDataNoPaint& data);
-extern std::ostream& operator<<(
- std::ostream& os,
- const MockCanvas::DrawImpellerPictureData& data);
-extern bool operator==(const MockCanvas::DrawImpellerPictureData& a,
- const MockCanvas::DrawImpellerPictureData& b);
extern bool operator==(const MockCanvas::DrawDisplayListData& a,
const MockCanvas::DrawDisplayListData& b);
extern std::ostream& operator<<(std::ostream& os,
diff --git a/third_party/txt/src/skia/paragraph_skia.cc b/third_party/txt/src/skia/paragraph_skia.cc
index c01ac2a..c909a34 100644
--- a/third_party/txt/src/skia/paragraph_skia.cc
+++ b/third_party/txt/src/skia/paragraph_skia.cc
@@ -45,9 +45,9 @@
class DisplayListParagraphPainter : public skt::ParagraphPainter {
public:
- DisplayListParagraphPainter(DlCanvas* canvas,
+ DisplayListParagraphPainter(DisplayListBuilder* builder,
const std::vector<DlPaint>& dl_paints)
- : canvas_(canvas), dl_paints_(dl_paints) {}
+ : builder_(builder), dl_paints_(dl_paints) {}
DlPaint toDlPaint(const DecorationStyle& decor_style,
DlDrawStyle draw_style = DlDrawStyle::kStroke) {
@@ -76,7 +76,7 @@
}
size_t paint_id = std::get<PaintID>(paint);
FML_DCHECK(paint_id < dl_paints_.size());
- canvas_->DrawTextBlob(blob, x, y, dl_paints_[paint_id]);
+ builder_->DrawTextBlob(blob, x, y, dl_paints_[paint_id]);
}
void drawTextShadow(const sk_sp<SkTextBlob>& blob,
@@ -93,24 +93,24 @@
DlBlurMaskFilter filter(DlBlurStyle::kNormal, blur_sigma, false);
paint.setMaskFilter(&filter);
}
- canvas_->DrawTextBlob(blob, x, y, paint);
+ builder_->DrawTextBlob(blob, x, y, paint);
}
void drawRect(const SkRect& rect, const SkPaintOrID& paint) override {
size_t paint_id = std::get<PaintID>(paint);
FML_DCHECK(paint_id < dl_paints_.size());
- canvas_->DrawRect(rect, dl_paints_[paint_id]);
+ builder_->DrawRect(rect, dl_paints_[paint_id]);
}
void drawFilledRect(const SkRect& rect,
const DecorationStyle& decor_style) override {
DlPaint paint = toDlPaint(decor_style, DlDrawStyle::kFill);
- canvas_->DrawRect(rect, paint);
+ builder_->DrawRect(rect, paint);
}
void drawPath(const SkPath& path,
const DecorationStyle& decor_style) override {
- canvas_->DrawPath(path, toDlPaint(decor_style));
+ builder_->DrawPath(path, toDlPaint(decor_style));
}
void drawLine(SkScalar x0,
@@ -118,24 +118,24 @@
SkScalar x1,
SkScalar y1,
const DecorationStyle& decor_style) override {
- canvas_->DrawLine(SkPoint::Make(x0, y0), SkPoint::Make(x1, y1),
- toDlPaint(decor_style));
+ builder_->DrawLine(SkPoint::Make(x0, y0), SkPoint::Make(x1, y1),
+ toDlPaint(decor_style));
}
void clipRect(const SkRect& rect) override {
- canvas_->ClipRect(rect, DlCanvas::ClipOp::kIntersect, false);
+ builder_->ClipRect(rect, DlCanvas::ClipOp::kIntersect, false);
}
void translate(SkScalar dx, SkScalar dy) override {
- canvas_->Translate(dx, dy);
+ builder_->Translate(dx, dy);
}
- void save() override { canvas_->Save(); }
+ void save() override { builder_->Save(); }
- void restore() override { canvas_->Restore(); }
+ void restore() override { builder_->Restore(); }
private:
- DlCanvas* canvas_;
+ DisplayListBuilder* builder_;
const std::vector<DlPaint>& dl_paints_;
};
@@ -222,7 +222,7 @@
paragraph_->layout(width);
}
-bool ParagraphSkia::Paint(DlCanvas* builder, double x, double y) {
+bool ParagraphSkia::Paint(DisplayListBuilder* builder, double x, double y) {
DisplayListParagraphPainter painter(builder, dl_paints_);
paragraph_->paint(&painter, x, y);
return true;
diff --git a/third_party/txt/src/skia/paragraph_skia.h b/third_party/txt/src/skia/paragraph_skia.h
index 7167573..8fa1314 100644
--- a/third_party/txt/src/skia/paragraph_skia.h
+++ b/third_party/txt/src/skia/paragraph_skia.h
@@ -53,7 +53,7 @@
void Layout(double width) override;
- bool Paint(flutter::DlCanvas* canvas, double x, double y) override;
+ bool Paint(flutter::DisplayListBuilder* builder, double x, double y) override;
std::vector<TextBox> GetRectsForRange(
size_t start,
diff --git a/third_party/txt/src/txt/paragraph.h b/third_party/txt/src/txt/paragraph.h
index 5c4e374..2d736fb 100644
--- a/third_party/txt/src/txt/paragraph.h
+++ b/third_party/txt/src/txt/paragraph.h
@@ -18,7 +18,7 @@
#ifndef LIB_TXT_SRC_PARAGRAPH_H_
#define LIB_TXT_SRC_PARAGRAPH_H_
-#include "flutter/display_list/dl_canvas.h"
+#include "flutter/display_list/dl_builder.h"
#include "line_metrics.h"
#include "paragraph_style.h"
#include "third_party/skia/include/core/SkRect.h"
@@ -143,9 +143,11 @@
// before Painting and getting any statistics from this class.
virtual void Layout(double width) = 0;
- // Paints the laid out text onto the supplied DlCanvas at
+ // Paints the laid out text onto the supplied DisplayListBuilder at
// (x, y) offset from the origin. Only valid after Layout() is called.
- virtual bool Paint(flutter::DlCanvas* canvas, double x, double y) = 0;
+ virtual bool Paint(flutter::DisplayListBuilder* builder,
+ double x,
+ double y) = 0;
// Returns a vector of bounding boxes that enclose all text between start and
// end glyph indexes, including start and excluding end.