From 4f2533a5684760e4d26d30e1e60e9753bad6ef63 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Thu, 16 Feb 2023 23:11:51 -0800 Subject: [PATCH 1/2] Create DlCanvas interface and implement with DisplayListBuilder and SkCanvasAdapter --- ci/licenses_golden/licenses_flutter | 10 +- common/graphics/texture.h | 11 +- display_list/BUILD.gn | 5 +- display_list/display_list.cc | 4 +- display_list/display_list_benchmarks.cc | 16 +- display_list/display_list_benchmarks.h | 9 +- display_list/display_list_builder.cc | 148 ++++--- display_list/display_list_builder.h | 199 ++++++--- .../display_list_builder_benchmarks.cc | 6 +- .../display_list_builder_multiplexer.cc | 28 -- .../display_list_builder_multiplexer.h | 36 -- .../display_list_canvas_dispatcher.cc | 24 +- display_list/display_list_canvas_dispatcher.h | 10 +- display_list/display_list_canvas_recorder.cc | 16 +- display_list/display_list_canvas_unittests.cc | 61 +-- display_list/display_list_complexity.h | 4 +- display_list/display_list_complexity_gl.cc | 10 +- display_list/display_list_complexity_gl.h | 4 +- display_list/display_list_complexity_metal.cc | 6 +- display_list/display_list_complexity_metal.h | 4 +- .../display_list_complexity_unittests.cc | 6 +- display_list/display_list_dispatcher.h | 15 +- display_list/display_list_image_skia.cc | 4 +- .../display_list_matrix_clip_tracker.cc | 26 +- .../display_list_matrix_clip_tracker.h | 14 +- ...play_list_matrix_clip_tracker_unittests.cc | 4 +- display_list/display_list_ops.h | 55 +-- display_list/display_list_paint.cc | 3 +- display_list/display_list_paint.h | 3 +- display_list/display_list_paint_unittests.cc | 4 + display_list/display_list_unittests.cc | 390 +++++++++-------- display_list/display_list_utils.h | 14 +- display_list/dl_canvas.h | 233 ++++++++++ display_list/skia/dl_sk_canvas.cc | 368 ++++++++++++++++ display_list/skia/dl_sk_canvas.h | 157 +++++++ display_list/testing/dl_test_snippets.cc | 66 +-- flow/compositor_context.cc | 20 +- flow/compositor_context.h | 8 +- flow/diff_context.cc | 2 +- flow/embedded_views.cc | 51 +-- flow/embedded_views.h | 56 +-- flow/instrumentation.cc | 7 +- flow/instrumentation.h | 4 +- .../layers/backdrop_filter_layer_unittests.cc | 84 ++-- .../checkerboard_layertree_unittests.cc | 54 +-- flow/layers/clip_path_layer_unittests.cc | 57 +-- flow/layers/clip_rect_layer_unittests.cc | 46 +- flow/layers/clip_rrect_layer_unittests.cc | 62 +-- flow/layers/clip_shape_layer.h | 2 +- flow/layers/color_filter_layer.cc | 8 +- flow/layers/color_filter_layer_unittests.cc | 89 ++-- flow/layers/container_layer_unittests.cc | 30 +- flow/layers/display_list_layer.cc | 29 +- flow/layers/display_list_layer_unittests.cc | 5 +- flow/layers/display_list_raster_cache_item.cc | 19 +- flow/layers/display_list_raster_cache_item.h | 21 +- flow/layers/image_filter_layer.cc | 12 +- flow/layers/image_filter_layer_unittests.cc | 122 +++--- flow/layers/layer.h | 6 +- flow/layers/layer_raster_cache_item.cc | 10 +- flow/layers/layer_raster_cache_item.h | 6 +- flow/layers/layer_state_stack.cc | 186 ++------ flow/layers/layer_state_stack.h | 66 +-- flow/layers/layer_state_stack_unittests.cc | 190 +++++---- flow/layers/layer_tree.cc | 25 +- flow/layers/layer_tree_unittests.cc | 15 +- flow/layers/offscreen_surface.cc | 7 +- flow/layers/offscreen_surface.h | 5 +- flow/layers/offscreen_surface_unittests.cc | 6 +- flow/layers/opacity_layer.cc | 2 +- flow/layers/opacity_layer_unittests.cc | 102 ++--- flow/layers/performance_overlay_layer.cc | 8 +- .../performance_overlay_layer_unittests.cc | 9 +- flow/layers/physical_shape_layer.cc | 16 +- flow/layers/physical_shape_layer.h | 8 +- flow/layers/physical_shape_layer_unittests.cc | 167 ++++---- flow/layers/platform_view_layer.cc | 14 +- flow/layers/platform_view_layer.h | 1 + flow/layers/platform_view_layer_unittests.cc | 10 +- flow/layers/shader_mask_layer.cc | 30 +- flow/layers/shader_mask_layer_unittests.cc | 84 ++-- flow/layers/texture_layer.cc | 9 +- flow/layers/texture_layer_unittests.cc | 2 +- flow/layers/transform_layer_unittests.cc | 38 +- flow/paint_utils.cc | 47 +- flow/paint_utils.h | 8 +- flow/raster_cache.cc | 45 +- flow/raster_cache.h | 22 +- flow/raster_cache_item.h | 12 +- flow/raster_cache_unittests.cc | 127 +++--- flow/surface_frame.cc | 16 +- flow/surface_frame.h | 12 +- flow/surface_frame_unittests.cc | 9 +- flow/testing/layer_test.h | 28 +- flow/testing/mock_embedder.cc | 27 +- flow/testing/mock_embedder.h | 15 +- flow/testing/mock_layer.cc | 11 +- flow/testing/mock_layer.h | 10 +- flow/testing/mock_layer_unittests.cc | 10 +- flow/testing/mock_raster_cache.cc | 22 +- flow/testing/mock_raster_cache.h | 12 +- flow/testing/mock_texture.cc | 4 +- flow/testing/mock_texture.h | 8 +- flow/testing/mock_texture_unittests.cc | 9 +- .../display_list/display_list_dispatcher.cc | 21 +- .../display_list/display_list_dispatcher.h | 8 +- .../display_list_image_impeller.cc | 2 +- .../display_list/display_list_unittests.cc | 185 ++++---- lib/ui/compositing/scene_builder.cc | 3 +- lib/ui/painting.dart | 2 +- lib/ui/painting/canvas.cc | 24 +- lib/ui/painting/canvas.h | 4 +- .../display_list_deferred_image_gpu_skia.cc | 6 +- lib/ui/painting/display_list_image_gpu.cc | 4 +- shell/common/canvas_spy.cc | 9 +- shell/common/canvas_spy.h | 9 +- shell/common/canvas_spy_unittests.cc | 12 +- shell/common/rasterizer.cc | 13 +- shell/common/rasterizer_unittests.cc | 30 +- .../shell_test_external_view_embedder.cc | 23 +- .../shell_test_external_view_embedder.h | 10 +- .../common/shell_test_platform_view_vulkan.cc | 4 +- shell/common/shell_unittests.cc | 22 +- shell/gpu/gpu_surface_gl_impeller.cc | 2 +- shell/gpu/gpu_surface_gl_skia.cc | 6 +- shell/gpu/gpu_surface_gl_skia.h | 2 +- shell/gpu/gpu_surface_metal_impeller.mm | 2 +- shell/gpu/gpu_surface_metal_skia.mm | 10 +- shell/gpu/gpu_surface_software.cc | 6 +- shell/gpu/gpu_surface_vulkan.cc | 6 +- shell/gpu/gpu_surface_vulkan_impeller.cc | 2 +- .../android/android_external_texture_gl.cc | 26 +- .../android/android_external_texture_gl.h | 2 +- .../external_view_embedder.cc | 57 +-- .../external_view_embedder.h | 13 +- .../external_view_embedder_unittests.cc | 166 +++----- .../FlutterDarwinExternalTextureMetal.h | 2 +- .../FlutterDarwinExternalTextureMetal.mm | 27 +- .../framework/Source/FlutterPlatformViews.mm | 69 +-- .../Source/FlutterPlatformViewsTest.mm | 21 +- .../Source/FlutterPlatformViews_Internal.h | 8 +- .../darwin/ios/ios_external_texture_metal.h | 2 +- .../darwin/ios/ios_external_texture_metal.mm | 2 +- .../darwin/ios/ios_external_view_embedder.h | 10 +- .../darwin/ios/ios_external_view_embedder.mm | 16 +- .../FlutterEmbedderExternalTextureTest.mm | 21 +- .../embedder/embedder_external_texture_gl.cc | 17 +- .../embedder/embedder_external_texture_gl.h | 7 +- .../embedder_external_texture_metal.h | 6 +- .../embedder_external_texture_metal.mm | 17 +- .../embedder/embedder_external_view.cc | 2 +- .../embedder/embedder_external_view.h | 2 +- .../embedder_external_view_embedder.cc | 28 +- .../embedder_external_view_embedder.h | 10 +- .../embedder/tests/embedder_gl_unittests.cc | 10 +- .../tests/embedder_metal_unittests.mm | 15 +- .../flatland_external_view_embedder.cc | 24 +- .../flutter/flatland_external_view_embedder.h | 11 +- .../flutter/gfx_external_view_embedder.cc | 22 +- .../flutter/gfx_external_view_embedder.h | 10 +- .../fuchsia/flutter/platform_view_unittest.cc | 19 +- shell/platform/fuchsia/flutter/surface.cc | 5 +- ...atland_external_view_embedder_unittests.cc | 358 ++++++++-------- .../tests/flatland_platform_view_unittest.cc | 19 +- .../gfx_external_view_embedder_unittests.cc | 142 +++---- shell/testing/tester_main.cc | 14 +- testing/BUILD.gn | 4 +- testing/canvas_test.h | 3 +- testing/display_list_testing.cc | 76 +++- testing/display_list_testing.h | 21 +- testing/mock_canvas.cc | 402 +++++++++++------- testing/mock_canvas.h | 279 ++++++------ testing/mock_canvas_unittests.cc | 6 +- third_party/txt/src/skia/paragraph_skia.cc | 20 +- 174 files changed, 3593 insertions(+), 3062 deletions(-) delete mode 100644 display_list/display_list_builder_multiplexer.cc delete mode 100644 display_list/display_list_builder_multiplexer.h create mode 100644 display_list/dl_canvas.h create mode 100644 display_list/skia/dl_sk_canvas.cc create mode 100644 display_list/skia/dl_sk_canvas.h diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 8bb26356b9db3..5a89b4f08cc77 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -713,8 +713,6 @@ ORIGIN: ../../../flutter/display_list/display_list_blend_mode.h + ../../../flutt ORIGIN: ../../../flutter/display_list/display_list_builder.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_builder.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_builder_benchmarks.cc + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/display_list/display_list_builder_multiplexer.cc + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/display_list/display_list_builder_multiplexer.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_canvas_dispatcher.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_canvas_dispatcher.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_canvas_recorder.cc + ../../../flutter/LICENSE @@ -762,6 +760,9 @@ ORIGIN: ../../../flutter/display_list/display_list_utils.cc + ../../../flutter/L ORIGIN: ../../../flutter/display_list/display_list_utils.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_vertices.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/display_list_vertices.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/display_list/dl_canvas.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/display_list/skia/dl_sk_canvas.cc + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/display_list/skia/dl_sk_canvas.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/display_list/types.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/compositor_context.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/compositor_context.h + ../../../flutter/LICENSE @@ -3213,8 +3214,6 @@ FILE: ../../../flutter/display_list/display_list_blend_mode.h FILE: ../../../flutter/display_list/display_list_builder.cc FILE: ../../../flutter/display_list/display_list_builder.h FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc -FILE: ../../../flutter/display_list/display_list_builder_multiplexer.cc -FILE: ../../../flutter/display_list/display_list_builder_multiplexer.h FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.cc FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.h FILE: ../../../flutter/display_list/display_list_canvas_recorder.cc @@ -3262,6 +3261,9 @@ FILE: ../../../flutter/display_list/display_list_utils.cc FILE: ../../../flutter/display_list/display_list_utils.h FILE: ../../../flutter/display_list/display_list_vertices.cc FILE: ../../../flutter/display_list/display_list_vertices.h +FILE: ../../../flutter/display_list/dl_canvas.h +FILE: ../../../flutter/display_list/skia/dl_sk_canvas.cc +FILE: ../../../flutter/display_list/skia/dl_sk_canvas.h FILE: ../../../flutter/display_list/types.h FILE: ../../../flutter/flow/compositor_context.cc FILE: ../../../flutter/flow/compositor_context.h diff --git a/common/graphics/texture.h b/common/graphics/texture.h index 16a97658d9fed..69d9306fcba96 100644 --- a/common/graphics/texture.h +++ b/common/graphics/texture.h @@ -7,8 +7,7 @@ #include -#include "flutter/display_list/display_list_builder.h" -#include "flutter/display_list/display_list_paint.h" +#include "flutter/display_list/dl_canvas.h" #include "flutter/fml/macros.h" #include "flutter/fml/synchronization/waitable_event.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -40,12 +39,10 @@ class ContextListener { class Texture : public ContextListener { public: struct PaintContext { - SkCanvas* canvas = nullptr; - DisplayListBuilder* builder = nullptr; + DlCanvas* canvas = nullptr; GrDirectContext* gr_context = nullptr; impeller::AiksContext* aiks_context = nullptr; - const SkPaint* sk_paint = nullptr; - const DlPaint* dl_paint = nullptr; + const DlPaint* paint = nullptr; }; explicit Texture(int64_t id); // Called from UI or raster thread. @@ -55,7 +52,7 @@ class Texture : public ContextListener { virtual void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) = 0; + const DlImageSampling sampling) = 0; // Called on raster thread. virtual void MarkNewFrameAvailable() = 0; diff --git a/display_list/BUILD.gn b/display_list/BUILD.gn index 160647a8612ba..027fa35e16bb6 100644 --- a/display_list/BUILD.gn +++ b/display_list/BUILD.gn @@ -16,8 +16,6 @@ source_set("display_list") { "display_list_blend_mode.h", "display_list_builder.cc", "display_list_builder.h", - "display_list_builder_multiplexer.cc", - "display_list_builder_multiplexer.h", "display_list_canvas_dispatcher.cc", "display_list_canvas_dispatcher.h", "display_list_canvas_recorder.cc", @@ -63,6 +61,9 @@ source_set("display_list") { "display_list_utils.h", "display_list_vertices.cc", "display_list_vertices.h", + "dl_canvas.h", + "skia/dl_sk_canvas.cc", + "skia/dl_sk_canvas.h", "types.h", ] diff --git a/display_list/display_list.cc b/display_list/display_list.cc index f5bdcd533ef1c..defde8be4be04 100644 --- a/display_list/display_list.cc +++ b/display_list/display_list.cc @@ -299,9 +299,9 @@ void DisplayList::RenderTo(DisplayListBuilder* builder) const { return; } if (has_rtree()) { - Dispatch(*builder, builder->getLocalClipBounds()); + Dispatch(builder->asDispatcher(), builder->GetLocalClipBounds()); } else { - Dispatch(*builder); + Dispatch(builder->asDispatcher()); } } diff --git a/display_list/display_list_benchmarks.cc b/display_list/display_list_benchmarks.cc index 0ade02a2dfa87..f85d020216c1c 100644 --- a/display_list/display_list_benchmarks.cc +++ b/display_list/display_list_benchmarks.cc @@ -839,13 +839,13 @@ std::vector GetTestPoints(size_t count, SkISize canvas_size) { return points; } -std::string PointModeToString(SkCanvas::PointMode mode) { +std::string PointModeToString(DlCanvas::PointMode mode) { switch (mode) { - case SkCanvas::kLines_PointMode: + case DlCanvas::PointMode::kLines: return "Lines"; - case SkCanvas::kPolygon_PointMode: + case DlCanvas::PointMode::kPolygon: return "Polygon"; - case SkCanvas::kPoints_PointMode: + case DlCanvas::PointMode::kPoints: default: return "Points"; } @@ -860,26 +860,26 @@ std::string PointModeToString(SkCanvas::PointMode mode) { void BM_DrawPoints(benchmark::State& state, BackendType backend_type, unsigned attributes, - SkCanvas::PointMode mode) { + DlCanvas::PointMode mode) { auto surface_provider = DlSurfaceProvider::Create(backend_type); DisplayListBuilder builder; SkPaint paint; switch (mode) { - case SkCanvas::kPoints_PointMode: + case DlCanvas::PointMode::kPoints: builder.setAttributesFromPaint( GetPaintForRun(attributes), DisplayListOpFlags::kDrawPointsAsPointsFlags); AnnotateAttributes(attributes, state, DisplayListOpFlags::kDrawPointsAsPointsFlags); break; - case SkCanvas::kLines_PointMode: + case DlCanvas::PointMode::kLines: builder.setAttributesFromPaint( GetPaintForRun(attributes), DisplayListOpFlags::kDrawPointsAsLinesFlags); AnnotateAttributes(attributes, state, DisplayListOpFlags::kDrawPointsAsLinesFlags); break; - case SkCanvas::kPolygon_PointMode: + case DlCanvas::PointMode::kPolygon: builder.setAttributesFromPaint( GetPaintForRun(attributes), DisplayListOpFlags::kDrawPointsAsPolygonFlags); diff --git a/display_list/display_list_benchmarks.h b/display_list/display_list_benchmarks.h index ad64fdc0cff04..2d4f427fa64c1 100644 --- a/display_list/display_list_benchmarks.h +++ b/display_list/display_list_benchmarks.h @@ -7,6 +7,7 @@ #include "flutter/display_list/display_list_sampling_options.h" #include "flutter/display_list/display_list_vertices.h" +#include "flutter/display_list/dl_canvas.h" #include "flutter/display_list/testing/dl_test_surface_provider.h" #include "third_party/benchmark/include/benchmark/benchmark.h" @@ -63,7 +64,7 @@ void BM_DrawPath(benchmark::State& state, void BM_DrawPoints(benchmark::State& state, BackendType backend_type, unsigned attributes, - SkCanvas::PointMode mode); + DlCanvas::PointMode mode); void BM_DrawVertices(benchmark::State& state, BackendType backend_type, unsigned attributes, @@ -199,7 +200,7 @@ void BM_SaveLayer(benchmark::State& state, BENCHMARK_CAPTURE(BM_DrawPoints, Points/BACKEND, \ BackendType::k##BACKEND##_Backend, \ ATTRIBUTES, \ - SkCanvas::kPoints_PointMode) \ + DlCanvas::PointMode::kPoints) \ ->RangeMultiplier(2) \ ->Range(1024, 32768) \ ->UseRealTime() \ @@ -208,7 +209,7 @@ void BM_SaveLayer(benchmark::State& state, BENCHMARK_CAPTURE(BM_DrawPoints, Lines/BACKEND, \ BackendType::k##BACKEND##_Backend, \ ATTRIBUTES, \ - SkCanvas::kLines_PointMode) \ + DlCanvas::PointMode::kLines) \ ->RangeMultiplier(2) \ ->Range(1024, 32768) \ ->UseRealTime() \ @@ -217,7 +218,7 @@ void BM_SaveLayer(benchmark::State& state, BENCHMARK_CAPTURE(BM_DrawPoints, Polygon/BACKEND, \ BackendType::k##BACKEND##_Backend, \ ATTRIBUTES, \ - SkCanvas::kPolygon_PointMode) \ + DlCanvas::PointMode::kPolygon) \ ->RangeMultiplier(2) \ ->Range(1024, 32768) \ ->UseRealTime() \ diff --git a/display_list/display_list_builder.cc b/display_list/display_list_builder.cc index 970601b53c13a..437cfea9060a0 100644 --- a/display_list/display_list_builder.cc +++ b/display_list/display_list_builder.cc @@ -98,6 +98,15 @@ DisplayListBuilder::~DisplayListBuilder() { } } +SkISize DisplayListBuilder::GetBaseLayerSize() const { + return tracker_.base_device_cull_rect().roundOut().size(); +} + +SkImageInfo DisplayListBuilder::GetImageInfo() const { + SkISize size = GetBaseLayerSize(); + return SkImageInfo::MakeUnknown(size.width(), size.height()); +} + void DisplayListBuilder::onSetAntiAlias(bool aa) { current_.setAntiAlias(aa); Push(0, 0, aa); @@ -460,7 +469,7 @@ void DisplayListBuilder::checkForDeferredSave() { } } -void DisplayListBuilder::save() { +void DisplayListBuilder::Save() { layer_stack_.emplace_back(); current_layer_ = &layer_stack_.back(); current_layer_->has_deferred_save_op_ = true; @@ -468,7 +477,7 @@ void DisplayListBuilder::save() { accumulator()->save(); } -void DisplayListBuilder::restore() { +void DisplayListBuilder::Restore() { if (layer_stack_.size() > 1) { SaveOpBase* op = reinterpret_cast( storage_.get() + current_layer_->save_offset()); @@ -491,7 +500,7 @@ void DisplayListBuilder::restore() { if (filter) { const SkRect clip = tracker_.device_cull_rect(); if (!accumulator()->restore( - [filter = filter, matrix = getTransform()](const SkRect& input, + [filter = filter, matrix = GetTransform()](const SkRect& input, SkRect& output) { SkIRect output_bounds; bool ret = filter->map_device_bounds(input.roundOut(), matrix, @@ -540,9 +549,9 @@ void DisplayListBuilder::restore() { } } } -void DisplayListBuilder::restoreToCount(int restore_count) { - FML_DCHECK(restore_count <= getSaveCount()); - while (restore_count < getSaveCount() && getSaveCount() > 1) { +void DisplayListBuilder::RestoreToCount(int restore_count) { + FML_DCHECK(restore_count <= GetSaveCount()); + while (restore_count < GetSaveCount() && GetSaveCount() > 1) { restore(); } } @@ -598,14 +607,14 @@ void DisplayListBuilder::saveLayer(const SkRect* bounds, // use them as the temporary layer bounds during rendering the layer, so // we set them as if a clip operation were performed. if (bounds) { - tracker_.clipRect(*bounds, SkClipOp::kIntersect, false); + tracker_.clipRect(*bounds, ClipOp::kIntersect, false); } if (backdrop) { // A backdrop will affect up to the entire surface, bounded by the clip AccumulateUnbounded(); } } -void DisplayListBuilder::saveLayer(const SkRect* bounds, +void DisplayListBuilder::SaveLayer(const SkRect* bounds, const DlPaint* paint, const DlImageFilter* backdrop) { if (paint != nullptr) { @@ -617,7 +626,7 @@ void DisplayListBuilder::saveLayer(const SkRect* bounds, } } -void DisplayListBuilder::translate(SkScalar tx, SkScalar ty) { +void DisplayListBuilder::Translate(SkScalar tx, SkScalar ty) { if (SkScalarIsFinite(tx) && SkScalarIsFinite(ty) && (tx != 0.0 || ty != 0.0)) { checkForDeferredSave(); @@ -625,7 +634,7 @@ void DisplayListBuilder::translate(SkScalar tx, SkScalar ty) { tracker_.translate(tx, ty); } } -void DisplayListBuilder::scale(SkScalar sx, SkScalar sy) { +void DisplayListBuilder::Scale(SkScalar sx, SkScalar sy) { if (SkScalarIsFinite(sx) && SkScalarIsFinite(sy) && (sx != 1.0 || sy != 1.0)) { checkForDeferredSave(); @@ -633,14 +642,14 @@ void DisplayListBuilder::scale(SkScalar sx, SkScalar sy) { tracker_.scale(sx, sy); } } -void DisplayListBuilder::rotate(SkScalar degrees) { +void DisplayListBuilder::Rotate(SkScalar degrees) { if (SkScalarMod(degrees, 360.0) != 0.0) { checkForDeferredSave(); Push(0, 1, degrees); tracker_.rotate(degrees); } } -void DisplayListBuilder::skew(SkScalar sx, SkScalar sy) { +void DisplayListBuilder::Skew(SkScalar sx, SkScalar sy) { if (SkScalarIsFinite(sx) && SkScalarIsFinite(sy) && (sx != 0.0 || sy != 0.0)) { checkForDeferredSave(); @@ -652,7 +661,7 @@ void DisplayListBuilder::skew(SkScalar sx, SkScalar sy) { // clang-format off // 2x3 2D affine subset of a 4x4 transform in row major order -void DisplayListBuilder::transform2DAffine( +void DisplayListBuilder::Transform2DAffine( SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) { if (SkScalarsAreFinite(mxx, myx) && @@ -669,7 +678,7 @@ void DisplayListBuilder::transform2DAffine( } } // full 4x4 transform in row major order -void DisplayListBuilder::transformFullPerspective( +void DisplayListBuilder::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, @@ -678,7 +687,7 @@ void DisplayListBuilder::transformFullPerspective( myz == 0 && mzx == 0 && mzy == 0 && mzz == 1 && mzt == 0 && mwx == 0 && mwy == 0 && mwz == 0 && mwt == 1) { - transform2DAffine(mxx, mxy, mxt, + Transform2DAffine(mxx, mxy, mxt, myx, myy, myt); } else if (SkScalarsAreFinite(mxx, mxy) && SkScalarsAreFinite(mxz, mxt) && SkScalarsAreFinite(myx, myy) && SkScalarsAreFinite(myz, myt) && @@ -697,17 +706,17 @@ void DisplayListBuilder::transformFullPerspective( } } // clang-format on -void DisplayListBuilder::transformReset() { +void DisplayListBuilder::TransformReset() { checkForDeferredSave(); Push(0, 0); tracker_.setIdentity(); } -void DisplayListBuilder::transform(const SkMatrix* matrix) { +void DisplayListBuilder::Transform(const SkMatrix* matrix) { if (matrix != nullptr) { - transform(SkM44(*matrix)); + Transform(SkM44(*matrix)); } } -void DisplayListBuilder::transform(const SkM44* m44) { +void DisplayListBuilder::Transform(const SkM44* m44) { if (m44 != nullptr) { transformFullPerspective( m44->rc(0, 0), m44->rc(0, 1), m44->rc(0, 2), m44->rc(0, 3), @@ -717,43 +726,43 @@ void DisplayListBuilder::transform(const SkM44* m44) { } } -void DisplayListBuilder::clipRect(const SkRect& rect, - SkClipOp clip_op, +void DisplayListBuilder::ClipRect(const SkRect& rect, + ClipOp clip_op, bool is_aa) { if (!rect.isFinite()) { return; } checkForDeferredSave(); switch (clip_op) { - case SkClipOp::kIntersect: + case ClipOp::kIntersect: Push(0, 1, rect, is_aa); break; - case SkClipOp::kDifference: + case ClipOp::kDifference: Push(0, 1, rect, is_aa); break; } tracker_.clipRect(rect, clip_op, is_aa); } -void DisplayListBuilder::clipRRect(const SkRRect& rrect, - SkClipOp clip_op, +void DisplayListBuilder::ClipRRect(const SkRRect& rrect, + ClipOp clip_op, bool is_aa) { if (rrect.isRect()) { clipRect(rrect.rect(), clip_op, is_aa); } else { checkForDeferredSave(); switch (clip_op) { - case SkClipOp::kIntersect: + case ClipOp::kIntersect: Push(0, 1, rrect, is_aa); break; - case SkClipOp::kDifference: + case ClipOp::kDifference: Push(0, 1, rrect, is_aa); break; } tracker_.clipRRect(rrect, clip_op, is_aa); } } -void DisplayListBuilder::clipPath(const SkPath& path, - SkClipOp clip_op, +void DisplayListBuilder::ClipPath(const SkPath& path, + ClipOp clip_op, bool is_aa) { if (!path.isInverseFillType()) { SkRect rect; @@ -774,17 +783,17 @@ void DisplayListBuilder::clipPath(const SkPath& path, } checkForDeferredSave(); switch (clip_op) { - case SkClipOp::kIntersect: + case ClipOp::kIntersect: Push(0, 1, path, is_aa); break; - case SkClipOp::kDifference: + case ClipOp::kDifference: Push(0, 1, path, is_aa); break; } tracker_.clipPath(path, clip_op, is_aa); } -bool DisplayListBuilder::quickReject(const SkRect& bounds) const { +bool DisplayListBuilder::QuickReject(const SkRect& bounds) const { return tracker_.content_culled(bounds); } @@ -793,11 +802,11 @@ void DisplayListBuilder::drawPaint() { CheckLayerOpacityCompatibility(); AccumulateUnbounded(); } -void DisplayListBuilder::drawPaint(const DlPaint& paint) { +void DisplayListBuilder::DrawPaint(const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawPaintFlags); drawPaint(); } -void DisplayListBuilder::drawColor(DlColor color, DlBlendMode mode) { +void DisplayListBuilder::DrawColor(DlColor color, DlBlendMode mode) { Push(0, 1, color, mode); CheckLayerOpacityCompatibility(mode); AccumulateUnbounded(); @@ -811,7 +820,7 @@ void DisplayListBuilder::drawLine(const SkPoint& p0, const SkPoint& p1) { : kDrawHVLineFlags; AccumulateOpBounds(bounds, flags); } -void DisplayListBuilder::drawLine(const SkPoint& p0, +void DisplayListBuilder::DrawLine(const SkPoint& p0, const SkPoint& p1, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawLineFlags); @@ -822,7 +831,7 @@ void DisplayListBuilder::drawRect(const SkRect& rect) { CheckLayerOpacityCompatibility(); AccumulateOpBounds(rect, kDrawRectFlags); } -void DisplayListBuilder::drawRect(const SkRect& rect, const DlPaint& paint) { +void DisplayListBuilder::DrawRect(const SkRect& rect, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawRectFlags); drawRect(rect); } @@ -831,7 +840,7 @@ void DisplayListBuilder::drawOval(const SkRect& bounds) { CheckLayerOpacityCompatibility(); AccumulateOpBounds(bounds, kDrawOvalFlags); } -void DisplayListBuilder::drawOval(const SkRect& bounds, const DlPaint& paint) { +void DisplayListBuilder::DrawOval(const SkRect& bounds, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawOvalFlags); drawOval(bounds); } @@ -842,7 +851,7 @@ void DisplayListBuilder::drawCircle(const SkPoint& center, SkScalar radius) { center.fX + radius, center.fY + radius), kDrawCircleFlags); } -void DisplayListBuilder::drawCircle(const SkPoint& center, +void DisplayListBuilder::DrawCircle(const SkPoint& center, SkScalar radius, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawCircleFlags); @@ -859,7 +868,7 @@ void DisplayListBuilder::drawRRect(const SkRRect& rrect) { AccumulateOpBounds(rrect.getBounds(), kDrawRRectFlags); } } -void DisplayListBuilder::drawRRect(const SkRRect& rrect, const DlPaint& paint) { +void DisplayListBuilder::DrawRRect(const SkRRect& rrect, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawRRectFlags); drawRRect(rrect); } @@ -869,7 +878,7 @@ void DisplayListBuilder::drawDRRect(const SkRRect& outer, CheckLayerOpacityCompatibility(); AccumulateOpBounds(outer.getBounds(), kDrawDRRectFlags); } -void DisplayListBuilder::drawDRRect(const SkRRect& outer, +void DisplayListBuilder::DrawDRRect(const SkRRect& outer, const SkRRect& inner, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawDRRectFlags); @@ -884,7 +893,7 @@ void DisplayListBuilder::drawPath(const SkPath& path) { AccumulateOpBounds(path.getBounds(), kDrawPathFlags); } } -void DisplayListBuilder::drawPath(const SkPath& path, const DlPaint& paint) { +void DisplayListBuilder::DrawPath(const SkPath& path, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawPathFlags); drawPath(path); } @@ -907,7 +916,7 @@ void DisplayListBuilder::drawArc(const SkRect& bounds, ? kDrawArcWithCenterFlags : kDrawArcNoCenterFlags); } -void DisplayListBuilder::drawArc(const SkRect& bounds, +void DisplayListBuilder::DrawArc(const SkRect& bounds, SkScalar start, SkScalar sweep, bool useCenter, @@ -916,7 +925,7 @@ void DisplayListBuilder::drawArc(const SkRect& bounds, paint, useCenter ? kDrawArcWithCenterFlags : kDrawArcNoCenterFlags); drawArc(bounds, start, sweep, useCenter); } -void DisplayListBuilder::drawPoints(SkCanvas::PointMode mode, +void DisplayListBuilder::drawPoints(PointMode mode, uint32_t count, const SkPoint pts[]) { if (count == 0) { @@ -924,7 +933,7 @@ void DisplayListBuilder::drawPoints(SkCanvas::PointMode mode, } void* data_ptr; - FML_DCHECK(count < kMaxDrawPointsCount); + FML_DCHECK(count < Dispatcher::kMaxDrawPointsCount); int bytes = count * sizeof(SkPoint); RectBoundsAccumulator ptBounds; for (size_t i = 0; i < count; i++) { @@ -932,15 +941,15 @@ void DisplayListBuilder::drawPoints(SkCanvas::PointMode mode, } SkRect point_bounds = ptBounds.bounds(); switch (mode) { - case SkCanvas::PointMode::kPoints_PointMode: + case PointMode::kPoints: data_ptr = Push(bytes, 1, count); AccumulateOpBounds(point_bounds, kDrawPointsAsPointsFlags); break; - case SkCanvas::PointMode::kLines_PointMode: + case PointMode::kLines: data_ptr = Push(bytes, 1, count); AccumulateOpBounds(point_bounds, kDrawPointsAsLinesFlags); break; - case SkCanvas::PointMode::kPolygon_PointMode: + case PointMode::kPolygon: data_ptr = Push(bytes, 1, count); AccumulateOpBounds(point_bounds, kDrawPointsAsPolygonFlags); break; @@ -956,19 +965,19 @@ void DisplayListBuilder::drawPoints(SkCanvas::PointMode mode, // See: https://fiddle.skia.org/c/228459001d2de8db117ce25ef5cedb0c UpdateLayerOpacityCompatibility(false); } -void DisplayListBuilder::drawPoints(SkCanvas::PointMode mode, +void DisplayListBuilder::DrawPoints(PointMode mode, uint32_t count, const SkPoint pts[], const DlPaint& paint) { const DisplayListAttributeFlags* flags; switch (mode) { - case SkCanvas::PointMode::kPoints_PointMode: + case PointMode::kPoints: flags = &DisplayListOpFlags::kDrawPointsAsPointsFlags; break; - case SkCanvas::PointMode::kLines_PointMode: + case PointMode::kLines: flags = &DisplayListOpFlags::kDrawPointsAsLinesFlags; break; - case SkCanvas::PointMode::kPolygon_PointMode: + case PointMode::kPolygon: flags = &DisplayListOpFlags::kDrawPointsAsPolygonFlags; break; default: @@ -999,7 +1008,7 @@ void DisplayListBuilder::drawVertices(const DlVertices* vertices, UpdateLayerOpacityCompatibility(false); AccumulateOpBounds(vertices->bounds(), kDrawVerticesFlags); } -void DisplayListBuilder::drawVertices(const DlVertices* vertices, +void DisplayListBuilder::DrawVertices(const DlVertices* vertices, DlBlendMode mode, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawVerticesFlags); @@ -1021,7 +1030,7 @@ void DisplayListBuilder::drawImage(const sk_sp image, : kDrawImageFlags; AccumulateOpBounds(bounds, flags); } -void DisplayListBuilder::drawImage(const sk_sp& image, +void DisplayListBuilder::DrawImage(const sk_sp& image, const SkPoint point, DlImageSampling sampling, const DlPaint* paint) { @@ -1047,12 +1056,15 @@ void DisplayListBuilder::drawImageRect(const sk_sp image, : kDrawImageRectFlags; AccumulateOpBounds(dst, flags); } -void DisplayListBuilder::drawImageRect(const sk_sp& image, +void DisplayListBuilder::DrawImageRect(const sk_sp& image, const SkRect& src, const SkRect& dst, DlImageSampling sampling, const DlPaint* paint, - SkCanvas::SrcRectConstraint constraint) { + bool enforce_src_edges) { + SkCanvas::SrcRectConstraint constraint = + enforce_src_edges ? SkCanvas::kStrict_SrcRectConstraint + : SkCanvas::kFast_SrcRectConstraint; if (paint != nullptr) { setAttributesFromDlPaint(*paint, DisplayListOpFlags::kDrawImageRectWithPaintFlags); @@ -1075,7 +1087,7 @@ void DisplayListBuilder::drawImageNine(const sk_sp image, : kDrawImageNineFlags; AccumulateOpBounds(dst, flags); } -void DisplayListBuilder::drawImageNine(const sk_sp& image, +void DisplayListBuilder::DrawImageNine(const sk_sp& image, const SkIRect& center, const SkRect& dst, DlFilterMode filter, @@ -1168,7 +1180,7 @@ void DisplayListBuilder::drawAtlas(const sk_sp atlas, AccumulateOpBounds(atlasBounds.bounds(), flags); } } -void DisplayListBuilder::drawAtlas(const sk_sp& atlas, +void DisplayListBuilder::DrawAtlas(const sk_sp& atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], @@ -1217,9 +1229,21 @@ void DisplayListBuilder::drawPicture(const sk_sp picture, nested_bytes_ += picture->approximateBytesUsed(); CheckLayerOpacityCompatibility(render_with_attributes); } -void DisplayListBuilder::drawDisplayList( - const sk_sp display_list) { +void DisplayListBuilder::DrawDisplayList(const sk_sp display_list, + SkScalar opacity) { + DlPaint current_paint = current_; + if (opacity < SK_Scalar1) { + SaveLayer(&display_list->bounds(), &DlPaint().setOpacity(opacity)); + } Push(0, 1, display_list); + if (opacity < SK_Scalar1) { + Restore(); + // Not really necessary if the developer is interacting with us via + // our attribute-state-less DlCanvas methods, but this avoids surprises + // for those who may have been using the stateful Dispatcher methods. + setAttributesFromDlPaint(current_paint, + DisplayListOpFlags::kSaveLayerWithPaintFlags); + } const SkRect bounds = display_list->bounds(); switch (accumulator()->type()) { @@ -1257,14 +1281,14 @@ void DisplayListBuilder::drawTextBlob(const sk_sp blob, AccumulateOpBounds(blob->bounds().makeOffset(x, y), kDrawTextBlobFlags); CheckLayerOpacityCompatibility(); } -void DisplayListBuilder::drawTextBlob(const sk_sp& blob, +void DisplayListBuilder::DrawTextBlob(const sk_sp& blob, SkScalar x, SkScalar y, const DlPaint& paint) { setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawTextBlobFlags); drawTextBlob(blob, x, y); } -void DisplayListBuilder::drawShadow(const SkPath& path, +void DisplayListBuilder::DrawShadow(const SkPath& path, const DlColor color, const SkScalar elevation, bool transparent_occluder, @@ -1274,7 +1298,7 @@ void DisplayListBuilder::drawShadow(const SkPath& path, : Push(0, 1, path, color, elevation, dpr); SkRect shadow_bounds = DisplayListCanvasDispatcher::ComputeShadowBounds( - path, elevation, dpr, getTransform()); + path, elevation, dpr, GetTransform()); AccumulateOpBounds(shadow_bounds, kDrawShadowFlags); UpdateLayerOpacityCompatibility(false); } diff --git a/display_list/display_list_builder.h b/display_list/display_list_builder.h index cc5888fb45951..d2846f87e5aec 100644 --- a/display_list/display_list_builder.h +++ b/display_list/display_list_builder.h @@ -16,6 +16,7 @@ #include "flutter/display_list/display_list_path_effect.h" #include "flutter/display_list/display_list_sampling_options.h" #include "flutter/display_list/display_list_utils.h" +#include "flutter/display_list/dl_canvas.h" #include "flutter/display_list/types.h" #include "flutter/fml/macros.h" @@ -26,8 +27,9 @@ namespace flutter { // If there is some code that already renders to an SkCanvas object, // those rendering commands can be captured into a DisplayList using // the DisplayListCanvasRecorder class. -class DisplayListBuilder final : public virtual Dispatcher, +class DisplayListBuilder final : public virtual DlCanvas, public SkRefCnt, + virtual Dispatcher, DisplayListOpFlags { public: static constexpr SkRect kMaxCullRect = @@ -39,8 +41,13 @@ class DisplayListBuilder final : public virtual Dispatcher, explicit DisplayListBuilder(const SkRect& cull_rect = kMaxCullRect, bool prepare_rtree = false); + SkISize GetBaseLayerSize() const override; + SkImageInfo GetImageInfo() const override; + ~DisplayListBuilder(); + Dispatcher& asDispatcher() { return *this; } + void setAntiAlias(bool aa) override { if (current_.isAntiAlias() != aa) { onSetAntiAlias(aa); @@ -160,7 +167,9 @@ class DisplayListBuilder final : public virtual Dispatcher, return current_.getImageFilter(); } - void save() override; + void Save() override; + void save() override { Save(); } + // Only the |renders_with_attributes()| option will be accepted here. Any // other flags will be ignored and calculated anew as the DisplayList is // built. Alternatively, use the |saveLayer(SkRect, bool)| method. @@ -175,17 +184,23 @@ class DisplayListBuilder final : public virtual Dispatcher, : SaveLayerOptions::kNoAttributes, nullptr); } - void saveLayer(const SkRect* bounds, - const DlPaint* paint, - const DlImageFilter* backdrop = nullptr); - void restore() override; - int getSaveCount() { return layer_stack_.size(); } - void restoreToCount(int restore_count); - - void translate(SkScalar tx, SkScalar ty) override; - void scale(SkScalar sx, SkScalar sy) override; - void rotate(SkScalar degrees) override; - void skew(SkScalar sx, SkScalar sy) override; + void SaveLayer(const SkRect* bounds, + const DlPaint* paint = nullptr, + const DlImageFilter* backdrop = nullptr) override; + void Restore() override; + void restore() override { Restore(); } + int GetSaveCount() const override { return layer_stack_.size(); } + void RestoreToCount(int restore_count) override; + void restoreToCount(int restore_count) { RestoreToCount(restore_count); } + + void Translate(SkScalar tx, SkScalar ty) override; + void Scale(SkScalar sx, SkScalar sy) override; + void Rotate(SkScalar degrees) override; + void Skew(SkScalar sx, SkScalar sy) override; + void translate(SkScalar tx, SkScalar ty) override { Translate(tx, ty); } + void scale(SkScalar sx, SkScalar sy) override { Scale(sx, sy); } + void rotate(SkScalar degrees) override { Rotate(degrees); } + void skew(SkScalar sx, SkScalar sy) override { Skew(sx, sy); } void setAttributesFromPaint(const SkPaint& paint, const DisplayListAttributeFlags flags); @@ -193,83 +208,129 @@ class DisplayListBuilder final : public virtual Dispatcher, // clang-format off // 2x3 2D affine subset of a 4x4 transform in row major order - void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override; + void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) override { + Transform2DAffine(mxx, mxy, mxt, myx, myy, myt); + } // full 4x4 transform in row major order - void transformFullPerspective( + 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; + 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 { + TransformFullPerspective(mxx, mxy, mxz, mxt, + myx, myy, myz, myt, + mzx, mzy, mzz, mzt, + mwx, mwy, mwz, mwt); + } // clang-format on - void transformReset() override; - void transform(const SkMatrix* matrix); - void transform(const SkM44* matrix44); - void transform(const SkMatrix& matrix) { transform(&matrix); } - void transform(const SkM44& matrix44) { transform(&matrix44); } + void TransformReset() override; + void Transform(const SkMatrix* matrix) override; + void Transform(const SkM44* matrix44) override; + void SetTransform(const SkMatrix* matrix) override { + TransformReset(); + Transform(matrix); + } + void SetTransform(const SkM44* matrix44) override { + TransformReset(); + Transform(matrix44); + } + using DlCanvas::Transform; + void transformReset() override { TransformReset(); } + void transform(const SkMatrix* matrix) { Transform(matrix); } + void transform(const SkM44* matrix44) { Transform(matrix44); } + void transform(const SkMatrix& matrix) { Transform(&matrix); } + void transform(const SkM44& matrix44) { Transform(&matrix44); } /// Returns the 4x4 full perspective transform representing all transform /// operations executed so far in this DisplayList within the enclosing /// save stack. - SkM44 getTransformFullPerspective() const { return tracker_.matrix_4x4(); } + SkM44 GetTransformFullPerspective() const override { + return tracker_.matrix_4x4(); + } /// Returns the 3x3 partial perspective transform representing all transform /// operations executed so far in this DisplayList within the enclosing /// save stack. - SkMatrix getTransform() const { return tracker_.matrix_3x3(); } + SkMatrix GetTransform() const override { return tracker_.matrix_3x3(); } - void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override; - void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override; - void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) override; + void ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; + void ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; + void ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; + void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override { + ClipRect(rect, clip_op, is_aa); + } + void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override { + ClipRRect(rrect, clip_op, is_aa); + } + void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override { + ClipPath(path, clip_op, is_aa); + } /// Conservative estimate of the bounds of all outstanding clip operations /// measured in the coordinate space within which this DisplayList will /// be rendered. - SkRect getDestinationClipBounds() { return tracker_.device_cull_rect(); } + SkRect GetDestinationClipBounds() const override { + return tracker_.device_cull_rect(); + } /// Conservative estimate of the bounds of all outstanding clip operations /// transformed into the local coordinate space in which currently /// recorded rendering operations are interpreted. - SkRect getLocalClipBounds() { return tracker_.local_cull_rect(); } + SkRect GetLocalClipBounds() const override { + return tracker_.local_cull_rect(); + } /// 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. - bool quickReject(const SkRect& bounds) const; + bool QuickReject(const SkRect& bounds) const override; void drawPaint() override; - void drawPaint(const DlPaint& paint); - void drawColor(DlColor color, DlBlendMode mode) override; + void DrawPaint(const DlPaint& paint) override; + void DrawColor(DlColor color, DlBlendMode mode) override; + void drawColor(DlColor color, DlBlendMode mode) override { + DrawColor(color, mode); + } void drawLine(const SkPoint& p0, const SkPoint& p1) override; - void drawLine(const SkPoint& p0, const SkPoint& p1, const DlPaint& paint); + void DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) override; void drawRect(const SkRect& rect) override; - void drawRect(const SkRect& rect, const DlPaint& paint); + void DrawRect(const SkRect& rect, const DlPaint& paint) override; void drawOval(const SkRect& bounds) override; - void drawOval(const SkRect& bounds, const DlPaint& paint); + void DrawOval(const SkRect& bounds, const DlPaint& paint) override; void drawCircle(const SkPoint& center, SkScalar radius) override; - void drawCircle(const SkPoint& center, SkScalar radius, const DlPaint& paint); + void DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) override; void drawRRect(const SkRRect& rrect) override; - void drawRRect(const SkRRect& rrect, const DlPaint& paint); + void DrawRRect(const SkRRect& rrect, const DlPaint& paint) override; void drawDRRect(const SkRRect& outer, const SkRRect& inner) override; - void drawDRRect(const SkRRect& outer, + void DrawDRRect(const SkRRect& outer, const SkRRect& inner, - const DlPaint& paint); + const DlPaint& paint) override; void drawPath(const SkPath& path) override; - void drawPath(const SkPath& path, const DlPaint& paint); + void DrawPath(const SkPath& path, const DlPaint& paint) override; void drawArc(const SkRect& bounds, SkScalar start, SkScalar sweep, bool useCenter) override; - void drawArc(const SkRect& bounds, + void DrawArc(const SkRect& bounds, SkScalar start, SkScalar sweep, bool useCenter, - const DlPaint& paint); - void drawPoints(SkCanvas::PointMode mode, - uint32_t count, - const SkPoint pts[]) override; - void drawPoints(SkCanvas::PointMode mode, + const DlPaint& paint) override; + void drawPoints(PointMode mode, uint32_t count, const SkPoint pts[]) override; + void DrawPoints(PointMode mode, uint32_t count, const SkPoint pts[], - const DlPaint& paint); + const DlPaint& paint) override; void drawSkVertices(const sk_sp vertices, SkBlendMode mode) override; void drawVertices(const DlVertices* vertices, DlBlendMode mode) override; @@ -277,22 +338,18 @@ class DisplayListBuilder final : public virtual Dispatcher, DlBlendMode mode) { drawVertices(vertices.get(), mode); } - void drawVertices(const DlVertices* vertices, - DlBlendMode mode, - const DlPaint& paint); - void drawVertices(const std::shared_ptr vertices, + void DrawVertices(const DlVertices* vertices, DlBlendMode mode, - const DlPaint& paint) { - drawVertices(vertices.get(), mode, paint); - } + const DlPaint& paint) override; + using DlCanvas::DrawVertices; void drawImage(const sk_sp image, const SkPoint point, DlImageSampling sampling, bool render_with_attributes) override; - void drawImage(const sk_sp& image, + void DrawImage(const sk_sp& image, const SkPoint point, DlImageSampling sampling, - const DlPaint* paint = nullptr); + const DlPaint* paint = nullptr) override; void drawImageRect( const sk_sp image, const SkRect& src, @@ -301,23 +358,22 @@ class DisplayListBuilder final : public virtual Dispatcher, bool render_with_attributes, SkCanvas::SrcRectConstraint constraint = SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint) override; - void drawImageRect(const sk_sp& image, + void DrawImageRect(const sk_sp& image, const SkRect& src, const SkRect& dst, DlImageSampling sampling, const DlPaint* paint = nullptr, - SkCanvas::SrcRectConstraint constraint = - SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint); + bool enforce_src_edges = false) override; void drawImageNine(const sk_sp image, const SkIRect& center, const SkRect& dst, DlFilterMode filter, bool render_with_attributes) override; - void drawImageNine(const sk_sp& image, + void DrawImageNine(const sk_sp& image, const SkIRect& center, const SkRect& dst, DlFilterMode filter, - const DlPaint* paint = nullptr); + const DlPaint* paint = nullptr) override; void drawImageLattice(const sk_sp image, const SkCanvas::Lattice& lattice, const SkRect& dst, @@ -332,7 +388,7 @@ class DisplayListBuilder final : public virtual Dispatcher, DlImageSampling sampling, const SkRect* cullRect, bool render_with_attributes) override; - void drawAtlas(const sk_sp& atlas, + void DrawAtlas(const sk_sp& atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], @@ -340,23 +396,36 @@ class DisplayListBuilder final : public virtual Dispatcher, DlBlendMode mode, DlImageSampling sampling, const SkRect* cullRect, - const DlPaint* paint = nullptr); + const DlPaint* paint = nullptr) override; void drawPicture(const sk_sp picture, const SkMatrix* matrix, bool render_with_attributes) override; - void drawDisplayList(const sk_sp display_list) override; + void DrawDisplayList(const sk_sp display_list, + SkScalar opacity) override; + void drawDisplayList(const sk_sp display_list) override { + DrawDisplayList(display_list, SK_Scalar1); + } void drawTextBlob(const sk_sp blob, SkScalar x, SkScalar y) override; - void drawTextBlob(const sk_sp& blob, + void DrawTextBlob(const sk_sp& blob, SkScalar x, SkScalar y, - const DlPaint& paint); - void drawShadow(const SkPath& path, + const DlPaint& paint) override; + void DrawShadow(const SkPath& path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override; + void drawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) override { + DrawShadow(path, color, elevation, transparent_occluder, dpr); + } + + void Flush() override {} sk_sp Build(); diff --git a/display_list/display_list_builder_benchmarks.cc b/display_list/display_list_builder_benchmarks.cc index 5228c4b0f986f..7405901f4b473 100644 --- a/display_list/display_list_builder_benchmarks.cc +++ b/display_list/display_list_builder_benchmarks.cc @@ -96,7 +96,7 @@ static void BM_DisplayListBuilderWithClipRect( bool prepare_rtree = NeedPrepareRTree(type); while (state.KeepRunning()) { DisplayListBuilder builder(prepare_rtree); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, true); + builder.clipRect(clip_bounds, DlCanvas::ClipOp::kIntersect, true); InvokeAllRenderingOps(builder); Complete(builder, type); } @@ -132,9 +132,9 @@ static void BM_DisplayListBuilderWithSaveLayerAndImageFilter( for (auto& group : allRenderingOps) { for (size_t i = 0; i < group.variants.size(); i++) { auto& invocation = group.variants[i]; - builder.saveLayer(&layer_bounds, &layer_paint); + builder.SaveLayer(&layer_bounds, &layer_paint); invocation.Invoke(builder); - builder.restore(); + builder.Restore(); } } Complete(builder, type); diff --git a/display_list/display_list_builder_multiplexer.cc b/display_list/display_list_builder_multiplexer.cc deleted file mode 100644 index 0c029c532f89d..0000000000000 --- a/display_list/display_list_builder_multiplexer.cc +++ /dev/null @@ -1,28 +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/display_list/display_list_builder_multiplexer.h" - -namespace flutter { - -void DisplayListBuilderMultiplexer::addBuilder(DisplayListBuilder* builder) { - builders_.push_back(builder); -} - -void DisplayListBuilderMultiplexer::saveLayer( - const SkRect* bounds, - const DlPaint* paint, - const DlImageFilter* backdrop_filter) { - for (auto* builder : builders_) { - builder->saveLayer(bounds, paint, backdrop_filter); - } -} - -void DisplayListBuilderMultiplexer::restore() { - for (auto* builder : builders_) { - builder->restore(); - } -} - -} // namespace flutter diff --git a/display_list/display_list_builder_multiplexer.h b/display_list/display_list_builder_multiplexer.h deleted file mode 100644 index 498301d136773..0000000000000 --- a/display_list/display_list_builder_multiplexer.h +++ /dev/null @@ -1,36 +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. - -#ifndef FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ -#define FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ - -#include "flutter/display_list/display_list_builder.h" -#include "flutter/display_list/display_list_image_filter.h" -#include "flutter/display_list/display_list_paint.h" -#include "flutter/fml/macros.h" - -namespace flutter { - -/// A class that mutiplexes some of the DisplayListBuilder calls to multiple -/// other builders. For now it only implements saveLayer and restore as those -/// are needed to create a replacement for PaintContext::internal_nodes_canvas. -class DisplayListBuilderMultiplexer { - public: - DisplayListBuilderMultiplexer() = default; - - void addBuilder(DisplayListBuilder* builder); - - void saveLayer(const SkRect* bounds, - const DlPaint* paint, - const DlImageFilter* backdrop_filter = nullptr); - - void restore(); - - private: - std::vector builders_; -}; - -} // namespace flutter - -#endif // FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ diff --git a/display_list/display_list_canvas_dispatcher.cc b/display_list/display_list_canvas_dispatcher.cc index 686dffdd24225..9b6529bd7523c 100644 --- a/display_list/display_list_canvas_dispatcher.cc +++ b/display_list/display_list_canvas_dispatcher.cc @@ -12,6 +12,14 @@ namespace flutter { const SkScalar kLightHeight = 600; const SkScalar kLightRadius = 800; +static SkClipOp ToSk(DlCanvas::ClipOp op) { + return static_cast(op); +} + +static SkCanvas::PointMode ToSk(DlCanvas::PointMode mode) { + return static_cast(mode); +} + const SkPaint* DisplayListCanvasDispatcher::safe_paint(bool use_attributes) { if (use_attributes) { // The accumulated SkPaint object will already have incorporated @@ -113,19 +121,19 @@ void DisplayListCanvasDispatcher::transformReset() { } void DisplayListCanvasDispatcher::clipRect(const SkRect& rect, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { - canvas_->clipRect(rect, clip_op, is_aa); + canvas_->clipRect(rect, ToSk(clip_op), is_aa); } void DisplayListCanvasDispatcher::clipRRect(const SkRRect& rrect, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { - canvas_->clipRRect(rrect, clip_op, is_aa); + canvas_->clipRRect(rrect, ToSk(clip_op), is_aa); } void DisplayListCanvasDispatcher::clipPath(const SkPath& path, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { - canvas_->clipPath(path, clip_op, is_aa); + canvas_->clipPath(path, ToSk(clip_op), is_aa); } void DisplayListCanvasDispatcher::drawPaint() { @@ -175,10 +183,10 @@ void DisplayListCanvasDispatcher::drawArc(const SkRect& bounds, bool useCenter) { canvas_->drawArc(bounds, start, sweep, useCenter, paint()); } -void DisplayListCanvasDispatcher::drawPoints(SkCanvas::PointMode mode, +void DisplayListCanvasDispatcher::drawPoints(PointMode mode, uint32_t count, const SkPoint pts[]) { - canvas_->drawPoints(mode, count, pts, paint()); + canvas_->drawPoints(ToSk(mode), count, pts, paint()); } void DisplayListCanvasDispatcher::drawSkVertices( const sk_sp vertices, diff --git a/display_list/display_list_canvas_dispatcher.h b/display_list/display_list_canvas_dispatcher.h index 2a1cd81035725..17162e5d8efbe 100644 --- a/display_list/display_list_canvas_dispatcher.h +++ b/display_list/display_list_canvas_dispatcher.h @@ -51,9 +51,9 @@ class DisplayListCanvasDispatcher : public virtual Dispatcher, // clang-format on void transformReset() override; - void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override; - void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override; - void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) override; + void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; + void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; + void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; void drawPaint() override; void drawColor(DlColor color, DlBlendMode mode) override; @@ -68,9 +68,7 @@ class DisplayListCanvasDispatcher : public virtual Dispatcher, SkScalar start, SkScalar sweep, bool useCenter) override; - void drawPoints(SkCanvas::PointMode mode, - uint32_t count, - const SkPoint pts[]) override; + void drawPoints(PointMode mode, uint32_t count, const SkPoint pts[]) override; void drawSkVertices(const sk_sp vertices, SkBlendMode mode) override; void drawVertices(const DlVertices* vertices, DlBlendMode mode) override; diff --git a/display_list/display_list_canvas_recorder.cc b/display_list/display_list_canvas_recorder.cc index be420bec89eab..31de676db2f2d 100644 --- a/display_list/display_list_canvas_recorder.cc +++ b/display_list/display_list_canvas_recorder.cc @@ -19,6 +19,14 @@ namespace flutter { } \ } while (0) +static DlCanvas::ClipOp ToDl(SkClipOp op) { + return static_cast(op); +} + +static DlCanvas::PointMode ToDl(SkCanvas::PointMode mode) { + return static_cast(mode); +} + DisplayListCanvasRecorder::DisplayListCanvasRecorder(const SkRect& bounds, bool prepare_rtree) : SkCanvasVirtualEnforcer(0, 0), @@ -59,7 +67,7 @@ void DisplayListCanvasRecorder::onClipRect(const SkRect& rect, SkClipOp clip_op, ClipEdgeStyle edge_style) { CHECK_DISPOSE(); - builder_->clipRect(rect, clip_op, + builder_->clipRect(rect, ToDl(clip_op), edge_style == ClipEdgeStyle::kSoft_ClipEdgeStyle); SkCanvasVirtualEnforcer::onClipRect(rect, clip_op, edge_style); } @@ -67,7 +75,7 @@ void DisplayListCanvasRecorder::onClipRRect(const SkRRect& rrect, SkClipOp clip_op, ClipEdgeStyle edge_style) { CHECK_DISPOSE(); - builder_->clipRRect(rrect, clip_op, + builder_->clipRRect(rrect, ToDl(clip_op), edge_style == ClipEdgeStyle::kSoft_ClipEdgeStyle); SkCanvasVirtualEnforcer::onClipRRect(rrect, clip_op, edge_style); } @@ -75,7 +83,7 @@ void DisplayListCanvasRecorder::onClipPath(const SkPath& path, SkClipOp clip_op, ClipEdgeStyle edge_style) { CHECK_DISPOSE(); - builder_->clipPath(path, clip_op, + builder_->clipPath(path, ToDl(clip_op), edge_style == ClipEdgeStyle::kSoft_ClipEdgeStyle); SkCanvasVirtualEnforcer::onClipPath(path, clip_op, edge_style); } @@ -176,7 +184,7 @@ void DisplayListCanvasRecorder::onDrawPoints(SkCanvas::PointMode mode, // multiple calls to drawPoints, but how much do we really want // to support more than a couple billion points? FML_DCHECK(count32 == count); - builder_->drawPoints(mode, count32, pts); + builder_->drawPoints(ToDl(mode), count32, pts); } } void DisplayListCanvasRecorder::onDrawVerticesObject(const SkVertices* vertices, diff --git a/display_list/display_list_canvas_unittests.cc b/display_list/display_list_canvas_unittests.cc index 29401b98896d9..dee47a5c18d07 100644 --- a/display_list/display_list_canvas_unittests.cc +++ b/display_list/display_list_canvas_unittests.cc @@ -24,6 +24,9 @@ namespace flutter { namespace testing { +using ClipOp = DlCanvas::ClipOp; +using PointMode = DlCanvas::PointMode; + constexpr int kTestWidth = 200; constexpr int kTestHeight = 200; constexpr int kRenderWidth = 100; @@ -394,10 +397,10 @@ struct DlRenderJob : public JobRenderer { DisplayListBuilder builder(SkRect::MakeWH(info.width, info.height)); dl_setup_(builder); if (setup_matrix) { - *setup_matrix = builder.getTransform(); + *setup_matrix = builder.GetTransform(); } if (setup_clip_bounds) { - *setup_clip_bounds = builder.getDestinationClipBounds().roundOut(); + *setup_clip_bounds = builder.GetDestinationClipBounds().roundOut(); } dl_render_(builder); dl_restore_(builder); @@ -940,7 +943,7 @@ class CanvasCompareTester { }, [=](DisplayListBuilder& b) { b.save(); - b.clipRect(clip, SkClipOp::kIntersect, false); + b.clipRect(clip, ClipOp::kIntersect, false); b.drawRect(rect); b.setBlendMode(DlBlendMode::kClear); b.drawRect(rect); @@ -1076,7 +1079,7 @@ class CanvasCompareTester { }, [=](DisplayListBuilder& b) { dl_backdrop_setup(b); - b.clipRect(layer_bounds, SkClipOp::kIntersect, false); + b.clipRect(layer_bounds, ClipOp::kIntersect, false); b.saveLayer(nullptr, SaveLayerOptions::kNoAttributes, &backdrop); }) @@ -1920,7 +1923,7 @@ class CanvasCompareTester { c->clipRect(r_clip, SkClipOp::kIntersect, false); }, [=](DisplayListBuilder& b) { - b.clipRect(r_clip, SkClipOp::kIntersect, false); + b.clipRect(r_clip, ClipOp::kIntersect, false); })); RenderWith(testP, env, intersect_tolerance, CaseParameters( @@ -1929,7 +1932,7 @@ class CanvasCompareTester { c->clipRect(r_clip, SkClipOp::kIntersect, true); }, [=](DisplayListBuilder& b) { - b.clipRect(r_clip, SkClipOp::kIntersect, true); + b.clipRect(r_clip, ClipOp::kIntersect, true); })); RenderWith(testP, env, diff_tolerance, CaseParameters( @@ -1938,7 +1941,7 @@ class CanvasCompareTester { c->clipRect(r_clip, SkClipOp::kDifference, false); }, [=](DisplayListBuilder& b) { - b.clipRect(r_clip, SkClipOp::kDifference, false); + b.clipRect(r_clip, ClipOp::kDifference, false); }) .with_diff_clip()); // This test RR clip used to use very small radii, but due to @@ -1954,7 +1957,7 @@ class CanvasCompareTester { c->clipRRect(rr_clip, SkClipOp::kIntersect, false); }, [=](DisplayListBuilder& b) { - b.clipRRect(rr_clip, SkClipOp::kIntersect, false); + b.clipRRect(rr_clip, ClipOp::kIntersect, false); })); RenderWith(testP, env, intersect_tolerance, CaseParameters( @@ -1963,7 +1966,7 @@ class CanvasCompareTester { c->clipRRect(rr_clip, SkClipOp::kIntersect, true); }, [=](DisplayListBuilder& b) { - b.clipRRect(rr_clip, SkClipOp::kIntersect, true); + b.clipRRect(rr_clip, ClipOp::kIntersect, true); })); RenderWith(testP, env, diff_tolerance, CaseParameters( @@ -1972,7 +1975,7 @@ class CanvasCompareTester { c->clipRRect(rr_clip, SkClipOp::kDifference, false); }, [=](DisplayListBuilder& b) { - b.clipRRect(rr_clip, SkClipOp::kDifference, false); + b.clipRRect(rr_clip, ClipOp::kDifference, false); }) .with_diff_clip()); SkPath path_clip = SkPath(); @@ -1986,7 +1989,7 @@ class CanvasCompareTester { c->clipPath(path_clip, SkClipOp::kIntersect, false); }, [=](DisplayListBuilder& b) { - b.clipPath(path_clip, SkClipOp::kIntersect, false); + b.clipPath(path_clip, ClipOp::kIntersect, false); })); RenderWith(testP, env, intersect_tolerance, CaseParameters( @@ -1995,7 +1998,7 @@ class CanvasCompareTester { c->clipPath(path_clip, SkClipOp::kIntersect, true); }, [=](DisplayListBuilder& b) { - b.clipPath(path_clip, SkClipOp::kIntersect, true); + b.clipPath(path_clip, ClipOp::kIntersect, true); })); RenderWith(testP, env, diff_tolerance, CaseParameters( @@ -2004,7 +2007,7 @@ class CanvasCompareTester { c->clipPath(path_clip, SkClipOp::kDifference, false); }, [=](DisplayListBuilder& b) { - b.clipPath(path_clip, SkClipOp::kDifference, false); + b.clipPath(path_clip, ClipOp::kDifference, false); }) .with_diff_clip()); } @@ -2841,7 +2844,7 @@ TEST_F(DisplayListCanvas, DrawPointsAsPoints) { canvas->drawPoints(SkCanvas::kPoints_PointMode, count, points, p); }, [=](DisplayListBuilder& builder) { // - builder.drawPoints(SkCanvas::kPoints_PointMode, count, points); + builder.drawPoints(PointMode::kPoints, count, points); }, kDrawPointsAsPointsFlags) .set_draw_line() @@ -2891,7 +2894,7 @@ TEST_F(DisplayListCanvas, DrawPointsAsLines) { canvas->drawPoints(SkCanvas::kLines_PointMode, count, points, p); }, [=](DisplayListBuilder& builder) { // - builder.drawPoints(SkCanvas::kLines_PointMode, count, points); + builder.drawPoints(PointMode::kLines, count, points); }, kDrawPointsAsLinesFlags)); } @@ -2923,7 +2926,7 @@ TEST_F(DisplayListCanvas, DrawPointsAsPolygon) { p); }, [=](DisplayListBuilder& builder) { // - builder.drawPoints(SkCanvas::kPolygon_PointMode, count1, points1); + builder.drawPoints(PointMode::kPolygon, count1, points1); }, kDrawPointsAsPolygonFlags)); } @@ -3633,18 +3636,18 @@ TEST_F(DisplayListCanvas, SaveLayerConsolidation) { } auto render_content = [](DisplayListBuilder& builder) { - builder.drawRect( + builder.DrawRect( SkRect{kRenderLeft, kRenderTop, kRenderCenterX, kRenderCenterY}, - DlPaint().setColor(DlColor::kYellow())); - builder.drawRect( + DlPaint(DlColor::kYellow())); + builder.DrawRect( SkRect{kRenderCenterX, kRenderTop, kRenderRight, kRenderCenterY}, - DlPaint().setColor(DlColor::kRed())); - builder.drawRect( + DlPaint(DlColor::kRed())); + builder.DrawRect( SkRect{kRenderLeft, kRenderCenterY, kRenderCenterX, kRenderBottom}, - DlPaint().setColor(DlColor::kBlue())); - builder.drawRect( + DlPaint(DlColor::kBlue())); + builder.DrawRect( SkRect{kRenderCenterX, kRenderCenterY, kRenderRight, kRenderBottom}, - DlPaint().setColor(DlColor::kRed().modulateOpacity(0.5f))); + DlPaint(DlColor::kRed().modulateOpacity(0.5f))); }; auto test_attributes_env = @@ -3653,19 +3656,19 @@ TEST_F(DisplayListCanvas, SaveLayerConsolidation) { const std::string& desc1, const std::string& desc2, const RenderEnvironment* env) { DisplayListBuilder nested_builder; - nested_builder.saveLayer(&kTestBounds, &paint1); - nested_builder.saveLayer(&kTestBounds, &paint2); + nested_builder.SaveLayer(&kTestBounds, &paint1); + nested_builder.SaveLayer(&kTestBounds, &paint2); render_content(nested_builder); auto nested_results = env->getResult(nested_builder.Build()); DisplayListBuilder reverse_builder; - reverse_builder.saveLayer(&kTestBounds, &paint2); - reverse_builder.saveLayer(&kTestBounds, &paint1); + reverse_builder.SaveLayer(&kTestBounds, &paint2); + reverse_builder.SaveLayer(&kTestBounds, &paint1); render_content(reverse_builder); auto reverse_results = env->getResult(reverse_builder.Build()); DisplayListBuilder combined_builder; - combined_builder.saveLayer(&kTestBounds, &paint_both); + combined_builder.SaveLayer(&kTestBounds, &paint_both); render_content(combined_builder); auto combined_results = env->getResult(combined_builder.Build()); diff --git a/display_list/display_list_complexity.h b/display_list/display_list_complexity.h index f6a838865ee4c..958e2accb8117 100644 --- a/display_list/display_list_complexity.h +++ b/display_list/display_list_complexity.h @@ -19,7 +19,7 @@ class DisplayListComplexityCalculator { virtual ~DisplayListComplexityCalculator() = default; // Returns a calculated complexity score for a given DisplayList object - virtual unsigned int Compute(DisplayList* display_list) = 0; + virtual unsigned int Compute(const DisplayList* display_list) = 0; // Returns whether a given complexity score meets the threshold for // cacheability for this particular ComplexityCalculator @@ -38,7 +38,7 @@ class DisplayListNaiveComplexityCalculator public: static DisplayListComplexityCalculator* GetInstance(); - unsigned int Compute(DisplayList* display_list) override { + unsigned int Compute(const DisplayList* display_list) override { return display_list->op_count(true); } diff --git a/display_list/display_list_complexity_gl.cc b/display_list/display_list_complexity_gl.cc index 9391253ee3b14..a0c982ffe5e92 100644 --- a/display_list/display_list_complexity_gl.cc +++ b/display_list/display_list_complexity_gl.cc @@ -414,7 +414,7 @@ void DisplayListGLComplexityCalculator::GLHelper::drawArc( } void DisplayListGLComplexityCalculator::GLHelper::drawPoints( - SkCanvas::PointMode mode, + DlCanvas::PointMode mode, uint32_t count, const SkPoint points[]) { if (IsComplex()) { @@ -423,7 +423,7 @@ void DisplayListGLComplexityCalculator::GLHelper::drawPoints( unsigned int complexity; if (IsAntiAliased()) { - if (mode == SkCanvas::kPoints_PointMode) { + if (mode == DlCanvas::PointMode::kPoints) { if (IsHairline()) { // This is a special case, it triggers an extremely fast path. // m = 1/4500 @@ -434,7 +434,7 @@ void DisplayListGLComplexityCalculator::GLHelper::drawPoints( // c = 0 complexity = count * 400; } - } else if (mode == SkCanvas::kLines_PointMode) { + } else if (mode == DlCanvas::PointMode::kLines) { if (IsHairline()) { // m = 1/750 // c = 0 @@ -456,12 +456,12 @@ void DisplayListGLComplexityCalculator::GLHelper::drawPoints( } } } else { - if (mode == SkCanvas::kPoints_PointMode) { + if (mode == DlCanvas::PointMode::kPoints) { // Hairline vs non hairline makes no difference for points without AA. // m = 1/18000 // c = 0.25 complexity = (count + 4500) * 100 / 9; - } else if (mode == SkCanvas::kLines_PointMode) { + } else if (mode == DlCanvas::PointMode::kLines) { if (IsHairline()) { // m = 1/8500 // c = 0.25 diff --git a/display_list/display_list_complexity_gl.h b/display_list/display_list_complexity_gl.h index bcc81bfab592a..d358e99970db1 100644 --- a/display_list/display_list_complexity_gl.h +++ b/display_list/display_list_complexity_gl.h @@ -14,7 +14,7 @@ class DisplayListGLComplexityCalculator public: static DisplayListGLComplexityCalculator* GetInstance(); - unsigned int Compute(DisplayList* display_list) override { + unsigned int Compute(const DisplayList* display_list) override { GLHelper helper(ceiling_); display_list->Dispatch(helper); return helper.ComplexityScore(); @@ -52,7 +52,7 @@ class DisplayListGLComplexityCalculator SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) override; - void drawPoints(SkCanvas::PointMode mode, + void drawPoints(DlCanvas::PointMode mode, uint32_t count, const SkPoint points[]) override; void drawSkVertices(const sk_sp, SkBlendMode mode) override; diff --git a/display_list/display_list_complexity_metal.cc b/display_list/display_list_complexity_metal.cc index 0152c120025fe..723f4bdd9525e 100644 --- a/display_list/display_list_complexity_metal.cc +++ b/display_list/display_list_complexity_metal.cc @@ -400,7 +400,7 @@ void DisplayListMetalComplexityCalculator::MetalHelper::drawArc( } void DisplayListMetalComplexityCalculator::MetalHelper::drawPoints( - SkCanvas::PointMode mode, + DlCanvas::PointMode mode, uint32_t count, const SkPoint points[]) { if (IsComplex()) { @@ -415,12 +415,12 @@ void DisplayListMetalComplexityCalculator::MetalHelper::drawPoints( // c = 0.75 complexity = (count + 12000) * 25 / 2; } else { - if (mode == SkCanvas::kPolygon_PointMode) { + if (mode == DlCanvas::PointMode::kPolygon) { // m = 1/1250 // c = 1 complexity = (count + 1250) * 160; } else { - if (IsHairline() && mode == SkCanvas::kPoints_PointMode) { + if (IsHairline() && mode == DlCanvas::PointMode::kPoints) { // This is a special case, it triggers an extremely fast path. // m = 1/14500 // c = 0 diff --git a/display_list/display_list_complexity_metal.h b/display_list/display_list_complexity_metal.h index e484bac857e4f..361862d304995 100644 --- a/display_list/display_list_complexity_metal.h +++ b/display_list/display_list_complexity_metal.h @@ -14,7 +14,7 @@ class DisplayListMetalComplexityCalculator public: static DisplayListMetalComplexityCalculator* GetInstance(); - unsigned int Compute(DisplayList* display_list) override { + unsigned int Compute(const DisplayList* display_list) override { MetalHelper helper(ceiling_); display_list->Dispatch(helper); return helper.ComplexityScore(); @@ -52,7 +52,7 @@ class DisplayListMetalComplexityCalculator SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) override; - void drawPoints(SkCanvas::PointMode mode, + void drawPoints(DlCanvas::PointMode mode, uint32_t count, const SkPoint points[]) override; void drawSkVertices(const sk_sp vertices, diff --git a/display_list/display_list_complexity_unittests.cc b/display_list/display_list_complexity_unittests.cc index 403ca3094ef3d..b459a78b35c1b 100644 --- a/display_list/display_list_complexity_unittests.cc +++ b/display_list/display_list_complexity_unittests.cc @@ -320,17 +320,17 @@ TEST(DisplayListComplexity, DrawTextBlob) { TEST(DisplayListComplexity, DrawPoints) { auto points = GetTestPoints(); DisplayListBuilder builder_lines; - builder_lines.drawPoints(SkCanvas::kLines_PointMode, points.size(), + builder_lines.drawPoints(DlCanvas::PointMode::kLines, points.size(), points.data()); auto display_list_lines = builder_lines.Build(); DisplayListBuilder builder_points; - builder_points.drawPoints(SkCanvas::kPoints_PointMode, points.size(), + builder_points.drawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data()); auto display_list_points = builder_points.Build(); DisplayListBuilder builder_polygon; - builder_polygon.drawPoints(SkCanvas::kPolygon_PointMode, points.size(), + builder_polygon.drawPoints(DlCanvas::PointMode::kPolygon, points.size(), points.data()); auto display_list_polygon = builder_polygon.Build(); diff --git a/display_list/display_list_dispatcher.h b/display_list/display_list_dispatcher.h index 62750b0d515dd..166a8645406b8 100644 --- a/display_list/display_list_dispatcher.h +++ b/display_list/display_list_dispatcher.h @@ -16,6 +16,7 @@ #include "flutter/display_list/display_list_path_effect.h" #include "flutter/display_list/display_list_sampling_options.h" #include "flutter/display_list/display_list_vertices.h" +#include "flutter/display_list/dl_canvas.h" namespace flutter { @@ -28,6 +29,10 @@ class DisplayList; /// invoked through the DisplayList::dispatch() method. /// class Dispatcher { + protected: + using ClipOp = DlCanvas::ClipOp; + using PointMode = DlCanvas::PointMode; + public: // MaxDrawPointsCount * sizeof(SkPoint) must be less than 1 << 32 static constexpr int kMaxDrawPointsCount = ((1 << 29) - 1); @@ -183,11 +188,9 @@ class Dispatcher { // Clears the transformation stack. virtual void transformReset() = 0; - virtual void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) = 0; - virtual void clipRRect(const SkRRect& rrect, - SkClipOp clip_op, - bool is_aa) = 0; - virtual void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) = 0; + virtual void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) = 0; + virtual void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) = 0; + virtual void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) = 0; // The following rendering methods all take their rendering attributes // from the last value set by the attribute methods above (regardless @@ -209,7 +212,7 @@ class Dispatcher { SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) = 0; - virtual void drawPoints(SkCanvas::PointMode mode, + virtual void drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) = 0; virtual void drawSkVertices(const sk_sp vertices, diff --git a/display_list/display_list_image_skia.cc b/display_list/display_list_image_skia.cc index 07fd84143b8fc..2e0b0f3bdfdcb 100644 --- a/display_list/display_list_image_skia.cc +++ b/display_list/display_list_image_skia.cc @@ -38,10 +38,10 @@ SkISize DlImageSkia::dimensions() const { // |DlImage| size_t DlImageSkia::GetApproximateByteSize() const { - auto size = sizeof(this); + auto size = sizeof(*this); if (image_) { const auto& info = image_->imageInfo(); - const auto kMipmapOverhead = 4.0 / 3.0; + const auto kMipmapOverhead = image_->hasMipmaps() ? 4.0 / 3.0 : 1.0; const size_t image_byte_size = info.computeMinByteSize() * kMipmapOverhead; size += image_byte_size; } diff --git a/display_list/display_list_matrix_clip_tracker.cc b/display_list/display_list_matrix_clip_tracker.cc index d79f6933aa0c1..c515b58057cbd 100644 --- a/display_list/display_list_matrix_clip_tracker.cc +++ b/display_list/display_list_matrix_clip_tracker.cc @@ -212,12 +212,12 @@ void DisplayListMatrixClipTracker::setTransform(const SkM44& m44) { } void DisplayListMatrixClipTracker::clipRRect(const SkRRect& rrect, - SkClipOp op, + ClipOp op, bool is_aa) { switch (op) { - case SkClipOp::kIntersect: + case ClipOp::kIntersect: break; - case SkClipOp::kDifference: + case ClipOp::kDifference: if (!rrect.isRect()) { return; } @@ -226,27 +226,27 @@ void DisplayListMatrixClipTracker::clipRRect(const SkRRect& rrect, current_->clipBounds(rrect.getBounds(), op, is_aa); } void DisplayListMatrixClipTracker::clipPath(const SkPath& path, - SkClipOp op, + ClipOp op, bool is_aa) { // Map "kDifference of inverse path" to "kIntersect of the original path" and // map "kIntersect of inverse path" to "kDifference of the original path" if (path.isInverseFillType()) { switch (op) { - case SkClipOp::kIntersect: - op = SkClipOp::kDifference; + case ClipOp::kIntersect: + op = ClipOp::kDifference; break; - case SkClipOp::kDifference: - op = SkClipOp::kIntersect; + case ClipOp::kDifference: + op = ClipOp::kIntersect; break; } } SkRect bounds; switch (op) { - case SkClipOp::kIntersect: + case ClipOp::kIntersect: bounds = path.getBounds(); break; - case SkClipOp::kDifference: + case ClipOp::kDifference: if (!path.isRect(&bounds)) { return; } @@ -272,7 +272,7 @@ bool DisplayListMatrixClipTracker::Data::content_culled( } void DisplayListMatrixClipTracker::Data::clipBounds(const SkRect& clip, - SkClipOp op, + ClipOp op, bool is_aa) { if (cull_rect_.isEmpty()) { // No point in intersecting further. @@ -283,7 +283,7 @@ void DisplayListMatrixClipTracker::Data::clipBounds(const SkRect& clip, return; } switch (op) { - case SkClipOp::kIntersect: { + case ClipOp::kIntersect: { if (clip.isEmpty()) { cull_rect_.setEmpty(); break; @@ -298,7 +298,7 @@ void DisplayListMatrixClipTracker::Data::clipBounds(const SkRect& clip, } break; } - case SkClipOp::kDifference: { + case ClipOp::kDifference: { if (clip.isEmpty() || !clip.intersects(cull_rect_)) { break; } diff --git a/display_list/display_list_matrix_clip_tracker.h b/display_list/display_list_matrix_clip_tracker.h index 563d489cecc62..6c76397b56dd8 100644 --- a/display_list/display_list_matrix_clip_tracker.h +++ b/display_list/display_list_matrix_clip_tracker.h @@ -7,6 +7,7 @@ #include +#include "flutter/display_list/dl_canvas.h" #include "flutter/fml/logging.h" #include "third_party/skia/include/core/SkClipOp.h" #include "third_party/skia/include/core/SkM44.h" @@ -19,10 +20,15 @@ namespace flutter { class DisplayListMatrixClipTracker { + private: + using ClipOp = DlCanvas::ClipOp; + public: DisplayListMatrixClipTracker(const SkRect& cull_rect, const SkMatrix& matrix); DisplayListMatrixClipTracker(const SkRect& cull_rect, const SkM44& matrix); + SkRect base_device_cull_rect() const { return saved_[0]->device_cull_rect(); } + bool using_4x4_matrix() const { return current_->is_4x4(); } SkM44 matrix_4x4() const { return current_->matrix_4x4(); } @@ -59,11 +65,11 @@ class DisplayListMatrixClipTracker { void setIdentity() { current_->setIdentity(); } bool mapRect(SkRect* rect) const { return current_->mapRect(*rect, rect); } - void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) { + void clipRect(const SkRect& rect, ClipOp op, bool is_aa) { current_->clipBounds(rect, op, is_aa); } - void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa); - void clipPath(const SkPath& path, SkClipOp op, bool is_aa); + void clipRRect(const SkRRect& rrect, ClipOp op, bool is_aa); + void clipPath(const SkPath& path, ClipOp op, bool is_aa); private: class Data { @@ -91,7 +97,7 @@ class DisplayListMatrixClipTracker { virtual bool mapRect(const SkRect& rect, SkRect* mapped) const = 0; virtual bool canBeInverted() const = 0; - virtual void clipBounds(const SkRect& clip, SkClipOp op, bool is_aa); + virtual void clipBounds(const SkRect& clip, ClipOp op, bool is_aa); protected: Data(const SkRect& rect) : cull_rect_(rect) {} diff --git a/display_list/display_list_matrix_clip_tracker_unittests.cc b/display_list/display_list_matrix_clip_tracker_unittests.cc index eff7e9094ad3c..adaee90bec97f 100644 --- a/display_list/display_list_matrix_clip_tracker_unittests.cc +++ b/display_list/display_list_matrix_clip_tracker_unittests.cc @@ -329,7 +329,7 @@ TEST(DisplayListMatrixClipTracker, ClipPathWithInvertFillType) { DisplayListMatrixClipTracker builder(cull_rect, SkMatrix::I()); SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); clip.setFillType(SkPathFillType::kInverseWinding); - builder.clipPath(clip, SkClipOp::kIntersect, false); + builder.clipPath(clip, DlCanvas::ClipOp::kIntersect, false); ASSERT_EQ(builder.local_cull_rect(), cull_rect); ASSERT_EQ(builder.device_cull_rect(), cull_rect); @@ -342,7 +342,7 @@ TEST(DisplayListMatrixClipTracker, DiffClipPathWithInvertFillType) { SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); clip.setFillType(SkPathFillType::kInverseWinding); SkRect clip_bounds = SkRect::MakeLTRB(8.2, 9.3, 22.4, 27.7); - tracker.clipPath(clip, SkClipOp::kDifference, false); + tracker.clipPath(clip, DlCanvas::ClipOp::kDifference, false); ASSERT_EQ(tracker.local_cull_rect(), clip_bounds); ASSERT_EQ(tracker.device_cull_rect(), clip_bounds); diff --git a/display_list/display_list_ops.h b/display_list/display_list_ops.h index d4f42f4906b5d..218dc22aa259f 100644 --- a/display_list/display_list_ops.h +++ b/display_list/display_list_ops.h @@ -629,7 +629,8 @@ struct TransformResetOp final : TransformClipOpBase { \ void dispatch(DispatchContext& ctx) const { \ if (op_needed(ctx)) { \ - ctx.dispatcher.clip##shapetype(shape, SkClipOp::k##clipop, is_aa); \ + ctx.dispatcher.clip##shapetype(shape, DlCanvas::ClipOp::k##clipop, \ + is_aa); \ } \ } \ }; @@ -639,27 +640,27 @@ DEFINE_CLIP_SHAPE_OP(Rect, Difference) DEFINE_CLIP_SHAPE_OP(RRect, Difference) #undef DEFINE_CLIP_SHAPE_OP -#define DEFINE_CLIP_PATH_OP(clipop) \ - struct Clip##clipop##PathOp final : TransformClipOpBase { \ - static const auto kType = DisplayListOpType::kClip##clipop##Path; \ - \ - Clip##clipop##PathOp(SkPath path, bool is_aa) \ - : is_aa(is_aa), path(path) {} \ - \ - const bool is_aa; \ - const SkPath path; \ - \ - void dispatch(DispatchContext& ctx) const { \ - if (op_needed(ctx)) { \ - ctx.dispatcher.clipPath(path, SkClipOp::k##clipop, is_aa); \ - } \ - } \ - \ - DisplayListCompare equals(const Clip##clipop##PathOp* other) const { \ - return is_aa == other->is_aa && path == other->path \ - ? DisplayListCompare::kEqual \ - : DisplayListCompare::kNotEqual; \ - } \ +#define DEFINE_CLIP_PATH_OP(clipop) \ + struct Clip##clipop##PathOp final : TransformClipOpBase { \ + static const auto kType = DisplayListOpType::kClip##clipop##Path; \ + \ + Clip##clipop##PathOp(SkPath path, bool is_aa) \ + : is_aa(is_aa), path(path) {} \ + \ + const bool is_aa; \ + const SkPath path; \ + \ + void dispatch(DispatchContext& ctx) const { \ + if (op_needed(ctx)) { \ + ctx.dispatcher.clipPath(path, DlCanvas::ClipOp::k##clipop, is_aa); \ + } \ + } \ + \ + DisplayListCompare equals(const Clip##clipop##PathOp* other) const { \ + return is_aa == other->is_aa && path == other->path \ + ? DisplayListCompare::kEqual \ + : DisplayListCompare::kNotEqual; \ + } \ }; DEFINE_CLIP_PATH_OP(Intersect) DEFINE_CLIP_PATH_OP(Difference) @@ -808,13 +809,13 @@ struct DrawArcOp final : DrawOpBase { void dispatch(DispatchContext& ctx) const { \ if (op_needed(ctx)) { \ const SkPoint* pts = reinterpret_cast(this + 1); \ - ctx.dispatcher.drawPoints(SkCanvas::PointMode::mode, count, pts); \ + ctx.dispatcher.drawPoints(DlCanvas::PointMode::mode, count, pts); \ } \ } \ }; -DEFINE_DRAW_POINTS_OP(Points, kPoints_PointMode); -DEFINE_DRAW_POINTS_OP(Lines, kLines_PointMode); -DEFINE_DRAW_POINTS_OP(Polygon, kPolygon_PointMode); +DEFINE_DRAW_POINTS_OP(Points, kPoints); +DEFINE_DRAW_POINTS_OP(Lines, kLines); +DEFINE_DRAW_POINTS_OP(Polygon, kPolygon); #undef DEFINE_DRAW_POINTS_OP // 4 byte header + 4 byte payload packs efficiently into 8 bytes @@ -1143,7 +1144,7 @@ struct DrawDisplayListOp final : DrawOpBase { explicit DrawDisplayListOp(const sk_sp display_list) : display_list(std::move(display_list)) {} - sk_sp display_list; + const sk_sp display_list; void dispatch(DispatchContext& ctx) const { if (op_needed(ctx)) { diff --git a/display_list/display_list_paint.cc b/display_list/display_list_paint.cc index d3a0f8c752c29..f287e9573e497 100644 --- a/display_list/display_list_paint.cc +++ b/display_list/display_list_paint.cc @@ -6,7 +6,7 @@ namespace flutter { -DlPaint::DlPaint() +DlPaint::DlPaint(DlColor color) : blendMode_(static_cast(DlBlendMode::kDefaultMode)), drawStyle_(static_cast(DlDrawStyle::kDefaultStyle)), strokeCap_(static_cast(DlStrokeCap::kDefaultCap)), @@ -14,6 +14,7 @@ DlPaint::DlPaint() isAntiAlias_(false), isDither_(false), isInvertColors_(false), + color_(color), strokeWidth_(kDefaultWidth), strokeMiter_(kDefaultMiter) {} diff --git a/display_list/display_list_paint.h b/display_list/display_list_paint.h index 9eb0ad0de2b2a..1d6ed34830eb8 100644 --- a/display_list/display_list_paint.h +++ b/display_list/display_list_paint.h @@ -73,7 +73,8 @@ class DlPaint { static constexpr float kDefaultWidth = 0.0; static constexpr float kDefaultMiter = 4.0; - DlPaint(); + DlPaint() : DlPaint(DlColor::kBlack()) {} + DlPaint(DlColor color); bool isAntiAlias() const { return isAntiAlias_; } DlPaint& setAntiAlias(bool isAntiAlias) { diff --git a/display_list/display_list_paint_unittests.cc b/display_list/display_list_paint_unittests.cc index b040647035e27..fbed4c691f4ae 100644 --- a/display_list/display_list_paint_unittests.cc +++ b/display_list/display_list_paint_unittests.cc @@ -38,11 +38,15 @@ TEST(DisplayListPaint, ConstructorDefaults) { EXPECT_EQ(DlPaint::kDefaultMiter, 4.0); EXPECT_EQ(paint, DlPaint()); + EXPECT_EQ(paint, DlPaint(DlColor::kBlack())); + EXPECT_EQ(paint, DlPaint(0xFF000000)); EXPECT_NE(paint, DlPaint().setAntiAlias(true)); EXPECT_NE(paint, DlPaint().setDither(true)); EXPECT_NE(paint, DlPaint().setInvertColors(true)); EXPECT_NE(paint, DlPaint().setColor(DlColor::kGreen())); + EXPECT_NE(paint, DlPaint(DlColor::kGreen())); + EXPECT_NE(paint, DlPaint(0xFF00FF00)); EXPECT_NE(paint, DlPaint().setAlpha(0x7f)); EXPECT_NE(paint, DlPaint().setBlendMode(DlBlendMode::kDstIn)); EXPECT_NE(paint, DlPaint().setDrawStyle(DlDrawStyle::kStrokeAndFill)); diff --git a/display_list/display_list_unittests.cc b/display_list/display_list_unittests.cc index 63e34f235db16..145117d995dae 100644 --- a/display_list/display_list_unittests.cc +++ b/display_list/display_list_unittests.cc @@ -29,6 +29,9 @@ namespace testing { static std::vector allGroups = CreateAllGroups(); +using ClipOp = DlCanvas::ClipOp; +using PointMode = DlCanvas::PointMode; + #ifndef NDEBUG TEST(DisplayList, CallMethodAfterBuild) { DisplayListCanvasRecorder recorder(kTestBounds); @@ -56,6 +59,18 @@ TEST(DisplayList, RecorderInitialClipBoundsNaN) { ASSERT_EQ(canvas->getDeviceClipBounds(), clip_bounds); } +TEST(DisplayList, BuilderBoundsTransformComparedToSkia) { + const SkRect frame_rect = SkRect::MakeLTRB(10, 10, 100, 100); + DisplayListBuilder builder(frame_rect); + SkPictureRecorder recorder; + SkCanvas* canvas = recorder.beginRecording(frame_rect); + ASSERT_EQ(builder.GetDestinationClipBounds(), + SkRect::Make(canvas->getDeviceClipBounds())); + ASSERT_EQ(builder.GetLocalClipBounds().makeOutset(1, 1), + canvas->getLocalClipBounds()); + ASSERT_EQ(builder.GetTransform(), canvas->getTotalMatrix()); +} + TEST(DisplayList, RecorderClipBoundsAfterClipRect) { SkRect cull_rect = SkRect::MakeWH(100, 100); SkRect clip_rect = SkRect::MakeLTRB(10, 10, 20, 20); @@ -99,14 +114,14 @@ TEST(DisplayList, BuilderInitialClipBounds) { SkRect cull_rect = SkRect::MakeWH(100, 100); SkRect clip_bounds = SkRect::MakeWH(100, 100); DisplayListBuilder builder(cull_rect); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, BuilderInitialClipBoundsNaN) { SkRect cull_rect = SkRect::MakeWH(SK_ScalarNaN, SK_ScalarNaN); SkRect clip_bounds = SkRect::MakeEmpty(); DisplayListBuilder builder(cull_rect); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, BuilderClipBoundsAfterClipRect) { @@ -114,8 +129,8 @@ TEST(DisplayList, BuilderClipBoundsAfterClipRect) { SkRect clip_rect = SkRect::MakeLTRB(10, 10, 20, 20); SkRect clip_bounds = SkRect::MakeLTRB(10, 10, 20, 20); DisplayListBuilder builder(cull_rect); - builder.clipRect(clip_rect, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + builder.clipRect(clip_rect, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, BuilderClipBoundsAfterClipRRect) { @@ -124,8 +139,8 @@ TEST(DisplayList, BuilderClipBoundsAfterClipRRect) { SkRRect clip_rrect = SkRRect::MakeRectXY(clip_rect, 2, 2); SkRect clip_bounds = SkRect::MakeLTRB(10, 10, 20, 20); DisplayListBuilder builder(cull_rect); - builder.clipRRect(clip_rrect, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + builder.clipRRect(clip_rrect, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, BuilderClipBoundsAfterClipPath) { @@ -134,8 +149,8 @@ TEST(DisplayList, BuilderClipBoundsAfterClipPath) { SkRect clip_bounds = SkRect::MakeLTRB(10, 10, 20, 20); DisplayListCanvasRecorder recorder(cull_rect); DisplayListBuilder builder(cull_rect); - builder.clipPath(clip_path, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + builder.clipPath(clip_path, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, BuilderInitialClipBoundsNonZero) { @@ -143,7 +158,7 @@ TEST(DisplayList, BuilderInitialClipBoundsNonZero) { SkRect clip_bounds = SkRect::MakeLTRB(10, 10, 100, 100); DisplayListCanvasRecorder recorder(cull_rect); DisplayListBuilder builder(cull_rect); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, SingleOpSizes) { @@ -183,7 +198,7 @@ TEST(DisplayList, SingleOpDisplayListsRecapturedAreEqual) { // Verify recapturing the replay of the display list is Equals() // when dispatching directly from the DL to another builder DisplayListBuilder builder; - dl->Dispatch(builder); + dl->Dispatch(builder.asDispatcher()); sk_sp copy = builder.Build(); auto desc = group.op_name + "(variant " + std::to_string(i + 1) + " == copy)"; @@ -773,8 +788,7 @@ TEST(DisplayList, SingleOpsMightSupportGroupOpacityWithOrWithoutBlendMode) { RUN_TESTS(builder.drawPath( SkPath().addOval({0, 0, 10, 10}).addOval({5, 5, 15, 15}));); RUN_TESTS(builder.drawArc({0, 0, 10, 10}, 0, math::kPi, true);); - RUN_TESTS2(builder.drawPoints(SkCanvas::kPoints_PointMode, TestPointCount, - TestPoints); + RUN_TESTS2(builder.drawPoints(PointMode::kPoints, TestPointCount, TestPoints); , false); RUN_TESTS2(builder.drawVertices(TestVertices1, DlBlendMode::kSrc);, false); RUN_TESTS(builder.drawImage(TestImage1, {0, 0}, kLinearSampling, true);); @@ -1190,14 +1204,14 @@ TEST(DisplayList, FlutterSvgIssue661BoundsWereEmpty) { DisplayListBuilder builder; { builder.save(); - builder.clipRect({0, 0, 100, 100}, SkClipOp::kIntersect, true); + builder.clipRect({0, 0, 100, 100}, ClipOp::kIntersect, true); { builder.save(); builder.transform2DAffine(2.17391, 0, -2547.83, // 0, 2.04082, -500); { builder.save(); - builder.clipRect({1172, 245, 1218, 294}, SkClipOp::kIntersect, true); + builder.clipRect({1172, 245, 1218, 294}, ClipOp::kIntersect, true); { builder.saveLayer(nullptr, SaveLayerOptions::kWithAttributes, nullptr); @@ -1250,14 +1264,14 @@ TEST(DisplayList, TranslateAffectsCurrentTransform) { builder.translate(12.3, 14.5); SkMatrix matrix = SkMatrix::Translate(12.3, 14.5); SkM44 m44 = SkM44(matrix); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1268,14 +1282,14 @@ TEST(DisplayList, ScaleAffectsCurrentTransform) { builder.scale(12.3, 14.5); SkMatrix matrix = SkMatrix::Scale(12.3, 14.5); SkM44 m44 = SkM44(matrix); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1286,14 +1300,14 @@ TEST(DisplayList, RotateAffectsCurrentTransform) { builder.rotate(12.3); SkMatrix matrix = SkMatrix::RotateDeg(12.3); SkM44 m44 = SkM44(matrix); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1304,14 +1318,14 @@ TEST(DisplayList, SkewAffectsCurrentTransform) { builder.skew(12.3, 14.5); SkMatrix matrix = SkMatrix::Skew(12.3, 14.5); SkM44 m44 = SkM44(matrix); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1325,14 +1339,14 @@ TEST(DisplayList, TransformAffectsCurrentTransform) { 1, 5, 14.5, // 0, 0, 1); SkM44 m44 = SkM44(matrix); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1351,14 +1365,14 @@ TEST(DisplayList, FullTransformAffectsCurrentTransform) { 1, 5, 3, 14.5, // 0, 0, 7, 16.2, // 0, 0, 0, 1); - SkM44 cur_m44 = builder.getTransformFullPerspective(); - SkMatrix cur_matrix = builder.getTransform(); + SkM44 cur_m44 = builder.GetTransformFullPerspective(); + SkMatrix cur_matrix = builder.GetTransform(); ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); builder.translate(10, 10); // CurrentTransform has changed - ASSERT_NE(builder.getTransformFullPerspective(), m44); - ASSERT_NE(builder.getTransform(), cur_matrix); + ASSERT_NE(builder.GetTransformFullPerspective(), m44); + ASSERT_NE(builder.GetTransform(), cur_matrix); // Previous return values have not ASSERT_EQ(cur_m44, m44); ASSERT_EQ(cur_matrix, matrix); @@ -1367,78 +1381,78 @@ TEST(DisplayList, FullTransformAffectsCurrentTransform) { TEST(DisplayList, ClipRectAffectsClipBounds) { DisplayListBuilder builder; SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.clipRect(clip_bounds, ClipOp::kIntersect, false); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, false); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, false); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_clip_bounds = SkRect::MakeLTRB(5.1, 5.65, 10.2, 12.85); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_clip_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_clip_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipRectDoAAAffectsClipBounds) { DisplayListBuilder builder; SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); SkRect clip_expanded_bounds = SkRect::MakeLTRB(10, 11, 21, 26); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, true); + builder.clipRect(clip_bounds, ClipOp::kIntersect, true); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, true); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, true); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_expanded_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_expanded_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_expanded_bounds = SkRect::MakeLTRB(5, 5.5, 10.5, 13); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_expanded_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_expanded_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipRectAffectsClipBoundsWithMatrix) { @@ -1446,17 +1460,17 @@ TEST(DisplayList, ClipRectAffectsClipBoundsWithMatrix) { SkRect clip_bounds_1 = SkRect::MakeLTRB(0, 0, 10, 10); SkRect clip_bounds_2 = SkRect::MakeLTRB(10, 10, 20, 20); builder.save(); - builder.clipRect(clip_bounds_1, SkClipOp::kIntersect, false); + builder.clipRect(clip_bounds_1, ClipOp::kIntersect, false); builder.translate(10, 0); - builder.clipRect(clip_bounds_1, SkClipOp::kIntersect, false); - ASSERT_TRUE(builder.getDestinationClipBounds().isEmpty()); + builder.clipRect(clip_bounds_1, ClipOp::kIntersect, false); + ASSERT_TRUE(builder.GetDestinationClipBounds().isEmpty()); builder.restore(); builder.save(); - builder.clipRect(clip_bounds_1, SkClipOp::kIntersect, false); + builder.clipRect(clip_bounds_1, ClipOp::kIntersect, false); builder.translate(-10, -10); - builder.clipRect(clip_bounds_2, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds_1); + builder.clipRect(clip_bounds_2, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds_1); builder.restore(); } @@ -1464,39 +1478,39 @@ TEST(DisplayList, ClipRRectAffectsClipBounds) { DisplayListBuilder builder; SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); SkRRect clip = SkRRect::MakeRectXY(clip_bounds, 3, 2); - builder.clipRRect(clip, SkClipOp::kIntersect, false); + builder.clipRRect(clip, ClipOp::kIntersect, false); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, false); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, false); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_clip_bounds = SkRect::MakeLTRB(5.1, 5.65, 10.2, 12.85); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_clip_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_clip_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipRRectDoAAAffectsClipBounds) { @@ -1504,39 +1518,39 @@ TEST(DisplayList, ClipRRectDoAAAffectsClipBounds) { SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); SkRect clip_expanded_bounds = SkRect::MakeLTRB(10, 11, 21, 26); SkRRect clip = SkRRect::MakeRectXY(clip_bounds, 3, 2); - builder.clipRRect(clip, SkClipOp::kIntersect, true); + builder.clipRRect(clip, ClipOp::kIntersect, true); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, true); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, true); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_expanded_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_expanded_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_expanded_bounds = SkRect::MakeLTRB(5, 5.5, 10.5, 13); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_expanded_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_expanded_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipRRectAffectsClipBoundsWithMatrix) { @@ -1547,17 +1561,17 @@ TEST(DisplayList, ClipRRectAffectsClipBoundsWithMatrix) { SkRRect clip2 = SkRRect::MakeRectXY(clip_bounds_2, 3, 2); builder.save(); - builder.clipRRect(clip1, SkClipOp::kIntersect, false); + builder.clipRRect(clip1, ClipOp::kIntersect, false); builder.translate(10, 0); - builder.clipRRect(clip1, SkClipOp::kIntersect, false); - ASSERT_TRUE(builder.getDestinationClipBounds().isEmpty()); + builder.clipRRect(clip1, ClipOp::kIntersect, false); + ASSERT_TRUE(builder.GetDestinationClipBounds().isEmpty()); builder.restore(); builder.save(); - builder.clipRRect(clip1, SkClipOp::kIntersect, false); + builder.clipRRect(clip1, ClipOp::kIntersect, false); builder.translate(-10, -10); - builder.clipRRect(clip2, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds_1); + builder.clipRRect(clip2, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds_1); builder.restore(); } @@ -1565,78 +1579,78 @@ TEST(DisplayList, ClipPathAffectsClipBounds) { DisplayListBuilder builder; SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); SkRect clip_bounds = SkRect::MakeLTRB(8.2, 9.3, 22.4, 27.7); - builder.clipPath(clip, SkClipOp::kIntersect, false); + builder.clipPath(clip, ClipOp::kIntersect, false); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, false); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, false); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_clip_bounds = SkRect::MakeLTRB(4.1, 4.65, 11.2, 13.85); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_clip_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_clip_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipPathDoAAAffectsClipBounds) { DisplayListBuilder builder; SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); SkRect clip_expanded_bounds = SkRect::MakeLTRB(8, 9, 23, 28); - builder.clipPath(clip, SkClipOp::kIntersect, true); + builder.clipPath(clip, ClipOp::kIntersect, true); // Save initial return values for testing restored values - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.save(); - builder.clipRect({0, 0, 15, 15}, SkClipOp::kIntersect, true); + builder.clipRect({0, 0, 15, 15}, ClipOp::kIntersect, true); // Both clip bounds have changed - ASSERT_NE(builder.getLocalClipBounds(), clip_expanded_bounds); - ASSERT_NE(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetLocalClipBounds(), clip_expanded_bounds); + ASSERT_NE(builder.GetDestinationClipBounds(), clip_expanded_bounds); // Previous return values have not changed ASSERT_EQ(initial_local_bounds, clip_expanded_bounds); ASSERT_EQ(initial_destination_bounds, clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); builder.save(); builder.scale(2, 2); SkRect scaled_expanded_bounds = SkRect::MakeLTRB(4, 4.5, 11.5, 14); - ASSERT_EQ(builder.getLocalClipBounds(), scaled_expanded_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), scaled_expanded_bounds); // Destination bounds are unaffected by transform - ASSERT_EQ(builder.getDestinationClipBounds(), clip_expanded_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_expanded_bounds); builder.restore(); // save/restore returned the values to their original values - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipPathAffectsClipBoundsWithMatrix) { @@ -1646,17 +1660,17 @@ TEST(DisplayList, ClipPathAffectsClipBoundsWithMatrix) { SkPath clip2 = SkPath().addCircle(12.5, 12.5, 2.5).addCircle(17.5, 17.5, 2.5); builder.save(); - builder.clipPath(clip1, SkClipOp::kIntersect, false); + builder.clipPath(clip1, ClipOp::kIntersect, false); builder.translate(10, 0); - builder.clipPath(clip1, SkClipOp::kIntersect, false); - ASSERT_TRUE(builder.getDestinationClipBounds().isEmpty()); + builder.clipPath(clip1, ClipOp::kIntersect, false); + ASSERT_TRUE(builder.GetDestinationClipBounds().isEmpty()); builder.restore(); builder.save(); - builder.clipPath(clip1, SkClipOp::kIntersect, false); + builder.clipPath(clip1, ClipOp::kIntersect, false); builder.translate(-10, -10); - builder.clipPath(clip2, SkClipOp::kIntersect, false); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + builder.clipPath(clip2, ClipOp::kIntersect, false); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); builder.restore(); } @@ -1664,17 +1678,17 @@ TEST(DisplayList, DiffClipRectDoesNotAffectClipBounds) { DisplayListBuilder builder; SkRect diff_clip = SkRect::MakeLTRB(0, 0, 15, 15); SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.clipRect(clip_bounds, ClipOp::kIntersect, false); // Save initial return values for testing after kDifference clip - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); - builder.clipRect(diff_clip, SkClipOp::kDifference, false); - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + builder.clipRect(diff_clip, ClipOp::kDifference, false); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, DiffClipRRectDoesNotAffectClipBounds) { @@ -1682,17 +1696,17 @@ TEST(DisplayList, DiffClipRRectDoesNotAffectClipBounds) { SkRRect diff_clip = SkRRect::MakeRectXY({0, 0, 15, 15}, 1, 1); SkRect clip_bounds = SkRect::MakeLTRB(10.2, 11.3, 20.4, 25.7); SkRRect clip = SkRRect::MakeRectXY({10.2, 11.3, 20.4, 25.7}, 3, 2); - builder.clipRRect(clip, SkClipOp::kIntersect, false); + builder.clipRRect(clip, ClipOp::kIntersect, false); // Save initial return values for testing after kDifference clip - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); - builder.clipRRect(diff_clip, SkClipOp::kDifference, false); - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + builder.clipRRect(diff_clip, ClipOp::kDifference, false); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, DiffClipPathDoesNotAffectClipBounds) { @@ -1700,17 +1714,17 @@ TEST(DisplayList, DiffClipPathDoesNotAffectClipBounds) { SkPath diff_clip = SkPath().addRect({0, 0, 15, 15}); SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); SkRect clip_bounds = SkRect::MakeLTRB(8.2, 9.3, 22.4, 27.7); - builder.clipPath(clip, SkClipOp::kIntersect, false); + builder.clipPath(clip, ClipOp::kIntersect, false); // Save initial return values for testing after kDifference clip - SkRect initial_local_bounds = builder.getLocalClipBounds(); - SkRect initial_destination_bounds = builder.getDestinationClipBounds(); + SkRect initial_local_bounds = builder.GetLocalClipBounds(); + SkRect initial_destination_bounds = builder.GetDestinationClipBounds(); ASSERT_EQ(initial_local_bounds, clip_bounds); ASSERT_EQ(initial_destination_bounds, clip_bounds); - builder.clipPath(diff_clip, SkClipOp::kDifference, false); - ASSERT_EQ(builder.getLocalClipBounds(), initial_local_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), initial_destination_bounds); + builder.clipPath(diff_clip, ClipOp::kDifference, false); + ASSERT_EQ(builder.GetLocalClipBounds(), initial_local_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), initial_destination_bounds); } TEST(DisplayList, ClipPathWithInvertFillTypeDoesNotAffectClipBounds) { @@ -1718,10 +1732,10 @@ TEST(DisplayList, ClipPathWithInvertFillTypeDoesNotAffectClipBounds) { DisplayListBuilder builder(cull_rect); SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); clip.setFillType(SkPathFillType::kInverseWinding); - builder.clipPath(clip, SkClipOp::kIntersect, false); + builder.clipPath(clip, ClipOp::kIntersect, false); - ASSERT_EQ(builder.getLocalClipBounds(), cull_rect); - ASSERT_EQ(builder.getDestinationClipBounds(), cull_rect); + ASSERT_EQ(builder.GetLocalClipBounds(), cull_rect); + ASSERT_EQ(builder.GetDestinationClipBounds(), cull_rect); } TEST(DisplayList, DiffClipPathWithInvertFillTypeAffectsClipBounds) { @@ -1730,10 +1744,10 @@ TEST(DisplayList, DiffClipPathWithInvertFillTypeAffectsClipBounds) { SkPath clip = SkPath().addCircle(10.2, 11.3, 2).addCircle(20.4, 25.7, 2); clip.setFillType(SkPathFillType::kInverseWinding); SkRect clip_bounds = SkRect::MakeLTRB(8.2, 9.3, 22.4, 27.7); - builder.clipPath(clip, SkClipOp::kDifference, false); + builder.clipPath(clip, ClipOp::kDifference, false); - ASSERT_EQ(builder.getLocalClipBounds(), clip_bounds); - ASSERT_EQ(builder.getDestinationClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetLocalClipBounds(), clip_bounds); + ASSERT_EQ(builder.GetDestinationClipBounds(), clip_bounds); } TEST(DisplayList, FlatDrawPointsProducesBounds) { @@ -1741,7 +1755,7 @@ TEST(DisplayList, FlatDrawPointsProducesBounds) { SkPoint vertical_points[2] = {{10, 10}, {10, 20}}; { DisplayListBuilder builder; - builder.drawPoints(SkCanvas::kPolygon_PointMode, 2, horizontal_points); + builder.drawPoints(PointMode::kPolygon, 2, horizontal_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); EXPECT_TRUE(bounds.contains(20, 10)); @@ -1749,7 +1763,7 @@ TEST(DisplayList, FlatDrawPointsProducesBounds) { } { DisplayListBuilder builder; - builder.drawPoints(SkCanvas::kPolygon_PointMode, 2, vertical_points); + builder.drawPoints(PointMode::kPolygon, 2, vertical_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); EXPECT_TRUE(bounds.contains(10, 20)); @@ -1757,14 +1771,14 @@ TEST(DisplayList, FlatDrawPointsProducesBounds) { } { DisplayListBuilder builder; - builder.drawPoints(SkCanvas::kPoints_PointMode, 1, horizontal_points); + builder.drawPoints(PointMode::kPoints, 1, horizontal_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); } { DisplayListBuilder builder; builder.setStrokeWidth(2); - builder.drawPoints(SkCanvas::kPolygon_PointMode, 2, horizontal_points); + builder.drawPoints(PointMode::kPolygon, 2, horizontal_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); EXPECT_TRUE(bounds.contains(20, 10)); @@ -1773,7 +1787,7 @@ TEST(DisplayList, FlatDrawPointsProducesBounds) { { DisplayListBuilder builder; builder.setStrokeWidth(2); - builder.drawPoints(SkCanvas::kPolygon_PointMode, 2, vertical_points); + builder.drawPoints(PointMode::kPolygon, 2, vertical_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); EXPECT_TRUE(bounds.contains(10, 20)); @@ -1782,7 +1796,7 @@ TEST(DisplayList, FlatDrawPointsProducesBounds) { { DisplayListBuilder builder; builder.setStrokeWidth(2); - builder.drawPoints(SkCanvas::kPoints_PointMode, 1, horizontal_points); + builder.drawPoints(PointMode::kPoints, 1, horizontal_points); SkRect bounds = builder.Build()->bounds(); EXPECT_TRUE(bounds.contains(10, 10)); EXPECT_EQ(bounds, SkRect::MakeLTRB(9, 9, 11, 11)); @@ -1868,12 +1882,12 @@ TEST(DisplayList, RTreeOfSaveLayerFilterScene) { auto filter = DlBlurImageFilter(1.0, 1.0, DlTileMode::kClamp); DlPaint default_paint = DlPaint(); DlPaint filter_paint = DlPaint().setImageFilter(&filter); - builder.drawRect({10, 10, 20, 20}, default_paint); - builder.saveLayer(nullptr, &filter_paint); + builder.DrawRect({10, 10, 20, 20}, default_paint); + builder.SaveLayer(nullptr, &filter_paint); // the following rectangle will be expanded to 50,50,60,60 // by the saveLayer filter during the restore operation - builder.drawRect({53, 53, 57, 57}, default_paint); - builder.restore(); + builder.DrawRect({53, 53, 57, 57}, default_paint); + builder.Restore(); auto display_list = builder.Build(); auto rtree = display_list->rtree(); std::vector rects = { @@ -1961,7 +1975,7 @@ TEST(DisplayList, CollapseMultipleNestedSaveRestore) { builder1.save(); builder1.translate(10, 10); builder1.scale(2, 2); - builder1.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); + builder1.clipRect({10, 10, 20, 20}, ClipOp::kIntersect, false); builder1.drawRect({0, 0, 100, 100}); builder1.restore(); builder1.restore(); @@ -1972,7 +1986,7 @@ TEST(DisplayList, CollapseMultipleNestedSaveRestore) { builder2.save(); builder2.translate(10, 10); builder2.scale(2, 2); - builder2.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); + builder2.clipRect({10, 10, 20, 20}, ClipOp::kIntersect, false); builder2.drawRect({0, 0, 100, 100}); builder2.restore(); auto display_list2 = builder2.Build(); @@ -2018,38 +2032,38 @@ TEST(DisplayList, RemoveUnnecessarySaveRestorePairsInSetPaint) { DlColorFilterImageFilter color_filter_image_filter(alpha_color_filter); { DisplayListBuilder builder(build_bounds); - builder.save(); + builder.Save(); DlPaint paint; paint.setImageFilter(&color_filter_image_filter); - builder.drawRect(rect, paint); - builder.restore(); + builder.DrawRect(rect, paint); + builder.Restore(); sk_sp display_list1 = builder.Build(); DisplayListBuilder builder2(build_bounds); DlPaint paint2; paint2.setImageFilter(&color_filter_image_filter); - builder2.drawRect(rect, paint2); + builder2.DrawRect(rect, paint2); sk_sp display_list2 = builder2.Build(); ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); } { DisplayListBuilder builder(build_bounds); - builder.save(); - builder.saveLayer(&build_bounds, true); + builder.Save(); + builder.SaveLayer(&build_bounds); DlPaint paint; paint.setImageFilter(&color_filter_image_filter); - builder.drawRect(rect, paint); - builder.restore(); - builder.restore(); + builder.DrawRect(rect, paint); + builder.Restore(); + builder.Restore(); sk_sp display_list1 = builder.Build(); DisplayListBuilder builder2(build_bounds); - builder2.saveLayer(&build_bounds, true); + builder2.SaveLayer(&build_bounds); DlPaint paint2; paint2.setImageFilter(&color_filter_image_filter); - builder2.drawRect(rect, paint2); - builder2.restore(); + builder2.DrawRect(rect, paint2); + builder2.Restore(); sk_sp display_list2 = builder2.Build(); ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); } @@ -2207,8 +2221,7 @@ TEST(DisplayList, ClipRectTriggersDeferredSave) { DisplayListBuilder builder1; builder1.save(); builder1.save(); - builder1.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), SkClipOp::kIntersect, - true); + builder1.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), ClipOp::kIntersect, true); builder1.drawRect({0, 0, 100, 100}); builder1.restore(); builder1.transform(SkM44()); @@ -2218,8 +2231,7 @@ TEST(DisplayList, ClipRectTriggersDeferredSave) { DisplayListBuilder builder2; builder2.save(); - builder2.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), SkClipOp::kIntersect, - true); + builder2.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), ClipOp::kIntersect, true); builder2.drawRect({0, 0, 100, 100}); builder2.restore(); builder2.transform(SkM44()); @@ -2233,7 +2245,7 @@ TEST(DisplayList, ClipRRectTriggersDeferredSave) { DisplayListBuilder builder1; builder1.save(); builder1.save(); - builder1.clipRRect(kTestRRect, SkClipOp::kIntersect, true); + builder1.clipRRect(kTestRRect, ClipOp::kIntersect, true); builder1.drawRect({0, 0, 100, 100}); builder1.restore(); @@ -2244,7 +2256,7 @@ TEST(DisplayList, ClipRRectTriggersDeferredSave) { DisplayListBuilder builder2; builder2.save(); - builder2.clipRRect(kTestRRect, SkClipOp::kIntersect, true); + builder2.clipRRect(kTestRRect, ClipOp::kIntersect, true); builder2.drawRect({0, 0, 100, 100}); builder2.restore(); @@ -2259,7 +2271,7 @@ TEST(DisplayList, ClipPathTriggersDeferredSave) { DisplayListBuilder builder1; builder1.save(); builder1.save(); - builder1.clipPath(kTestPath1, SkClipOp::kIntersect, true); + builder1.clipPath(kTestPath1, ClipOp::kIntersect, true); builder1.drawRect({0, 0, 100, 100}); builder1.restore(); builder1.transform(SkM44()); @@ -2269,7 +2281,7 @@ TEST(DisplayList, ClipPathTriggersDeferredSave) { DisplayListBuilder builder2; builder2.save(); - builder2.clipPath(kTestPath1, SkClipOp::kIntersect, true); + builder2.clipPath(kTestPath1, ClipOp::kIntersect, true); builder2.drawRect({0, 0, 100, 100}); builder2.restore(); builder2.transform(SkM44()); @@ -2446,7 +2458,7 @@ TEST(DisplayList, NOPClipDoesNotTriggerDeferredSave) { builder1.save(); builder1.save(); builder1.clipRect(SkRect::MakeLTRB(0, SK_ScalarNaN, SK_ScalarNaN, 0), - SkClipOp::kIntersect, true); + ClipOp::kIntersect, true); builder1.drawRect({0, 0, 100, 100}); builder1.restore(); builder1.drawRect({0, 0, 100, 100}); @@ -2467,13 +2479,13 @@ TEST(DisplayList, RTreeOfClippedSaveLayerFilterScene) { auto filter = DlBlurImageFilter(10.0, 10.0, DlTileMode::kClamp); DlPaint default_paint = DlPaint(); DlPaint filter_paint = DlPaint().setImageFilter(&filter); - builder.drawRect({10, 10, 20, 20}, default_paint); - builder.clipRect({50, 50, 60, 60}, SkClipOp::kIntersect, false); - builder.saveLayer(nullptr, &filter_paint); + builder.DrawRect({10, 10, 20, 20}, default_paint); + builder.clipRect({50, 50, 60, 60}, ClipOp::kIntersect, false); + builder.SaveLayer(nullptr, &filter_paint); // the following rectangle will be expanded to 23,23,87,87 // by the saveLayer filter during the restore operation // but it will then be clipped to 50,50,60,60 - builder.drawRect({53, 53, 57, 57}, default_paint); + builder.DrawRect({53, 53, 57, 57}, default_paint); builder.restore(); auto display_list = builder.Build(); auto rtree = display_list->rtree(); diff --git a/display_list/display_list_utils.h b/display_list/display_list_utils.h index 37222f01bdbdc..c740f322cd57e 100644 --- a/display_list/display_list_utils.h +++ b/display_list/display_list_utils.h @@ -56,9 +56,15 @@ class IgnoreAttributeDispatchHelper : public virtual Dispatcher { // A utility class that will ignore all Dispatcher methods relating // to setting a clip. class IgnoreClipDispatchHelper : public virtual Dispatcher { - void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override {} - void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override {} - void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) override {} + void clipRect(const SkRect& rect, + DlCanvas::ClipOp clip_op, + bool is_aa) override {} + void clipRRect(const SkRRect& rrect, + DlCanvas::ClipOp clip_op, + bool is_aa) override {} + void clipPath(const SkPath& path, + DlCanvas::ClipOp clip_op, + bool is_aa) override {} }; // A utility class that will ignore all Dispatcher methods relating @@ -103,7 +109,7 @@ class IgnoreDrawDispatchHelper : public virtual Dispatcher { SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) override {} - void drawPoints(SkCanvas::PointMode mode, + void drawPoints(DlCanvas::PointMode mode, uint32_t count, const SkPoint points[]) override {} void drawSkVertices(const sk_sp vertices, diff --git a/display_list/dl_canvas.h b/display_list/dl_canvas.h new file mode 100644 index 0000000000000..8618849e1d2f3 --- /dev/null +++ b/display_list/dl_canvas.h @@ -0,0 +1,233 @@ +// 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. + +#ifndef FLUTTER_DISPLAY_LIST_DL_CANVAS_H_ +#define FLUTTER_DISPLAY_LIST_DL_CANVAS_H_ + +#include "flutter/display_list/display_list_blend_mode.h" +#include "flutter/display_list/display_list_image.h" +#include "flutter/display_list/display_list_paint.h" +#include "flutter/display_list/display_list_vertices.h" + +namespace flutter { + +// The primary class used to express rendering operations in the +// DisplayList ecosystem. This class is an API-only virtual class and +// can be used to talk to a DisplayListBuilder to record a series of +// rendering operations, or it could be the public facing API of an +// adapter that forwards the calls to another rendering module, like +// Skia. +// +// Developers familiar with Skia's SkCanvas API will be immediately +// familiar with the methods below as they follow that API closely +// but with DisplayList objects and values used as data instead. +class DlCanvas { + public: + enum class ClipOp { + kDifference, + kIntersect, + }; + + enum class PointMode { + kPoints, //!< draw each point separately + kLines, //!< draw each separate pair of points as a line segment + kPolygon, //!< draw each pair of overlapping points as a line segment + }; + + virtual ~DlCanvas() = default; + + virtual SkISize GetBaseLayerSize() const = 0; + virtual SkImageInfo GetImageInfo() const = 0; + + virtual void Save() = 0; + virtual void SaveLayer(const SkRect* bounds, + const DlPaint* paint = nullptr, + const DlImageFilter* backdrop = nullptr) = 0; + virtual void Restore() = 0; + virtual int GetSaveCount() const = 0; + virtual void RestoreToCount(int restore_count) = 0; + + virtual void Translate(SkScalar tx, SkScalar ty) = 0; + virtual void Scale(SkScalar sx, SkScalar sy) = 0; + virtual void Rotate(SkScalar degrees) = 0; + virtual void Skew(SkScalar sx, SkScalar sy) = 0; + + // clang-format off + + // 2x3 2D affine subset of a 4x4 transform in row major order + virtual void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) = 0; + // full 4x4 transform in row major order + virtual 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) = 0; + // clang-format on + virtual void TransformReset() = 0; + virtual void Transform(const SkMatrix* matrix) = 0; + virtual void Transform(const SkM44* matrix44) = 0; + virtual void Transform(const SkMatrix& matrix) { Transform(&matrix); } + virtual void Transform(const SkM44& matrix44) { Transform(&matrix44); } + virtual void SetTransform(const SkMatrix* matrix) = 0; + virtual void SetTransform(const SkM44* matrix44) = 0; + virtual void SetTransform(const SkMatrix& matrix) { SetTransform(&matrix); } + virtual void SetTransform(const SkM44& matrix44) { SetTransform(&matrix44); } + + /// Returns the 4x4 full perspective transform representing all transform + /// operations executed so far in this DisplayList within the enclosing + /// save stack. + virtual SkM44 GetTransformFullPerspective() const = 0; + /// Returns the 3x3 partial perspective transform representing all transform + /// operations executed so far in this DisplayList within the enclosing + /// save stack. + virtual SkMatrix GetTransform() const = 0; + + virtual void ClipRect(const SkRect& rect, + ClipOp clip_op = ClipOp::kIntersect, + bool is_aa = false) = 0; + virtual void ClipRRect(const SkRRect& rrect, + ClipOp clip_op = ClipOp::kIntersect, + bool is_aa = false) = 0; + virtual void ClipPath(const SkPath& path, + ClipOp clip_op = ClipOp::kIntersect, + bool is_aa = false) = 0; + + /// Conservative estimate of the bounds of all outstanding clip operations + /// measured in the coordinate space within which this DisplayList will + /// be rendered. + virtual SkRect GetDestinationClipBounds() const = 0; + /// Conservative estimate of the bounds of all outstanding clip operations + /// transformed into the local coordinate space in which currently + /// recorded rendering operations are interpreted. + virtual SkRect GetLocalClipBounds() const = 0; + + /// 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. + virtual bool QuickReject(const SkRect& bounds) const = 0; + + virtual void DrawPaint(const DlPaint& paint) = 0; + virtual void DrawColor(DlColor color, DlBlendMode mode) = 0; + void Clear(DlColor color) { DrawColor(color, DlBlendMode::kSrc); } + virtual void DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) = 0; + virtual void DrawRect(const SkRect& rect, const DlPaint& paint) = 0; + virtual void DrawOval(const SkRect& bounds, const DlPaint& paint) = 0; + virtual void DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) = 0; + virtual void DrawRRect(const SkRRect& rrect, const DlPaint& paint) = 0; + virtual void DrawDRRect(const SkRRect& outer, + const SkRRect& inner, + const DlPaint& paint) = 0; + virtual void DrawPath(const SkPath& path, const DlPaint& paint) = 0; + virtual void DrawArc(const SkRect& bounds, + SkScalar start, + SkScalar sweep, + bool useCenter, + const DlPaint& paint) = 0; + virtual void DrawPoints(PointMode mode, + uint32_t count, + const SkPoint pts[], + const DlPaint& paint) = 0; + virtual void DrawVertices(const DlVertices* vertices, + DlBlendMode mode, + const DlPaint& paint) = 0; + void DrawVertices(const std::shared_ptr vertices, + DlBlendMode mode, + const DlPaint& paint) { + DrawVertices(vertices.get(), mode, paint); + } + virtual void DrawImage(const sk_sp& image, + const SkPoint point, + DlImageSampling sampling, + const DlPaint* paint = nullptr) = 0; + virtual void DrawImageRect(const sk_sp& image, + const SkRect& src, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint = nullptr, + bool enforce_src_edges = false) = 0; + virtual void DrawImageRect(const sk_sp& image, + const SkIRect& src, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint = nullptr, + bool enforce_src_edges = false) { + DrawImageRect(image, SkRect::Make(src), dst, sampling, paint, + enforce_src_edges); + } + virtual void DrawImageRect(const sk_sp& image, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint = nullptr, + bool enforce_src_edges = false) { + DrawImageRect(image, image->bounds(), dst, sampling, paint, + enforce_src_edges); + } + virtual void DrawImageNine(const sk_sp& image, + const SkIRect& center, + const SkRect& dst, + DlFilterMode filter, + const DlPaint* paint = nullptr) = 0; + virtual void DrawAtlas(const sk_sp& atlas, + const SkRSXform xform[], + const SkRect tex[], + const DlColor colors[], + int count, + DlBlendMode mode, + DlImageSampling sampling, + const SkRect* cullRect, + const DlPaint* paint = nullptr) = 0; + virtual void DrawDisplayList(const sk_sp display_list, + SkScalar opacity = SK_Scalar1) = 0; + virtual void DrawTextBlob(const sk_sp& blob, + SkScalar x, + SkScalar y, + const DlPaint& paint) = 0; + virtual void DrawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) = 0; + + virtual void Flush() = 0; +}; + +class DlAutoCanvasRestore { + public: + DlAutoCanvasRestore(DlCanvas* canvas, bool do_save) : canvas_(canvas) { + if (canvas) { + canvas_ = canvas; + restore_count_ = canvas->GetSaveCount(); + if (do_save) { + canvas_->Save(); + } + } else { + canvas_ = nullptr; + restore_count_ = 0; + } + } + + ~DlAutoCanvasRestore() { Restore(); } + + void Restore() { + if (canvas_) { + canvas_->RestoreToCount(restore_count_); + canvas_ = nullptr; + } + } + + private: + DlCanvas* canvas_; + int restore_count_; + + FML_DISALLOW_COPY_ASSIGN_AND_MOVE(DlAutoCanvasRestore); +}; + +} // namespace flutter + +#endif // FLUTTER_DISPLAY_LIST_DL_CANVAS_H_ diff --git a/display_list/skia/dl_sk_canvas.cc b/display_list/skia/dl_sk_canvas.cc new file mode 100644 index 0000000000000..178ec91fdd836 --- /dev/null +++ b/display_list/skia/dl_sk_canvas.cc @@ -0,0 +1,368 @@ +// 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/display_list/skia/dl_sk_canvas.h" + +#include "flutter/display_list/display_list_canvas_dispatcher.h" + +namespace flutter { + +static sk_sp ToSk(const DlColorSource* source) { + return source ? source->skia_object() : nullptr; +} + +static sk_sp ToSk(const DlImageFilter* filter) { + return filter ? filter->skia_object() : nullptr; +} + +static sk_sp ToSk(const DlColorFilter* filter) { + return filter ? filter->skia_object() : nullptr; +} + +static sk_sp ToSk(const DlMaskFilter* filter) { + return filter ? filter->skia_object() : nullptr; +} + +static sk_sp ToSk(const DlPathEffect* effect) { + return effect ? effect->skia_object() : nullptr; +} + +static SkCanvas::SrcRectConstraint ToSkConstraint(bool enforce_edges) { + return enforce_edges ? SkCanvas::kStrict_SrcRectConstraint + : SkCanvas::kFast_SrcRectConstraint; +} + +static SkClipOp ToSk(DlCanvas::ClipOp op) { + return static_cast(op); +} + +static SkCanvas::PointMode ToSk(DlCanvas::PointMode mode) { + return static_cast(mode); +} + +static SkPaint ToSk(const DlPaint& paint) { + SkPaint sk_paint; + + sk_paint.setColor(paint.getColor()); + sk_paint.setBlendMode(ToSk(paint.getBlendMode())); + sk_paint.setStyle(ToSk(paint.getDrawStyle())); + sk_paint.setStrokeWidth(paint.getStrokeWidth()); + sk_paint.setStrokeMiter(paint.getStrokeMiter()); + sk_paint.setStrokeCap(ToSk(paint.getStrokeCap())); + sk_paint.setStrokeJoin(ToSk(paint.getStrokeJoin())); + + sk_paint.setShader(ToSk(paint.getColorSourcePtr())); + sk_paint.setImageFilter(ToSk(paint.getImageFilterPtr())); + sk_paint.setColorFilter(ToSk(paint.getColorFilterPtr())); + sk_paint.setMaskFilter(ToSk(paint.getMaskFilterPtr())); + sk_paint.setPathEffect(ToSk(paint.getPathEffectPtr())); + + return sk_paint; +} + +class SkOptionalPaint { + public: + explicit SkOptionalPaint(const DlPaint* paint) { + if (paint) { + paint_ = ToSk(*paint); + ptr_ = &paint_; + } else { + ptr_ = nullptr; + } + } + + SkPaint* operator()() { return ptr_; } + + private: + SkPaint paint_; + SkPaint* ptr_; +}; + +void DlSkCanvasAdapter::set_canvas(SkCanvas* canvas) { + delegate_ = canvas; +} + +SkISize DlSkCanvasAdapter::GetBaseLayerSize() const { + return delegate_->getBaseLayerSize(); +} + +SkImageInfo DlSkCanvasAdapter::GetImageInfo() const { + return delegate_->imageInfo(); +} + +void DlSkCanvasAdapter::Save() { + delegate_->save(); +} + +void DlSkCanvasAdapter::SaveLayer(const SkRect* bounds, + const DlPaint* paint, + const DlImageFilter* backdrop) { + sk_sp sk_filter = backdrop ? backdrop->skia_object() : nullptr; + SkOptionalPaint sk_paint(paint); + delegate_->saveLayer( + SkCanvas::SaveLayerRec{bounds, sk_paint(), sk_filter.get(), 0}); +} + +void DlSkCanvasAdapter::Restore() { + delegate_->restore(); +} + +int DlSkCanvasAdapter::GetSaveCount() const { + return delegate_->getSaveCount(); +} + +void DlSkCanvasAdapter::RestoreToCount(int restore_count) { + delegate_->restoreToCount(restore_count); +} + +void DlSkCanvasAdapter::Translate(SkScalar tx, SkScalar ty) { + delegate_->translate(tx, ty); +} + +void DlSkCanvasAdapter::Scale(SkScalar sx, SkScalar sy) { + delegate_->scale(sx, sy); +} + +void DlSkCanvasAdapter::Rotate(SkScalar degrees) { + delegate_->rotate(degrees); +} + +void DlSkCanvasAdapter::Skew(SkScalar sx, SkScalar sy) { + delegate_->skew(sx, sy); +} + +// clang-format off + +// 2x3 2D affine subset of a 4x4 transform in row major order +void DlSkCanvasAdapter::Transform2DAffine( + SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) { + delegate_->concat(SkMatrix::MakeAll(mxx, mxy, mxt, myx, myy, myt, 0, 0, 1)); +} + +// full 4x4 transform in row major order +void DlSkCanvasAdapter::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) { + delegate_->concat(SkM44(mxx, mxy, mxz, mxt, + myx, myy, myz, myt, + mzx, mzy, mzz, mzt, + mwx, mwy, mwz, mwt)); +} + +// clang-format on + +void DlSkCanvasAdapter::TransformReset() { + delegate_->resetMatrix(); +} + +void DlSkCanvasAdapter::Transform(const SkMatrix* matrix) { + delegate_->concat(*matrix); +} + +void DlSkCanvasAdapter::Transform(const SkM44* matrix44) { + delegate_->concat(*matrix44); +} + +void DlSkCanvasAdapter::SetTransform(const SkMatrix* matrix) { + delegate_->setMatrix(*matrix); +} + +void DlSkCanvasAdapter::SetTransform(const SkM44* matrix44) { + delegate_->setMatrix(*matrix44); +} + +/// Returns the 4x4 full perspective transform representing all transform +/// operations executed so far in this DisplayList within the enclosing +/// save stack. +SkM44 DlSkCanvasAdapter::GetTransformFullPerspective() const { + return delegate_->getLocalToDevice(); +} + +/// Returns the 3x3 partial perspective transform representing all transform +/// operations executed so far in this DisplayList within the enclosing +/// save stack. +SkMatrix DlSkCanvasAdapter::GetTransform() const { + return delegate_->getTotalMatrix(); +} + +void DlSkCanvasAdapter::ClipRect(const SkRect& rect, + ClipOp clip_op, + bool is_aa) { + delegate_->clipRect(rect, ToSk(clip_op), is_aa); +} + +void DlSkCanvasAdapter::ClipRRect(const SkRRect& rrect, + ClipOp clip_op, + bool is_aa) { + delegate_->clipRRect(rrect, ToSk(clip_op), is_aa); +} + +void DlSkCanvasAdapter::ClipPath(const SkPath& path, + ClipOp clip_op, + bool is_aa) { + delegate_->clipPath(path, ToSk(clip_op), is_aa); +} + +/// Conservative estimate of the bounds of all outstanding clip operations +/// measured in the coordinate space within which this DisplayList will +/// be rendered. +SkRect DlSkCanvasAdapter::GetDestinationClipBounds() const { + return SkRect::Make(delegate_->getDeviceClipBounds()); +} + +/// Conservative estimate of the bounds of all outstanding clip operations +/// transformed into the local coordinate space in which currently +/// recorded rendering operations are interpreted. +SkRect DlSkCanvasAdapter::GetLocalClipBounds() const { + return delegate_->getLocalClipBounds(); +} + +/// 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. +bool DlSkCanvasAdapter::QuickReject(const SkRect& bounds) const { + return delegate_->quickReject(bounds); +} + +void DlSkCanvasAdapter::DrawPaint(const DlPaint& paint) { + delegate_->drawPaint(ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawColor(DlColor color, DlBlendMode mode) { + delegate_->drawColor(color, ToSk(mode)); +} + +void DlSkCanvasAdapter::DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) { + delegate_->drawLine(p0, p1, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawRect(const SkRect& rect, const DlPaint& paint) { + delegate_->drawRect(rect, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawOval(const SkRect& bounds, const DlPaint& paint) { + delegate_->drawOval(bounds, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) { + delegate_->drawCircle(center, radius, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawRRect(const SkRRect& rrect, const DlPaint& paint) { + delegate_->drawRRect(rrect, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawDRRect(const SkRRect& outer, + const SkRRect& inner, + const DlPaint& paint) { + delegate_->drawDRRect(outer, inner, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawPath(const SkPath& path, const DlPaint& paint) { + delegate_->drawPath(path, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawArc(const SkRect& bounds, + SkScalar start, + SkScalar sweep, + bool useCenter, + const DlPaint& paint) { + delegate_->drawArc(bounds, start, sweep, useCenter, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawPoints(PointMode mode, + uint32_t count, + const SkPoint pts[], + const DlPaint& paint) { + delegate_->drawPoints(ToSk(mode), count, pts, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawVertices(const DlVertices* vertices, + DlBlendMode mode, + const DlPaint& paint) { + delegate_->drawVertices(vertices->skia_object(), ToSk(mode), ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawImage(const sk_sp& image, + const SkPoint point, + DlImageSampling sampling, + const DlPaint* paint) { + SkOptionalPaint sk_paint(paint); + sk_sp sk_image = image->skia_image(); + delegate_->drawImage(sk_image.get(), point.fX, point.fY, ToSk(sampling), + sk_paint()); +} + +void DlSkCanvasAdapter::DrawImageRect(const sk_sp& image, + const SkRect& src, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint, + bool enforce_src_edges) { + SkOptionalPaint sk_paint(paint); + sk_sp sk_image = image->skia_image(); + delegate_->drawImageRect(sk_image.get(), src, dst, ToSk(sampling), sk_paint(), + ToSkConstraint(enforce_src_edges)); +} + +void DlSkCanvasAdapter::DrawImageNine(const sk_sp& image, + const SkIRect& center, + const SkRect& dst, + DlFilterMode filter, + const DlPaint* paint) { + SkOptionalPaint sk_paint(paint); + sk_sp sk_image = image->skia_image(); + delegate_->drawImageNine(sk_image.get(), center, dst, ToSk(filter), + sk_paint()); +} + +void DlSkCanvasAdapter::DrawAtlas(const sk_sp& atlas, + const SkRSXform xform[], + const SkRect tex[], + const DlColor colors[], + int count, + DlBlendMode mode, + DlImageSampling sampling, + const SkRect* cullRect, + const DlPaint* paint) { + SkOptionalPaint sk_paint(paint); + sk_sp sk_image = atlas->skia_image(); + const SkColor* sk_colors = reinterpret_cast(colors); + delegate_->drawAtlas(sk_image.get(), xform, tex, sk_colors, count, ToSk(mode), + ToSk(sampling), cullRect, sk_paint()); +} + +void DlSkCanvasAdapter::DrawDisplayList(const sk_sp display_list, + SkScalar opacity) { + display_list->RenderTo(delegate_, opacity); +} + +void DlSkCanvasAdapter::DrawTextBlob(const sk_sp& blob, + SkScalar x, + SkScalar y, + const DlPaint& paint) { + delegate_->drawTextBlob(blob, x, y, ToSk(paint)); +} + +void DlSkCanvasAdapter::DrawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) { + DisplayListCanvasDispatcher::DrawShadow(delegate_, path, color, elevation, + SkColorGetA(color) != 0xff, dpr); +} + +void DlSkCanvasAdapter::Flush() { + delegate_->flush(); +} + +} // namespace flutter diff --git a/display_list/skia/dl_sk_canvas.h b/display_list/skia/dl_sk_canvas.h new file mode 100644 index 0000000000000..249e5189f2276 --- /dev/null +++ b/display_list/skia/dl_sk_canvas.h @@ -0,0 +1,157 @@ +// 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. + +#ifndef FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ +#define FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ + +#include "flutter/display_list/dl_canvas.h" + +namespace flutter { + +// An adapter to receive DlCanvas calls and dispatch them into +// an SkCanvas. +class DlSkCanvasAdapter final : public virtual DlCanvas { + public: + DlSkCanvasAdapter() : delegate_(nullptr) {} + explicit DlSkCanvasAdapter(SkCanvas* canvas) : delegate_(canvas) {} + ~DlSkCanvasAdapter() override = default; + + void set_canvas(SkCanvas* canvas); + SkCanvas* canvas() { return delegate_; } + + SkISize GetBaseLayerSize() const override; + SkImageInfo GetImageInfo() const override; + + void Save() override; + void SaveLayer(const SkRect* bounds, + const DlPaint* paint = nullptr, + const DlImageFilter* backdrop = nullptr) override; + void Restore() override; + int GetSaveCount() const override; + void RestoreToCount(int restore_count) override; + + void Translate(SkScalar tx, SkScalar ty) override; + void Scale(SkScalar sx, SkScalar sy) override; + void Rotate(SkScalar degrees) override; + void Skew(SkScalar sx, SkScalar sy) override; + + // clang-format off + + // 2x3 2D affine subset of a 4x4 transform in row major order + void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) override; + // full 4x4 transform in row major order + 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 + void TransformReset() override; + void Transform(const SkMatrix* matrix) override; + void Transform(const SkM44* matrix44) override; + void SetTransform(const SkMatrix* matrix) override; + void SetTransform(const SkM44* matrix44) override; + using DlCanvas::SetTransform; + using DlCanvas::Transform; + + /// Returns the 4x4 full perspective transform representing all transform + /// operations executed so far in this DisplayList within the enclosing + /// save stack. + SkM44 GetTransformFullPerspective() const override; + /// Returns the 3x3 partial perspective transform representing all transform + /// operations executed so far in this DisplayList within the enclosing + /// save stack. + SkMatrix GetTransform() const override; + + void ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; + void ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; + void ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; + + /// Conservative estimate of the bounds of all outstanding clip operations + /// measured in the coordinate space within which this DisplayList will + /// be rendered. + SkRect GetDestinationClipBounds() const override; + /// Conservative estimate of the bounds of all outstanding clip operations + /// transformed into the local coordinate space in which currently + /// recorded rendering operations are interpreted. + SkRect GetLocalClipBounds() const override; + + /// 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. + bool QuickReject(const SkRect& bounds) const override; + + void DrawPaint(const DlPaint& paint) override; + void DrawColor(DlColor color, DlBlendMode mode) override; + void DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) override; + void DrawRect(const SkRect& rect, const DlPaint& paint) override; + void DrawOval(const SkRect& bounds, const DlPaint& paint) override; + void DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) override; + void DrawRRect(const SkRRect& rrect, const DlPaint& paint) override; + void DrawDRRect(const SkRRect& outer, + const SkRRect& inner, + const DlPaint& paint) override; + void DrawPath(const SkPath& path, const DlPaint& paint) override; + void DrawArc(const SkRect& bounds, + SkScalar start, + SkScalar sweep, + bool useCenter, + const DlPaint& paint) override; + void DrawPoints(PointMode mode, + uint32_t count, + const SkPoint pts[], + const DlPaint& paint) override; + void DrawVertices(const DlVertices* vertices, + DlBlendMode mode, + const DlPaint& paint) override; + void DrawImage(const sk_sp& image, + const SkPoint point, + DlImageSampling sampling, + const DlPaint* paint = nullptr) override; + void DrawImageRect(const sk_sp& image, + const SkRect& src, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint = nullptr, + bool enforce_src_edges = false) override; + void DrawImageNine(const sk_sp& image, + const SkIRect& center, + const SkRect& dst, + DlFilterMode filter, + const DlPaint* paint = nullptr) override; + void DrawAtlas(const sk_sp& atlas, + const SkRSXform xform[], + const SkRect tex[], + const DlColor colors[], + int count, + DlBlendMode mode, + DlImageSampling sampling, + const SkRect* cullRect, + const DlPaint* paint = nullptr) override; + void DrawDisplayList(const sk_sp display_list, + SkScalar opacity) override; + void DrawTextBlob(const sk_sp& blob, + SkScalar x, + SkScalar y, + const DlPaint& paint) override; + void DrawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) override; + + void Flush() override; + + private: + SkCanvas* delegate_; +}; + +} // namespace flutter + +#endif // FLUTTER_DISPLAY_LIST_SKIA_DL_SK_CANVAS_H_ diff --git a/display_list/testing/dl_test_snippets.cc b/display_list/testing/dl_test_snippets.cc index 1ba810f6d5880..5c75e6595a729 100644 --- a/display_list/testing/dl_test_snippets.cc +++ b/display_list/testing/dl_test_snippets.cc @@ -308,7 +308,7 @@ std::vector CreateAllSaveRestoreOps() { [](DisplayListBuilder& b) { b.saveLayer(nullptr, SaveLayerOptions::kNoAttributes, &kTestCFImageFilter1); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -323,7 +323,7 @@ std::vector CreateAllSaveRestoreOps() { {5, 96, 5, 96, [](DisplayListBuilder& b) { b.save(); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -331,7 +331,7 @@ std::vector CreateAllSaveRestoreOps() { {5, 96, 5, 96, [](DisplayListBuilder& b) { b.saveLayer(nullptr, false); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -339,7 +339,7 @@ std::vector CreateAllSaveRestoreOps() { {5, 96, 5, 96, [](DisplayListBuilder& b) { b.saveLayer(nullptr, true); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -347,7 +347,7 @@ std::vector CreateAllSaveRestoreOps() { {5, 112, 5, 112, [](DisplayListBuilder& b) { b.saveLayer(&kTestBounds, false); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -355,7 +355,7 @@ std::vector CreateAllSaveRestoreOps() { {5, 112, 5, 112, [](DisplayListBuilder& b) { b.saveLayer(&kTestBounds, true); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -373,7 +373,7 @@ std::vector CreateAllSaveRestoreOps() { [](DisplayListBuilder& b) { b.saveLayer(nullptr, SaveLayerOptions::kWithAttributes, &kTestCFImageFilter1); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -382,7 +382,7 @@ std::vector CreateAllSaveRestoreOps() { [](DisplayListBuilder& b) { b.saveLayer(&kTestBounds, SaveLayerOptions::kNoAttributes, &kTestCFImageFilter1); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -391,7 +391,7 @@ std::vector CreateAllSaveRestoreOps() { [](DisplayListBuilder& b) { b.saveLayer(&kTestBounds, SaveLayerOptions::kWithAttributes, &kTestCFImageFilter1); - b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); + b.clipRect({0, 0, 25, 25}, DlCanvas::ClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); b.drawRect({10, 10, 20, 20}); b.restore(); @@ -476,85 +476,85 @@ std::vector CreateAllClipOps() { { {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipRect(kTestBounds, SkClipOp::kIntersect, true); + b.clipRect(kTestBounds, DlCanvas::ClipOp::kIntersect, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipRect(kTestBounds.makeOffset(1, 1), SkClipOp::kIntersect, - true); + b.clipRect(kTestBounds.makeOffset(1, 1), + DlCanvas::ClipOp::kIntersect, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipRect(kTestBounds, SkClipOp::kIntersect, false); + b.clipRect(kTestBounds, DlCanvas::ClipOp::kIntersect, false); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipRect(kTestBounds, SkClipOp::kDifference, true); + b.clipRect(kTestBounds, DlCanvas::ClipOp::kDifference, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipRect(kTestBounds, SkClipOp::kDifference, false); + b.clipRect(kTestBounds, DlCanvas::ClipOp::kDifference, false); }}, }}, {"ClipRRect", { {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipRRect(kTestRRect, SkClipOp::kIntersect, true); + b.clipRRect(kTestRRect, DlCanvas::ClipOp::kIntersect, true); }}, {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipRRect(kTestRRect.makeOffset(1, 1), SkClipOp::kIntersect, - true); + b.clipRRect(kTestRRect.makeOffset(1, 1), + DlCanvas::ClipOp::kIntersect, true); }}, {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipRRect(kTestRRect, SkClipOp::kIntersect, false); + b.clipRRect(kTestRRect, DlCanvas::ClipOp::kIntersect, false); }}, {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipRRect(kTestRRect, SkClipOp::kDifference, true); + b.clipRRect(kTestRRect, DlCanvas::ClipOp::kDifference, true); }}, {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipRRect(kTestRRect, SkClipOp::kDifference, false); + b.clipRRect(kTestRRect, DlCanvas::ClipOp::kDifference, false); }}, }}, {"ClipPath", { {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath1, SkClipOp::kIntersect, true); + b.clipPath(kTestPath1, DlCanvas::ClipOp::kIntersect, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath2, SkClipOp::kIntersect, true); + b.clipPath(kTestPath2, DlCanvas::ClipOp::kIntersect, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath3, SkClipOp::kIntersect, true); + b.clipPath(kTestPath3, DlCanvas::ClipOp::kIntersect, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath1, SkClipOp::kIntersect, false); + b.clipPath(kTestPath1, DlCanvas::ClipOp::kIntersect, false); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath1, SkClipOp::kDifference, true); + b.clipPath(kTestPath1, DlCanvas::ClipOp::kDifference, true); }}, {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPath1, SkClipOp::kDifference, false); + b.clipPath(kTestPath1, DlCanvas::ClipOp::kDifference, false); }}, // clipPath(rect) becomes clipRect {1, 24, 1, 24, [](DisplayListBuilder& b) { - b.clipPath(kTestPathRect, SkClipOp::kIntersect, true); + b.clipPath(kTestPathRect, DlCanvas::ClipOp::kIntersect, true); }}, // clipPath(oval) becomes clipRRect {1, 64, 1, 64, [](DisplayListBuilder& b) { - b.clipPath(kTestPathOval, SkClipOp::kIntersect, true); + b.clipPath(kTestPathOval, DlCanvas::ClipOp::kIntersect, true); }}, }}, }; @@ -716,22 +716,22 @@ std::vector CreateAllRenderingOps() { { {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, [](DisplayListBuilder& b) { - b.drawPoints(SkCanvas::kPoints_PointMode, TestPointCount, + b.drawPoints(DlCanvas::PointMode::kPoints, TestPointCount, TestPoints); }}, {1, 8 + (TestPointCount - 1) * 8, 1, 8 + (TestPointCount - 1) * 8, [](DisplayListBuilder& b) { - b.drawPoints(SkCanvas::kPoints_PointMode, TestPointCount - 1, + b.drawPoints(DlCanvas::PointMode::kPoints, TestPointCount - 1, TestPoints); }}, {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, [](DisplayListBuilder& b) { - b.drawPoints(SkCanvas::kLines_PointMode, TestPointCount, + b.drawPoints(DlCanvas::PointMode::kLines, TestPointCount, TestPoints); }}, {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, [](DisplayListBuilder& b) { - b.drawPoints(SkCanvas::kPolygon_PointMode, TestPointCount, + b.drawPoints(DlCanvas::PointMode::kPolygon, TestPointCount, TestPoints); }}, }}, diff --git a/flow/compositor_context.cc b/flow/compositor_context.cc index 90dcc6ac42282..12e3ed9751ea8 100644 --- a/flow/compositor_context.cc +++ b/flow/compositor_context.cc @@ -76,7 +76,7 @@ void CompositorContext::EndFrame(ScopedFrame& frame, std::unique_ptr CompositorContext::AcquireFrame( GrDirectContext* gr_context, - SkCanvas* canvas, + DlCanvas* canvas, ExternalViewEmbedder* view_embedder, const SkMatrix& root_surface_transformation, bool instrumentation_enabled, @@ -94,7 +94,7 @@ std::unique_ptr CompositorContext::AcquireFrame( CompositorContext::ScopedFrame::ScopedFrame( CompositorContext& context, GrDirectContext* gr_context, - SkCanvas* canvas, + DlCanvas* canvas, ExternalViewEmbedder* view_embedder, const SkMatrix& root_surface_transformation, bool instrumentation_enabled, @@ -146,28 +146,26 @@ RasterStatus CompositorContext::ScopedFrame::Raster( return RasterStatus::kSkipAndRetry; } - SkAutoCanvasRestore restore(canvas(), clip_rect.has_value()); + DlAutoCanvasRestore restore(canvas(), clip_rect.has_value()); // Clearing canvas after preroll reduces one render target switch when preroll // paints some raster cache. if (canvas()) { if (clip_rect) { - canvas()->clipRect(*clip_rect); + canvas()->ClipRect(*clip_rect); } if (needs_save_layer) { TRACE_EVENT0("flutter", "Canvas::saveLayer"); SkRect bounds = SkRect::Make(layer_tree.frame_size()); - SkPaint paint; - paint.setBlendMode(SkBlendMode::kSrc); - canvas()->saveLayer(&bounds, &paint); + DlPaint paint; + paint.setBlendMode(DlBlendMode::kSrc); + canvas()->SaveLayer(&bounds, &paint); } - canvas()->clear(SK_ColorTRANSPARENT); + canvas()->Clear(DlColor::kTransparent()); } layer_tree.Paint(*this, ignore_raster_cache); - if (canvas() && needs_save_layer) { - canvas()->restore(); - } + // The canvas()->Restore() is taken care of by the DlAutoCanvasRestore return RasterStatus::kSuccess; } diff --git a/flow/compositor_context.h b/flow/compositor_context.h index 3e9552bd94f7f..dbc053590a319 100644 --- a/flow/compositor_context.h +++ b/flow/compositor_context.h @@ -108,7 +108,7 @@ class CompositorContext { public: ScopedFrame(CompositorContext& context, GrDirectContext* gr_context, - SkCanvas* canvas, + DlCanvas* canvas, ExternalViewEmbedder* view_embedder, const SkMatrix& root_surface_transformation, bool instrumentation_enabled, @@ -119,7 +119,7 @@ class CompositorContext { virtual ~ScopedFrame(); - SkCanvas* canvas() { return canvas_; } + DlCanvas* canvas() { return canvas_; } DisplayListBuilder* display_list_builder() const { return display_list_builder_; @@ -146,7 +146,7 @@ class CompositorContext { private: CompositorContext& context_; GrDirectContext* gr_context_; - SkCanvas* canvas_; + DlCanvas* canvas_; DisplayListBuilder* display_list_builder_; impeller::AiksContext* aiks_context_; ExternalViewEmbedder* view_embedder_; @@ -166,7 +166,7 @@ class CompositorContext { virtual std::unique_ptr AcquireFrame( GrDirectContext* gr_context, - SkCanvas* canvas, + DlCanvas* canvas, ExternalViewEmbedder* view_embedder, const SkMatrix& root_surface_transformation, bool instrumentation_enabled, diff --git a/flow/diff_context.cc b/flow/diff_context.cc index 9612cef549d2d..5310ef9939d05 100644 --- a/flow/diff_context.cc +++ b/flow/diff_context.cc @@ -152,7 +152,7 @@ SkRect DiffContext::MapRect(const SkRect& rect) { } bool DiffContext::PushCullRect(const SkRect& clip) { - clip_tracker_.clipRect(clip, SkClipOp::kIntersect, false); + clip_tracker_.clipRect(clip, DlCanvas::ClipOp::kIntersect, false); return !clip_tracker_.device_cull_rect().isEmpty(); } diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index a6eb2d3442651..fd0ce1178ae60 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -6,56 +6,19 @@ namespace flutter { -SkPictureEmbedderViewSlice::SkPictureEmbedderViewSlice(SkRect view_bounds) { - auto rtree_factory = RTreeFactory(); - rtree_ = rtree_factory.getInstance(); - - recorder_ = std::make_unique(); - recorder_->beginRecording(view_bounds, &rtree_factory); -} - -SkCanvas* SkPictureEmbedderViewSlice::canvas() { - return recorder_->getRecordingCanvas(); -} - -DisplayListBuilder* SkPictureEmbedderViewSlice::builder() { - return nullptr; -} - -void SkPictureEmbedderViewSlice::end_recording() { - picture_ = recorder_->finishRecordingAsPicture(); -} - -std::list SkPictureEmbedderViewSlice::searchNonOverlappingDrawnRects( - const SkRect& query) const { - return rtree_->searchNonOverlappingDrawnRects(query); -} - -void SkPictureEmbedderViewSlice::render_into(SkCanvas* canvas) { - canvas->drawPicture(picture_); -} - -void SkPictureEmbedderViewSlice::render_into(DisplayListBuilder* builder) { - builder->drawPicture(picture_, nullptr, false); -} - DisplayListEmbedderViewSlice::DisplayListEmbedderViewSlice(SkRect view_bounds) { - recorder_ = std::make_unique( + builder_ = std::make_unique( /*bounds=*/view_bounds, /*prepare_rtree=*/true); } -SkCanvas* DisplayListEmbedderViewSlice::canvas() { - return recorder_ ? recorder_.get() : nullptr; -} - -DisplayListBuilder* DisplayListEmbedderViewSlice::builder() { - return recorder_ ? recorder_->builder().get() : nullptr; +DlCanvas* DisplayListEmbedderViewSlice::canvas() { + return builder_ ? builder_.get() : nullptr; } void DisplayListEmbedderViewSlice::end_recording() { - display_list_ = recorder_->Build(); - recorder_ = nullptr; + display_list_ = builder_->Build(); + builder_ = nullptr; } std::list DisplayListEmbedderViewSlice::searchNonOverlappingDrawnRects( @@ -63,8 +26,8 @@ std::list DisplayListEmbedderViewSlice::searchNonOverlappingDrawnRects( return display_list_->rtree()->searchAndConsolidateRects(query); } -void DisplayListEmbedderViewSlice::render_into(SkCanvas* canvas) { - display_list_->RenderTo(canvas); +void DisplayListEmbedderViewSlice::render_into(DlCanvas* canvas) { + canvas->DrawDisplayList(display_list_); } void DisplayListEmbedderViewSlice::render_into(DisplayListBuilder* builder) { diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 544a4b08ffc30..18cbe77a73508 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -8,6 +8,7 @@ #include #include "flutter/display_list/display_list_builder.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/flow/rtree.h" #include "flutter/flow/surface_frame.h" #include "flutter/fml/memory/ref_counted.h" @@ -323,67 +324,37 @@ enum class PostPrerollResult { kSkipAndRetryFrame }; -// The |PlatformViewLayer| calls |CompositeEmbeddedView| in its |Paint| -// method to replace the leaf_nodes_canvas and leaf_nodes_builder in its -// |PaintContext| for subsequent layers in the frame to render into. -// The builder value will only be supplied if the associated ScopedFrame -// is being rendered to DisplayLists. The |EmbedderPaintContext| struct -// allows the method to return both values. -struct EmbedderPaintContext { - SkCanvas* canvas; - DisplayListBuilder* builder; -}; - // The |EmbedderViewSlice| represents the details of recording all of // the layer tree rendering operations that appear between before, after -// and between the embedded views. The Slice may be recorded into an -// SkPicture or a DisplayListBuilder depending on the ScopedFrame. +// and between the embedded views. The Slice used to abstract away +// implementations that were based on either an SkPicture or a +// DisplayListBuilder but more recently all of the embedder recordings +// have standardized on the DisplayList. class EmbedderViewSlice { public: virtual ~EmbedderViewSlice() = default; - virtual SkCanvas* canvas() = 0; - virtual DisplayListBuilder* builder() = 0; + virtual DlCanvas* canvas() = 0; virtual void end_recording() = 0; virtual std::list searchNonOverlappingDrawnRects( const SkRect& query) const = 0; - virtual void render_into(SkCanvas* canvas) = 0; + virtual void render_into(DlCanvas* canvas) = 0; virtual void render_into(DisplayListBuilder* builder) = 0; }; -class SkPictureEmbedderViewSlice : public EmbedderViewSlice { - public: - SkPictureEmbedderViewSlice(SkRect view_bounds); - ~SkPictureEmbedderViewSlice() override = default; - - SkCanvas* canvas() override; - DisplayListBuilder* builder() override; - void end_recording() override; - std::list searchNonOverlappingDrawnRects( - const SkRect& query) const override; - void render_into(SkCanvas* canvas) override; - void render_into(DisplayListBuilder* builder) override; - - private: - std::unique_ptr recorder_; - sk_sp rtree_; - sk_sp picture_; -}; - class DisplayListEmbedderViewSlice : public EmbedderViewSlice { public: DisplayListEmbedderViewSlice(SkRect view_bounds); ~DisplayListEmbedderViewSlice() override = default; - SkCanvas* canvas() override; - DisplayListBuilder* builder() override; + DlCanvas* canvas() override; void end_recording() override; std::list searchNonOverlappingDrawnRects( const SkRect& query) const override; - void render_into(SkCanvas* canvas) override; + void render_into(DlCanvas* canvas) override; void render_into(DisplayListBuilder* builder) override; private: - std::unique_ptr recorder_; + std::unique_ptr builder_; sk_sp display_list_; }; @@ -403,7 +374,7 @@ class ExternalViewEmbedder { // the view embedder wants to provide a canvas to the rasterizer, it may // return one here. This canvas takes priority over the canvas materialized // from the on-screen render target. - virtual SkCanvas* GetRootCanvas() = 0; + virtual DlCanvas* GetRootCanvas() = 0; // Call this in-lieu of |SubmitFrame| to clear pre-roll state and // sets the stage for the next pre-roll. @@ -432,11 +403,8 @@ class ExternalViewEmbedder { return PostPrerollResult::kSuccess; } - virtual std::vector GetCurrentCanvases() = 0; - virtual std::vector GetCurrentBuilders() = 0; - // Must be called on the UI thread. - virtual EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) = 0; + virtual DlCanvas* CompositeEmbeddedView(int64_t view_id) = 0; // Implementers must submit the frame by calling frame.Submit(). // diff --git a/flow/instrumentation.cc b/flow/instrumentation.cc index 1c18f7b041f8a..5e80f7bebc84b 100644 --- a/flow/instrumentation.cc +++ b/flow/instrumentation.cc @@ -6,6 +6,7 @@ #include +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/core/SkSurface.h" @@ -152,7 +153,7 @@ void Stopwatch::InitVisualizeSurface(const SkRect& rect) const { cache_canvas->drawPath(path, paint); } -void Stopwatch::Visualize(SkCanvas* canvas, const SkRect& rect) const { +void Stopwatch::Visualize(DlCanvas* canvas, const SkRect& rect) const { // Initialize visualize cache if it has not yet been initialized. InitVisualizeSurface(rect); @@ -241,7 +242,9 @@ void Stopwatch::Visualize(SkCanvas* canvas, const SkRect& rect) const { prev_drawn_sample_index_ = current_sample_; // Draw the cached surface onto the output canvas. - visualize_cache_surface_->draw(canvas, rect.x(), rect.y()); + auto image = DlImage::Make(visualize_cache_surface_->makeImageSnapshot()); + canvas->DrawImage(image, {rect.x(), rect.y()}, + DlImageSampling::kNearestNeighbor); } fml::Milliseconds Stopwatch::GetFrameBudget() const { diff --git a/flow/instrumentation.h b/flow/instrumentation.h index acf2c013eaea6..5a5c796ca71ec 100644 --- a/flow/instrumentation.h +++ b/flow/instrumentation.h @@ -7,11 +7,11 @@ #include +#include "flutter/display_list/dl_canvas.h" #include "flutter/fml/macros.h" #include "flutter/fml/time/time_delta.h" #include "flutter/fml/time/time_point.h" -#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkSurface.h" namespace flutter { @@ -40,7 +40,7 @@ class Stopwatch { void InitVisualizeSurface(const SkRect& rect) const; - void Visualize(SkCanvas* canvas, const SkRect& rect) const; + void Visualize(DlCanvas* canvas, const SkRect& rect) const; void Start(); diff --git a/flow/layers/backdrop_filter_layer_unittests.cc b/flow/layers/backdrop_filter_layer_unittests.cc index e335544f3e96b..c547a20b1f336 100644 --- a/flow/layers/backdrop_filter_layer_unittests.cc +++ b/flow/layers/backdrop_filter_layer_unittests.cc @@ -57,7 +57,7 @@ TEST_F(BackdropFilterLayerTest, EmptyFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(nullptr, DlBlendMode::kSrcOver); @@ -76,7 +76,7 @@ TEST_F(BackdropFilterLayerTest, EmptyFilter) { EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{child_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -87,12 +87,12 @@ TEST_F(BackdropFilterLayerTest, SimpleFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); - auto layer_filter = SkImageFilters::Shader( - SkShaders::Color(SkColors::kMagenta, /*colorSpace=*/nullptr)); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); + auto layer_filter = + std::make_shared(2.5, 3.2, DlTileMode::kClamp); auto mock_layer = std::make_shared(child_path, child_paint); - auto layer = std::make_shared( - DlImageFilter::From(layer_filter), DlBlendMode::kSrcOver); + auto layer = std::make_shared(layer_filter, + DlBlendMode::kSrcOver); layer->Add(mock_layer); auto parent = std::make_shared(child_bounds, Clip::hardEdge); parent->Add(layer); @@ -108,7 +108,7 @@ TEST_F(BackdropFilterLayerTest, SimpleFilter) { EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{child_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{child_bounds, DlPaint(), layer_filter, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -119,12 +119,12 @@ TEST_F(BackdropFilterLayerTest, NonSrcOverBlend) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); - auto layer_filter = SkImageFilters::Shader( - SkShaders::Color(SkColors::kMagenta, /*colorSpace=*/nullptr)); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); + auto layer_filter = + std::make_shared(2.5, 3.2, DlTileMode::kClamp); auto mock_layer = std::make_shared(child_path, child_paint); - auto layer = std::make_shared( - DlImageFilter::From(layer_filter), DlBlendMode::kSrc); + auto layer = + std::make_shared(layer_filter, DlBlendMode::kSrc); layer->Add(mock_layer); auto parent = std::make_shared(child_bounds, Clip::hardEdge); parent->Add(layer); @@ -136,8 +136,8 @@ TEST_F(BackdropFilterLayerTest, NonSrcOverBlend) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(mock_layer->parent_matrix(), initial_transform); - SkPaint filter_paint = SkPaint(); - filter_paint.setBlendMode(SkBlendMode::kSrc); + DlPaint filter_paint = DlPaint(); + filter_paint.setBlendMode(DlBlendMode::kSrc); layer->Paint(paint_context()); EXPECT_EQ( @@ -156,16 +156,16 @@ TEST_F(BackdropFilterLayerTest, MultipleChildren) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); SkRect children_bounds = child_path1.getBounds(); children_bounds.join(child_path2.getBounds()); - auto layer_filter = SkImageFilters::Shader( - SkShaders::Color(SkColors::kMagenta, /*colorSpace=*/nullptr)); + auto layer_filter = + std::make_shared(2.5, 3.2, DlTileMode::kClamp); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(child_path2, child_paint2); - auto layer = std::make_shared( - DlImageFilter::From(layer_filter), DlBlendMode::kSrcOver); + auto layer = std::make_shared(layer_filter, + DlBlendMode::kSrcOver); layer->Add(mock_layer1); layer->Add(mock_layer2); auto parent = @@ -188,7 +188,7 @@ TEST_F(BackdropFilterLayerTest, MultipleChildren) { EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{children_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{children_bounds, DlPaint(), layer_filter, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path1, child_paint1}}, @@ -203,20 +203,20 @@ TEST_F(BackdropFilterLayerTest, Nested) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); SkRect children_bounds = child_path1.getBounds(); children_bounds.join(child_path2.getBounds()); - auto layer_filter1 = SkImageFilters::Shader( - SkShaders::Color(SkColors::kMagenta, /*colorSpace=*/nullptr)); - auto layer_filter2 = SkImageFilters::Shader( - SkShaders::Color(SkColors::kDkGray, /*colorSpace=*/nullptr)); + auto layer_filter1 = + std::make_shared(2.5, 3.2, DlTileMode::kClamp); + auto layer_filter2 = + std::make_shared(2.7, 3.1, DlTileMode::kDecal); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(child_path2, child_paint2); - auto layer1 = std::make_shared( - DlImageFilter::From(layer_filter1), DlBlendMode::kSrcOver); - auto layer2 = std::make_shared( - DlImageFilter::From(layer_filter2), DlBlendMode::kSrcOver); + auto layer1 = std::make_shared(layer_filter1, + DlBlendMode::kSrcOver); + auto layer2 = std::make_shared(layer_filter2, + DlBlendMode::kSrcOver); layer2->Add(mock_layer2); layer1->Add(mock_layer1); layer1->Add(layer2); @@ -242,12 +242,12 @@ TEST_F(BackdropFilterLayerTest, Nested) { EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{children_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{children_bounds, DlPaint(), layer_filter1, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path1, child_paint1}}, MockCanvas::DrawCall{ - 1, MockCanvas::SaveLayerData{children_bounds, SkPaint(), + 1, MockCanvas::SaveLayerData{children_bounds, DlPaint(), layer_filter2, 2}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path2, child_paint2}}, @@ -281,7 +281,7 @@ TEST_F(BackdropFilterLayerTest, Readback) { EXPECT_TRUE(preroll_context()->surface_needs_readback); // BDF with no filter blocks child with readback - auto mock_layer = std::make_shared(SkPath(), SkPaint()); + auto mock_layer = std::make_shared(SkPath(), DlPaint()); mock_layer->set_fake_reads_surface(true); layer2->Add(mock_layer); preroll_context()->surface_needs_readback = false; @@ -292,7 +292,7 @@ TEST_F(BackdropFilterLayerTest, Readback) { TEST_F(BackdropFilterLayerTest, OpacityInheritance) { auto backdrop_filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); const SkPath mock_path = SkPath().addRect(SkRect::MakeLTRB(0, 0, 10, 10)); - const SkPaint mock_paint = SkPaint(SkColors::kRed); + const DlPaint mock_paint = DlPaint(DlColor::kRed()); const SkRect clip_rect = SkRect::MakeLTRB(0, 0, 100, 100); auto clip = std::make_shared(clip_rect, Clip::hardEdge); @@ -310,27 +310,27 @@ TEST_F(BackdropFilterLayerTest, OpacityInheritance) { DisplayListBuilder expected_builder(clip_rect); /* ClipRectLayer::Paint */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.clipRect(clip_rect, SkClipOp::kIntersect, false); + expected_builder.ClipRect(clip_rect, DlCanvas::ClipOp::kIntersect, false); /* OpacityLayer::Paint */ { // NOP - it hands opacity down to BackdropFilterLayer /* BackdropFilterLayer::Paint */ { DlPaint save_paint; save_paint.setAlpha(128); - expected_builder.saveLayer(&clip_rect, &save_paint, &backdrop_filter); + expected_builder.SaveLayer(&clip_rect, &save_paint, &backdrop_filter); { /* MockLayer::Paint */ { DlPaint child_paint; child_paint.setColor(DlColor::kRed()); - expected_builder.drawPath(mock_path, child_paint); + expected_builder.DrawPath(mock_path, child_paint); } } - expected_builder.restore(); + expected_builder.Restore(); } } } - expected_builder.restore(); + expected_builder.Restore(); } EXPECT_TRUE(DisplayListsEQ_Verbose(display_list(), expected_builder.Build())); } diff --git a/flow/layers/checkerboard_layertree_unittests.cc b/flow/layers/checkerboard_layertree_unittests.cc index 2a75ad5c5091d..d54abf924f921 100644 --- a/flow/layers/checkerboard_layertree_unittests.cc +++ b/flow/layers/checkerboard_layertree_unittests.cc @@ -17,13 +17,15 @@ namespace testing { using CheckerBoardLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + #ifndef NDEBUG TEST_F(CheckerBoardLayerTest, ClipRectSaveLayerCheckBoard) { const SkMatrix initial_matrix = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeXYWH(1.0, 2.0, 2.0, 2.0); const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_bounds, Clip::antiAliasWithSaveLayer); @@ -52,11 +54,11 @@ TEST_F(CheckerBoardLayerTest, ClipRectSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipRectData{layer_bounds, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, - MockCanvas::SaveLayerData{child_bounds, SkPaint(), nullptr, 2}}, + MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 2}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path, child_paint}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, @@ -70,11 +72,11 @@ TEST_F(CheckerBoardLayerTest, ClipRectSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipRectData{layer_bounds, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, - MockCanvas::SaveLayerData{child_bounds, SkPaint(), nullptr, 2}}, + MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 2}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path, child_paint}}, // start DrawCheckerboard calls @@ -92,8 +94,8 @@ TEST_F(CheckerBoardLayerTest, ClipPathSaveLayerCheckBoard) { const SkPath child_path = SkPath().addRect(child_bounds); const SkPath layer_path = SkPath().addRect(layer_bounds).addRect(layer_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); - const SkPaint clip_paint; + const DlPaint child_paint = DlPaint(DlColor::kYellow()); + const DlPaint clip_paint; auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_path, Clip::antiAliasWithSaveLayer); @@ -120,7 +122,7 @@ TEST_F(CheckerBoardLayerTest, ClipPathSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipPathData{layer_path, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, @@ -138,7 +140,7 @@ TEST_F(CheckerBoardLayerTest, ClipPathSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipPathData{layer_path, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, @@ -159,8 +161,8 @@ TEST_F(CheckerBoardLayerTest, ClipRRectSaveLayerCheckBoard) { const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); const SkRRect layer_rrect = SkRRect::MakeRectXY(layer_bounds, .1, .1); - const SkPaint child_paint = SkPaint(SkColors::kYellow); - const SkPaint clip_paint; + const DlPaint child_paint = DlPaint(DlColor::kYellow()); + const DlPaint clip_paint; auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_rrect, Clip::antiAliasWithSaveLayer); @@ -187,7 +189,7 @@ TEST_F(CheckerBoardLayerTest, ClipRRectSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRRectData{layer_rrect, SkClipOp::kIntersect, + 1, MockCanvas::ClipRRectData{layer_rrect, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, @@ -205,7 +207,7 @@ TEST_F(CheckerBoardLayerTest, ClipRRectSaveLayerCheckBoard) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRRectData{layer_rrect, SkClipOp::kIntersect, + 1, MockCanvas::ClipRRectData{layer_rrect, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, @@ -222,8 +224,9 @@ TEST_F(CheckerBoardLayerTest, ClipRRectSaveLayerCheckBoard) { TEST_F(CheckerBoardLayerTest, PhysicalSaveLayerCheckBoard) { constexpr float initial_elevation = 20.0f; - SkPath layer_path; - layer_path.addRect(0, 0, 8, 8).close(); + const SkRect paint_bounds = SkRect::MakeXYWH(0, 0, 8, 8); + SkPath layer_path = + SkPath().addRect(paint_bounds).addOval(paint_bounds.makeInset(0.1, 0.1)); auto layer = std::make_shared( SK_ColorGREEN, SK_ColorBLACK, initial_elevation, layer_path, Clip::antiAliasWithSaveLayer); @@ -237,24 +240,25 @@ TEST_F(CheckerBoardLayerTest, PhysicalSaveLayerCheckBoard) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(layer->elevation(), initial_elevation); - const SkRect paint_bounds = SkRect::MakeXYWH(0, 0, 8, 8); - const SkPaint clip_paint; - SkPaint layer_paint; + const DlPaint clip_paint; + DlPaint layer_paint; layer_paint.setColor(SK_ColorGREEN); layer_paint.setAntiAlias(true); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector( - {MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + {MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevation, false, 1}}, MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{paint_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::SaveLayerData{layer->paint_bounds(), clip_paint, nullptr, 2}}, - MockCanvas::DrawCall{2, MockCanvas::DrawPaint{layer_paint}}, + MockCanvas::DrawCall{2, MockCanvas::DrawPaintData{layer_paint}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); @@ -264,15 +268,17 @@ TEST_F(CheckerBoardLayerTest, PhysicalSaveLayerCheckBoard) { EXPECT_EQ( mock_canvas().draw_calls(), std::vector( - {MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + {MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevation, false, 1}}, MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{paint_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect, MockCanvas::kSoft_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::SaveLayerData{layer->paint_bounds(), clip_paint, nullptr, 2}}, - MockCanvas::DrawCall{2, MockCanvas::DrawPaint{layer_paint}}, + MockCanvas::DrawCall{2, MockCanvas::DrawPaintData{layer_paint}}, // start DrawCheckerboard calls MockCanvas::DrawCall{2, MockCanvas::DrawRectData{layer->paint_bounds(), diff --git a/flow/layers/clip_path_layer_unittests.cc b/flow/layers/clip_path_layer_unittests.cc index 2b1ddad6c701b..4f07f8c8fa66c 100644 --- a/flow/layers/clip_path_layer_unittests.cc +++ b/flow/layers/clip_path_layer_unittests.cc @@ -14,13 +14,14 @@ #include "flutter/fml/macros.h" #include "flutter/testing/mock_canvas.h" #include "gtest/gtest.h" -#include "include/core/SkPaint.h" namespace flutter { namespace testing { using ClipPathLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + #ifndef NDEBUG TEST_F(ClipPathLayerTest, ClipNoneBehaviorDies) { EXPECT_DEATH_IF_SUPPORTED( @@ -103,7 +104,7 @@ TEST_F(ClipPathLayerTest, ChildOutsideBounds) { const SkRect clip_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); const SkPath clip_path = SkPath().addRect(clip_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_path, Clip::hardEdge); layer->Add(mock_layer); @@ -116,8 +117,8 @@ TEST_F(ClipPathLayerTest, ChildOutsideBounds) { // Set up both contexts to cull clipped child preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds, initial_matrix); - paint_context().canvas->clipRect(device_cull_bounds); - paint_context().canvas->concat(initial_matrix); + paint_context().canvas->ClipRect(device_cull_bounds); + paint_context().canvas->Transform(initial_matrix); layer->Preroll(preroll_context()); // Untouched @@ -144,9 +145,11 @@ TEST_F(ClipPathLayerTest, FullyContainedChild) { const SkMatrix initial_matrix = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeXYWH(1.0, 2.0, 2.0, 2.0); const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); - const SkPath child_path = SkPath().addRect(child_bounds); - const SkPath layer_path = SkPath().addRect(layer_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const SkPath child_path = + SkPath().addRect(child_bounds).addOval(child_bounds.makeInset(0.1, 0.1)); + const SkPath layer_path = + SkPath().addRect(layer_bounds).addOval(layer_bounds.makeInset(0.1, 0.1)); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_path, Clip::hardEdge); layer->Add(mock_layer); @@ -173,7 +176,7 @@ TEST_F(ClipPathLayerTest, FullyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -186,9 +189,11 @@ TEST_F(ClipPathLayerTest, PartiallyContainedChild) { const SkRect device_cull_bounds = initial_matrix.mapRect(local_cull_bounds); const SkRect child_bounds = SkRect::MakeXYWH(2.5, 5.0, 4.5, 4.0); const SkRect clip_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); - const SkPath child_path = SkPath().addRect(child_bounds); - const SkPath clip_path = SkPath().addRect(clip_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const SkPath child_path = + SkPath().addRect(child_bounds).addOval(child_bounds.makeInset(0.1, 0.1)); + const SkPath clip_path = + SkPath().addRect(clip_bounds).addOval(clip_bounds.makeInset(0.1, 0.1)); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_path, Clip::hardEdge); layer->Add(mock_layer); @@ -225,7 +230,7 @@ TEST_F(ClipPathLayerTest, PartiallyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{clip_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipPathData{clip_path, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -250,7 +255,7 @@ static bool ReadbackResult(PrerollContext* context, TEST_F(ClipPathLayerTest, Readback) { PrerollContext* context = preroll_context(); SkPath path; - SkPaint paint; + DlPaint paint; const Clip hard = Clip::hardEdge; const Clip soft = Clip::antiAlias; @@ -415,22 +420,22 @@ TEST_F(ClipPathLayerTest, OpacityInheritancePainting) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { expected_builder.save(); - expected_builder.clipPath(layer_clip, SkClipOp::kIntersect, true); + expected_builder.ClipPath(layer_clip, ClipOp::kIntersect, true); /* child layer1 paint */ { - expected_builder.drawPath(path1, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path1, DlPaint().setAlpha(opacity_alpha)); } /* child layer2 paint */ { - expected_builder.drawPath(path2, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path2, DlPaint().setAlpha(opacity_alpha)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); @@ -472,7 +477,7 @@ TEST_F(ClipPathLayerTest, OpacityInheritanceSaveLayerPainting) { expected_builder.translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { expected_builder.save(); - expected_builder.clipPath(layer_clip, SkClipOp::kIntersect, true); + expected_builder.clipPath(layer_clip, ClipOp::kIntersect, true); expected_builder.setColor(opacity_alpha << 24); expected_builder.saveLayer(&children_bounds, true); /* child layer1 paint */ { @@ -504,8 +509,8 @@ TEST_F(ClipPathLayerTest, LayerCached) { auto initial_transform = SkMatrix::Translate(50.0, 25.5); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); + DisplayListBuilder cache_canvas; + cache_canvas.Transform(cache_ctm); use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -530,7 +535,7 @@ TEST_F(ClipPathLayerTest, LayerCached) { EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1); EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kCurrent); - SkPaint paint; + DlPaint paint; EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(), cache_canvas, &paint)); } @@ -548,8 +553,8 @@ TEST_F(ClipPathLayerTest, EmptyClipDoesNotCullPlatformView) { clip->Add(platform_view); auto embedder = MockViewEmbedder(); - SkCanvas fake_overlay_canvas; - embedder.AddCanvas(&fake_overlay_canvas); + DisplayListBuilder fake_overlay_builder; + embedder.AddCanvas(&fake_overlay_builder); preroll_context()->view_embedder = &embedder; paint_context().view_embedder = &embedder; diff --git a/flow/layers/clip_rect_layer_unittests.cc b/flow/layers/clip_rect_layer_unittests.cc index 5363539290cd8..728e487c38856 100644 --- a/flow/layers/clip_rect_layer_unittests.cc +++ b/flow/layers/clip_rect_layer_unittests.cc @@ -18,6 +18,8 @@ namespace testing { using ClipRectLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + #ifndef NDEBUG TEST_F(ClipRectLayerTest, ClipNoneBehaviorDies) { EXPECT_DEATH_IF_SUPPORTED( @@ -98,7 +100,7 @@ TEST_F(ClipRectLayerTest, ChildOutsideBounds) { const SkRect child_bounds = SkRect::MakeXYWH(2.5, 5.0, 4.5, 4.0); const SkRect clip_rect = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_rect, Clip::hardEdge); layer->Add(mock_layer); @@ -111,8 +113,8 @@ TEST_F(ClipRectLayerTest, ChildOutsideBounds) { // Set up both contexts to cull clipped child preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds, initial_matrix); - paint_context().canvas->clipRect(device_cull_bounds); - paint_context().canvas->concat(initial_matrix); + paint_context().canvas->ClipRect(device_cull_bounds); + paint_context().canvas->Transform(initial_matrix); layer->Preroll(preroll_context()); // Untouched @@ -140,7 +142,7 @@ TEST_F(ClipRectLayerTest, FullyContainedChild) { const SkRect child_bounds = SkRect::MakeXYWH(1.0, 2.0, 2.0, 2.0); const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_bounds, Clip::hardEdge); layer->Add(mock_layer); @@ -168,7 +170,7 @@ TEST_F(ClipRectLayerTest, FullyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_bounds, SkClipOp::kIntersect, + 1, MockCanvas::ClipRectData{layer_bounds, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -182,7 +184,7 @@ TEST_F(ClipRectLayerTest, PartiallyContainedChild) { const SkRect child_bounds = SkRect::MakeXYWH(2.5, 5.0, 4.5, 4.0); const SkRect clip_rect = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_rect, Clip::hardEdge); layer->Add(mock_layer); @@ -217,7 +219,7 @@ TEST_F(ClipRectLayerTest, PartiallyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{clip_rect, SkClipOp::kIntersect, + 1, MockCanvas::ClipRectData{clip_rect, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -241,7 +243,7 @@ static bool ReadbackResult(PrerollContext* context, TEST_F(ClipRectLayerTest, Readback) { PrerollContext* context = preroll_context(); SkPath path; - SkPaint paint; + DlPaint paint; const Clip hard = Clip::hardEdge; const Clip soft = Clip::antiAlias; @@ -402,22 +404,22 @@ TEST_F(ClipRectLayerTest, OpacityInheritancePainting) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { - expected_builder.save(); - expected_builder.clipRect(clip_rect, SkClipOp::kIntersect, true); + expected_builder.Save(); + expected_builder.ClipRect(clip_rect, ClipOp::kIntersect, true); /* child layer1 paint */ { - expected_builder.drawPath(path1, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path1, DlPaint().setAlpha(opacity_alpha)); } /* child layer2 paint */ { - expected_builder.drawPath(path2, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path2, DlPaint().setAlpha(opacity_alpha)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); @@ -457,7 +459,7 @@ TEST_F(ClipRectLayerTest, OpacityInheritanceSaveLayerPainting) { expected_builder.translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { expected_builder.save(); - expected_builder.clipRect(clip_rect, SkClipOp::kIntersect, true); + expected_builder.clipRect(clip_rect, ClipOp::kIntersect, true); expected_builder.setColor(opacity_alpha << 24); expected_builder.saveLayer(&children_bounds, true); /* child layer1 paint */ { @@ -487,8 +489,8 @@ TEST_F(ClipRectLayerTest, LayerCached) { auto initial_transform = SkMatrix::Translate(50.0, 25.5); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -511,7 +513,7 @@ TEST_F(ClipRectLayerTest, LayerCached) { EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1); EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kCurrent); - SkPaint paint; + DlPaint paint; EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(), cache_canvas, &paint)); } @@ -527,8 +529,8 @@ TEST_F(ClipRectLayerTest, EmptyClipDoesNotCullPlatformView) { clip->Add(platform_view); auto embedder = MockViewEmbedder(); - SkCanvas fake_overlay_canvas; - embedder.AddCanvas(&fake_overlay_canvas); + DisplayListBuilder fake_overlay_builder; + embedder.AddCanvas(&fake_overlay_builder); preroll_context()->view_embedder = &embedder; paint_context().view_embedder = &embedder; diff --git a/flow/layers/clip_rrect_layer_unittests.cc b/flow/layers/clip_rrect_layer_unittests.cc index ada85a008fbc9..9e789cee4f82b 100644 --- a/flow/layers/clip_rrect_layer_unittests.cc +++ b/flow/layers/clip_rrect_layer_unittests.cc @@ -18,6 +18,8 @@ namespace testing { using ClipRRectLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + #ifndef NDEBUG TEST_F(ClipRRectLayerTest, ClipNoneBehaviorDies) { const SkRRect layer_rrect = SkRRect::MakeEmpty(); @@ -63,7 +65,7 @@ TEST_F(ClipRRectLayerTest, PaintingCulledLayerDies) { const SkRect distant_bounds = SkRect::MakeXYWH(100.0, 100.0, 10.0, 10.0); const SkPath child_path = SkPath().addRect(child_bounds); const SkRRect layer_rrect = SkRRect::MakeRect(layer_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_rrect, Clip::hardEdge); layer->Add(mock_layer); @@ -103,7 +105,7 @@ TEST_F(ClipRRectLayerTest, ChildOutsideBounds) { const SkRect clip_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath child_path = SkPath().addRect(child_bounds); const SkRRect clip_rrect = SkRRect::MakeRect(clip_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_rrect, Clip::hardEdge); layer->Add(mock_layer); @@ -116,8 +118,8 @@ TEST_F(ClipRRectLayerTest, ChildOutsideBounds) { // Set up both contexts to cull clipped child preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds, initial_matrix); - paint_context().canvas->clipRect(device_cull_bounds); - paint_context().canvas->concat(initial_matrix); + paint_context().canvas->ClipRect(device_cull_bounds); + paint_context().canvas->Transform(initial_matrix); layer->Preroll(preroll_context()); // Untouched @@ -144,9 +146,10 @@ TEST_F(ClipRRectLayerTest, FullyContainedChild) { const SkMatrix initial_matrix = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeXYWH(1.0, 2.0, 2.0, 2.0); const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); - const SkPath child_path = SkPath().addRect(child_bounds); - const SkRRect layer_rrect = SkRRect::MakeRect(layer_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const SkPath child_path = + SkPath().addRect(child_bounds).addOval(child_bounds.makeInset(0.1, 0.1)); + const SkRRect layer_rrect = SkRRect::MakeRectXY(layer_bounds, 0.1, 0.1); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(layer_rrect, Clip::hardEdge); layer->Add(mock_layer); @@ -173,8 +176,8 @@ TEST_F(ClipRRectLayerTest, FullyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_bounds, SkClipOp::kIntersect, - MockCanvas::kHard_ClipEdgeStyle}}, + 1, MockCanvas::ClipRRectData{layer_rrect, ClipOp::kIntersect, + MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); @@ -186,9 +189,10 @@ TEST_F(ClipRRectLayerTest, PartiallyContainedChild) { const SkRect device_cull_bounds = initial_matrix.mapRect(local_cull_bounds); const SkRect child_bounds = SkRect::MakeXYWH(2.5, 5.0, 4.5, 4.0); const SkRect clip_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); - const SkPath child_path = SkPath().addRect(child_bounds); - const SkRRect clip_rrect = SkRRect::MakeRect(clip_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const SkPath child_path = + SkPath().addRect(child_bounds).addOval(child_bounds.makeInset(0.1, 0.1)); + const SkRRect clip_rrect = SkRRect::MakeRectXY(clip_bounds, 0.1, 0.1); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(clip_rrect, Clip::hardEdge); layer->Add(mock_layer); @@ -224,8 +228,8 @@ TEST_F(ClipRRectLayerTest, PartiallyContainedChild) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{clip_bounds, SkClipOp::kIntersect, - MockCanvas::kHard_ClipEdgeStyle}}, + 1, MockCanvas::ClipRRectData{clip_rrect, ClipOp::kIntersect, + MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); @@ -249,7 +253,7 @@ static bool ReadbackResult(PrerollContext* context, TEST_F(ClipRRectLayerTest, Readback) { PrerollContext* context = preroll_context(); SkPath path; - SkPaint paint; + DlPaint paint; const Clip hard = Clip::hardEdge; const Clip soft = Clip::antiAlias; @@ -412,22 +416,22 @@ TEST_F(ClipRRectLayerTest, OpacityInheritancePainting) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { - expected_builder.save(); - expected_builder.clipRRect(clip_rrect, SkClipOp::kIntersect, true); + expected_builder.Save(); + expected_builder.ClipRRect(clip_rrect, ClipOp::kIntersect, true); /* child layer1 paint */ { - expected_builder.drawPath(path1, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path1, DlPaint().setAlpha(opacity_alpha)); } /* child layer2 paint */ { - expected_builder.drawPath(path2, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path2, DlPaint().setAlpha(opacity_alpha)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); @@ -468,7 +472,7 @@ TEST_F(ClipRRectLayerTest, OpacityInheritanceSaveLayerPainting) { expected_builder.translate(offset.fX, offset.fY); /* ClipRectLayer::Paint() */ { expected_builder.save(); - expected_builder.clipRRect(clip_rrect, SkClipOp::kIntersect, true); + expected_builder.clipRRect(clip_rrect, ClipOp::kIntersect, true); expected_builder.setColor(opacity_alpha << 24); expected_builder.saveLayer(&children_bounds, true); /* child layer1 paint */ { @@ -490,7 +494,7 @@ TEST_F(ClipRRectLayerTest, OpacityInheritanceSaveLayerPainting) { TEST_F(ClipRRectLayerTest, LayerCached) { auto path1 = SkPath().addRect({10, 10, 30, 30}); - SkPaint paint = SkPaint(); + DlPaint paint = DlPaint(); auto mock1 = MockLayer::MakeOpacityCompatible(path1); SkRect clip_rect = SkRect::MakeWH(500, 500); SkRRect clip_rrect = SkRRect::MakeRectXY(clip_rect, 20, 20); @@ -500,8 +504,8 @@ TEST_F(ClipRRectLayerTest, LayerCached) { auto initial_transform = SkMatrix::Translate(50.0, 25.5); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -576,8 +580,8 @@ TEST_F(ClipRRectLayerTest, EmptyClipDoesNotCullPlatformView) { clip->Add(platform_view); auto embedder = MockViewEmbedder(); - SkCanvas fake_overlay_canvas; - embedder.AddCanvas(&fake_overlay_canvas); + DisplayListBuilder fake_overlay_builder; + embedder.AddCanvas(&fake_overlay_builder); preroll_context()->view_embedder = &embedder; paint_context().view_embedder = &embedder; diff --git a/flow/layers/clip_shape_layer.h b/flow/layers/clip_shape_layer.h index 591d4b22237d5..69c479fe61a23 100644 --- a/flow/layers/clip_shape_layer.h +++ b/flow/layers/clip_shape_layer.h @@ -88,7 +88,7 @@ class ClipShapeLayer : public CacheableContainerLayer { auto restore_apply = context.state_stack.applyState( paint_bounds(), LayerStateStack::kCallerCanApplyOpacity); - SkPaint paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, context.state_stack.fill(paint))) { return; diff --git a/flow/layers/color_filter_layer.cc b/flow/layers/color_filter_layer.cc index ee19cc3f56461..dabd7335f5a35 100644 --- a/flow/layers/color_filter_layer.cc +++ b/flow/layers/color_filter_layer.cc @@ -74,9 +74,9 @@ void ColorFilterLayer::Paint(PaintContext& context) const { // Try drawing the layer cache item from the cache before applying the // color filter if it was cached with the filter applied. if (!layer_raster_cache_item_->IsCacheChildren()) { - SkPaint sk_paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, - context.state_stack.fill(sk_paint))) { + context.state_stack.fill(paint))) { return; } } @@ -87,9 +87,9 @@ void ColorFilterLayer::Paint(PaintContext& context) const { mutator.applyColorFilter(paint_bounds(), filter_); if (context.raster_cache && layer_raster_cache_item_->IsCacheChildren()) { - SkPaint sk_paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, - context.state_stack.fill(sk_paint))) { + context.state_stack.fill(paint))) { return; } } diff --git a/flow/layers/color_filter_layer_unittests.cc b/flow/layers/color_filter_layer_unittests.cc index 093ee3546f3c1..c6d453e936960 100644 --- a/flow/layers/color_filter_layer_unittests.cc +++ b/flow/layers/color_filter_layer_unittests.cc @@ -60,7 +60,7 @@ TEST_F(ColorFilterLayerTest, EmptyFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(nullptr); layer->Add(mock_layer); @@ -72,8 +72,6 @@ TEST_F(ColorFilterLayerTest, EmptyFilter) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(mock_layer->parent_matrix(), initial_transform); - SkPaint filter_paint; - filter_paint.setColorFilter(nullptr); layer->Paint(paint_context()); EXPECT_EQ(mock_canvas().draw_calls(), std::vector({ @@ -86,7 +84,7 @@ TEST_F(ColorFilterLayerTest, SimpleFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto dl_color_filter = DlLinearToSrgbGammaColorFilter::instance; auto mock_layer = std::make_shared(child_path, child_paint); @@ -104,15 +102,14 @@ TEST_F(ColorFilterLayerTest, SimpleFilter) { /* ColorFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setColorFilter(dl_color_filter.get()); - expected_builder.saveLayer(&child_bounds, &dl_paint); + expected_builder.SaveLayer(&child_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path, DlPaint(DlColor::kYellow())); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); layer->Paint(display_list_paint_context()); @@ -125,8 +122,8 @@ TEST_F(ColorFilterLayerTest, MultipleChildren) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(child_path2, child_paint2); auto dl_color_filter = DlSrgbToLinearGammaColorFilter::instance; @@ -152,19 +149,17 @@ TEST_F(ColorFilterLayerTest, MultipleChildren) { /* ColorFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setColorFilter(dl_color_filter.get()); - expected_builder.saveLayer(&children_bounds, &dl_paint); + expected_builder.SaveLayer(&children_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path1, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path1, DlPaint(DlColor::kYellow())); } /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path2, - DlPaint().setColor(DlColor::kCyan())); + expected_builder.DrawPath(child_path2, DlPaint(DlColor::kCyan())); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); layer->Paint(display_list_paint_context()); @@ -177,8 +172,8 @@ TEST_F(ColorFilterLayerTest, Nested) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(child_path2, child_paint2); auto dl_color_filter = DlSrgbToLinearGammaColorFilter::instance; @@ -210,27 +205,25 @@ TEST_F(ColorFilterLayerTest, Nested) { /* ColorFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setColorFilter(dl_color_filter.get()); - expected_builder.saveLayer(&children_bounds, &dl_paint); + expected_builder.SaveLayer(&children_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path1, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path1, DlPaint(DlColor::kYellow())); } /* ColorFilter::Paint() */ { DlPaint child_dl_paint; child_dl_paint.setColor(DlColor::kBlack()); child_dl_paint.setColorFilter(dl_color_filter.get()); - expected_builder.saveLayer(&child_path2.getBounds(), &child_dl_paint); + expected_builder.SaveLayer(&child_path2.getBounds(), &child_dl_paint); /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path2, - DlPaint().setColor(DlColor::kCyan())); + expected_builder.DrawPath(child_path2, DlPaint(DlColor::kCyan())); } - expected_builder.restore(); + expected_builder.Restore(); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); @@ -250,7 +243,7 @@ TEST_F(ColorFilterLayerTest, Readback) { EXPECT_FALSE(preroll_context()->surface_needs_readback); // ColorFilterLayer blocks child with readback - auto mock_layer = std::make_shared(SkPath(), SkPaint()); + auto mock_layer = std::make_shared(SkPath(), DlPaint()); mock_layer->set_fake_reads_surface(true); layer->Add(mock_layer); preroll_context()->surface_needs_readback = false; @@ -263,16 +256,16 @@ TEST_F(ColorFilterLayerTest, CacheChild) { auto initial_transform = SkMatrix::Translate(50.0, 25.5); auto other_transform = SkMatrix::Scale(1.0, 2.0); const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); - SkPaint paint = SkPaint(); + DlPaint paint = DlPaint(); auto mock_layer = std::make_shared(child_path); auto layer = std::make_shared(layer_filter); layer->Add(mock_layer); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); const auto* cacheable_color_filter_item = layer->raster_cache_item(); @@ -310,13 +303,13 @@ TEST_F(ColorFilterLayerTest, CacheChildren) { auto layer = std::make_shared(layer_filter); layer->Add(mock_layer1); layer->Add(mock_layer2); - SkPaint paint = SkPaint(); + DlPaint paint = DlPaint(); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); @@ -356,13 +349,13 @@ TEST_F(ColorFilterLayerTest, CacheColorFilterLayerSelf) { auto layer = std::make_shared(layer_filter); layer->Add(mock_layer1); layer->Add(mock_layer2); - SkPaint paint = SkPaint(); + DlPaint paint = DlPaint(); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -438,21 +431,21 @@ TEST_F(ColorFilterLayerTest, OpacityInheritance) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ColorFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setColor(opacity_alpha << 24); dl_paint.setColorFilter(&layer_filter); - expected_builder.saveLayer(&child_path.getBounds(), &dl_paint); + expected_builder.SaveLayer(&child_path.getBounds(), &dl_paint); /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, DlPaint().setColor(0xFF000000)); + expected_builder.DrawPath(child_path, DlPaint(0xFF000000)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); diff --git a/flow/layers/container_layer_unittests.cc b/flow/layers/container_layer_unittests.cc index f9e72debdbd92..990bb244cdc3f 100644 --- a/flow/layers/container_layer_unittests.cc +++ b/flow/layers/container_layer_unittests.cc @@ -68,8 +68,8 @@ TEST_F(ContainerLayerTest, LayerWithParentHasTextureLayerNeedsResetFlag) { child_path1.addRect(5.0f, 6.0f, 20.5f, 21.5f); SkPath child_path2; child_path2.addRect(8.0f, 2.0f, 16.5f, 14.5f); - SkPaint child_paint1(SkColors::kGray); - SkPaint child_paint2(SkColors::kGreen); + DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + DlPaint child_paint2 = DlPaint(DlColor::kGreen()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); mock_layer1->set_fake_has_texture_layer(true); @@ -93,7 +93,7 @@ TEST_F(ContainerLayerTest, LayerWithParentHasTextureLayerNeedsResetFlag) { TEST_F(ContainerLayerTest, Simple) { SkPath child_path; child_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); - SkPaint child_paint(SkColors::kGreen); + DlPaint child_paint = DlPaint(DlColor::kGreen()); SkMatrix initial_transform = SkMatrix::Translate(-0.5f, -0.5f); auto mock_layer = std::make_shared(child_path, child_paint); @@ -122,8 +122,8 @@ TEST_F(ContainerLayerTest, Multiple) { child_path1.addRect(5.0f, 6.0f, 20.5f, 21.5f); SkPath child_path2; child_path2.addRect(8.0f, 2.0f, 16.5f, 14.5f); - SkPaint child_paint1(SkColors::kGray); - SkPaint child_paint2(SkColors::kGreen); + DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + DlPaint child_paint2 = DlPaint(DlColor::kGreen()); SkMatrix initial_transform = SkMatrix::Translate(-0.5f, -0.5f); auto mock_layer1 = std::make_shared(child_path1, child_paint1); @@ -163,8 +163,8 @@ TEST_F(ContainerLayerTest, Multiple) { TEST_F(ContainerLayerTest, MultipleWithEmpty) { SkPath child_path1; child_path1.addRect(5.0f, 6.0f, 20.5f, 21.5f); - SkPaint child_paint1(SkColors::kGray); - SkPaint child_paint2(SkColors::kGreen); + DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + DlPaint child_paint2 = DlPaint(DlColor::kGreen()); SkMatrix initial_transform = SkMatrix::Translate(-0.5f, -0.5f); auto mock_layer1 = std::make_shared(child_path1, child_paint1); @@ -199,8 +199,8 @@ TEST_F(ContainerLayerTest, NeedsSystemComposite) { child_path1.addRect(5.0f, 6.0f, 20.5f, 21.5f); SkPath child_path2; child_path2.addRect(8.0f, 2.0f, 16.5f, 14.5f); - SkPaint child_paint1(SkColors::kGray); - SkPaint child_paint2(SkColors::kGreen); + DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + DlPaint child_paint2 = DlPaint(DlColor::kGreen()); SkMatrix initial_transform = SkMatrix::Translate(-0.5f, -0.5f); auto mock_layer1 = std::make_shared(child_path1, child_paint1); @@ -241,9 +241,9 @@ TEST_F(ContainerLayerTest, RasterCacheTest) { const SkPath child_path1 = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path2 = SkPath().addRect(21.0f, 6.0f, 25.5f, 21.5f); const SkPath child_path3 = SkPath().addRect(26.0f, 6.0f, 30.5f, 21.5f); - const SkPaint child_paint1(SkColors::kGray); - const SkPaint child_paint2(SkColors::kGreen); - const SkPaint paint; + const DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + const DlPaint child_paint2 = DlPaint(DlColor::kGreen()); + const DlPaint paint; auto cacheable_container_layer1 = MockCacheableContainerLayer::CacheLayerOrChildren(); auto cacheable_container_layer2 = @@ -286,8 +286,8 @@ TEST_F(ContainerLayerTest, RasterCacheTest) { layer->Add(mock_layer2); layer->Add(cacheable_container_layer2); - SkCanvas cache_canvas; - cache_canvas.setMatrix(SkMatrix::I()); + DisplayListBuilder cache_canvas; + cache_canvas.TransformReset(); // Initial Preroll for check the layer paint bounds layer->Preroll(preroll_context()); @@ -510,7 +510,7 @@ TEST_F(ContainerLayerTest, OpacityInheritance) { TEST_F(ContainerLayerTest, CollectionCacheableLayer) { SkPath child_path; child_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); - SkPaint child_paint(SkColors::kGreen); + DlPaint child_paint = DlPaint(DlColor::kGreen()); SkMatrix initial_transform = SkMatrix::Translate(-0.5f, -0.5f); auto mock_layer1 = std::make_shared(SkPath(), child_paint); diff --git a/flow/layers/display_list_layer.cc b/flow/layers/display_list_layer.cc index 7ba4feb7276dc..1014093b9424e 100644 --- a/flow/layers/display_list_layer.cc +++ b/flow/layers/display_list_layer.cc @@ -25,7 +25,7 @@ DisplayListLayer::DisplayListLayer(const SkPoint& offset, bounds_ = display_list_.skia_object()->bounds().makeOffset(offset_.x(), offset_.y()); display_list_raster_cache_item_ = DisplayListRasterCacheItem::Make( - display_list_.skia_object().get(), offset_, is_complex, will_change); + display_list_.skia_object(), offset_, is_complex, will_change); } } @@ -118,7 +118,7 @@ void DisplayListLayer::Paint(PaintContext& context) const { mutator.integralTransform(); if (display_list_raster_cache_item_) { - SkPaint paint; + DlPaint paint; if (display_list_raster_cache_item_->Draw( context, context.state_stack.fill(paint))) { TRACE_EVENT_INSTANT0("flutter", "raster cache hit"); @@ -130,21 +130,23 @@ void DisplayListLayer::Paint(PaintContext& context) const { SkScalar opacity = context.state_stack.outstanding_opacity(); if (context.enable_leaf_layer_tracing) { - const auto canvas_size = context.canvas->getBaseLayerSize(); + const auto canvas_size = context.canvas->GetBaseLayerSize(); auto offscreen_surface = std::make_unique(context.gr_context, canvas_size); - const auto& ctm = context.canvas->getTotalMatrix(); + const auto& ctm = context.canvas->GetTransform(); const auto start_time = fml::TimePoint::Now(); { // render display list to offscreen surface. auto* canvas = offscreen_surface->GetCanvas(); - SkAutoCanvasRestore save(canvas, true); - canvas->clear(SK_ColorTRANSPARENT); - canvas->setMatrix(ctm); - display_list()->RenderTo(canvas, opacity); - canvas->flush(); + { + DlAutoCanvasRestore save(canvas, true); + canvas->Clear(DlColor::kTransparent()); + canvas->SetTransform(ctm); + canvas->DrawDisplayList(display_list_.skia_object(), opacity); + } + canvas->Flush(); } const fml::TimeDelta offscreen_render_time = fml::TimePoint::Now() - start_time; @@ -157,13 +159,8 @@ void DisplayListLayer::Paint(PaintContext& context) const { context.layer_snapshot_store->Add(snapshot_data); } - if (context.builder) { - auto display_list = display_list_.skia_object(); - auto restore = context.state_stack.applyState(display_list->bounds(), 0); - context.builder->drawDisplayList(display_list); - } else { - display_list()->RenderTo(context.canvas, opacity); - } + auto display_list = display_list_.skia_object(); + context.canvas->DrawDisplayList(display_list, opacity); } } // namespace flutter diff --git a/flow/layers/display_list_layer_unittests.cc b/flow/layers/display_list_layer_unittests.cc index c4852a42b006e..cd0f12466c65f 100644 --- a/flow/layers/display_list_layer_unittests.cc +++ b/flow/layers/display_list_layer_unittests.cc @@ -93,8 +93,8 @@ TEST_F(DisplayListLayerTest, SimpleDisplayList) { {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ 1, MockCanvas::ConcatMatrixData{SkM44(layer_offset_matrix)}}, - MockCanvas::DrawCall{ - 1, MockCanvas::DrawRectData{picture_bounds, SkPaint()}}, + MockCanvas::DrawCall{1, + MockCanvas::DrawDisplayListData{display_list, 1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}}); EXPECT_EQ(mock_canvas().draw_calls(), expected_draw_calls); } @@ -156,6 +156,7 @@ TEST_F(DisplayListLayerTest, SimpleDisplayListOpacityInheritance) { expected_builder.drawDisplayList(child_display_list); } expected_builder.restore(); + expected_builder.setColor(DlColor::kBlack()); } expected_builder.restore(); } diff --git a/flow/layers/display_list_raster_cache_item.cc b/flow/layers/display_list_raster_cache_item.cc index 42f6d1884bed2..42a2fa3280eae 100644 --- a/flow/layers/display_list_raster_cache_item.cc +++ b/flow/layers/display_list_raster_cache_item.cc @@ -8,6 +8,7 @@ #include #include "flutter/display_list/display_list.h" +#include "flutter/display_list/display_list_complexity.h" #include "flutter/flow/layers/layer.h" #include "flutter/flow/raster_cache.h" #include "flutter/flow/raster_cache_item.h" @@ -18,7 +19,7 @@ namespace flutter { static bool IsDisplayListWorthRasterizing( - DisplayList* display_list, + const DisplayList* display_list, bool will_change, bool is_complex, DisplayListComplexityCalculator* complexity_calculator) { @@ -46,7 +47,7 @@ static bool IsDisplayListWorthRasterizing( } DisplayListRasterCacheItem::DisplayListRasterCacheItem( - DisplayList* display_list, + const sk_sp& display_list, const SkPoint& offset, bool is_complex, bool will_change) @@ -59,7 +60,7 @@ DisplayListRasterCacheItem::DisplayListRasterCacheItem( will_change_(will_change) {} std::unique_ptr DisplayListRasterCacheItem::Make( - DisplayList* display_list, + const sk_sp& display_list, const SkPoint& offset, bool is_complex, bool will_change) { @@ -75,7 +76,7 @@ void DisplayListRasterCacheItem::PrerollSetup(PrerollContext* context, context->gr_context->backend()) : DisplayListComplexityCalculator::GetForSoftware(); - if (!IsDisplayListWorthRasterizing(display_list_, will_change_, is_complex_, + if (!IsDisplayListWorthRasterizing(display_list(), will_change_, is_complex_, complexity_calculator)) { // We only deal with display lists that are worthy of rasterization. return; @@ -121,13 +122,13 @@ void DisplayListRasterCacheItem::PrerollFinalize(PrerollContext* context, } bool DisplayListRasterCacheItem::Draw(const PaintContext& context, - const SkPaint* paint) const { + const DlPaint* paint) const { return Draw(context, context.canvas, paint); } bool DisplayListRasterCacheItem::Draw(const PaintContext& context, - SkCanvas* canvas, - const SkPaint* paint) const { + DlCanvas* canvas, + const DlPaint* paint) const { if (!context.raster_cache || !canvas) { return false; } @@ -164,8 +165,8 @@ bool DisplayListRasterCacheItem::TryToPrepareRasterCache( }; return context.raster_cache->UpdateCacheEntry( GetId().value(), r_context, - [display_list = display_list_](SkCanvas* canvas) { - display_list->RenderTo(canvas); + [display_list = display_list_](DlCanvas* canvas) { + canvas->DrawDisplayList(display_list); }); } } // namespace flutter diff --git a/flow/layers/display_list_raster_cache_item.h b/flow/layers/display_list_raster_cache_item.h index 65d838939e92d..370ab5634e91c 100644 --- a/flow/layers/display_list_raster_cache_item.h +++ b/flow/layers/display_list_raster_cache_item.h @@ -23,26 +23,27 @@ namespace flutter { class DisplayListRasterCacheItem : public RasterCacheItem { public: - DisplayListRasterCacheItem(DisplayList* display_list, + DisplayListRasterCacheItem(const sk_sp& display_list, const SkPoint& offset, bool is_complex = true, bool will_change = false); - static std::unique_ptr Make(DisplayList*, - const SkPoint& offset, - bool is_complex, - bool will_change); + static std::unique_ptr Make( + const sk_sp&, + const SkPoint& offset, + bool is_complex, + bool will_change); void PrerollSetup(PrerollContext* context, const SkMatrix& matrix) override; void PrerollFinalize(PrerollContext* context, const SkMatrix& matrix) override; - bool Draw(const PaintContext& context, const SkPaint* paint) const override; + bool Draw(const PaintContext& context, const DlPaint* paint) const override; bool Draw(const PaintContext& context, - SkCanvas* canvas, - const SkPaint* paint) const override; + DlCanvas* canvas, + const DlPaint* paint) const override; bool TryToPrepareRasterCache(const PaintContext& context, bool parent_cached = false) const override; @@ -51,11 +52,11 @@ class DisplayListRasterCacheItem : public RasterCacheItem { matrix_ = matrix_.preTranslate(offset.x(), offset.y()); } - const DisplayList* display_list() const { return display_list_; } + const DisplayList* display_list() const { return display_list_.get(); } private: SkMatrix transformation_matrix_; - DisplayList* display_list_; + sk_sp display_list_; SkPoint offset_; bool is_complex_; bool will_change_; diff --git a/flow/layers/image_filter_layer.cc b/flow/layers/image_filter_layer.cc index b759ee97005bb..9fa4d774c5a64 100644 --- a/flow/layers/image_filter_layer.cc +++ b/flow/layers/image_filter_layer.cc @@ -103,9 +103,9 @@ void ImageFilterLayer::Paint(PaintContext& context) const { // Try drawing the layer cache item from the cache before applying the // image filter if it was cached with the filter applied. if (!layer_raster_cache_item_->IsCacheChildren()) { - SkPaint sk_paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, - context.state_stack.fill(sk_paint))) { + context.state_stack.fill(paint))) { return; } } @@ -123,10 +123,10 @@ void ImageFilterLayer::Paint(PaintContext& context) const { // transformed version of the filter so we must process it into the // cache paint object manually. FML_DCHECK(transformed_filter_ != nullptr); - SkPaint sk_paint; - context.state_stack.fill(sk_paint); - sk_paint.setImageFilter(transformed_filter_->skia_object()); - if (layer_raster_cache_item_->Draw(context, &sk_paint)) { + DlPaint paint; + context.state_stack.fill(paint); + paint.setImageFilter(transformed_filter_); + if (layer_raster_cache_item_->Draw(context, &paint)) { return; } } diff --git a/flow/layers/image_filter_layer_unittests.cc b/flow/layers/image_filter_layer_unittests.cc index c0bb30930b370..77789a9b6af30 100644 --- a/flow/layers/image_filter_layer_unittests.cc +++ b/flow/layers/image_filter_layer_unittests.cc @@ -13,7 +13,6 @@ #include "flutter/fml/macros.h" #include "flutter/testing/mock_canvas.h" #include "gtest/gtest.h" -#include "include/core/SkPaint.h" #include "include/core/SkPath.h" #include "third_party/skia/include/effects/SkImageFilters.h" @@ -52,7 +51,7 @@ TEST_F(ImageFilterLayerTest, EmptyFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(nullptr); layer->Add(mock_layer); @@ -64,8 +63,6 @@ TEST_F(ImageFilterLayerTest, EmptyFilter) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(mock_layer->parent_matrix(), initial_transform); - SkPaint filter_paint; - filter_paint.setImageFilter(nullptr); layer->Paint(paint_context()); EXPECT_EQ(mock_canvas().draw_calls(), std::vector({ @@ -78,7 +75,7 @@ TEST_F(ImageFilterLayerTest, SimpleFilter) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto dl_image_filter = std::make_shared( SkMatrix(), DlImageSampling::kMipmapLinear); auto mock_layer = std::make_shared(child_path, child_paint); @@ -99,15 +96,14 @@ TEST_F(ImageFilterLayerTest, SimpleFilter) { /* ImageFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setImageFilter(dl_image_filter.get()); - expected_builder.saveLayer(&child_bounds, &dl_paint); + expected_builder.SaveLayer(&child_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path, DlPaint(DlColor::kYellow())); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); layer->Paint(display_list_paint_context()); @@ -119,7 +115,7 @@ TEST_F(ImageFilterLayerTest, SimpleFilterWithOffset) { const SkRect initial_cull_rect = SkRect::MakeLTRB(0, 0, 100, 100); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); const SkPoint layer_offset = SkPoint::Make(5.5, 6.5); auto dl_image_filter = std::make_shared( SkMatrix(), DlImageSampling::kMipmapLinear); @@ -145,21 +141,20 @@ TEST_F(ImageFilterLayerTest, SimpleFilterWithOffset) { DisplayListBuilder expected_builder; /* ImageFilterLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(layer_offset.fX, layer_offset.fY); + expected_builder.Translate(layer_offset.fX, layer_offset.fY); DlPaint dl_paint; dl_paint.setImageFilter(dl_image_filter.get()); - expected_builder.saveLayer(&child_bounds, &dl_paint); + expected_builder.SaveLayer(&child_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path, DlPaint(DlColor::kYellow())); } } - expected_builder.restore(); + expected_builder.Restore(); } - expected_builder.restore(); + expected_builder.Restore(); } auto expected_display_list = expected_builder.Build(); @@ -171,7 +166,7 @@ TEST_F(ImageFilterLayerTest, SimpleFilterBounds) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); const SkMatrix filter_transform = SkMatrix::Scale(2.0, 2.0); auto dl_image_filter = std::make_shared( @@ -193,15 +188,14 @@ TEST_F(ImageFilterLayerTest, SimpleFilterBounds) { /* ImageFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setImageFilter(dl_image_filter.get()); - expected_builder.saveLayer(&child_bounds, &dl_paint); + expected_builder.SaveLayer(&child_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path, DlPaint(DlColor::kYellow())); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); layer->Paint(display_list_paint_context()); @@ -214,8 +208,8 @@ TEST_F(ImageFilterLayerTest, MultipleChildren) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto dl_image_filter = std::make_shared( SkMatrix(), DlImageSampling::kMipmapLinear); auto mock_layer1 = std::make_shared(child_path1, child_paint1); @@ -244,15 +238,13 @@ TEST_F(ImageFilterLayerTest, MultipleChildren) { /* ImageFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setImageFilter(dl_image_filter.get()); - expected_builder.saveLayer(&children_bounds, &dl_paint); + expected_builder.SaveLayer(&children_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path1, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path1, DlPaint(DlColor::kYellow())); } /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path2, - DlPaint().setColor(DlColor::kCyan())); + expected_builder.DrawPath(child_path2, DlPaint(DlColor::kCyan())); } } } @@ -269,8 +261,8 @@ TEST_F(ImageFilterLayerTest, Nested) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto dl_image_filter1 = std::make_shared( SkMatrix(), DlImageSampling::kMipmapLinear); auto dl_image_filter2 = std::make_shared( @@ -309,25 +301,23 @@ TEST_F(ImageFilterLayerTest, Nested) { /* ImageFilterLayer::Paint() */ { DlPaint dl_paint; dl_paint.setImageFilter(dl_image_filter1.get()); - expected_builder.saveLayer(&children_bounds, &dl_paint); + expected_builder.SaveLayer(&children_bounds, &dl_paint); { /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path1, - DlPaint().setColor(DlColor::kYellow())); + expected_builder.DrawPath(child_path1, DlPaint(DlColor::kYellow())); } /* ImageFilterLayer::Paint() */ { DlPaint child_paint; child_paint.setImageFilter(dl_image_filter2.get()); - expected_builder.saveLayer(&child_path2.getBounds(), &child_paint); + expected_builder.SaveLayer(&child_path2.getBounds(), &child_paint); /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path2, - DlPaint().setColor(DlColor::kCyan())); + expected_builder.DrawPath(child_path2, DlPaint(DlColor::kCyan())); } - expected_builder.restore(); + expected_builder.Restore(); } } } - expected_builder.restore(); + expected_builder.Restore(); auto expected_display_list = expected_builder.Build(); layer1->Paint(display_list_paint_context()); @@ -345,7 +335,7 @@ TEST_F(ImageFilterLayerTest, Readback) { EXPECT_FALSE(preroll_context()->surface_needs_readback); // ImageFilterLayer blocks child with readback - auto mock_layer = std::make_shared(SkPath(), SkPaint()); + auto mock_layer = std::make_shared(SkPath(), DlPaint()); mock_layer->set_fake_reads_surface(true); layer->Add(mock_layer); preroll_context()->surface_needs_readback = false; @@ -364,11 +354,11 @@ TEST_F(ImageFilterLayerTest, CacheChild) { layer->Add(mock_layer); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); - SkPaint paint = SkPaint(); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); + DlPaint paint; use_mock_raster_cache(); const auto* cacheable_image_filter_item = layer->raster_cache_item(); @@ -399,7 +389,7 @@ TEST_F(ImageFilterLayerTest, CacheChildren) { SkMatrix(), DlImageSampling::kMipmapLinear); auto initial_transform = SkMatrix::Translate(50.0, 25.5); auto other_transform = SkMatrix::Scale(1.0, 2.0); - SkPaint paint = SkPaint(); + DlPaint paint; const SkPath child_path1 = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); const SkPath child_path2 = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); auto mock_layer1 = std::make_shared(child_path1); @@ -410,10 +400,10 @@ TEST_F(ImageFilterLayerTest, CacheChildren) { layer->Add(mock_layer2); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); @@ -488,11 +478,11 @@ TEST_F(ImageFilterLayerTest, CacheImageFilterLayerSelf) { layer->Add(mock_layer); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); - SkPaint paint = SkPaint(); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); + DlPaint paint; use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -515,7 +505,7 @@ TEST_F(ImageFilterLayerTest, CacheImageFilterLayerSelf) { EXPECT_EQ(uncached_call3_data.save_bounds, child_rect); EXPECT_EQ(uncached_call3_data.save_to_layer, 2); auto uncached_call4 = - MockCanvas::DrawCall{2, MockCanvas::DrawPathData{child_path, SkPaint()}}; + MockCanvas::DrawCall{2, MockCanvas::DrawPathData{child_path, DlPaint()}}; EXPECT_EQ(mock_canvas().draw_calls()[4], uncached_call4); auto uncached_call5 = MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}; EXPECT_EQ(mock_canvas().draw_calls()[5], uncached_call5); @@ -567,7 +557,7 @@ TEST_F(ImageFilterLayerTest, OpacityInheritance) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 1.0f); const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto dl_image_filter = std::make_shared( SkMatrix(), DlImageSampling::kMipmapLinear); @@ -595,23 +585,23 @@ TEST_F(ImageFilterLayerTest, OpacityInheritance) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ImageFilterLayer::Paint() */ { DlPaint image_filter_paint; image_filter_paint.setColor(opacity_alpha << 24); image_filter_paint.setImageFilter(dl_image_filter.get()); - expected_builder.saveLayer(&child_path.getBounds(), + expected_builder.SaveLayer(&child_path.getBounds(), &image_filter_paint); /* MockLayer::Paint() */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(child_paint.getColor())); + expected_builder.DrawPath(child_path, + DlPaint(child_paint.getColor())); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); @@ -687,7 +677,7 @@ TEST_F(ImageFilterLayerDiffTest, ImageFilterLayerInflatestChildSize) { filter_layer_1_1->Add(filter_layer_1_2); auto path = SkPath().addRect(SkRect::MakeLTRB(100, 100, 110, 110)); filter_layer_1_2->Add( - std::make_shared(path, SkPaint(SkColors::kYellow))); + std::make_shared(path, DlPaint(DlColor::kYellow()))); l1.root()->Add(filter_layer_1_1); // second layer tree with identical filter layers but different child layer @@ -698,7 +688,7 @@ TEST_F(ImageFilterLayerDiffTest, ImageFilterLayerInflatestChildSize) { filter_layer2_2->AssignOldLayer(filter_layer_1_2.get()); filter_layer2_1->Add(filter_layer2_2); filter_layer2_2->Add( - std::make_shared(path, SkPaint(SkColors::kRed))); + std::make_shared(path, DlPaint(DlColor::kRed()))); l2.root()->Add(filter_layer2_1); DiffLayerTree(l1, MockLayerTree()); diff --git a/flow/layers/layer.h b/flow/layers/layer.h index 234d3c3db9ff8..f65719574ca8d 100644 --- a/flow/layers/layer.h +++ b/flow/layers/layer.h @@ -11,7 +11,8 @@ #include #include "flutter/common/graphics/texture.h" -#include "flutter/display_list/display_list_builder_multiplexer.h" +#include "flutter/display_list/dl_canvas.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/flow/diff_context.h" #include "flutter/flow/embedded_views.h" #include "flutter/flow/instrumentation.h" @@ -103,8 +104,7 @@ struct PaintContext { // allowing leaf layers to report that they can handle rendering some of // its state attributes themselves via the |applyState| method. LayerStateStack& state_stack; - SkCanvas* canvas; - DisplayListBuilder* builder = nullptr; + DlCanvas* canvas; GrDirectContext* gr_context; SkColorSpace* dst_color_space; diff --git a/flow/layers/layer_raster_cache_item.cc b/flow/layers/layer_raster_cache_item.cc index 826c0eb2203a0..6d130d2299692 100644 --- a/flow/layers/layer_raster_cache_item.cc +++ b/flow/layers/layer_raster_cache_item.cc @@ -101,7 +101,7 @@ const SkRect* LayerRasterCacheItem::GetPaintBoundsFromLayer() const { bool Rasterize(RasterCacheItem::CacheState cache_state, Layer* layer, const PaintContext& paint_context, - SkCanvas* canvas) { + DlCanvas* canvas) { FML_DCHECK(cache_state != RasterCacheItem::CacheState::kNone); LayerStateStack state_stack; state_stack.set_delegate(canvas); @@ -158,7 +158,7 @@ bool LayerRasterCacheItem::TryToPrepareRasterCache(const PaintContext& context, return context.raster_cache->UpdateCacheEntry( GetId().value(), r_context, [ctx = context, cache_state = cache_state_, - layer = layer_](SkCanvas* canvas) { + layer = layer_](DlCanvas* canvas) { Rasterize(cache_state, layer, ctx, canvas); }); } @@ -167,13 +167,13 @@ bool LayerRasterCacheItem::TryToPrepareRasterCache(const PaintContext& context, } bool LayerRasterCacheItem::Draw(const PaintContext& context, - const SkPaint* paint) const { + const DlPaint* paint) const { return Draw(context, context.canvas, paint); } bool LayerRasterCacheItem::Draw(const PaintContext& context, - SkCanvas* canvas, - const SkPaint* paint) const { + DlCanvas* canvas, + const DlPaint* paint) const { if (!context.raster_cache || !canvas) { return false; } diff --git a/flow/layers/layer_raster_cache_item.h b/flow/layers/layer_raster_cache_item.h index 3588abdf3b627..53e9a65237aef 100644 --- a/flow/layers/layer_raster_cache_item.h +++ b/flow/layers/layer_raster_cache_item.h @@ -36,11 +36,11 @@ class LayerRasterCacheItem : public RasterCacheItem { void PrerollFinalize(PrerollContext* context, const SkMatrix& matrix) override; - bool Draw(const PaintContext& context, const SkPaint* paint) const override; + bool Draw(const PaintContext& context, const DlPaint* paint) const override; bool Draw(const PaintContext& context, - SkCanvas* canvas, - const SkPaint* paint) const override; + DlCanvas* canvas, + const DlPaint* paint) const override; bool TryToPrepareRasterCache(const PaintContext& context, bool parent_cached = false) const override; diff --git a/flow/layers/layer_state_stack.cc b/flow/layers/layer_state_stack.cc index 154172659462c..4bb33f1737d14 100644 --- a/flow/layers/layer_state_stack.cc +++ b/flow/layers/layer_state_stack.cc @@ -60,9 +60,9 @@ class DummyDelegate : public LayerStateStack::Delegate { void transform(const SkMatrix& matrix) override {} void integralTransform() override {} - void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) override {} - void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa) override {} - void clipPath(const SkPath& path, SkClipOp op, bool is_aa) override {} + void clipRect(const SkRect& rect, ClipOp op, bool is_aa) override {} + void clipRRect(const SkRRect& rrect, ClipOp op, bool is_aa) override {} + void clipPath(const SkPath& path, ClipOp op, bool is_aa) override {} private: static void error() { @@ -72,129 +72,64 @@ class DummyDelegate : public LayerStateStack::Delegate { const std::shared_ptr DummyDelegate::kInstance = std::make_shared(); -class SkCanvasDelegate : public LayerStateStack::Delegate { +class DlCanvasDelegate : public LayerStateStack::Delegate { public: - explicit SkCanvasDelegate(SkCanvas* canvas) - : canvas_(canvas), initial_save_level_(canvas->getSaveCount()) {} + explicit DlCanvasDelegate(DlCanvas* canvas) + : canvas_(canvas), initial_save_level_(canvas->GetSaveCount()) {} - void decommission() override { canvas_->restoreToCount(initial_save_level_); } + void decommission() override { canvas_->RestoreToCount(initial_save_level_); } - SkCanvas* canvas() const override { return canvas_; } + DlCanvas* canvas() const override { return canvas_; } SkRect local_cull_rect() const override { - return canvas_->getLocalClipBounds(); + return canvas_->GetLocalClipBounds(); } SkRect device_cull_rect() const override { - return SkRect::Make(canvas_->getDeviceClipBounds()); - } - SkM44 matrix_4x4() const override { return canvas_->getLocalToDevice(); } - SkMatrix matrix_3x3() const override { - return canvas_->getLocalToDeviceAs3x3(); - } - bool content_culled(const SkRect& content_bounds) const override { - return canvas_->quickReject(content_bounds); - } - - void save() override { canvas_->save(); } - void saveLayer(const SkRect& bounds, - LayerStateStack::RenderingAttributes& attributes, - DlBlendMode blend_mode, - const DlImageFilter* backdrop) override { - TRACE_EVENT0("flutter", "Canvas::saveLayer"); - SkPaint paint; - sk_sp backdrop_filter = - backdrop ? backdrop->skia_object() : nullptr; - canvas_->saveLayer(SkCanvas::SaveLayerRec( - &bounds, attributes.fill(paint, blend_mode), backdrop_filter.get(), 0)); - } - void restore() override { canvas_->restore(); } - - void translate(SkScalar tx, SkScalar ty) override { - canvas_->translate(tx, ty); - } - void transform(const SkM44& m44) override { canvas_->concat(m44); } - void transform(const SkMatrix& matrix) override { canvas_->concat(matrix); } - void integralTransform() override { - SkM44 matrix = RasterCacheUtil::GetIntegralTransCTM(matrix_4x4()); - canvas_->setMatrix(matrix); - } - - void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) override { - canvas_->clipRect(rect, op, is_aa); - } - void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa) override { - canvas_->clipRRect(rrect, op, is_aa); - } - void clipPath(const SkPath& path, SkClipOp op, bool is_aa) override { - canvas_->clipPath(path, op, is_aa); - } - - private: - SkCanvas* canvas_; - const int initial_save_level_; -}; - -class DlBuilderDelegate : public LayerStateStack::Delegate { - public: - explicit DlBuilderDelegate(DisplayListBuilder* builder) - : builder_(builder), initial_save_level_(builder->getSaveCount()) {} - - void decommission() override { - builder_->restoreToCount(initial_save_level_); - } - - DisplayListBuilder* builder() const override { return builder_; } - - SkRect local_cull_rect() const override { - return builder_->getLocalClipBounds(); - } - SkRect device_cull_rect() const override { - return builder_->getDestinationClipBounds(); + return canvas_->GetDestinationClipBounds(); } SkM44 matrix_4x4() const override { - return builder_->getTransformFullPerspective(); + return canvas_->GetTransformFullPerspective(); } - SkMatrix matrix_3x3() const override { return builder_->getTransform(); } + SkMatrix matrix_3x3() const override { return canvas_->GetTransform(); } bool content_culled(const SkRect& content_bounds) const override { - return builder_->quickReject(content_bounds); + return canvas_->QuickReject(content_bounds); } - void save() override { builder_->save(); } + void save() override { canvas_->Save(); } void saveLayer(const SkRect& bounds, LayerStateStack::RenderingAttributes& attributes, DlBlendMode blend_mode, const DlImageFilter* backdrop) override { TRACE_EVENT0("flutter", "Canvas::saveLayer"); DlPaint paint; - builder_->saveLayer(&bounds, attributes.fill(paint, blend_mode), backdrop); + canvas_->SaveLayer(&bounds, attributes.fill(paint, blend_mode), backdrop); } - void restore() override { builder_->restore(); } + void restore() override { canvas_->Restore(); } void translate(SkScalar tx, SkScalar ty) override { - builder_->translate(tx, ty); + canvas_->Translate(tx, ty); } - void transform(const SkM44& m44) override { builder_->transform(m44); } + void transform(const SkM44& m44) override { canvas_->Transform(m44); } void transform(const SkMatrix& matrix) override { - builder_->transform(matrix); + canvas_->Transform(matrix); } void integralTransform() override { SkM44 matrix = RasterCacheUtil::GetIntegralTransCTM(matrix_4x4()); - builder_->transformReset(); - builder_->transform(matrix); + canvas_->SetTransform(matrix); } - void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) override { - builder_->clipRect(rect, op, is_aa); + void clipRect(const SkRect& rect, ClipOp op, bool is_aa) override { + canvas_->ClipRect(rect, op, is_aa); } - void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa) override { - builder_->clipRRect(rrect, op, is_aa); + void clipRRect(const SkRRect& rrect, ClipOp op, bool is_aa) override { + canvas_->ClipRRect(rrect, op, is_aa); } - void clipPath(const SkPath& path, SkClipOp op, bool is_aa) override { - builder_->clipPath(path, op, is_aa); + void clipPath(const SkPath& path, ClipOp op, bool is_aa) override { + canvas_->ClipPath(path, op, is_aa); } private: - DisplayListBuilder* builder_; + DlCanvas* canvas_; const int initial_save_level_; }; @@ -241,13 +176,13 @@ class PrerollDelegate : public LayerStateStack::Delegate { } } - void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) override { + void clipRect(const SkRect& rect, ClipOp op, bool is_aa) override { tracker_.clipRect(rect, op, is_aa); } - void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa) override { + void clipRRect(const SkRRect& rrect, ClipOp op, bool is_aa) override { tracker_.clipRRect(rrect, op, is_aa); } - void clipPath(const SkPath& path, SkClipOp op, bool is_aa) override { + void clipPath(const SkPath& path, ClipOp op, bool is_aa) override { tracker_.clipPath(path, op, is_aa); } @@ -287,8 +222,10 @@ class SaveLayerEntry : public LayerStateStack::StateEntry { } void restore(LayerStateStack* stack) const override { if (stack->checkerboard_func_) { - (*stack->checkerboard_func_)(stack->canvas_delegate(), - stack->builder_delegate(), bounds_); + DlCanvas* canvas = stack->canvas_delegate(); + if (canvas != nullptr) { + (*stack->checkerboard_func_)(canvas, bounds_); + } } stack->delegate_->restore(); stack->outstanding_ = old_attributes_; @@ -499,7 +436,8 @@ class ClipRectEntry : public LayerStateStack::StateEntry { : clip_rect_(clip_rect), is_aa_(is_aa) {} void apply(LayerStateStack* stack) const override { - stack->delegate_->clipRect(clip_rect_, SkClipOp::kIntersect, is_aa_); + stack->delegate_->clipRect(clip_rect_, DlCanvas::ClipOp::kIntersect, + is_aa_); } void update_mutators(MutatorsStack* mutators_stack) const override { mutators_stack->PushClipRect(clip_rect_); @@ -518,7 +456,8 @@ class ClipRRectEntry : public LayerStateStack::StateEntry { : clip_rrect_(clip_rrect), is_aa_(is_aa) {} void apply(LayerStateStack* stack) const override { - stack->delegate_->clipRRect(clip_rrect_, SkClipOp::kIntersect, is_aa_); + stack->delegate_->clipRRect(clip_rrect_, DlCanvas::ClipOp::kIntersect, + is_aa_); } void update_mutators(MutatorsStack* mutators_stack) const override { mutators_stack->PushClipRRect(clip_rrect_); @@ -538,7 +477,8 @@ class ClipPathEntry : public LayerStateStack::StateEntry { ~ClipPathEntry() override = default; void apply(LayerStateStack* stack) const override { - stack->delegate_->clipPath(clip_path_, SkClipOp::kIntersect, is_aa_); + stack->delegate_->clipPath(clip_path_, DlCanvas::ClipOp::kIntersect, + is_aa_); } void update_mutators(MutatorsStack* mutators_stack) const override { mutators_stack->PushClipPath(clip_path_); @@ -555,34 +495,6 @@ class ClipPathEntry : public LayerStateStack::StateEntry { // RenderingAttributes methods // ============================================================== -SkPaint* LayerStateStack::RenderingAttributes::fill(SkPaint& paint, - DlBlendMode mode) const { - SkPaint* ret = nullptr; - if (opacity < SK_Scalar1) { - paint.setAlphaf(std::max(opacity, 0.0f)); - ret = &paint; - } else { - paint.setAlphaf(SK_Scalar1); - } - if (color_filter) { - paint.setColorFilter(color_filter->skia_object()); - ret = &paint; - } else { - paint.setColorFilter(nullptr); - } - if (image_filter) { - paint.setImageFilter(image_filter->skia_object()); - ret = &paint; - } else { - paint.setImageFilter(nullptr); - } - paint.setBlendMode(ToSk(mode)); - if (mode != DlBlendMode::kSrcOver) { - ret = &paint; - } - return ret; -} - DlPaint* LayerStateStack::RenderingAttributes::fill(DlPaint& paint, DlBlendMode mode) const { DlPaint* ret = nullptr; @@ -705,7 +617,7 @@ void LayerStateStack::clear_delegate() { delegate_ = DummyDelegate::kInstance; } -void LayerStateStack::set_delegate(SkCanvas* canvas) { +void LayerStateStack::set_delegate(DlCanvas* canvas) { if (delegate_) { if (canvas == delegate_->canvas()) { return; @@ -713,20 +625,7 @@ void LayerStateStack::set_delegate(SkCanvas* canvas) { clear_delegate(); } if (canvas) { - delegate_ = std::make_shared(canvas); - reapply_all(); - } -} - -void LayerStateStack::set_delegate(DisplayListBuilder* builder) { - if (delegate_) { - if (builder == delegate_->builder()) { - return; - } - clear_delegate(); - } - if (builder) { - delegate_ = std::make_shared(builder); + delegate_ = std::make_shared(canvas); reapply_all(); } } @@ -739,6 +638,7 @@ void LayerStateStack::set_preroll_delegate(const SkMatrix& matrix) { } void LayerStateStack::set_preroll_delegate(const SkRect& cull_rect, const SkMatrix& matrix) { + clear_delegate(); delegate_ = std::make_shared(cull_rect, matrix); reapply_all(); } diff --git a/flow/layers/layer_state_stack.h b/flow/layers/layer_state_stack.h index 4a5e19e40779d..613bf21e469a4 100644 --- a/flow/layers/layer_state_stack.h +++ b/flow/layers/layer_state_stack.h @@ -5,11 +5,9 @@ #ifndef FLUTTER_FLOW_LAYERS_LAYER_STATE_STACK_H_ #define FLUTTER_FLOW_LAYERS_LAYER_STATE_STACK_H_ -#include "flutter/display_list/display_list_builder.h" -#include "flutter/display_list/display_list_canvas_recorder.h" +#include "flutter/display_list/dl_canvas.h" #include "flutter/flow/embedded_views.h" #include "flutter/flow/paint_utils.h" -#include "third_party/skia/include/core/SkCanvas.h" namespace flutter { @@ -41,10 +39,7 @@ namespace flutter { /// The delegate can be any one of: /// - Preroll delegate: used during Preroll to remember the outstanding /// state for embedded platform layers -/// - SkCanvas: used during Paint for the default output to a Skia -/// surface -/// - DisplayListBuilder: used during Paint to construct a DisplayList -/// for Impeller output +/// - DlCanvas: used during Paint for rendering output /// The stack will know which state needs to be conveyed to any of these /// delegates and when is the best time to convey that state (i.e. lazy /// saveLayer calls for example). @@ -114,39 +109,20 @@ class LayerStateStack { // Clears out any old delegate to make room for a new one. void clear_delegate(); - // Return the SkCanvas delegate if the state stack has such a delegate. + // Return the DlCanvas delegate if the state stack has such a delegate. // The state stack will only have one delegate at a time holding either - // an SkCanvas, DisplayListBuilder, or a preroll accumulator. - // See also |builder_delegate|. - SkCanvas* canvas_delegate() { return delegate_->canvas(); } - - // Return the DisplayListBuilder delegate if the state stack has such a - // delegate. - // The state stack will only have one delegate at a time holding either - // an SkCanvas, DisplayListBuilder, or a preroll accumulator. - // See also |builder_delegate|. - DisplayListBuilder* builder_delegate() { return delegate_->builder(); } + // a DlCanvas or a preroll accumulator. + DlCanvas* canvas_delegate() { return delegate_->canvas(); } // Clears the old delegate and sets the canvas delegate to the indicated - // canvas (if not nullptr). This ensures that only one delegate - either a - // canvas, a builder, or a preroll accumulator - is present at any one time. - void set_delegate(SkCanvas* canvas); - - // Clears the old delegate and sets the builder delegate to the indicated - // buider (if not nullptr). This ensures that only one delegate - either a - // canvas, a builder, or a preroll accumulator - is present at any one time. - void set_delegate(DisplayListBuilder* builder); - void set_delegate(sk_sp builder) { - set_delegate(builder.get()); - } - void set_delegate(DisplayListCanvasRecorder& recorder) { - set_delegate(recorder.builder().get()); - } + // DL canvas (if not nullptr). This ensures that only one delegate - either + // a DlCanvas or a preroll accumulator - is present at any one time. + void set_delegate(DlCanvas* canvas); // Clears the old delegate and sets the state stack up to accumulate // clip and transform information for a Preroll phase. This ensures - // that only one delegate - either a canvas, a builder, or a preroll - // accumulator - is present at any one time. + // that only one delegate - either a DlCanvas or a preroll accumulator - + // is present at any one time. void set_preroll_delegate(const SkRect& cull_rect, const SkMatrix& matrix); void set_preroll_delegate(const SkRect& cull_rect); void set_preroll_delegate(const SkMatrix& matrix); @@ -296,11 +272,6 @@ class LayerStateStack { // bounds received will be sufficient to apply all outstanding attributes. SkRect outstanding_bounds() const { return outstanding_.save_layer_bounds; } - // Fill the provided paint object with any oustanding attributes and - // return a pointer to it, or return a nullptr if there were no - // outstanding attributes to paint with. - SkPaint* fill(SkPaint& paint) const { return outstanding_.fill(paint); } - // Fill the provided paint object with any oustanding attributes and // return a pointer to it, or return a nullptr if there were no // outstanding attributes to paint with. @@ -416,8 +387,6 @@ class LayerStateStack { std::shared_ptr color_filter; std::shared_ptr image_filter; - SkPaint* fill(SkPaint& paint, - DlBlendMode mode = DlBlendMode::kSrcOver) const; DlPaint* fill(DlPaint& paint, DlBlendMode mode = DlBlendMode::kSrcOver) const; @@ -459,6 +428,9 @@ class LayerStateStack { friend class ClipPathEntry; class Delegate { + protected: + using ClipOp = DlCanvas::ClipOp; + public: virtual ~Delegate() = default; @@ -471,8 +443,7 @@ class LayerStateStack { // state and finalize all outstanding save or saveLayer operations. virtual void decommission() = 0; - virtual SkCanvas* canvas() const { return nullptr; } - virtual DisplayListBuilder* builder() const { return nullptr; } + virtual DlCanvas* canvas() const { return nullptr; } virtual SkRect local_cull_rect() const = 0; virtual SkRect device_cull_rect() const = 0; @@ -492,13 +463,12 @@ class LayerStateStack { virtual void transform(const SkMatrix& matrix) = 0; virtual void integralTransform() = 0; - virtual void clipRect(const SkRect& rect, SkClipOp op, bool is_aa) = 0; - virtual void clipRRect(const SkRRect& rrect, SkClipOp op, bool is_aa) = 0; - virtual void clipPath(const SkPath& path, SkClipOp op, bool is_aa) = 0; + virtual void clipRect(const SkRect& rect, ClipOp op, bool is_aa) = 0; + virtual void clipRRect(const SkRRect& rrect, ClipOp op, bool is_aa) = 0; + virtual void clipPath(const SkPath& path, ClipOp op, bool is_aa) = 0; }; friend class DummyDelegate; - friend class SkCanvasDelegate; - friend class DlBuilderDelegate; + friend class DlCanvasDelegate; friend class PrerollDelegate; std::vector> state_stack_; diff --git a/flow/layers/layer_state_stack_unittests.cc b/flow/layers/layer_state_stack_unittests.cc index 9d48776d04231..129425691d884 100644 --- a/flow/layers/layer_state_stack_unittests.cc +++ b/flow/layers/layer_state_stack_unittests.cc @@ -42,7 +42,6 @@ TEST(LayerStateStack, Defaults) { LayerStateStack state_stack; ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), nullptr); ASSERT_EQ(state_stack.checkerboard_func(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); @@ -55,10 +54,6 @@ TEST(LayerStateStack, Defaults) { ASSERT_EQ(state_stack.transform_3x3(), SkMatrix::I()); ASSERT_EQ(state_stack.transform_4x4(), SkM44()); - SkPaint sk_paint; - state_stack.fill(sk_paint); - ASSERT_EQ(sk_paint, SkPaint()); - DlPaint dl_paint; state_stack.fill(dl_paint); ASSERT_EQ(dl_paint, DlPaint()); @@ -67,36 +62,73 @@ TEST(LayerStateStack, Defaults) { TEST(LayerStateStack, SingularDelegate) { LayerStateStack state_stack; ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), nullptr); + // Two kinds of DlCanvas implementation DisplayListBuilder builder; MockCanvas canvas; // no delegate -> builder delegate state_stack.set_delegate(&builder); - ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), &builder); + ASSERT_EQ(state_stack.canvas_delegate(), &builder); - // builder delegate -> canvas delegate + // builder delegate -> DlCanvas delegate state_stack.set_delegate(&canvas); ASSERT_EQ(state_stack.canvas_delegate(), &canvas); - ASSERT_EQ(state_stack.builder_delegate(), nullptr); - // canvas delegate -> builder delegate + // DlCanvas delegate -> builder delegate state_stack.set_delegate(&builder); - ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), &builder); + ASSERT_EQ(state_stack.canvas_delegate(), &builder); // builder delegate -> no delegate state_stack.clear_delegate(); ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), nullptr); - // canvas delegate -> no delegate + // DlCanvas delegate -> no delegate state_stack.set_delegate(&canvas); state_stack.clear_delegate(); ASSERT_EQ(state_stack.canvas_delegate(), nullptr); - ASSERT_EQ(state_stack.builder_delegate(), nullptr); +} + +TEST(LayerStateStack, OldDelegateIsRolledBack) { + LayerStateStack state_stack; + DisplayListBuilder builder; + MockCanvas canvas; + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); + + state_stack.set_delegate(&builder); + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); + + auto mutator = state_stack.save(); + mutator.translate({10, 10}); + + ASSERT_EQ(builder.GetTransform(), SkMatrix::Translate(10, 10)); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); + + state_stack.set_delegate(&canvas); + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_EQ(canvas.GetTransform(), SkMatrix::Translate(10, 10)); + + state_stack.set_preroll_delegate(SkRect::MakeWH(100, 100)); + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); + + state_stack.set_delegate(&builder); + state_stack.clear_delegate(); + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); + + state_stack.set_delegate(&canvas); + state_stack.clear_delegate(); + + ASSERT_TRUE(builder.GetTransform().isIdentity()); + ASSERT_TRUE(canvas.GetTransform().isIdentity()); } TEST(LayerStateStack, Opacity) { @@ -130,16 +162,16 @@ TEST(LayerStateStack, Opacity) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; DlPaint save_paint = DlPaint().setOpacity(state_stack.outstanding_opacity()); - expected.saveLayer(&rect, &save_paint); - expected.drawRect(rect, DlPaint()); - expected.restore(); + expected.SaveLayer(&rect, &save_paint); + expected.DrawRect(rect, DlPaint()); + expected.Restore(); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } @@ -155,12 +187,12 @@ TEST(LayerStateStack, Opacity) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; - expected.drawRect(rect, DlPaint().setOpacity(0.25f)); + expected.DrawRect(rect, DlPaint().setOpacity(0.25f)); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } } @@ -207,18 +239,18 @@ TEST(LayerStateStack, ColorFilter) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; DlPaint outer_save_paint = DlPaint().setColorFilter(outer_filter); DlPaint inner_save_paint = DlPaint().setColorFilter(inner_filter); - expected.saveLayer(&rect, &outer_save_paint); - expected.saveLayer(&rect, &inner_save_paint); - expected.drawRect(rect, DlPaint()); - expected.restore(); - expected.restore(); + expected.SaveLayer(&rect, &outer_save_paint); + expected.SaveLayer(&rect, &inner_save_paint); + expected.DrawRect(rect, DlPaint()); + expected.Restore(); + expected.Restore(); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } @@ -234,15 +266,15 @@ TEST(LayerStateStack, ColorFilter) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; DlPaint save_paint = DlPaint().setColorFilter(outer_filter); DlPaint draw_paint = DlPaint().setColorFilter(inner_filter); - expected.saveLayer(&rect, &save_paint); - expected.drawRect(rect, draw_paint); + expected.SaveLayer(&rect, &save_paint); + expected.DrawRect(rect, draw_paint); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } } @@ -289,18 +321,18 @@ TEST(LayerStateStack, ImageFilter) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; DlPaint outer_save_paint = DlPaint().setImageFilter(outer_filter); DlPaint inner_save_paint = DlPaint().setImageFilter(inner_filter); - expected.saveLayer(&outer_src_rect, &outer_save_paint); - expected.saveLayer(&inner_src_rect, &inner_save_paint); - expected.drawRect(rect, DlPaint()); - expected.restore(); - expected.restore(); + expected.SaveLayer(&outer_src_rect, &outer_save_paint); + expected.SaveLayer(&inner_src_rect, &inner_save_paint); + expected.DrawRect(rect, DlPaint()); + expected.Restore(); + expected.Restore(); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } @@ -316,15 +348,15 @@ TEST(LayerStateStack, ImageFilter) { DlPaint paint; state_stack.fill(paint); - builder.drawRect(rect, paint); + builder.DrawRect(rect, paint); } state_stack.clear_delegate(); DisplayListBuilder expected; DlPaint save_paint = DlPaint().setImageFilter(outer_filter); DlPaint draw_paint = DlPaint().setImageFilter(inner_filter); - expected.saveLayer(&outer_src_rect, &save_paint); - expected.drawRect(rect, draw_paint); + expected.SaveLayer(&outer_src_rect, &save_paint); + expected.DrawRect(rect, draw_paint); ASSERT_TRUE(DisplayListsEQ_Verbose(builder.Build(), expected.Build())); } } @@ -344,53 +376,53 @@ TEST(LayerStateStack, OpacityAndColorFilterInteraction) { DisplayListBuilder builder; LayerStateStack state_stack; state_stack.set_delegate(&builder); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyOpacity(rect, 0.5f); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyColorFilter(rect, color_filter); // The opacity will have been resolved by a saveLayer - ASSERT_EQ(builder.getSaveCount(), 2); + ASSERT_EQ(builder.GetSaveCount(), 2); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), 0.5f); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyColorFilter(rect, color_filter); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyOpacity(rect, 0.5f); // color filter applied to opacity can be applied together - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); ASSERT_EQ(state_stack.outstanding_opacity(), 0.5f); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); } @@ -403,53 +435,53 @@ TEST(LayerStateStack, OpacityAndImageFilterInteraction) { DisplayListBuilder builder; LayerStateStack state_stack; state_stack.set_delegate(&builder); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyOpacity(rect, 0.5f); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyImageFilter(rect, image_filter); // opacity applied to image filter can be applied together - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), image_filter); ASSERT_EQ(state_stack.outstanding_opacity(), 0.5f); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), 0.5f); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyImageFilter(rect, image_filter); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyOpacity(rect, 0.5f); // The image filter will have been resolved by a saveLayer - ASSERT_EQ(builder.getSaveCount(), 2); + ASSERT_EQ(builder.GetSaveCount(), 2); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), 0.5f); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), image_filter); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_opacity(), SK_Scalar1); } @@ -465,53 +497,53 @@ TEST(LayerStateStack, ColorFilterAndImageFilterInteraction) { DisplayListBuilder builder; LayerStateStack state_stack; state_stack.set_delegate(&builder); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyColorFilter(rect, color_filter); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyImageFilter(rect, image_filter); // color filter applied to image filter can be applied together - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), image_filter); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); { auto mutator1 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator1.applyImageFilter(rect, image_filter); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); { auto mutator2 = state_stack.save(); - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); mutator2.applyColorFilter(rect, color_filter); // The image filter will have been resolved by a saveLayer - ASSERT_EQ(builder.getSaveCount(), 2); + ASSERT_EQ(builder.GetSaveCount(), 2); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_color_filter(), color_filter); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), image_filter); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); } - ASSERT_EQ(builder.getSaveCount(), 1); + ASSERT_EQ(builder.GetSaveCount(), 1); ASSERT_EQ(state_stack.outstanding_image_filter(), nullptr); ASSERT_EQ(state_stack.outstanding_color_filter(), nullptr); } diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc index 62d4c2d5dd286..d01b243ab3eb8 100644 --- a/flow/layers/layer_tree.cc +++ b/flow/layers/layer_tree.cc @@ -4,6 +4,7 @@ #include "flutter/flow/layers/layer_tree.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/flow/embedded_views.h" #include "flutter/flow/frame_timings.h" #include "flutter/flow/layer_snapshot_store.h" @@ -28,8 +29,8 @@ LayerTree::LayerTree(const SkISize& frame_size, float device_pixel_ratio) FML_CHECK(device_pixel_ratio_ != 0.0f); } -inline SkColorSpace* GetColorSpace(SkCanvas* canvas) { - return canvas ? canvas->imageInfo().colorSpace() : nullptr; +inline SkColorSpace* GetColorSpace(DlCanvas* canvas) { + return canvas ? canvas->GetImageInfo().colorSpace() : nullptr; } bool LayerTree::Preroll(CompositorContext::ScopedFrame& frame, @@ -116,12 +117,8 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame, state_stack.set_checkerboard_func(DrawCheckerboard); } - DisplayListBuilder* builder = frame.display_list_builder(); - if (builder) { - state_stack.set_delegate(builder); - } else { - state_stack.set_delegate(frame.canvas()); - } + DlCanvas* canvas = frame.canvas(); + state_stack.set_delegate(canvas); // clear the previous snapshots. LayerSnapshotStore* snapshot_store = nullptr; @@ -136,8 +133,7 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame, PaintContext context = { // clang-format off .state_stack = state_stack, - .canvas = frame.canvas(), - .builder = builder, + .canvas = canvas, .gr_context = frame.gr_context(), .dst_color_space = color_space, .view_embedder = frame.view_embedder(), @@ -168,7 +164,7 @@ sk_sp LayerTree::Flatten( GrDirectContext* gr_context) { TRACE_EVENT0("flutter", "LayerTree::Flatten"); - DisplayListCanvasRecorder recorder(bounds); + DisplayListBuilder builder(bounds); const FixedRefreshRateStopwatch unused_stopwatch; @@ -191,12 +187,11 @@ sk_sp LayerTree::Flatten( }; LayerStateStack paint_state_stack; - paint_state_stack.set_delegate(recorder); + paint_state_stack.set_delegate(&builder); PaintContext paint_context = { // clang-format off .state_stack = paint_state_stack, - .canvas = &recorder, - .builder = recorder.builder().get(), + .canvas = &builder, .gr_context = gr_context, .dst_color_space = nullptr, .view_embedder = nullptr, @@ -221,7 +216,7 @@ sk_sp LayerTree::Flatten( } } - return recorder.Build(); + return builder.Build(); } } // namespace flutter diff --git a/flow/layers/layer_tree_unittests.cc b/flow/layers/layer_tree_unittests.cc index 113f253d43910..ea655b5b44ae8 100644 --- a/flow/layers/layer_tree_unittests.cc +++ b/flow/layers/layer_tree_unittests.cc @@ -74,7 +74,7 @@ TEST_F(LayerTreeTest, PaintBeforePrerollDies) { TEST_F(LayerTreeTest, Simple) { const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kCyan); + const DlPaint child_paint = DlPaint(DlColor::kCyan()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(); layer->Add(mock_layer); @@ -96,8 +96,8 @@ TEST_F(LayerTreeTest, Simple) { TEST_F(LayerTreeTest, Multiple) { const SkPath child_path1 = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path2 = SkPath().addRect(8.0f, 2.0f, 16.5f, 14.5f); - const SkPaint child_paint1(SkColors::kGray); - const SkPaint child_paint2(SkColors::kGreen); + const DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + const DlPaint child_paint2 = DlPaint(DlColor::kGreen()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); mock_layer1->set_fake_has_platform_view(true); auto mock_layer2 = std::make_shared(child_path2, child_paint2); @@ -132,8 +132,8 @@ TEST_F(LayerTreeTest, Multiple) { TEST_F(LayerTreeTest, MultipleWithEmpty) { const SkPath child_path1 = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); - const SkPaint child_paint1(SkColors::kGray); - const SkPaint child_paint2(SkColors::kGreen); + const DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + const DlPaint child_paint2 = DlPaint(DlColor::kGreen()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(SkPath(), child_paint2); auto layer = std::make_shared(); @@ -162,8 +162,8 @@ TEST_F(LayerTreeTest, MultipleWithEmpty) { TEST_F(LayerTreeTest, NeedsSystemComposite) { const SkPath child_path1 = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); const SkPath child_path2 = SkPath().addRect(8.0f, 2.0f, 16.5f, 14.5f); - const SkPaint child_paint1(SkColors::kGray); - const SkPaint child_paint2(SkColors::kGreen); + const DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); + const DlPaint child_paint2 = DlPaint(DlColor::kGreen()); auto mock_layer1 = std::make_shared(child_path1, child_paint1); auto mock_layer2 = std::make_shared(child_path2, child_paint2); auto layer = std::make_shared(); @@ -245,7 +245,6 @@ TEST_F(LayerTreeTest, PaintContextInitialization) { &mock_registry](const PaintContext& context) { EXPECT_EQ(&context.state_stack, &state_stack); EXPECT_EQ(context.canvas, nullptr); - EXPECT_EQ(context.builder, nullptr); EXPECT_EQ(context.gr_context, nullptr); EXPECT_EQ(context.view_embedder, nullptr); EXPECT_EQ(&context.raster_time, &mock_raster_time); diff --git a/flow/layers/offscreen_surface.cc b/flow/layers/offscreen_surface.cc index 95516098603a9..199eace46d564 100644 --- a/flow/layers/offscreen_surface.cc +++ b/flow/layers/offscreen_surface.cc @@ -68,14 +68,17 @@ static sk_sp GetRasterData(const sk_sp& offscreen_surface, OffscreenSurface::OffscreenSurface(GrDirectContext* surface_context, const SkISize& size) { offscreen_surface_ = CreateSnapshotSurface(surface_context, size); + if (offscreen_surface_) { + adapter_.set_canvas(offscreen_surface_->getCanvas()); + } } sk_sp OffscreenSurface::GetRasterData(bool compressed) const { return flutter::GetRasterData(offscreen_surface_, compressed); } -SkCanvas* OffscreenSurface::GetCanvas() const { - return offscreen_surface_->getCanvas(); +DlCanvas* OffscreenSurface::GetCanvas() { + return &adapter_; } bool OffscreenSurface::IsValid() const { diff --git a/flow/layers/offscreen_surface.h b/flow/layers/offscreen_surface.h index bfa192fb85e93..091906415d004 100644 --- a/flow/layers/offscreen_surface.h +++ b/flow/layers/offscreen_surface.h @@ -8,6 +8,8 @@ #include "flutter/fml/logging.h" #include "flutter/fml/macros.h" +#include "flutter/display_list/dl_canvas.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "third_party/skia/include/core/SkSurface.h" namespace flutter { @@ -21,12 +23,13 @@ class OffscreenSurface { sk_sp GetRasterData(bool compressed) const; - SkCanvas* GetCanvas() const; + DlCanvas* GetCanvas(); bool IsValid() const; private: sk_sp offscreen_surface_; + DlSkCanvasAdapter adapter_; FML_DISALLOW_COPY_AND_ASSIGN(OffscreenSurface); }; diff --git a/flow/layers/offscreen_surface_unittests.cc b/flow/layers/offscreen_surface_unittests.cc index 64063b0001cb5..780ea310009c3 100644 --- a/flow/layers/offscreen_surface_unittests.cc +++ b/flow/layers/offscreen_surface_unittests.cc @@ -29,9 +29,9 @@ TEST(OffscreenSurfaceTest, PaintSurfaceBlack) { auto surface = std::make_unique(nullptr, SkISize::Make(1, 1)); - SkCanvas* canvas = surface->GetCanvas(); - canvas->clear(SK_ColorBLACK); - canvas->flush(); + DlCanvas* canvas = surface->GetCanvas(); + canvas->Clear(DlColor::kBlack()); + canvas->Flush(); auto raster_data = surface->GetRasterData(false); const uint32_t* actual = diff --git a/flow/layers/opacity_layer.cc b/flow/layers/opacity_layer.cc index 3636af4e569bb..8b55dff69aa92 100644 --- a/flow/layers/opacity_layer.cc +++ b/flow/layers/opacity_layer.cc @@ -79,7 +79,7 @@ void OpacityLayer::Paint(PaintContext& context) const { mutator.applyOpacity(child_paint_bounds(), opacity()); if (!children_can_accept_opacity()) { - SkPaint paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, context.state_stack.fill(paint))) { return; diff --git a/flow/layers/opacity_layer_unittests.cc b/flow/layers/opacity_layer_unittests.cc index df5bfecb1d422..a5e72e056d720 100644 --- a/flow/layers/opacity_layer_unittests.cc +++ b/flow/layers/opacity_layer_unittests.cc @@ -18,7 +18,6 @@ #include "flutter/testing/display_list_testing.h" #include "flutter/testing/mock_canvas.h" #include "gtest/gtest.h" -#include "include/core/SkPaint.h" namespace flutter { namespace testing { @@ -67,7 +66,7 @@ TEST_F(OpacityLayerTest, PaintBeforePrerollDies) { TEST_F(OpacityLayerTest, TranslateChildren) { SkPath child_path1; child_path1.addRect(10.0f, 10.0f, 20.0f, 20.f); - SkPaint child_paint1(SkColors::kGray); + DlPaint child_paint1 = DlPaint(DlColor::kMidGrey()); auto layer = std::make_shared(0.5, SkPoint::Make(10, 10)); auto mock_layer1 = std::make_shared(child_path1, child_paint1); layer->Add(mock_layer1); @@ -91,13 +90,13 @@ TEST_F(OpacityLayerTest, CacheChild) { auto layer = std::make_shared(alpha_half, SkPoint::Make(0.0f, 0.0f)); layer->Add(mock_layer); - SkPaint paint; + DlPaint paint; SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); @@ -134,7 +133,7 @@ TEST_F(OpacityLayerTest, CacheChildren) { auto other_transform = SkMatrix::Scale(1.0, 2.0); const SkPath child_path1 = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); const SkPath child_path2 = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); - SkPaint paint; + DlPaint paint; auto mock_layer1 = std::make_shared(child_path1); auto mock_layer2 = std::make_shared(child_path2); auto layer = @@ -143,10 +142,10 @@ TEST_F(OpacityLayerTest, CacheChildren) { layer->Add(mock_layer2); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); - SkCanvas other_canvas; - other_canvas.setMatrix(other_transform); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); + MockCanvas other_canvas; + other_canvas.SetTransform(other_transform); use_mock_raster_cache(); @@ -178,7 +177,7 @@ TEST_F(OpacityLayerTest, CacheChildren) { } TEST_F(OpacityLayerTest, ShouldNotCacheChildren) { - SkPaint paint; + DlPaint paint; auto opacity_layer = std::make_shared(128, SkPoint::Make(20, 20)); auto mock_layer = MockLayer::MakeOpacityCompatible(SkPath()); @@ -215,7 +214,7 @@ TEST_F(OpacityLayerTest, FullyOpaque) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 0.5f); const SkMatrix layer_transform = SkMatrix::Translate(layer_offset.fX, layer_offset.fY); - const SkPaint child_paint = SkPaint(SkColors::kGreen); + const DlPaint child_paint = DlPaint(DlColor::kGreen()); const SkRect expected_layer_bounds = layer_transform.mapRect(child_path.getBounds()); auto mock_layer = std::make_shared(child_path, child_paint); @@ -234,7 +233,6 @@ TEST_F(OpacityLayerTest, FullyOpaque) { EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(layer_transform)})); - const SkPaint opacity_paint = SkPaint(SkColors::kBlack); // A = 1.0f SkRect opacity_bounds; expected_layer_bounds.makeOffset(-layer_offset.fX, -layer_offset.fY) .roundOut(&opacity_bounds); @@ -250,12 +248,13 @@ TEST_F(OpacityLayerTest, FullyOpaque) { } TEST_F(OpacityLayerTest, FullyTransparent) { - const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); + const SkRect child_bounds = SkRect::MakeWH(5.0f, 5.0f); + const SkPath child_path = SkPath().addRect(child_bounds); const SkPoint layer_offset = SkPoint::Make(0.5f, 1.5f); const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 0.5f); const SkMatrix layer_transform = SkMatrix::Translate(layer_offset.fX, layer_offset.fY); - const SkPaint child_paint = SkPaint(SkColors::kGreen); + const DlPaint child_paint = DlPaint(DlColor::kGreen()); const SkRect expected_layer_bounds = layer_transform.mapRect(child_path.getBounds()); auto mock_layer = std::make_shared(child_path, child_paint); @@ -280,10 +279,12 @@ TEST_F(OpacityLayerTest, FullyTransparent) { {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ 1, MockCanvas::ConcatMatrixData{SkM44(layer_transform)}}, - MockCanvas::DrawCall{1, MockCanvas::SaveData{2}}, MockCanvas::DrawCall{ - 2, MockCanvas::ClipRectData{kEmptyRect, SkClipOp::kIntersect, - MockCanvas::kHard_ClipEdgeStyle}}, + 1, + MockCanvas::SaveLayerData{ + child_bounds, DlPaint(DlColor::kTransparent()), nullptr, 2}}, + MockCanvas::DrawCall{2, + MockCanvas::DrawPathData{child_path, child_paint}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}}); layer->Paint(paint_context()); @@ -296,7 +297,7 @@ TEST_F(OpacityLayerTest, HalfTransparent) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 0.5f); const SkMatrix layer_transform = SkMatrix::Translate(layer_offset.fX, layer_offset.fY); - const SkPaint child_paint = SkPaint(SkColors::kGreen); + const DlPaint child_paint = DlPaint(DlColor::kGreen()); const SkRect expected_layer_bounds = layer_transform.mapRect(child_path.getBounds()); const SkAlpha alpha_half = 255 / 2; @@ -320,15 +321,15 @@ TEST_F(OpacityLayerTest, HalfTransparent) { expected_layer_bounds.makeOffset(-layer_offset.fX, -layer_offset.fY) .roundOut(&opacity_bounds); DlPaint save_paint = DlPaint().setAlpha(alpha_half); - DlPaint child_dl_paint = DlPaint().setColor(DlColor::kGreen()); + DlPaint child_dl_paint = DlPaint(DlColor::kGreen()); auto expected_builder = DisplayListBuilder(); - expected_builder.save(); - expected_builder.translate(layer_offset.fX, layer_offset.fY); - expected_builder.saveLayer(&opacity_bounds, &save_paint); - expected_builder.drawPath(child_path, child_dl_paint); - expected_builder.restore(); - expected_builder.restore(); + expected_builder.Save(); + expected_builder.Translate(layer_offset.fX, layer_offset.fY); + expected_builder.SaveLayer(&opacity_bounds, &save_paint); + expected_builder.DrawPath(child_path, child_dl_paint); + expected_builder.Restore(); + expected_builder.Restore(); sk_sp expected_display_list = expected_builder.Build(); layer->Paint(display_list_paint_context()); @@ -346,9 +347,9 @@ TEST_F(OpacityLayerTest, Nested) { SkMatrix::Translate(layer1_offset.fX, layer1_offset.fY); const SkMatrix layer2_transform = SkMatrix::Translate(layer2_offset.fX, layer2_offset.fY); - const SkPaint child1_paint = SkPaint(SkColors::kRed); - const SkPaint child2_paint = SkPaint(SkColors::kBlue); - const SkPaint child3_paint = SkPaint(SkColors::kGreen); + const DlPaint child1_paint = DlPaint(DlColor::kRed()); + const DlPaint child2_paint = DlPaint(DlColor::kBlue()); + const DlPaint child3_paint = DlPaint(DlColor::kGreen()); const SkAlpha alpha1 = 155; const SkAlpha alpha2 = 224; auto mock_layer1 = std::make_shared(child1_path, child1_paint); @@ -397,10 +398,10 @@ TEST_F(OpacityLayerTest, Nested) { // EXPECT_EQ(mock_layer3->parent_mutators(), // std::vector({Mutator(layer1_transform), Mutator(alpha1)})); - SkPaint opacity1_paint; - opacity1_paint.setAlphaf(alpha1 * (1.0 / SK_AlphaOPAQUE)); - SkPaint opacity2_paint; - opacity2_paint.setAlphaf(alpha2 * (1.0 / SK_AlphaOPAQUE)); + DlPaint opacity1_paint; + opacity1_paint.setOpacity(alpha1 * (1.0 / SK_AlphaOPAQUE)); + DlPaint opacity2_paint; + opacity2_paint.setOpacity(alpha2 * (1.0 / SK_AlphaOPAQUE)); SkRect opacity1_bounds = expected_layer1_bounds.makeOffset(-layer1_offset.fX, -layer1_offset.fY); SkRect opacity2_bounds = @@ -442,7 +443,7 @@ TEST_F(OpacityLayerTest, Readback) { EXPECT_FALSE(preroll_context()->surface_needs_readback); // OpacityLayer blocks child with readback - auto mock_layer = std::make_shared(SkPath(), SkPaint()); + auto mock_layer = std::make_shared(SkPath(), DlPaint()); mock_layer->set_fake_reads_surface(true); layer->Add(mock_layer); preroll_context()->surface_needs_readback = false; @@ -552,29 +553,29 @@ TEST_F(OpacityLayerTest, OpacityInheritanceNestedWithCompatibleChild) { EXPECT_TRUE(opacity_layer_1->children_can_accept_opacity()); EXPECT_TRUE(opacity_layer_2->children_can_accept_opacity()); - SkPaint savelayer_paint; + DlPaint savelayer_paint; SkScalar inherited_opacity = 128 * 1.0 / SK_AlphaOPAQUE; inherited_opacity *= 64 * 1.0 / SK_AlphaOPAQUE; - savelayer_paint.setAlphaf(inherited_opacity); + savelayer_paint.setOpacity(inherited_opacity); DisplayListBuilder expected_builder; /* opacity_layer_1::Paint */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset1.fX, offset1.fY); + expected_builder.Translate(offset1.fX, offset1.fY); /* opacity_layer_2::Paint */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset2.fX, offset2.fY); + expected_builder.Translate(offset2.fX, offset2.fY); /* mock_layer::Paint */ { - expected_builder.drawPath(mock_path, + expected_builder.DrawPath(mock_path, DlPaint().setOpacity(inherited_opacity)); } } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer_1->Paint(display_list_paint_context()); @@ -598,10 +599,10 @@ TEST_F(OpacityLayerTest, OpacityInheritanceNestedWithIncompatibleChild) { EXPECT_TRUE(opacity_layer_1->children_can_accept_opacity()); EXPECT_FALSE(opacity_layer_2->children_can_accept_opacity()); - SkPaint savelayer_paint; + DlPaint savelayer_paint; SkScalar inherited_opacity = 128 * 1.0 / SK_AlphaOPAQUE; inherited_opacity *= 64 * 1.0 / SK_AlphaOPAQUE; - savelayer_paint.setAlphaf(inherited_opacity); + savelayer_paint.setOpacity(inherited_opacity); DisplayListBuilder expected_builder; /* opacity_layer_1::Paint */ { @@ -665,7 +666,7 @@ TEST_F(OpacityLayerTest, FullyOpaqueWithFractionalValues) { const SkMatrix initial_transform = SkMatrix::Translate(0.5f, 0.5f); const SkMatrix layer_transform = SkMatrix::Translate(layer_offset.fX, layer_offset.fY); - const SkPaint child_paint = SkPaint(SkColors::kGreen); + const DlPaint child_paint = DlPaint(DlColor::kGreen()); const SkRect expected_layer_bounds = layer_transform.mapRect(child_path.getBounds()); auto mock_layer = std::make_shared(child_path, child_paint); @@ -675,7 +676,6 @@ TEST_F(OpacityLayerTest, FullyOpaqueWithFractionalValues) { preroll_context()->state_stack.set_preroll_delegate(initial_transform); layer->Preroll(preroll_context()); - const SkPaint opacity_paint = SkPaint(SkColors::kBlack); // A = 1.0f SkRect opacity_bounds; expected_layer_bounds.makeOffset(-layer_offset.fX, -layer_offset.fY) .roundOut(&opacity_bounds); @@ -706,8 +706,8 @@ TEST_F(OpacityLayerTest, FullyTransparentDoesNotCullPlatformView) { opacity->Add(platform_view); auto embedder = MockViewEmbedder(); - SkCanvas fake_overlay_canvas; - embedder.AddCanvas(&fake_overlay_canvas); + DisplayListBuilder fake_overlay_builder; + embedder.AddCanvas(&fake_overlay_builder); preroll_context()->view_embedder = &embedder; paint_context().view_embedder = &embedder; diff --git a/flow/layers/performance_overlay_layer.cc b/flow/layers/performance_overlay_layer.cc index 680873c5cab3f..2b693b270033c 100644 --- a/flow/layers/performance_overlay_layer.cc +++ b/flow/layers/performance_overlay_layer.cc @@ -14,7 +14,7 @@ namespace flutter { namespace { -void VisualizeStopWatch(SkCanvas* canvas, +void VisualizeStopWatch(DlCanvas* canvas, const Stopwatch& stopwatch, SkScalar x, SkScalar y, @@ -35,9 +35,9 @@ void VisualizeStopWatch(SkCanvas* canvas, if (show_labels) { auto text = PerformanceOverlayLayer::MakeStatisticsText( stopwatch, label_prefix, font_path); - SkPaint paint; - paint.setColor(SK_ColorGRAY); - canvas->drawTextBlob(text, x + label_x, y + height + label_y, paint); + // Historically SK_ColorGRAY (== 0xFF888888) was used here + DlPaint paint(0xFF888888); + canvas->DrawTextBlob(text, x + label_x, y + height + label_y, paint); } } diff --git a/flow/layers/performance_overlay_layer_unittests.cc b/flow/layers/performance_overlay_layer_unittests.cc index 7c2f1edbe8265..3c601b472a55d 100644 --- a/flow/layers/performance_overlay_layer_unittests.cc +++ b/flow/layers/performance_overlay_layer_unittests.cc @@ -55,14 +55,17 @@ static void TestPerformanceOverlayLayerGold(int refresh_rate) { const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000); sk_sp surface = SkSurface::MakeRaster(image_info); + DlSkCanvasAdapter canvas(surface->getCanvas()); ASSERT_TRUE(surface != nullptr); LayerStateStack state_stack; + state_stack.set_delegate(&canvas); + flutter::PaintContext paint_context = { // clang-format off .state_stack = state_stack, - .canvas = surface->getCanvas(), + .canvas = &canvas, .gr_context = nullptr, .view_embedder = nullptr, .raster_time = mock_stopwatch, @@ -174,8 +177,8 @@ TEST_F(PerformanceOverlayLayerTest, SimpleRasterizerStatistics) { auto overlay_text = PerformanceOverlayLayer::MakeStatisticsText( paint_context().raster_time, "Raster", ""); auto overlay_text_data = overlay_text->serialize(SkSerialProcs{}); - SkPaint text_paint; - text_paint.setColor(SK_ColorGRAY); + // Historically SK_ColorGRAY (== 0xFF888888) was used here + DlPaint text_paint(0xFF888888); SkPoint text_position = SkPoint::Make(16.0f, 22.0f); // TODO(https://github.com/flutter/flutter/issues/82202): Remove once the diff --git a/flow/layers/physical_shape_layer.cc b/flow/layers/physical_shape_layer.cc index 172ac41b8c840..61b31995c2620 100644 --- a/flow/layers/physical_shape_layer.cc +++ b/flow/layers/physical_shape_layer.cc @@ -9,8 +9,8 @@ namespace flutter { -PhysicalShapeLayer::PhysicalShapeLayer(SkColor color, - SkColor shadow_color, +PhysicalShapeLayer::PhysicalShapeLayer(DlColor color, + DlColor shadow_color, float elevation, const SkPath& path, Clip clip_behavior) @@ -81,17 +81,17 @@ void PhysicalShapeLayer::Paint(PaintContext& context) const { FML_DCHECK(needs_painting(context)); if (elevation_ != 0) { - DisplayListCanvasDispatcher::DrawShadow( - context.canvas, path_, shadow_color_, elevation_, - SkColorGetA(color_) != 0xff, context.frame_device_pixel_ratio); + context.canvas->DrawShadow(path_, shadow_color_, elevation_, + SkColorGetA(color_) != 0xff, + context.frame_device_pixel_ratio); } // Call drawPath without clip if possible for better performance. - SkPaint paint; + DlPaint paint; paint.setColor(color_); paint.setAntiAlias(true); if (clip_behavior_ != Clip::antiAliasWithSaveLayer) { - context.canvas->drawPath(path_, paint); + context.canvas->DrawPath(path_, paint); } auto mutator = context.state_stack.save(); @@ -116,7 +116,7 @@ void PhysicalShapeLayer::Paint(PaintContext& context) const { // (https://github.com/flutter/flutter/issues/18057#issue-328003931) // using saveLayer, we have to call drawPaint instead of drawPath as // anti-aliased drawPath will always have such artifacts. - context.canvas->drawPaint(paint); + context.canvas->DrawPaint(paint); } PaintChildren(context); diff --git a/flow/layers/physical_shape_layer.h b/flow/layers/physical_shape_layer.h index b4a90785f6585..c14317676b78f 100644 --- a/flow/layers/physical_shape_layer.h +++ b/flow/layers/physical_shape_layer.h @@ -11,8 +11,8 @@ namespace flutter { class PhysicalShapeLayer : public ContainerLayer { public: - PhysicalShapeLayer(SkColor color, - SkColor shadow_color, + PhysicalShapeLayer(DlColor color, + DlColor shadow_color, float elevation, const SkPath& path, Clip clip_behavior); @@ -30,8 +30,8 @@ class PhysicalShapeLayer : public ContainerLayer { float elevation() const { return elevation_; } private: - SkColor color_; - SkColor shadow_color_; + DlColor color_; + DlColor shadow_color_; float elevation_ = 0.0f; SkPath path_; Clip clip_behavior_; diff --git a/flow/layers/physical_shape_layer_unittests.cc b/flow/layers/physical_shape_layer_unittests.cc index 9f791ef6064ac..daae0907f4412 100644 --- a/flow/layers/physical_shape_layer_unittests.cc +++ b/flow/layers/physical_shape_layer_unittests.cc @@ -18,10 +18,12 @@ namespace testing { using PhysicalShapeLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + #ifndef NDEBUG TEST_F(PhysicalShapeLayerTest, PaintingEmptyLayerDies) { auto layer = - std::make_shared(SK_ColorBLACK, SK_ColorBLACK, + std::make_shared(DlColor::kBlack(), DlColor::kBlack(), 0.0f, // elevation SkPath(), Clip::none); @@ -37,9 +39,9 @@ TEST_F(PhysicalShapeLayerTest, PaintingEmptyLayerDies) { TEST_F(PhysicalShapeLayerTest, PaintBeforePrerollDies) { SkPath child_path; child_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); - auto mock_layer = std::make_shared(child_path, SkPaint()); + auto mock_layer = std::make_shared(child_path, DlPaint()); auto layer = - std::make_shared(SK_ColorBLACK, SK_ColorBLACK, + std::make_shared(DlColor::kBlack(), DlColor::kBlack(), 0.0f, // elevation SkPath(), Clip::none); layer->Add(mock_layer); @@ -53,7 +55,7 @@ TEST_F(PhysicalShapeLayerTest, NonEmptyLayer) { SkPath layer_path; layer_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::none); layer->Preroll(preroll_context()); @@ -61,8 +63,8 @@ TEST_F(PhysicalShapeLayerTest, NonEmptyLayer) { EXPECT_EQ(layer->child_paint_bounds(), SkRect::MakeEmpty()); EXPECT_TRUE(layer->needs_painting(paint_context())); - SkPaint layer_paint; - layer_paint.setColor(SK_ColorGREEN); + DlPaint layer_paint; + layer_paint.setColor(DlColor::kGreen()); layer_paint.setAntiAlias(true); layer->Paint(paint_context()); EXPECT_EQ(mock_canvas().draw_calls(), @@ -71,21 +73,27 @@ TEST_F(PhysicalShapeLayerTest, NonEmptyLayer) { } TEST_F(PhysicalShapeLayerTest, ChildrenLargerThanPathClip) { - SkPath layer_path; - layer_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); - SkPath child1_path; - child1_path.addRect(4, 0, 12, 12).close(); - SkPath child2_path; - child2_path.addRect(3, 2, 5, 15).close(); - auto child1 = std::make_shared(SK_ColorRED, SK_ColorBLACK, - 0.0f, // elevation - child1_path, Clip::none); + const SkRect layer_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); + const SkRect child_bounds1 = SkRect::MakeLTRB(4, 0, 12, 12); + const SkRect child_bounds2 = SkRect::MakeLTRB(3, 2, 5, 15); + SkPath layer_path = + SkPath().addRect(layer_bounds).addOval(layer_bounds.makeInset(0.1, 0.1)); + SkPath child1_path = SkPath() + .addRect(child_bounds1) + .addOval(child_bounds1.makeInset(0.1, 0.1)); + SkPath child2_path = SkPath() + .addRect(child_bounds2) + .addOval(child_bounds2.makeInset(0.1, 0.1)); + auto child1 = + std::make_shared(DlColor::kRed(), DlColor::kBlack(), + 0.0f, // elevation + child1_path, Clip::none); auto child2 = - std::make_shared(SK_ColorBLUE, SK_ColorBLACK, + std::make_shared(DlColor::kBlue(), DlColor::kBlack(), 0.0f, // elevation child2_path, Clip::none); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::hardEdge); layer->Add(child1); @@ -100,48 +108,43 @@ TEST_F(PhysicalShapeLayerTest, ChildrenLargerThanPathClip) { EXPECT_EQ(layer->child_paint_bounds(), child_paint_bounds); EXPECT_TRUE(layer->needs_painting(paint_context())); - SkPaint layer_paint; - layer_paint.setColor(SK_ColorGREEN); + DlPaint layer_paint; + layer_paint.setColor(DlColor::kGreen()); layer_paint.setAntiAlias(true); - SkPaint child1_paint; - child1_paint.setColor(SK_ColorRED); + DlPaint child1_paint; + child1_paint.setColor(DlColor::kRed()); child1_paint.setAntiAlias(true); - SkPaint child2_paint; - child2_paint.setColor(SK_ColorBLUE); + DlPaint child2_paint; + child2_paint.setColor(DlColor::kBlue()); child2_paint.setAntiAlias(true); layer->Paint(paint_context()); - EXPECT_EQ(mock_canvas().draw_calls(), - std::vector({ - MockCanvas::DrawCall{ - 0, MockCanvas::DrawPathData{layer_path, layer_paint}}, - MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, - MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{layer_path.getBounds(), - SkClipOp::kIntersect}}, - MockCanvas::DrawCall{ - 1, MockCanvas::DrawPathData{child1_path, child1_paint}}, - // Child 2 is rendered when using Skia as a state delegate - // because the quickReject tests are conservative. - MockCanvas::DrawCall{ - 1, MockCanvas::DrawPathData{child2_path, child2_paint}}, - MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}, - })); + EXPECT_EQ( + mock_canvas().draw_calls(), + std::vector({ + MockCanvas::DrawCall{ + 0, MockCanvas::DrawPathData{layer_path, layer_paint}}, + MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, + MockCanvas::DrawCall{ + 1, MockCanvas::ClipPathData{layer_path, ClipOp::kIntersect}}, + MockCanvas::DrawCall{ + 1, MockCanvas::DrawPathData{child1_path, child1_paint}}, + MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}, + })); DisplayListBuilder expected_builder; { // layer::Paint() - expected_builder.drawPath( - layer_path, DlPaint().setColor(DlColor::kGreen()).setAntiAlias(true)); - expected_builder.save(); + expected_builder.DrawPath(layer_path, + DlPaint(DlColor::kGreen()).setAntiAlias(true)); + expected_builder.Save(); { - expected_builder.clipPath(layer_path, SkClipOp::kIntersect, false); + expected_builder.ClipPath(layer_path, ClipOp::kIntersect, false); { // child1::Paint() - expected_builder.drawPath( - child1_path, - DlPaint().setColor(DlColor::kRed()).setAntiAlias(true)); + expected_builder.DrawPath(child1_path, + DlPaint(DlColor::kRed()).setAntiAlias(true)); } // child2::Paint() is not called due to layer cullling // This is the expected and intended behavior. } - expected_builder.restore(); + expected_builder.Restore(); } layer->Paint(display_list_paint_context()); EXPECT_TRUE(DisplayListsEQ_Verbose(display_list(), expected_builder.Build())); @@ -154,15 +157,16 @@ TEST_F(PhysicalShapeLayerTest, ChildrenLargerThanPathNoClip) { child1_path.addRect(4, 0, 12, 12).close(); SkPath child2_path; child2_path.addRect(3, 2, 5, 15).close(); - auto child1 = std::make_shared(SK_ColorRED, SK_ColorBLACK, - 0.0f, // elevation - child1_path, Clip::none); + auto child1 = + std::make_shared(DlColor::kRed(), DlColor::kBlack(), + 0.0f, // elevation + child1_path, Clip::none); auto child2 = - std::make_shared(SK_ColorBLUE, SK_ColorBLACK, + std::make_shared(DlColor::kBlue(), DlColor::kBlack(), 0.0f, // elevation child2_path, Clip::none); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::none); layer->Add(child1); @@ -178,14 +182,14 @@ TEST_F(PhysicalShapeLayerTest, ChildrenLargerThanPathNoClip) { EXPECT_EQ(layer->child_paint_bounds(), child_bounds); EXPECT_TRUE(layer->needs_painting(paint_context())); - SkPaint layer_paint; - layer_paint.setColor(SK_ColorGREEN); + DlPaint layer_paint; + layer_paint.setColor(DlColor::kGreen()); layer_paint.setAntiAlias(true); - SkPaint child1_paint; - child1_paint.setColor(SK_ColorRED); + DlPaint child1_paint; + child1_paint.setColor(DlColor::kRed()); child1_paint.setAntiAlias(true); - SkPaint child2_paint; - child2_paint.setColor(SK_ColorBLUE); + DlPaint child2_paint; + child2_paint.setColor(DlColor::kBlue()); child2_paint.setAntiAlias(true); layer->Paint(paint_context()); EXPECT_EQ( @@ -203,7 +207,8 @@ TEST_F(PhysicalShapeLayerTest, ElevationSimple) { SkPath layer_path; layer_path.addRect(0, 0, 8, 8).close(); auto layer = std::make_shared( - SK_ColorGREEN, SK_ColorBLACK, initial_elevation, layer_path, Clip::none); + DlColor::kGreen(), DlColor::kBlack(), initial_elevation, layer_path, + Clip::none); layer->Preroll(preroll_context()); // The Fuchsia system compositor handles all elevated PhysicalShapeLayers and @@ -214,14 +219,16 @@ TEST_F(PhysicalShapeLayerTest, ElevationSimple) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(layer->elevation(), initial_elevation); - SkPaint layer_paint; - layer_paint.setColor(SK_ColorGREEN); + DlPaint layer_paint; + layer_paint.setColor(DlColor::kGreen()); layer_paint.setAntiAlias(true); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector( - {MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + {MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevation, false, 1}}, MockCanvas::DrawCall{ 0, MockCanvas::DrawPathData{layer_path, layer_paint}}})); } @@ -245,7 +252,7 @@ TEST_F(PhysicalShapeLayerTest, ElevationComplex) { std::shared_ptr layers[4]; for (int i = 0; i < 4; i += 1) { layers[i] = std::make_shared( - SK_ColorBLACK, SK_ColorBLACK, initial_elevations[i], layer_path, + DlColor::kBlack(), DlColor::kBlack(), initial_elevations[i], layer_path, Clip::none); } layers[0]->Add(layers[1]); @@ -268,23 +275,31 @@ TEST_F(PhysicalShapeLayerTest, ElevationComplex) { EXPECT_TRUE(layers[i]->needs_painting(paint_context())); } - SkPaint layer_paint; - layer_paint.setColor(SK_ColorBLACK); + DlPaint layer_paint; + layer_paint.setColor(DlColor::kBlack()); layer_paint.setAntiAlias(true); layers[0]->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector( - {MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + {MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevations[0], false, 1}}, MockCanvas::DrawCall{ 0, MockCanvas::DrawPathData{layer_path, layer_paint}}, - MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevations[1], false, 1}}, MockCanvas::DrawCall{ 0, MockCanvas::DrawPathData{layer_path, layer_paint}}, - MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevations[2], false, 1}}, MockCanvas::DrawCall{ 0, MockCanvas::DrawPathData{layer_path, layer_paint}}, - MockCanvas::DrawCall{0, MockCanvas::DrawShadowData{layer_path}}, + MockCanvas::DrawCall{ + 0, MockCanvas::DrawShadowData{layer_path, DlColor::kBlack(), + initial_elevations[3], false, 1}}, MockCanvas::DrawCall{ 0, MockCanvas::DrawPathData{layer_path, layer_paint}}})); } @@ -363,13 +378,13 @@ TEST_F(PhysicalShapeLayerTest, ShadowNotDependsPathSize) { SkPath path; path.addRect(test_case[0]).close(); DisplayListCanvasDispatcher::DrawShadow( - canvas, path, SK_ColorBLACK, 1.0f, false, 1.0f); + canvas, path, DlColor::kBlack(), 1.0f, false, 1.0f); }, [=](SkCanvas* canvas) { SkPath path; path.addRect(test_case[1]).close(); DisplayListCanvasDispatcher::DrawShadow( - canvas, path, SK_ColorBLACK, 1.0f, false, 1.0f); + canvas, path, DlColor::kBlack(), 1.0f, false, 1.0f); }, SkSize::Make(100, 100)), 0); @@ -383,7 +398,7 @@ static bool ReadbackResult(PrerollContext* context, const SkRect layer_bounds = SkRect::MakeXYWH(0.5, 1.0, 5.0, 6.0); const SkPath layer_path = SkPath().addRect(layer_bounds); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, clip_behavior); if (child != nullptr) { @@ -397,7 +412,7 @@ static bool ReadbackResult(PrerollContext* context, TEST_F(PhysicalShapeLayerTest, Readback) { PrerollContext* context = preroll_context(); SkPath path; - SkPaint paint; + DlPaint paint; const Clip hard = Clip::hardEdge; const Clip soft = Clip::antiAlias; @@ -443,7 +458,7 @@ TEST_F(PhysicalShapeLayerTest, OpacityInheritance) { SkPath layer_path; layer_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::none); @@ -459,7 +474,7 @@ TEST_F(PhysicalShapeLayerDiffTest, NoClipPaintRegion) { MockLayerTree tree1; const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100)); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::none); @@ -477,7 +492,7 @@ TEST_F(PhysicalShapeLayerDiffTest, ClipPaintRegion) { MockLayerTree tree1; const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100)); auto layer = - std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + std::make_shared(DlColor::kGreen(), DlColor::kBlack(), 0.0f, // elevation layer_path, Clip::hardEdge); diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 1996ec430b184..487bbc1e710e2 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -4,6 +4,8 @@ #include "flutter/flow/layers/platform_view_layer.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" + namespace flutter { PlatformViewLayer::PlatformViewLayer(const SkPoint& offset, @@ -39,15 +41,9 @@ void PlatformViewLayer::Paint(PaintContext& context) const { "does not support embedding"; return; } - EmbedderPaintContext embedder_context = - context.view_embedder->CompositeEmbeddedView(view_id_); - context.canvas = embedder_context.canvas; - context.builder = embedder_context.builder; - if (context.builder) { - context.state_stack.set_delegate(context.builder); - } else { - context.state_stack.set_delegate(context.canvas); - } + DlCanvas* canvas = context.view_embedder->CompositeEmbeddedView(view_id_); + context.canvas = canvas; + context.state_stack.set_delegate(canvas); } } // namespace flutter diff --git a/flow/layers/platform_view_layer.h b/flow/layers/platform_view_layer.h index f812e52901ca0..ac5792af55872 100644 --- a/flow/layers/platform_view_layer.h +++ b/flow/layers/platform_view_layer.h @@ -5,6 +5,7 @@ #ifndef FLUTTER_FLOW_LAYERS_PLATFORM_VIEW_LAYER_H_ #define FLUTTER_FLOW_LAYERS_PLATFORM_VIEW_LAYER_H_ +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/flow/layers/layer.h" #include "third_party/skia/include/core/SkPoint.h" #include "third_party/skia/include/core/SkSize.h" diff --git a/flow/layers/platform_view_layer_unittests.cc b/flow/layers/platform_view_layer_unittests.cc index 3fc19c23cd94d..0c83f71c61bf7 100644 --- a/flow/layers/platform_view_layer_unittests.cc +++ b/flow/layers/platform_view_layer_unittests.cc @@ -17,6 +17,8 @@ namespace testing { using PlatformViewLayerTest = LayerTest; +using ClipOp = DlCanvas::ClipOp; + TEST_F(PlatformViewLayerTest, NullViewEmbedderDoesntPrerollCompositeOrPaint) { const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f); const SkSize layer_size = SkSize::Make(8.0f, 8.0f); @@ -74,11 +76,11 @@ TEST_F(PlatformViewLayerTest, ClippedPlatformViewPrerollsAndPaintsNothing) { std::vector( {MockCanvas::DrawCall{0, MockCanvas::SaveData{1}}, MockCanvas::DrawCall{ - 1, MockCanvas::ClipRectData{parent_clip, SkClipOp::kIntersect, + 1, MockCanvas::ClipRectData{parent_clip, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{1, MockCanvas::SaveData{2}}, MockCanvas::DrawCall{ - 2, MockCanvas::ClipRectData{child_clip, SkClipOp::kIntersect, + 2, MockCanvas::ClipRectData{child_clip, ClipOp::kIntersect, MockCanvas::kHard_ClipEdgeStyle}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); @@ -125,8 +127,8 @@ TEST_F(PlatformViewLayerTest, StateTransfer) { transform_layer2->Add(child2); auto embedder = MockViewEmbedder(); - DisplayListCanvasRecorder recorder({0, 0, 500, 500}); - embedder.AddRecorder(&recorder); + DisplayListBuilder builder({0, 0, 500, 500}); + embedder.AddCanvas(&builder); PrerollContext* preroll_ctx = preroll_context(); preroll_ctx->view_embedder = &embedder; diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc index a460760c7a668..bf7b81f400521 100644 --- a/flow/layers/shader_mask_layer.cc +++ b/flow/layers/shader_mask_layer.cc @@ -54,35 +54,25 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { if (context.raster_cache) { mutator.integralTransform(); - SkPaint sk_paint; + DlPaint paint; if (layer_raster_cache_item_->Draw(context, - context.state_stack.fill(sk_paint))) { + context.state_stack.fill(paint))) { return; } } auto shader_rect = SkRect::MakeWH(mask_rect_.width(), mask_rect_.height()); mutator.saveLayer(paint_bounds()); - if (context.builder) { - PaintChildren(context); - DlPaint dl_paint; - dl_paint.setBlendMode(blend_mode_); - if (color_source_) { - dl_paint.setColorSource(color_source_.get()); - } - context.builder->translate(mask_rect_.left(), mask_rect_.top()); - context.builder->drawRect(shader_rect, dl_paint); - } else { - PaintChildren(context); - SkPaint paint; - paint.setBlendMode(ToSk(blend_mode_)); - if (color_source_) { - paint.setShader(color_source_->skia_object()); - } - context.canvas->translate(mask_rect_.left(), mask_rect_.top()); - context.canvas->drawRect(shader_rect, paint); + PaintChildren(context); + + DlPaint dl_paint; + dl_paint.setBlendMode(blend_mode_); + if (color_source_) { + dl_paint.setColorSource(color_source_.get()); } + context.canvas->Translate(mask_rect_.left(), mask_rect_.top()); + context.canvas->DrawRect(shader_rect, dl_paint); } } // namespace flutter diff --git a/flow/layers/shader_mask_layer_unittests.cc b/flow/layers/shader_mask_layer_unittests.cc index db37ae3430fb7..b4d55ee2e7da7 100644 --- a/flow/layers/shader_mask_layer_unittests.cc +++ b/flow/layers/shader_mask_layer_unittests.cc @@ -55,7 +55,7 @@ TEST_F(ShaderMaskLayerTest, EmptyFilter) { const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkRect layer_bounds = SkRect::MakeLTRB(2.0f, 4.0f, 6.5f, 6.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto mock_layer = std::make_shared(child_path, child_paint); auto layer = std::make_shared(nullptr, layer_bounds, DlBlendMode::kSrc); @@ -70,14 +70,14 @@ TEST_F(ShaderMaskLayerTest, EmptyFilter) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(mock_layer->parent_matrix(), initial_transform); - SkPaint filter_paint; - filter_paint.setBlendMode(SkBlendMode::kSrc); - filter_paint.setShader(nullptr); + DlPaint filter_paint; + filter_paint.setBlendMode(DlBlendMode::kSrc); + filter_paint.setColorSource(nullptr); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{child_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -97,7 +97,7 @@ TEST_F(ShaderMaskLayerTest, SimpleFilter) { const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkRect layer_bounds = SkRect::MakeLTRB(2.0f, 4.0f, 6.5f, 6.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto layer_filter = SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 1, 1.0f); auto dl_filter = DlColorSource::From(layer_filter); @@ -113,14 +113,14 @@ TEST_F(ShaderMaskLayerTest, SimpleFilter) { EXPECT_TRUE(layer->needs_painting(paint_context())); EXPECT_EQ(mock_layer->parent_matrix(), initial_transform); - SkPaint filter_paint; - filter_paint.setBlendMode(SkBlendMode::kSrc); - filter_paint.setShader(layer_filter); + DlPaint filter_paint; + filter_paint.setBlendMode(DlBlendMode::kSrc); + filter_paint.setColorSource(dl_filter); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{child_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, child_paint}}, @@ -142,8 +142,8 @@ TEST_F(ShaderMaskLayerTest, MultipleChildren) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto layer_filter = SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 1, 1.0f); auto dl_filter = DlColorSource::From(layer_filter); @@ -168,14 +168,14 @@ TEST_F(ShaderMaskLayerTest, MultipleChildren) { EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform); EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform); - SkPaint filter_paint; - filter_paint.setBlendMode(SkBlendMode::kSrc); - filter_paint.setShader(layer_filter); + DlPaint filter_paint; + filter_paint.setBlendMode(DlBlendMode::kSrc); + filter_paint.setColorSource(dl_filter); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{children_bounds, SkPaint(), + 0, MockCanvas::SaveLayerData{children_bounds, DlPaint(), nullptr, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path1, child_paint1}}, @@ -199,8 +199,8 @@ TEST_F(ShaderMaskLayerTest, Nested) { const SkPath child_path1 = SkPath().addRect(child_bounds); const SkPath child_path2 = SkPath().addRect(child_bounds.makeOffset(3.0f, 0.0f)); - const SkPaint child_paint1 = SkPaint(SkColors::kYellow); - const SkPaint child_paint2 = SkPaint(SkColors::kCyan); + const DlPaint child_paint1 = DlPaint(DlColor::kYellow()); + const DlPaint child_paint2 = DlPaint(DlColor::kCyan()); auto layer_filter1 = SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 1, 1.0f); auto dl_filter1 = DlColorSource::From(layer_filter1); @@ -234,22 +234,22 @@ TEST_F(ShaderMaskLayerTest, Nested) { EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform); EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform); - SkPaint filter_paint1, filter_paint2; - filter_paint1.setBlendMode(SkBlendMode::kSrc); - filter_paint2.setBlendMode(SkBlendMode::kSrc); - filter_paint1.setShader(layer_filter1); - filter_paint2.setShader(layer_filter2); + DlPaint filter_paint1, filter_paint2; + filter_paint1.setBlendMode(DlBlendMode::kSrc); + filter_paint2.setBlendMode(DlBlendMode::kSrc); + filter_paint1.setColorSource(dl_filter1); + filter_paint2.setColorSource(dl_filter2); layer1->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), std::vector( {MockCanvas::DrawCall{ - 0, MockCanvas::SaveLayerData{children_bounds, SkPaint(), nullptr, + 0, MockCanvas::SaveLayerData{children_bounds, DlPaint(), nullptr, 1}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path1, child_paint1}}, MockCanvas::DrawCall{ - 1, MockCanvas::SaveLayerData{child_path2.getBounds(), SkPaint(), + 1, MockCanvas::SaveLayerData{child_path2.getBounds(), DlPaint(), nullptr, 2}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path2, child_paint2}}, @@ -287,7 +287,7 @@ TEST_F(ShaderMaskLayerTest, Readback) { EXPECT_FALSE(preroll_context()->surface_needs_readback); // ShaderMaskLayer blocks child with readback - auto mock_layer = std::make_shared(SkPath(), SkPaint()); + auto mock_layer = std::make_shared(SkPath(), DlPaint()); mock_layer->set_fake_reads_surface(true); layer->Add(mock_layer); preroll_context()->surface_needs_readback = false; @@ -299,7 +299,7 @@ TEST_F(ShaderMaskLayerTest, LayerCached) { auto layer_filter = SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 1, 1.0f); auto dl_filter = DlColorSource::From(layer_filter); - SkPaint paint; + DlPaint paint; const SkRect layer_bounds = SkRect::MakeLTRB(2.0f, 4.0f, 20.5f, 20.5f); auto initial_transform = SkMatrix::Translate(50.0, 25.5); const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f)); @@ -309,8 +309,8 @@ TEST_F(ShaderMaskLayerTest, LayerCached) { layer->Add(mock_layer); SkMatrix cache_ctm = initial_transform; - SkCanvas cache_canvas; - cache_canvas.setMatrix(cache_ctm); + MockCanvas cache_canvas; + cache_canvas.SetTransform(cache_ctm); use_mock_raster_cache(); preroll_context()->state_stack.set_preroll_delegate(initial_transform); @@ -372,25 +372,25 @@ TEST_F(ShaderMaskLayerTest, OpacityInheritance) { DisplayListBuilder expected_builder; /* OpacityLayer::Paint() */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* ShaderMaskLayer::Paint() */ { - DlPaint sl_paint = DlPaint().setColor(opacity_alpha << 24); - expected_builder.saveLayer(&child_path.getBounds(), &sl_paint); + DlPaint sl_paint = DlPaint(opacity_alpha << 24); + expected_builder.SaveLayer(&child_path.getBounds(), &sl_paint); { /* child layer paint */ { - expected_builder.drawPath(child_path, DlPaint()); + expected_builder.DrawPath(child_path, DlPaint()); } expected_builder.translate(mask_rect.fLeft, mask_rect.fTop); - expected_builder.drawRect( + expected_builder.DrawRect( SkRect::MakeWH(mask_rect.width(), mask_rect.height()), DlPaint().setBlendMode(DlBlendMode::kSrc)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); @@ -404,7 +404,7 @@ TEST_F(ShaderMaskLayerTest, SimpleFilterWithRasterCache) { const SkRect child_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); const SkRect layer_bounds = SkRect::MakeLTRB(2.0f, 4.0f, 6.5f, 6.5f); const SkPath child_path = SkPath().addRect(child_bounds); - const SkPaint child_paint = SkPaint(SkColors::kYellow); + const DlPaint child_paint = DlPaint(DlColor::kYellow()); auto layer_filter = SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 1, 1.0f); auto dl_filter = DlColorSource::From(layer_filter); @@ -416,9 +416,9 @@ TEST_F(ShaderMaskLayerTest, SimpleFilterWithRasterCache) { preroll_context()->state_stack.set_preroll_delegate(initial_transform); layer->Preroll(preroll_context()); - SkPaint filter_paint; - filter_paint.setBlendMode(SkBlendMode::kSrc); - filter_paint.setShader(layer_filter); + DlPaint filter_paint; + filter_paint.setBlendMode(DlBlendMode::kSrc); + filter_paint.setColorSource(dl_filter); layer->Paint(paint_context()); EXPECT_EQ( mock_canvas().draw_calls(), @@ -426,7 +426,7 @@ TEST_F(ShaderMaskLayerTest, SimpleFilterWithRasterCache) { MockCanvas::DrawCall{1, MockCanvas::SetMatrixData{SkM44( SkMatrix::Translate(0.0, 0.0))}}, MockCanvas::DrawCall{ - 1, MockCanvas::SaveLayerData{child_bounds, SkPaint(), + 1, MockCanvas::SaveLayerData{child_bounds, DlPaint(), nullptr, 2}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path, child_paint}}, diff --git a/flow/layers/texture_layer.cc b/flow/layers/texture_layer.cc index 52892c4ea6b20..c36a5eb6274d4 100644 --- a/flow/layers/texture_layer.cc +++ b/flow/layers/texture_layer.cc @@ -58,17 +58,14 @@ void TextureLayer::Paint(PaintContext& context) const { TRACE_EVENT_INSTANT0("flutter", "null texture"); return; } - SkPaint sk_paint; - DlPaint dl_paint; + DlPaint paint; Texture::PaintContext ctx{ .canvas = context.canvas, - .builder = context.builder, .gr_context = context.gr_context, .aiks_context = context.aiks_context, - .sk_paint = context.state_stack.fill(sk_paint), - .dl_paint = context.state_stack.fill(dl_paint), + .paint = context.state_stack.fill(paint), }; - texture->Paint(ctx, paint_bounds(), freeze_, ToSk(sampling_)); + texture->Paint(ctx, paint_bounds(), freeze_, sampling_); } } // namespace flutter diff --git a/flow/layers/texture_layer_unittests.cc b/flow/layers/texture_layer_unittests.cc index 0862a81da9ab3..b1a96002821e2 100644 --- a/flow/layers/texture_layer_unittests.cc +++ b/flow/layers/texture_layer_unittests.cc @@ -90,7 +90,7 @@ TEST_F(TextureLayerTest, PaintingWithLinearSampling) { EXPECT_EQ(mock_texture->paint_calls(), std::vector({MockTexture::PaintCall{ mock_canvas(), layer->paint_bounds(), false, nullptr, - SkSamplingOptions(SkFilterMode::kLinear)}})); + DlImageSampling::kLinear}})); EXPECT_EQ(mock_canvas().draw_calls(), std::vector()); } diff --git a/flow/layers/transform_layer_unittests.cc b/flow/layers/transform_layer_unittests.cc index e1c2522a9c563..a0fd2bb04673d 100644 --- a/flow/layers/transform_layer_unittests.cc +++ b/flow/layers/transform_layer_unittests.cc @@ -31,7 +31,7 @@ TEST_F(TransformLayerTest, PaintingEmptyLayerDies) { TEST_F(TransformLayerTest, PaintBeforePrerollDies) { SkPath child_path; child_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); - auto mock_layer = std::make_shared(child_path, SkPaint()); + auto mock_layer = std::make_shared(child_path, DlPaint()); auto layer = std::make_shared(SkMatrix()); // identity layer->Add(mock_layer); @@ -44,7 +44,7 @@ TEST_F(TransformLayerTest, Identity) { SkPath child_path; child_path.addRect(5.0f, 6.0f, 20.5f, 21.5f); SkRect cull_rect = SkRect::MakeXYWH(2.0f, 2.0f, 14.0f, 14.0f); - auto mock_layer = std::make_shared(child_path, SkPaint()); + auto mock_layer = std::make_shared(child_path, DlPaint()); auto layer = std::make_shared(SkMatrix()); // identity layer->Add(mock_layer); @@ -62,7 +62,7 @@ TEST_F(TransformLayerTest, Identity) { layer->Paint(paint_context()); EXPECT_EQ(mock_canvas().draw_calls(), std::vector({MockCanvas::DrawCall{ - 0, MockCanvas::DrawPathData{child_path, SkPaint()}}})); + 0, MockCanvas::DrawPathData{child_path, DlPaint()}}})); } TEST_F(TransformLayerTest, Simple) { @@ -75,7 +75,7 @@ TEST_F(TransformLayerTest, Simple) { SkMatrix inverse_layer_transform; EXPECT_TRUE(layer_transform.invert(&inverse_layer_transform)); - auto mock_layer = std::make_shared(child_path, SkPaint()); + auto mock_layer = std::make_shared(child_path, DlPaint()); auto layer = std::make_shared(layer_transform); layer->Add(mock_layer); @@ -102,7 +102,7 @@ TEST_F(TransformLayerTest, Simple) { MockCanvas::DrawCall{ 1, MockCanvas::ConcatMatrixData{SkM44(layer_transform)}}, MockCanvas::DrawCall{ - 1, MockCanvas::DrawPathData{child_path, SkPaint()}}, + 1, MockCanvas::DrawPathData{child_path, DlPaint()}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); } @@ -118,7 +118,7 @@ TEST_F(TransformLayerTest, Nested) { EXPECT_TRUE(layer1_transform.invert(&inverse_layer1_transform)); EXPECT_TRUE(layer2_transform.invert(&inverse_layer2_transform)); - auto mock_layer = std::make_shared(child_path, SkPaint()); + auto mock_layer = std::make_shared(child_path, DlPaint()); auto layer1 = std::make_shared(layer1_transform); auto layer2 = std::make_shared(layer2_transform); layer1->Add(layer2); @@ -158,7 +158,7 @@ TEST_F(TransformLayerTest, Nested) { MockCanvas::DrawCall{ 2, MockCanvas::ConcatMatrixData{SkM44(layer2_transform)}}, MockCanvas::DrawCall{ - 2, MockCanvas::DrawPathData{child_path, SkPaint()}}, + 2, MockCanvas::DrawPathData{child_path, DlPaint()}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); } @@ -176,9 +176,9 @@ TEST_F(TransformLayerTest, NestedSeparated) { EXPECT_TRUE(layer2_transform.invert(&inverse_layer2_transform)); auto mock_layer1 = - std::make_shared(child_path, SkPaint(SkColors::kBlue)); + std::make_shared(child_path, DlPaint(DlColor::kBlue())); auto mock_layer2 = - std::make_shared(child_path, SkPaint(SkColors::kGreen)); + std::make_shared(child_path, DlPaint(DlColor::kGreen())); auto layer1 = std::make_shared(layer1_transform); auto layer2 = std::make_shared(layer2_transform); layer1->Add(mock_layer1); @@ -229,13 +229,13 @@ TEST_F(TransformLayerTest, NestedSeparated) { 1, MockCanvas::ConcatMatrixData{SkM44(layer1_transform)}}, MockCanvas::DrawCall{ 1, MockCanvas::DrawPathData{child_path, - SkPaint(SkColors::kBlue)}}, + DlPaint(DlColor::kBlue())}}, MockCanvas::DrawCall{1, MockCanvas::SaveData{2}}, MockCanvas::DrawCall{ 2, MockCanvas::ConcatMatrixData{SkM44(layer2_transform)}}, MockCanvas::DrawCall{ 2, MockCanvas::DrawPathData{child_path, - SkPaint(SkColors::kGreen)}}, + DlPaint(DlColor::kGreen())}}, MockCanvas::DrawCall{2, MockCanvas::RestoreData{1}}, MockCanvas::DrawCall{1, MockCanvas::RestoreData{0}}})); } @@ -316,22 +316,22 @@ TEST_F(TransformLayerTest, OpacityInheritancePainting) { DisplayListBuilder expected_builder; /* opacity_layer paint */ { - expected_builder.save(); + expected_builder.Save(); { - expected_builder.translate(offset.fX, offset.fY); + expected_builder.Translate(offset.fX, offset.fY); /* transform_layer paint */ { - expected_builder.save(); - expected_builder.transform(transform); + expected_builder.Save(); + expected_builder.Transform(transform); /* child layer1 paint */ { - expected_builder.drawPath(path1, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path1, DlPaint().setAlpha(opacity_alpha)); } /* child layer2 paint */ { - expected_builder.drawPath(path2, DlPaint().setAlpha(opacity_alpha)); + expected_builder.DrawPath(path2, DlPaint().setAlpha(opacity_alpha)); } - expected_builder.restore(); + expected_builder.Restore(); } } - expected_builder.restore(); + expected_builder.Restore(); } opacity_layer->Paint(display_list_paint_context()); diff --git a/flow/paint_utils.cc b/flow/paint_utils.cc index 2d1d6f65029ef..b594ccd8ce365 100644 --- a/flow/paint_utils.cc +++ b/flow/paint_utils.cc @@ -26,45 +26,10 @@ sk_sp CreateCheckerboardShader(SkColor c1, SkColor c2, int size) { } // anonymous namespace -void DrawCheckerboard(SkCanvas* canvas, - DisplayListBuilder* builder, - const SkRect& rect) { - if (canvas) { - DrawCheckerboard(canvas, rect); - } - if (builder) { - DrawCheckerboard(builder, rect); - } -} - -void DrawCheckerboard(SkCanvas* canvas, const SkRect& rect) { - // Draw a checkerboard - canvas->save(); - canvas->clipRect(rect); - - // Secure random number generation isn't needed here. - // NOLINTBEGIN(clang-analyzer-security.insecureAPI.rand) - auto checkerboard_color = - SkColorSetARGB(64, rand() % 256, rand() % 256, rand() % 256); - // NOLINTEND(clang-analyzer-security.insecureAPI.rand) - - SkPaint paint; - paint.setShader(CreateCheckerboardShader(checkerboard_color, 0x00000000, 12)); - canvas->drawPaint(paint); - canvas->restore(); - - // Stroke the drawn area - SkPaint debug_paint; - debug_paint.setStrokeWidth(8); - debug_paint.setColor(SkColorSetA(checkerboard_color, 255)); - debug_paint.setStyle(SkPaint::kStroke_Style); - canvas->drawRect(rect, debug_paint); -} - -void DrawCheckerboard(DisplayListBuilder* builder, const SkRect& rect) { +void DrawCheckerboard(DlCanvas* canvas, const SkRect& rect) { // Draw a checkerboard - builder->save(); - builder->clipRect(rect, SkClipOp::kIntersect, false); + canvas->Save(); + canvas->ClipRect(rect, DlCanvas::ClipOp::kIntersect, false); // Secure random number generation isn't needed here. // NOLINTBEGIN(clang-analyzer-security.insecureAPI.rand) @@ -75,15 +40,15 @@ void DrawCheckerboard(DisplayListBuilder* builder, const SkRect& rect) { DlPaint paint; paint.setColorSource(DlColorSource::From( CreateCheckerboardShader(checkerboard_color, 0x00000000, 12))); - builder->drawPaint(paint); - builder->restore(); + canvas->DrawPaint(paint); + canvas->Restore(); // Stroke the drawn area DlPaint debug_paint; debug_paint.setStrokeWidth(8); debug_paint.setColor(SkColorSetA(checkerboard_color, 255)); debug_paint.setDrawStyle(DlDrawStyle::kStroke); - builder->drawRect(rect, debug_paint); + canvas->DrawRect(rect, debug_paint); } } // namespace flutter diff --git a/flow/paint_utils.h b/flow/paint_utils.h index c01d7d1a8c5f4..b3879484a3240 100644 --- a/flow/paint_utils.h +++ b/flow/paint_utils.h @@ -12,13 +12,9 @@ namespace flutter { -typedef void (*CheckerboardFunc)(SkCanvas*, DisplayListBuilder*, const SkRect&); +typedef void (*CheckerboardFunc)(DlCanvas*, const SkRect&); -void DrawCheckerboard(SkCanvas* canvas, - DisplayListBuilder* builder, - const SkRect& rect); -void DrawCheckerboard(SkCanvas* canvas, const SkRect& rect); -void DrawCheckerboard(DisplayListBuilder* builder, const SkRect& rect); +void DrawCheckerboard(DlCanvas* canvas, const SkRect& rect); } // namespace flutter diff --git a/flow/raster_cache.cc b/flow/raster_cache.cc index f6bc2b0156dfa..258d2c221cc4e 100644 --- a/flow/raster_cache.cc +++ b/flow/raster_cache.cc @@ -23,23 +23,23 @@ namespace flutter { -RasterCacheResult::RasterCacheResult(sk_sp image, +RasterCacheResult::RasterCacheResult(sk_sp image, const SkRect& logical_rect, const char* type) : image_(std::move(image)), logical_rect_(logical_rect), flow_(type) {} -void RasterCacheResult::draw(SkCanvas& canvas, const SkPaint* paint) const { - SkAutoCanvasRestore auto_restore(&canvas, true); +void RasterCacheResult::draw(DlCanvas& canvas, const DlPaint* paint) const { + DlAutoCanvasRestore auto_restore(&canvas, true); - auto matrix = RasterCacheUtil::GetIntegralTransCTM(canvas.getTotalMatrix()); + auto matrix = RasterCacheUtil::GetIntegralTransCTM(canvas.GetTransform()); SkRect bounds = RasterCacheUtil::GetRoundedOutDeviceBounds(logical_rect_, matrix); FML_DCHECK(std::abs(bounds.width() - image_->dimensions().width()) <= 1 && std::abs(bounds.height() - image_->dimensions().height()) <= 1); - canvas.resetMatrix(); + canvas.TransformReset(); flow_.Step(); - canvas.drawImage(image_, bounds.fLeft, bounds.fTop, SkSamplingOptions(), - paint); + canvas.DrawImage(image_, {bounds.fLeft, bounds.fTop}, + DlImageSampling::kNearestNeighbor, paint); } RasterCache::RasterCache(size_t access_threshold, @@ -51,8 +51,8 @@ RasterCache::RasterCache(size_t access_threshold, /// @note Procedure doesn't copy all closures. std::unique_ptr RasterCache::Rasterize( const RasterCache::Context& context, - const std::function& draw_function, - const std::function& draw_checkerboard) + const std::function& draw_function, + const std::function& draw_checkerboard) const { auto matrix = RasterCacheUtil::GetIntegralTransCTM(context.matrix); SkRect dest_rect = @@ -72,28 +72,29 @@ std::unique_ptr RasterCache::Rasterize( return nullptr; } - SkCanvas* canvas = surface->getCanvas(); - canvas->clear(SK_ColorTRANSPARENT); - canvas->translate(-dest_rect.left(), -dest_rect.top()); - canvas->concat(matrix); - draw_function(canvas); + DlSkCanvasAdapter canvas(surface->getCanvas()); + canvas.Clear(DlColor::kTransparent()); + canvas.Translate(-dest_rect.left(), -dest_rect.top()); + canvas.Transform(matrix); + draw_function(&canvas); if (checkerboard_images_) { - draw_checkerboard(canvas, context.logical_rect); + draw_checkerboard(&canvas, context.logical_rect); } - return std::make_unique( - surface->makeImageSnapshot(), context.logical_rect, context.flow_type); + auto image = DlImage::Make(surface->makeImageSnapshot()); + return std::make_unique(image, context.logical_rect, + context.flow_type); } bool RasterCache::UpdateCacheEntry( const RasterCacheKeyID& id, const Context& raster_cache_context, - const std::function& render_function) const { + const std::function& render_function) const { RasterCacheKey key = RasterCacheKey(id, raster_cache_context.matrix); Entry& entry = cache_[key]; if (!entry.image) { - void (*func)(SkCanvas*, const SkRect& rect) = DrawCheckerboard; + void (*func)(DlCanvas*, const SkRect& rect) = DrawCheckerboard; entry.image = Rasterize(raster_cache_context, render_function, func); if (entry.image != nullptr) { switch (id.type()) { @@ -143,9 +144,9 @@ bool RasterCache::HasEntry(const RasterCacheKeyID& id, } bool RasterCache::Draw(const RasterCacheKeyID& id, - SkCanvas& canvas, - const SkPaint* paint) const { - auto it = cache_.find(RasterCacheKey(id, canvas.getTotalMatrix())); + DlCanvas& canvas, + const DlPaint* paint) const { + auto it = cache_.find(RasterCacheKey(id, canvas.GetTransform())); if (it == cache_.end()) { return false; } diff --git a/flow/raster_cache.h b/flow/raster_cache.h index 8f51b3f52ae89..38a026aa360fb 100644 --- a/flow/raster_cache.h +++ b/flow/raster_cache.h @@ -8,14 +8,12 @@ #include #include -#include "flutter/display_list/display_list.h" -#include "flutter/display_list/display_list_complexity.h" +#include "flutter/display_list/dl_canvas.h" #include "flutter/flow/raster_cache_key.h" #include "flutter/flow/raster_cache_util.h" #include "flutter/fml/macros.h" #include "flutter/fml/memory/weak_ptr.h" #include "flutter/fml/trace_event.h" -#include "include/core/SkCanvas.h" #include "include/core/SkMatrix.h" #include "include/core/SkRect.h" #include "third_party/skia/include/core/SkImage.h" @@ -29,24 +27,24 @@ enum class RasterCacheLayerStrategy { kLayer, kLayerChildren }; class RasterCacheResult { public: - RasterCacheResult(sk_sp image, + RasterCacheResult(sk_sp image, const SkRect& logical_rect, const char* type); virtual ~RasterCacheResult() = default; - virtual void draw(SkCanvas& canvas, const SkPaint* paint) const; + virtual void draw(DlCanvas& canvas, const DlPaint* paint) const; virtual SkISize image_dimensions() const { return image_ ? image_->dimensions() : SkISize::Make(0, 0); }; virtual int64_t image_bytes() const { - return image_ ? image_->imageInfo().computeMinByteSize() : 0; + return image_ ? image_->GetApproximateByteSize() : 0; }; private: - sk_sp image_; + sk_sp image_; SkRect logical_rect_; fml::tracing::TraceFlow flow_; }; @@ -128,8 +126,8 @@ class RasterCache { std::unique_ptr Rasterize( const RasterCache::Context& context, - const std::function& draw_function, - const std::function& + const std::function& draw_function, + const std::function& draw_checkerboard) const; explicit RasterCache( @@ -145,8 +143,8 @@ class RasterCache { // or if the attempt to populate the entry failed due to bounds overflow // conditions. bool Draw(const RasterCacheKeyID& id, - SkCanvas& canvas, - const SkPaint* paint) const; + DlCanvas& canvas, + const DlPaint* paint) const; bool HasEntry(const RasterCacheKeyID& id, const SkMatrix&) const; @@ -238,7 +236,7 @@ class RasterCache { bool UpdateCacheEntry( const RasterCacheKeyID& id, const Context& raster_cache_context, - const std::function& render_function) const; + const std::function& render_function) const; private: struct Entry { diff --git a/flow/raster_cache_item.h b/flow/raster_cache_item.h index 8509775589077..6df3066fed7ab 100644 --- a/flow/raster_cache_item.h +++ b/flow/raster_cache_item.h @@ -8,11 +8,8 @@ #include #include +#include "flutter/display_list/dl_canvas.h" #include "flutter/flow/raster_cache_key.h" -#include "include/core/SkCanvas.h" -#include "include/core/SkPaint.h" -#include "include/core/SkPicture.h" -#include "include/core/SkPoint.h" namespace flutter { @@ -22,7 +19,6 @@ class DisplayList; class RasterCache; class LayerRasterCacheItem; class DisplayListRasterCacheItem; -class SkPictureRasterCacheItem; class RasterCacheItem { public: @@ -46,11 +42,11 @@ class RasterCacheItem { const SkMatrix& matrix) = 0; virtual bool Draw(const PaintContext& context, - const SkPaint* paint) const = 0; + const DlPaint* paint) const = 0; virtual bool Draw(const PaintContext& context, - SkCanvas* canvas, - const SkPaint* paint) const = 0; + DlCanvas* canvas, + const DlPaint* paint) const = 0; virtual std::optional GetId() const { return key_id_; } diff --git a/flow/raster_cache_unittests.cc b/flow/raster_cache_unittests.cc index d3bb3cbb93c07..7fc8a5c7f8fce 100644 --- a/flow/raster_cache_unittests.cc +++ b/flow/raster_cache_unittests.cc @@ -4,6 +4,7 @@ #include "flutter/display_list/display_list.h" #include "flutter/display_list/display_list_builder.h" +#include "flutter/display_list/display_list_complexity.h" #include "flutter/display_list/testing/dl_test_snippets.h" #include "flutter/flow/layers/container_layer.h" #include "flutter/flow/layers/display_list_layer.h" @@ -39,8 +40,8 @@ TEST(RasterCache, MetricsOmitUnpopulatedEntries) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -57,8 +58,8 @@ TEST(RasterCache, MetricsOmitUnpopulatedEntries) { auto& paint_context = paint_context_holder.paint_context; cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); // 1st access. ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( @@ -87,8 +88,8 @@ TEST(RasterCache, MetricsOmitUnpopulatedEntries) { cache.EndFrame(); ASSERT_EQ(cache.picture_metrics().total_count(), 1u); - // 150w * 100h * 4bpp - ASSERT_EQ(cache.picture_metrics().total_bytes(), 25600u); + // 80w * 80h * 4bpp + image object overhead + ASSERT_EQ(cache.picture_metrics().total_bytes(), 25624u); } TEST(RasterCache, ThresholdIsRespectedForDisplayList) { @@ -99,8 +100,8 @@ TEST(RasterCache, ThresholdIsRespectedForDisplayList) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -118,8 +119,8 @@ TEST(RasterCache, ThresholdIsRespectedForDisplayList) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); // 1st access. ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( @@ -158,9 +159,9 @@ TEST(RasterCache, SetCheckboardCacheImages) { PaintContextHolder paint_context_holder = GetSamplePaintContextHolder( preroll_state_stack, &cache, &raster_time, &ui_time); auto& paint_context = paint_context_holder.paint_context; - auto dummy_draw_function = [](SkCanvas* canvas) {}; + auto dummy_draw_function = [](DlCanvas* canvas) {}; bool did_draw_checkerboard = false; - auto draw_checkerboard = [&](SkCanvas* canvas, const SkRect&) { + auto draw_checkerboard = [&](DlCanvas* canvas, const SkRect&) { did_draw_checkerboard = true; }; RasterCache::Context r_context = { @@ -190,8 +191,8 @@ TEST(RasterCache, AccessThresholdOfZeroDisablesCachingForSkPicture) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -208,8 +209,8 @@ TEST(RasterCache, AccessThresholdOfZeroDisablesCachingForSkPicture) { auto& paint_context = paint_context_holder.paint_context; cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); ASSERT_FALSE(display_list_item.Draw(paint_context, &dummy_canvas, &paint)); @@ -223,8 +224,8 @@ TEST(RasterCache, AccessThresholdOfZeroDisablesCachingForDisplayList) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -242,8 +243,8 @@ TEST(RasterCache, AccessThresholdOfZeroDisablesCachingForDisplayList) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); ASSERT_FALSE(display_list_item.Draw(paint_context, &dummy_canvas, &paint)); @@ -257,8 +258,8 @@ TEST(RasterCache, PictureCacheLimitPerFrameIsRespectedWhenZeroForSkPicture) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -276,8 +277,8 @@ TEST(RasterCache, PictureCacheLimitPerFrameIsRespectedWhenZeroForSkPicture) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); ASSERT_FALSE(display_list_item.Draw(paint_context, &dummy_canvas, &paint)); @@ -297,8 +298,8 @@ TEST(RasterCache, PictureCacheLimitPerFrameIsRespectedWhenZeroForDisplayList) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -316,8 +317,8 @@ TEST(RasterCache, PictureCacheLimitPerFrameIsRespectedWhenZeroForDisplayList) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); // 1st access. ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); @@ -332,7 +333,7 @@ TEST(RasterCache, PictureCacheLimitPerFrameIsRespectedWhenZeroForDisplayList) { ASSERT_FALSE(display_list_item.Draw(paint_context, &dummy_canvas, &paint)); } -TEST(RasterCache, EvitUnusedCacheEntries) { +TEST(RasterCache, EvictUnusedCacheEntries) { size_t threshold = 1; flutter::RasterCache cache(threshold); @@ -341,8 +342,8 @@ TEST(RasterCache, EvitUnusedCacheEntries) { auto display_list_1 = GetSampleDisplayList(); auto display_list_2 = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -358,10 +359,10 @@ TEST(RasterCache, EvitUnusedCacheEntries) { auto& preroll_context = preroll_context_holder.preroll_context; auto& paint_context = paint_context_holder.paint_context; - DisplayListRasterCacheItem display_list_item_1(display_list_1.get(), - SkPoint(), true, false); - DisplayListRasterCacheItem display_list_item_2(display_list_2.get(), - SkPoint(), true, false); + DisplayListRasterCacheItem display_list_item_1(display_list_1, SkPoint(), + true, false); + DisplayListRasterCacheItem display_list_item_2(display_list_2, SkPoint(), + true, false); cache.BeginFrame(); RasterCacheItemPreroll(display_list_item_1, preroll_context, matrix); @@ -390,28 +391,28 @@ TEST(RasterCache, EvitUnusedCacheEntries) { RasterCacheItemTryToRasterCache(display_list_item_1, paint_context)); ASSERT_TRUE( RasterCacheItemTryToRasterCache(display_list_item_2, paint_context)); - ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 51200u); + ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 51248u); ASSERT_TRUE(display_list_item_1.Draw(paint_context, &dummy_canvas, &paint)); ASSERT_TRUE(display_list_item_2.Draw(paint_context, &dummy_canvas, &paint)); cache.EndFrame(); - ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 51200u); + ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 51248u); ASSERT_EQ(cache.picture_metrics().total_count(), 2u); - ASSERT_EQ(cache.picture_metrics().total_bytes(), 51200u); + ASSERT_EQ(cache.picture_metrics().total_bytes(), 51248u); cache.BeginFrame(); RasterCacheItemPreroll(display_list_item_1, preroll_context, matrix); cache.EvictUnusedCacheEntries(); - ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25600u); + ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25624u); ASSERT_TRUE( RasterCacheItemTryToRasterCache(display_list_item_1, paint_context)); - ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25600u); + ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25624u); ASSERT_TRUE(display_list_item_1.Draw(paint_context, &dummy_canvas, &paint)); cache.EndFrame(); - ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25600u); + ASSERT_EQ(cache.EstimatePictureCacheByteSize(), 25624u); ASSERT_EQ(cache.picture_metrics().total_count(), 1u); - ASSERT_EQ(cache.picture_metrics().total_bytes(), 25600u); + ASSERT_EQ(cache.picture_metrics().total_bytes(), 25624u); cache.BeginFrame(); cache.EvictUnusedCacheEntries(); @@ -453,10 +454,10 @@ TEST(RasterCache, DeviceRectRoundOutForDisplayList) { sk_sp display_list = builder.Build(); SkMatrix ctm = SkMatrix::MakeAll(1.3312, 0, 233, 0, 1.3312, 206, 0, 0, 1); - SkPaint paint; + DlPaint paint; - SkCanvas canvas(1000, 1000, nullptr); - canvas.setMatrix(ctm); + MockCanvas canvas(1000, 1000); + canvas.SetTransform(ctm); LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, ctm); @@ -473,8 +474,8 @@ TEST(RasterCache, DeviceRectRoundOutForDisplayList) { auto& paint_context = paint_context_holder.paint_context; cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, ctm)); @@ -487,7 +488,7 @@ TEST(RasterCache, DeviceRectRoundOutForDisplayList) { display_list_item, preroll_context, paint_context, ctm)); ASSERT_TRUE(display_list_item.Draw(paint_context, &canvas, &paint)); - canvas.translate(248, 0); + canvas.Translate(248, 0); ASSERT_TRUE(cache.Draw(display_list_item.GetId().value(), canvas, &paint)); ASSERT_TRUE(display_list_item.Draw(paint_context, &canvas, &paint)); } @@ -502,8 +503,8 @@ TEST(RasterCache, NestedOpCountMetricUsedForDisplayList) { ASSERT_EQ(display_list->op_count(), 1u); ASSERT_EQ(display_list->op_count(true), 36u); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -521,8 +522,8 @@ TEST(RasterCache, NestedOpCountMetricUsedForDisplayList) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - false, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), false, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); @@ -553,8 +554,8 @@ TEST(RasterCache, NaiveComplexityScoringDisplayList) { ASSERT_EQ(display_list->op_count(), 5u); ASSERT_FALSE(calculator->ShouldBeCached(complexity_score)); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); @@ -572,8 +573,8 @@ TEST(RasterCache, NaiveComplexityScoringDisplayList) { cache.BeginFrame(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - false, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), false, + false); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( display_list_item, preroll_context, paint_context, matrix)); @@ -595,7 +596,7 @@ TEST(RasterCache, NaiveComplexityScoringDisplayList) { ASSERT_TRUE(calculator->ShouldBeCached(complexity_score)); DisplayListRasterCacheItem display_list_item_2 = - DisplayListRasterCacheItem(display_list.get(), SkPoint(), false, false); + DisplayListRasterCacheItem(display_list, SkPoint(), false, false); cache.BeginFrame(); ASSERT_FALSE(RasterCacheItemPrerollAndTryToRasterCache( @@ -623,8 +624,8 @@ TEST(RasterCache, DisplayListWithSingularMatrixIsNotCached) { auto display_list = GetSampleDisplayList(); - SkCanvas dummy_canvas(1000, 1000); - SkPaint paint; + MockCanvas dummy_canvas(1000, 1000); + DlPaint paint; LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, SkMatrix::I()); @@ -640,8 +641,8 @@ TEST(RasterCache, DisplayListWithSingularMatrixIsNotCached) { auto& preroll_context = preroll_context_holder.preroll_context; auto& paint_context = paint_context_holder.paint_context; - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); for (int i = 0; i < 10; i++) { cache.BeginFrame(); @@ -653,7 +654,7 @@ TEST(RasterCache, DisplayListWithSingularMatrixIsNotCached) { } for (int j = 0; j < matrix_count; j++) { - dummy_canvas.setMatrix(matrices[j]); + dummy_canvas.SetTransform(matrices[j]); ASSERT_FALSE( display_list_item.Draw(paint_context, &dummy_canvas, &paint)); } @@ -680,7 +681,7 @@ TEST(RasterCache, PrepareLayerTransform) { size_t threshold = 2; MockRasterCache cache(threshold); - SkCanvas dummy_canvas(1000, 1000); + MockCanvas dummy_canvas(1000, 1000); LayerStateStack preroll_state_stack; preroll_state_stack.set_preroll_delegate(kGiantRect, matrix); diff --git a/flow/surface_frame.cc b/flow/surface_frame.cc index dd70b478f52c6..d11c92ef17440 100644 --- a/flow/surface_frame.cc +++ b/flow/surface_frame.cc @@ -27,12 +27,12 @@ SurfaceFrame::SurfaceFrame(sk_sp surface, context_result_(std::move(context_result)) { FML_DCHECK(submit_callback_); if (surface_) { - canvas_ = surface_->getCanvas(); + adapter_.set_canvas(surface_->getCanvas()); + canvas_ = &adapter_; } else if (display_list_fallback) { FML_DCHECK(!frame_size.isEmpty()); - dl_recorder_ = - sk_make_sp(SkRect::Make(frame_size)); - canvas_ = dl_recorder_.get(); + dl_builder_ = sk_make_sp(SkRect::Make(frame_size)); + canvas_ = dl_builder_.get(); } } @@ -51,7 +51,7 @@ bool SurfaceFrame::IsSubmitted() const { return submitted_; } -SkCanvas* SurfaceFrame::SkiaCanvas() { +DlCanvas* SurfaceFrame::Canvas() { return canvas_; } @@ -64,7 +64,7 @@ bool SurfaceFrame::PerformSubmit() { return false; } - if (submit_callback_(*this, SkiaCanvas())) { + if (submit_callback_(*this, Canvas())) { return true; } @@ -72,12 +72,12 @@ bool SurfaceFrame::PerformSubmit() { } sk_sp SurfaceFrame::GetDisplayListBuilder() { - return dl_recorder_ ? dl_recorder_->builder() : nullptr; + return dl_builder_; } sk_sp SurfaceFrame::BuildDisplayList() { TRACE_EVENT0("impeller", "SurfaceFrame::BuildDisplayList"); - return dl_recorder_ ? dl_recorder_->Build() : nullptr; + return dl_builder_ ? dl_builder_->Build() : nullptr; } } // namespace flutter diff --git a/flow/surface_frame.h b/flow/surface_frame.h index ecacb5b8063c4..8cccacbc98942 100644 --- a/flow/surface_frame.h +++ b/flow/surface_frame.h @@ -9,7 +9,8 @@ #include #include "flutter/common/graphics/gl_context_switch.h" -#include "flutter/display_list/display_list_canvas_recorder.h" +#include "flutter/display_list/display_list_builder.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/fml/macros.h" #include "flutter/fml/time/time_point.h" @@ -23,7 +24,7 @@ namespace flutter { class SurfaceFrame { public: using SubmitCallback = - std::function; + std::function; // Information about the underlying framebuffer struct FramebufferInfo { @@ -87,7 +88,7 @@ class SurfaceFrame { sk_sp SkiaSurface() const; - SkCanvas* SkiaCanvas(); + DlCanvas* Canvas(); const FramebufferInfo& framebuffer_info() const { return framebuffer_info_; } @@ -103,9 +104,10 @@ class SurfaceFrame { private: bool submitted_ = false; - sk_sp dl_recorder_; + DlSkCanvasAdapter adapter_; + sk_sp dl_builder_; sk_sp surface_; - SkCanvas* canvas_ = nullptr; + DlCanvas* canvas_ = nullptr; FramebufferInfo framebuffer_info_; SubmitInfo submit_info_; SubmitCallback submit_callback_; diff --git a/flow/surface_frame_unittests.cc b/flow/surface_frame_unittests.cc index c025c662bceaf..0f6f9ba3081fc 100644 --- a/flow/surface_frame_unittests.cc +++ b/flow/surface_frame_unittests.cc @@ -14,7 +14,7 @@ TEST(FlowTest, SurfaceFrameDoesNotSubmitInDtor) { auto surface_frame = std::make_unique( /*surface=*/nullptr, framebuffer_info, /*submit_callback=*/ - [](const SurfaceFrame&, SkCanvas*) { + [](const SurfaceFrame&, DlCanvas*) { EXPECT_FALSE(true); return true; }, @@ -26,13 +26,12 @@ TEST(FlowTest, SurfaceFrameDoesNotHaveEmptyCanvas) { SurfaceFrame::FramebufferInfo framebuffer_info; SurfaceFrame frame( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600), /*context_result=*/nullptr, /*display_list_fallback=*/true); - EXPECT_FALSE(frame.SkiaCanvas()->getLocalClipBounds().isEmpty()); - EXPECT_FALSE( - frame.SkiaCanvas()->quickReject(SkRect::MakeLTRB(10, 10, 50, 50))); + EXPECT_FALSE(frame.Canvas()->GetLocalClipBounds().isEmpty()); + EXPECT_FALSE(frame.Canvas()->QuickReject(SkRect::MakeLTRB(10, 10, 50, 50))); } } // namespace flutter diff --git a/flow/testing/layer_test.h b/flow/testing/layer_test.h index 16de7afcbdf44..455e74b842690 100644 --- a/flow/testing/layer_test.h +++ b/flow/testing/layer_test.h @@ -12,7 +12,6 @@ #include #include -#include "flutter/display_list/display_list_builder_multiplexer.h" #include "flutter/flow/testing/mock_raster_cache.h" #include "flutter/fml/macros.h" #include "flutter/testing/canvas_test.h" @@ -75,12 +74,11 @@ class LayerTestBase : public CanvasTestBase { .frame_device_pixel_ratio = 1.0f, // clang-format on }, - display_list_recorder_(kDlBounds), + display_list_builder_(kDlBounds), display_list_paint_context_{ // clang-format off .state_stack = display_list_state_stack_, - .canvas = &display_list_recorder_, - .builder = display_list_recorder_.builder().get(), + .canvas = &display_list_builder_, .gr_context = nullptr, .view_embedder = nullptr, .raster_time = raster_time_, @@ -106,7 +104,7 @@ class LayerTestBase : public CanvasTestBase { use_null_raster_cache(); preroll_state_stack_.set_preroll_delegate(kGiantRect, SkMatrix::I()); paint_state_stack_.set_delegate(&TestT::mock_canvas()); - display_list_state_stack_.set_delegate(display_list_recorder_); + display_list_state_stack_.set_delegate(&display_list_builder_); checkerboard_state_stack_.set_delegate(&TestT::mock_canvas()); checkerboard_state_stack_.set_checkerboard_func(draw_checkerboard); checkerboard_paint_.setColor(checkerboard_color_); @@ -172,7 +170,7 @@ class LayerTestBase : public CanvasTestBase { PaintContext& display_list_paint_context() { return display_list_paint_context_; } - const SkPaint& checkerboard_paint() { return checkerboard_paint_; } + const DlPaint& checkerboard_paint() { return checkerboard_paint_; } PaintContext& checkerboard_context() { return checkerboard_context_; } LayerSnapshotStore& layer_snapshot_store() { return snapshot_store_; } @@ -182,8 +180,7 @@ class LayerTestBase : public CanvasTestBase { // and the delegate of the state_stack to prevent future use. display_list_paint_context_.state_stack.clear_delegate(); display_list_paint_context_.canvas = nullptr; - display_list_paint_context_.builder = nullptr; - display_list_ = display_list_recorder_.Build(); + display_list_ = display_list_builder_.Build(); } return display_list_; } @@ -208,18 +205,11 @@ class LayerTestBase : public CanvasTestBase { static constexpr SkColor checkerboard_color_ = 0x42424242; - static void draw_checkerboard(SkCanvas* canvas, - DisplayListBuilder* builder, - const SkRect& rect) { + static void draw_checkerboard(DlCanvas* canvas, const SkRect& rect) { if (canvas) { - SkPaint paint; - paint.setColor(checkerboard_color_); - canvas->drawRect(rect, paint); - } - if (builder) { DlPaint paint; paint.setColor(checkerboard_color_); - builder->drawRect(rect, paint); + canvas->DrawRect(rect, paint); } } @@ -233,11 +223,11 @@ class LayerTestBase : public CanvasTestBase { std::unique_ptr raster_cache_; PrerollContext preroll_context_; PaintContext paint_context_; - DisplayListCanvasRecorder display_list_recorder_; + DisplayListBuilder display_list_builder_; LayerStateStack display_list_state_stack_; sk_sp display_list_; PaintContext display_list_paint_context_; - SkPaint checkerboard_paint_; + DlPaint checkerboard_paint_; PaintContext checkerboard_context_; LayerSnapshotStore snapshot_store_; diff --git a/flow/testing/mock_embedder.cc b/flow/testing/mock_embedder.cc index b725b12e7ed4c..ae41675b6f771 100644 --- a/flow/testing/mock_embedder.cc +++ b/flow/testing/mock_embedder.cc @@ -11,17 +11,12 @@ MockViewEmbedder::MockViewEmbedder() = default; MockViewEmbedder::~MockViewEmbedder() = default; -void MockViewEmbedder::AddCanvas(SkCanvas* canvas) { - contexts_.emplace_back(EmbedderPaintContext{canvas, nullptr}); -} - -void MockViewEmbedder::AddRecorder(DisplayListCanvasRecorder* recorder) { - contexts_.emplace_back( - EmbedderPaintContext{recorder, recorder->builder().get()}); +void MockViewEmbedder::AddCanvas(DlCanvas* canvas) { + contexts_.emplace_back(canvas); } // |ExternalViewEmbedder| -SkCanvas* MockViewEmbedder::GetRootCanvas() { +DlCanvas* MockViewEmbedder::GetRootCanvas() { return nullptr; } @@ -43,21 +38,11 @@ void MockViewEmbedder::PrerollCompositeEmbeddedView( } // |ExternalViewEmbedder| -std::vector MockViewEmbedder::GetCurrentCanvases() { - return std::vector({}); -} - -// |ExternalViewEmbedder| -std::vector MockViewEmbedder::GetCurrentBuilders() { - return std::vector({}); -} - -// |ExternalViewEmbedder| -EmbedderPaintContext MockViewEmbedder::CompositeEmbeddedView(int64_t view_id) { +DlCanvas* MockViewEmbedder::CompositeEmbeddedView(int64_t view_id) { painted_views_.emplace_back(view_id); - EmbedderPaintContext context = contexts_.front(); + DlCanvas* canvas = contexts_.front(); contexts_.pop_front(); - return context; + return canvas; } } // namespace testing diff --git a/flow/testing/mock_embedder.h b/flow/testing/mock_embedder.h index d7c7da1ba7959..164d7baff79e3 100644 --- a/flow/testing/mock_embedder.h +++ b/flow/testing/mock_embedder.h @@ -16,11 +16,10 @@ class MockViewEmbedder : public ExternalViewEmbedder { ~MockViewEmbedder(); - void AddCanvas(SkCanvas* canvas); - void AddRecorder(DisplayListCanvasRecorder* recorder); + void AddCanvas(DlCanvas* canvas); // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; + DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| void CancelFrame() override; @@ -38,19 +37,13 @@ class MockViewEmbedder : public ExternalViewEmbedder { std::unique_ptr params) override; // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; - - // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override; std::vector prerolled_views() const { return prerolled_views_; } std::vector painted_views() const { return painted_views_; } private: - std::deque contexts_; + std::deque contexts_; std::vector prerolled_views_; std::vector painted_views_; }; diff --git a/flow/testing/mock_layer.cc b/flow/testing/mock_layer.cc index be09af1627e66..4f0453c383578 100644 --- a/flow/testing/mock_layer.cc +++ b/flow/testing/mock_layer.cc @@ -12,7 +12,7 @@ namespace flutter { namespace testing { -MockLayer::MockLayer(const SkPath& path, SkPaint paint) +MockLayer::MockLayer(const SkPath& path, DlPaint paint) : fake_paint_path_(path), fake_paint_(std::move(paint)) {} bool MockLayer::IsReplacing(DiffContext* context, const Layer* layer) const { @@ -53,15 +53,14 @@ void MockLayer::Paint(PaintContext& context) const { FML_DCHECK(needs_painting(context)); if (expected_paint_matrix_.has_value()) { - SkMatrix matrix = context.builder ? context.builder->getTransform() - : context.canvas->getTotalMatrix(); + SkMatrix matrix = context.canvas->GetTransform(); EXPECT_EQ(matrix, expected_paint_matrix_.value()); } - SkPaint sk_paint = fake_paint_; - context.state_stack.fill(sk_paint); - context.canvas->drawPath(fake_paint_path_, sk_paint); + DlPaint paint = fake_paint_; + context.state_stack.fill(paint); + context.canvas->DrawPath(fake_paint_path_, paint); } void MockCacheableContainerLayer::Preroll(PrerollContext* context) { diff --git a/flow/testing/mock_layer.h b/flow/testing/mock_layer.h index 804e837942218..4d2efdf367842 100644 --- a/flow/testing/mock_layer.h +++ b/flow/testing/mock_layer.h @@ -24,15 +24,15 @@ namespace testing { // verify the data against expected values. class MockLayer : public Layer { public: - explicit MockLayer(const SkPath& path, SkPaint paint = SkPaint()); + explicit MockLayer(const SkPath& path, DlPaint paint = DlPaint()); static std::shared_ptr Make(SkPath path, - SkPaint paint = SkPaint()) { + DlPaint paint = DlPaint()) { return std::make_shared(path, paint); } static std::shared_ptr MakeOpacityCompatible(SkPath path) { - auto mock_layer = std::make_shared(path, SkPaint()); + auto mock_layer = std::make_shared(path, DlPaint()); mock_layer->set_fake_opacity_compatible(true); return mock_layer; } @@ -111,7 +111,7 @@ class MockLayer : public Layer { SkMatrix parent_matrix_; SkRect parent_cull_rect_ = SkRect::MakeEmpty(); SkPath fake_paint_path_; - SkPaint fake_paint_; + DlPaint fake_paint_; std::optional expected_paint_matrix_; static constexpr int kParentHasPlatformView = 1 << 0; @@ -153,7 +153,7 @@ class MockLayerCacheableItem : public LayerRasterCacheItem { class MockCacheableLayer : public MockLayer { public: explicit MockCacheableLayer(SkPath path, - SkPaint paint = SkPaint(), + DlPaint paint = DlPaint(), int render_limit = 3) : MockLayer(path, paint) { raster_cache_item_ = diff --git a/flow/testing/mock_layer_unittests.cc b/flow/testing/mock_layer_unittests.cc index bc70271102001..125bcb1c83c91 100644 --- a/flow/testing/mock_layer_unittests.cc +++ b/flow/testing/mock_layer_unittests.cc @@ -16,14 +16,14 @@ using MockLayerTest = LayerTest; #ifndef NDEBUG TEST_F(MockLayerTest, PaintBeforePrerollDies) { SkPath path = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); - auto layer = std::make_shared(path, SkPaint()); + auto layer = std::make_shared(path, DlPaint()); EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), "needs_painting\\(context\\)"); } TEST_F(MockLayerTest, PaintingEmptyLayerDies) { - auto layer = std::make_shared(SkPath(), SkPaint()); + auto layer = std::make_shared(SkPath(), DlPaint()); layer->Preroll(preroll_context()); EXPECT_EQ(layer->paint_bounds(), SkPath().getBounds()); @@ -35,7 +35,7 @@ TEST_F(MockLayerTest, PaintingEmptyLayerDies) { TEST_F(MockLayerTest, SimpleParams) { const SkPath path = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); - const SkPaint paint = SkPaint(SkColors::kBlue); + const DlPaint paint = DlPaint(DlColor::kBlue()); const SkMatrix start_matrix = SkMatrix::Translate(1.0f, 2.0f); const SkMatrix scale_matrix = SkMatrix::Scale(0.5f, 0.5f); const SkMatrix combined_matrix = SkMatrix::Concat(start_matrix, scale_matrix); @@ -65,7 +65,7 @@ TEST_F(MockLayerTest, SimpleParams) { } TEST_F(MockLayerTest, FakePlatformView) { - auto layer = std::make_shared(SkPath(), SkPaint()); + auto layer = std::make_shared(SkPath(), DlPaint()); layer->set_fake_has_platform_view(true); EXPECT_EQ(preroll_context()->has_platform_view, false); @@ -74,7 +74,7 @@ TEST_F(MockLayerTest, FakePlatformView) { } TEST_F(MockLayerTest, SaveLayerOnLeafNodesCanvas) { - auto layer = std::make_shared(SkPath(), SkPaint()); + auto layer = std::make_shared(SkPath(), DlPaint()); layer->set_fake_has_platform_view(true); EXPECT_EQ(preroll_context()->has_platform_view, false); diff --git a/flow/testing/mock_raster_cache.cc b/flow/testing/mock_raster_cache.cc index ca8cb71ccf089..fd6ea7ec7dd69 100644 --- a/flow/testing/mock_raster_cache.cc +++ b/flow/testing/mock_raster_cache.cc @@ -8,10 +8,7 @@ #include "flutter/flow/layers/layer.h" #include "flutter/flow/raster_cache.h" #include "flutter/flow/raster_cache_item.h" -#include "include/core/SkCanvas.h" #include "include/core/SkMatrix.h" -#include "include/core/SkPoint.h" -#include "third_party/skia/include/core/SkPictureRecorder.h" namespace flutter { namespace testing { @@ -26,7 +23,7 @@ void MockRasterCache::AddMockLayer(int width, int height) { path.addRect(100, 100, 100 + width, 100 + height); int layer_cached_threshold = 1; MockCacheableLayer layer = - MockCacheableLayer(path, SkPaint(), layer_cached_threshold); + MockCacheableLayer(path, DlPaint(), layer_cached_threshold); layer.Preroll(&preroll_context_); layer.raster_cache_item()->TryToPrepareRasterCache(paint_context_); RasterCache::Context r_context = { @@ -39,7 +36,7 @@ void MockRasterCache::AddMockLayer(int width, int height) { }; UpdateCacheEntry( RasterCacheKeyID(layer.unique_id(), RasterCacheKeyType::kLayer), - r_context, [&](SkCanvas* canvas) { + r_context, [&](DlCanvas* canvas) { SkRect cache_rect = RasterCacheUtil::GetDeviceBounds( r_context.logical_rect, r_context.matrix); return std::make_unique(cache_rect); @@ -49,22 +46,21 @@ void MockRasterCache::AddMockLayer(int width, int height) { void MockRasterCache::AddMockPicture(int width, int height) { FML_DCHECK(access_threshold() > 0); SkMatrix ctm = SkMatrix::I(); - DisplayListCanvasRecorder recorder( - SkRect::MakeLTRB(0, 0, 200 + width, 200 + height)); + DisplayListBuilder builder(SkRect::MakeLTRB(0, 0, 200 + width, 200 + height)); SkPath path; path.addRect(100, 100, 100 + width, 100 + height); - recorder.drawPath(path, SkPaint()); - sk_sp display_list = recorder.Build(); + builder.DrawPath(path, DlPaint()); + sk_sp display_list = builder.Build(); FixedRefreshRateStopwatch raster_time; FixedRefreshRateStopwatch ui_time; LayerStateStack state_stack; PaintContextHolder holder = GetSamplePaintContextHolder(state_stack, this, &raster_time, &ui_time); - holder.paint_context.dst_color_space = color_space_; + holder.paint_context.dst_color_space = color_space_.get(); - DisplayListRasterCacheItem display_list_item(display_list.get(), SkPoint(), - true, false); + DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true, + false); for (size_t i = 0; i < access_threshold(); i++) { AutoCache(&display_list_item, &preroll_context_, ctm); } @@ -78,7 +74,7 @@ void MockRasterCache::AddMockPicture(int width, int height) { }; UpdateCacheEntry(RasterCacheKeyID(display_list->unique_id(), RasterCacheKeyType::kDisplayList), - r_context, [&](SkCanvas* canvas) { + r_context, [&](DlCanvas* canvas) { SkRect cache_rect = RasterCacheUtil::GetDeviceBounds( r_context.logical_rect, r_context.matrix); return std::make_unique(cache_rect); diff --git a/flow/testing/mock_raster_cache.h b/flow/testing/mock_raster_cache.h index b75234e69bfed..79615cf77230a 100644 --- a/flow/testing/mock_raster_cache.h +++ b/flow/testing/mock_raster_cache.h @@ -11,11 +11,7 @@ #include "flutter/flow/raster_cache_item.h" #include "flutter/flow/testing/mock_layer.h" #include "flutter/testing/mock_canvas.h" -#include "include/core/SkCanvas.h" -#include "third_party/skia/include/core/SkColorSpace.h" -#include "third_party/skia/include/core/SkColorType.h" #include "third_party/skia/include/core/SkImage.h" -#include "third_party/skia/include/core/SkPicture.h" namespace flutter { namespace testing { @@ -31,7 +27,7 @@ class MockRasterCacheResult : public RasterCacheResult { public: explicit MockRasterCacheResult(SkRect device_rect); - void draw(SkCanvas& canvas, const SkPaint* paint = nullptr) const override{}; + void draw(DlCanvas& canvas, const DlPaint* paint = nullptr) const override{}; SkISize image_dimensions() const override { return SkSize::Make(device_rect_.width(), device_rect_.height()).toCeil(); @@ -73,7 +69,7 @@ class MockRasterCache : public RasterCache { LayerStateStack preroll_state_stack_; LayerStateStack paint_state_stack_; MockCanvas mock_canvas_; - SkColorSpace* color_space_ = mock_canvas_.imageInfo().colorSpace(); + sk_sp color_space_ = SkColorSpace::MakeSRGB(); MutatorsStack mutators_stack_; FixedRefreshRateStopwatch raster_time_; FixedRefreshRateStopwatch ui_time_; @@ -84,7 +80,7 @@ class MockRasterCache : public RasterCache { .gr_context = nullptr, .view_embedder = nullptr, .state_stack = preroll_state_stack_, - .dst_color_space = color_space_, + .dst_color_space = color_space_.get(), .surface_needs_readback = false, .raster_time = raster_time_, .ui_time = ui_time_, @@ -101,7 +97,7 @@ class MockRasterCache : public RasterCache { .state_stack = paint_state_stack_, .canvas = nullptr, .gr_context = nullptr, - .dst_color_space = color_space_, + .dst_color_space = color_space_.get(), .view_embedder = nullptr, .raster_time = raster_time_, .ui_time = ui_time_, diff --git a/flow/testing/mock_texture.cc b/flow/testing/mock_texture.cc index 3fe4fd116813c..ceb8e88fd69c9 100644 --- a/flow/testing/mock_texture.cc +++ b/flow/testing/mock_texture.cc @@ -14,10 +14,10 @@ MockTexture::MockTexture(int64_t textureId) : Texture(textureId) {} void MockTexture::Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) { + const DlImageSampling sampling) { paint_calls_.emplace_back(PaintCall{*(context.canvas), bounds, freeze, context.gr_context, sampling, - context.sk_paint}); + context.paint}); } bool operator==(const MockTexture::PaintCall& a, diff --git a/flow/testing/mock_texture.h b/flow/testing/mock_texture.h index 8b1dfb05b493d..bf5d79bd25cdf 100644 --- a/flow/testing/mock_texture.h +++ b/flow/testing/mock_texture.h @@ -17,12 +17,12 @@ namespace testing { class MockTexture : public Texture { public: struct PaintCall { - SkCanvas& canvas; + DlCanvas& canvas; SkRect bounds; bool freeze; GrDirectContext* context; - SkSamplingOptions sampling; - const SkPaint* paint; + DlImageSampling sampling; + const DlPaint* paint; }; explicit MockTexture(int64_t textureId); @@ -31,7 +31,7 @@ class MockTexture : public Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) override; + const DlImageSampling sampling) override; void OnGrContextCreated() override { gr_context_created_ = true; } void OnGrContextDestroyed() override { gr_context_destroyed_ = true; } diff --git a/flow/testing/mock_texture_unittests.cc b/flow/testing/mock_texture_unittests.cc index 5dd12f82cfeea..3413f2855d18d 100644 --- a/flow/testing/mock_texture_unittests.cc +++ b/flow/testing/mock_texture_unittests.cc @@ -4,6 +4,7 @@ #include "flutter/flow/testing/mock_texture.h" +#include "flutter/testing/mock_canvas.h" #include "gtest/gtest.h" namespace flutter { @@ -26,10 +27,10 @@ TEST(MockTextureTest, Callbacks) { } TEST(MockTextureTest, PaintCalls) { - SkCanvas canvas; + MockCanvas canvas; const SkRect paint_bounds1 = SkRect::MakeWH(1.0f, 1.0f); const SkRect paint_bounds2 = SkRect::MakeWH(2.0f, 2.0f); - const SkSamplingOptions sampling; + const DlImageSampling sampling = DlImageSampling::kNearestNeighbor; const auto expected_paint_calls = std::vector{ MockTexture::PaintCall{canvas, paint_bounds1, false, nullptr, sampling}, MockTexture::PaintCall{canvas, paint_bounds2, true, nullptr, sampling}}; @@ -43,10 +44,10 @@ TEST(MockTextureTest, PaintCalls) { } TEST(MockTextureTest, PaintCallsWithLinearSampling) { - SkCanvas canvas; + MockCanvas canvas; const SkRect paint_bounds1 = SkRect::MakeWH(1.0f, 1.0f); const SkRect paint_bounds2 = SkRect::MakeWH(2.0f, 2.0f); - const auto sampling = SkSamplingOptions(SkFilterMode::kLinear); + const auto sampling = DlImageSampling::kLinear; const auto expected_paint_calls = std::vector{ MockTexture::PaintCall{canvas, paint_bounds1, false, nullptr, sampling}, MockTexture::PaintCall{canvas, paint_bounds2, true, nullptr, sampling}}; diff --git a/impeller/display_list/display_list_dispatcher.cc b/impeller/display_list/display_list_dispatcher.cc index 4dd2111f442d9..019c2c28c5af7 100644 --- a/impeller/display_list/display_list_dispatcher.cc +++ b/impeller/display_list/display_list_dispatcher.cc @@ -880,18 +880,19 @@ static Rect ToRect(const SkRect& rect) { return Rect::MakeLTRB(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); } -static Entity::ClipOperation ToClipOperation(SkClipOp clip_op) { +static Entity::ClipOperation ToClipOperation( + flutter::DlCanvas::ClipOp clip_op) { switch (clip_op) { - case SkClipOp::kDifference: + case flutter::DlCanvas::ClipOp::kDifference: return Entity::ClipOperation::kDifference; - case SkClipOp::kIntersect: + case flutter::DlCanvas::ClipOp::kIntersect: return Entity::ClipOperation::kIntersect; } } // |flutter::Dispatcher| void DisplayListDispatcher::clipRect(const SkRect& rect, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { auto path = PathBuilder{}.AddRect(ToRect(rect)).TakePath(); canvas_.ClipPath(path, ToClipOperation(clip_op)); @@ -991,14 +992,14 @@ static Path ToPath(const SkRRect& rrect) { // |flutter::Dispatcher| void DisplayListDispatcher::clipRRect(const SkRRect& rrect, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { canvas_.ClipPath(ToPath(rrect), ToClipOperation(clip_op)); } // |flutter::Dispatcher| void DisplayListDispatcher::clipPath(const SkPath& path, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { canvas_.ClipPath(ToPath(path), ToClipOperation(clip_op)); } @@ -1080,13 +1081,13 @@ void DisplayListDispatcher::drawArc(const SkRect& oval_bounds, } // |flutter::Dispatcher| -void DisplayListDispatcher::drawPoints(SkCanvas::PointMode mode, +void DisplayListDispatcher::drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) { Paint paint = paint_; paint.style = Paint::Style::kStroke; switch (mode) { - case SkCanvas::kPoints_PointMode: + case flutter::DlCanvas::PointMode::kPoints: if (paint.stroke_cap == Cap::kButt) { paint.stroke_cap = Cap::kSquare; } @@ -1096,7 +1097,7 @@ void DisplayListDispatcher::drawPoints(SkCanvas::PointMode mode, canvas_.DrawPath(path, paint); } break; - case SkCanvas::kLines_PointMode: + case flutter::DlCanvas::PointMode::kLines: for (uint32_t i = 1; i < count; i += 2) { Point p0 = ToPoint(points[i - 1]); Point p1 = ToPoint(points[i]); @@ -1104,7 +1105,7 @@ void DisplayListDispatcher::drawPoints(SkCanvas::PointMode mode, canvas_.DrawPath(path, paint); } break; - case SkCanvas::kPolygon_PointMode: + case flutter::DlCanvas::PointMode::kPolygon: if (count > 1) { Point p0 = ToPoint(points[0]); for (uint32_t i = 1; i < count; i++) { diff --git a/impeller/display_list/display_list_dispatcher.h b/impeller/display_list/display_list_dispatcher.h index c811164275708..d280459ccabbf 100644 --- a/impeller/display_list/display_list_dispatcher.h +++ b/impeller/display_list/display_list_dispatcher.h @@ -123,13 +123,13 @@ class DisplayListDispatcher final : public flutter::Dispatcher { void transformReset() override; // |flutter::Dispatcher| - void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override; + void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; // |flutter::Dispatcher| - void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override; + void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; // |flutter::Dispatcher| - void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) override; + void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; // |flutter::Dispatcher| void drawColor(flutter::DlColor color, flutter::DlBlendMode mode) override; @@ -165,7 +165,7 @@ class DisplayListDispatcher final : public flutter::Dispatcher { bool use_center) override; // |flutter::Dispatcher| - void drawPoints(SkCanvas::PointMode mode, + void drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) override; diff --git a/impeller/display_list/display_list_image_impeller.cc b/impeller/display_list/display_list_image_impeller.cc index 7650a41ff364c..01339088649ae 100644 --- a/impeller/display_list/display_list_image_impeller.cc +++ b/impeller/display_list/display_list_image_impeller.cc @@ -72,7 +72,7 @@ SkISize DlImageImpeller::dimensions() const { // |DlImage| size_t DlImageImpeller::GetApproximateByteSize() const { - auto size = sizeof(this); + auto size = sizeof(*this); if (texture_) { size += texture_->GetTextureDescriptor().GetByteSizeOfBaseMipLevel(); } diff --git a/impeller/display_list/display_list_unittests.cc b/impeller/display_list/display_list_unittests.cc index 8d10b33b672f8..92651b99a17b0 100644 --- a/impeller/display_list/display_list_unittests.cc +++ b/impeller/display_list/display_list_unittests.cc @@ -271,10 +271,10 @@ TEST_P(DisplayListTest, IgnoreMaskFilterWhenSavingLayer) { auto filter = flutter::DlBlurMaskFilter(kNormal_SkBlurStyle, 10.0f); flutter::DlPaint paint; paint.setMaskFilter(&filter); - builder.saveLayer(nullptr, &paint); - builder.drawImage(DlImageImpeller::Make(texture), SkPoint::Make(100, 100), + builder.SaveLayer(nullptr, &paint); + builder.DrawImage(DlImageImpeller::Make(texture), SkPoint::Make(100, 100), flutter::DlImageSampling::kNearestNeighbor); - builder.restore(); + builder.Restore(); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -447,11 +447,11 @@ TEST_P(DisplayListTest, SaveLayerWithColorMatrixFiltersAndAlphaDrawCorrectly) { case Type::kDisableFilter: break; } - builder.saveLayer(nullptr, &save_paint); + builder.SaveLayer(nullptr, &save_paint); flutter::DlPaint draw_paint; - builder.drawImage(DlImageImpeller::Make(texture), SkPoint::Make(100, 100), + builder.DrawImage(DlImageImpeller::Make(texture), SkPoint::Make(100, 100), flutter::DlImageSampling::kNearestNeighbor, &draw_paint); - builder.restore(); + builder.Restore(); return builder.Build(); }; @@ -493,11 +493,11 @@ TEST_P(DisplayListTest, SaveLayerWithBlendFiltersAndAlphaDrawCorrectly) { case Type::kDisableFilter: break; } - builder.saveLayer(nullptr, &save_paint); + builder.SaveLayer(nullptr, &save_paint); flutter::DlPaint draw_paint; draw_paint.setColor(flutter::DlColor::kBlue()); - builder.drawRect(SkRect::MakeLTRB(100, 100, 400, 400), draw_paint); - builder.restore(); + builder.DrawRect(SkRect::MakeLTRB(100, 100, 400, 400), draw_paint); + builder.Restore(); return builder.Build(); }; @@ -545,7 +545,7 @@ TEST_P(DisplayListTest, CanDrawBackdropFilter) { // correctly. if (add_clip) { builder.clipRect(SkRect::MakeLTRB(0, 0, 99999, 99999), - SkClipOp::kIntersect, true); + flutter::DlCanvas::ClipOp::kIntersect, true); } builder.drawImage(DlImageImpeller::Make(texture), SkPoint::Make(200, 200), @@ -667,17 +667,18 @@ TEST_P(DisplayListTest, CanDrawPoints) { flutter::DlPaint() // .setColor(flutter::DlColor::kYellow().withAlpha(127)) // .setStrokeWidth(20); - builder.translate(50, 50); + builder.Translate(50, 50); for (auto cap : caps) { paint.setStrokeCap(cap); - builder.save(); - builder.drawPoints(SkCanvas::kPoints_PointMode, 7, points, paint); - builder.translate(150, 0); - builder.drawPoints(SkCanvas::kLines_PointMode, 5, points, paint); - builder.translate(150, 0); - builder.drawPoints(SkCanvas::kPolygon_PointMode, 5, points, paint); - builder.restore(); - builder.translate(0, 150); + builder.Save(); + builder.DrawPoints(flutter::DlCanvas::PointMode::kPoints, 7, points, paint); + builder.Translate(150, 0); + builder.DrawPoints(flutter::DlCanvas::PointMode::kLines, 5, points, paint); + builder.Translate(150, 0); + builder.DrawPoints(flutter::DlCanvas::PointMode::kPolygon, 5, points, + paint); + builder.Restore(); + builder.Translate(0, 150); } ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -698,9 +699,9 @@ TEST_P(DisplayListTest, CanDrawZeroLengthLine) { SkPath path = SkPath().addPoly({{150, 50}, {150, 50}}, false); for (auto cap : caps) { paint.setStrokeCap(cap); - builder.drawLine({50, 50}, {50, 50}, paint); - builder.drawPath(path, paint); - builder.translate(0, 150); + builder.DrawLine({50, 50}, {50, 50}, paint); + builder.DrawPath(path, paint); + builder.Translate(0, 150); } ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -772,12 +773,12 @@ TEST_P(DisplayListTest, CanConvertTriangleFanToTriangles) { SkPoint::Make(hex_start.x - center_to_flat, hex_start.y + 0.5 * hexagon_radius) }; // clang-format on - auto paint = flutter::DlPaint().setColor(flutter::DlColor::kDarkGrey()); + auto paint = flutter::DlPaint(flutter::DlColor::kDarkGrey()); auto dl_vertices = flutter::DlVertices::Make( flutter::DlVertexMode::kTriangleFan, vertices.size(), vertices.data(), nullptr, nullptr); flutter::DisplayListBuilder builder; - builder.drawVertices(dl_vertices, flutter::DlBlendMode::kSrcOver, paint); + builder.DrawVertices(dl_vertices, flutter::DlBlendMode::kSrcOver, paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -802,15 +803,15 @@ TEST_P(DisplayListTest, CanDrawZeroWidthLine) { SkPath path = SkPath().addPoly({{150, 50}, {160, 50}}, false); for (auto cap : caps) { paint.setStrokeCap(cap); - builder.drawLine({50, 50}, {60, 50}, paint); - builder.drawRect({45, 45, 65, 55}, outline_paint); - builder.drawLine({100, 50}, {100, 50}, paint); + builder.DrawLine({50, 50}, {60, 50}, paint); + builder.DrawRect({45, 45, 65, 55}, outline_paint); + builder.DrawLine({100, 50}, {100, 50}, paint); if (cap != flutter::DlStrokeCap::kButt) { - builder.drawRect({95, 45, 105, 55}, outline_paint); + builder.DrawRect({95, 45, 105, 55}, outline_paint); } - builder.drawPath(path, paint); - builder.drawRect(path.getBounds().makeOutset(5, 5), outline_paint); - builder.translate(0, 150); + builder.DrawPath(path, paint); + builder.DrawRect(path.getBounds().makeOutset(5, 5), outline_paint); + builder.Translate(0, 150); } ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -865,7 +866,7 @@ TEST_P(DisplayListTest, CanDrawWithMatrixFilter) { flutter::DisplayListBuilder builder; SkPaint paint; if (enable_savelayer) { - builder.saveLayer(nullptr, nullptr); + builder.SaveLayer(nullptr, nullptr); } { auto content_scale = GetContentScale(); @@ -922,11 +923,11 @@ TEST_P(DisplayListTest, CanDrawRectWithLinearToSrgbColorFilter) { paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128)); flutter::DisplayListBuilder builder; paint.setColorFilter(flutter::DlLinearToSrgbGammaColorFilter::instance.get()); - builder.drawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint); - builder.translate(0, 200); + builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint); + builder.Translate(0, 200); paint.setColorFilter(flutter::DlSrgbToLinearGammaColorFilter::instance.get()); - builder.drawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint); + builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -940,45 +941,45 @@ TEST_P(DisplayListTest, CanDrawPaintWithColorSource) { flutter::DlPaint paint; flutter::DisplayListBuilder builder; auto clip_bounds = SkRect::MakeWH(300.0, 300.0); - builder.save(); - builder.translate(100, 100); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.Save(); + builder.Translate(100, 100); + builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect, false); auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors, stops, flutter::DlTileMode::kRepeat); paint.setColorSource(linear); - builder.drawPaint(paint); - builder.restore(); + builder.DrawPaint(paint); + builder.Restore(); - builder.save(); - builder.translate(500, 100); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.Save(); + builder.Translate(500, 100); + builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect, false); auto radial = flutter::DlColorSource::MakeRadial( {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat); paint.setColorSource(radial); - builder.drawPaint(paint); - builder.restore(); + builder.DrawPaint(paint); + builder.Restore(); - builder.save(); - builder.translate(100, 500); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.Save(); + builder.Translate(100, 500); + builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect, false); auto sweep = flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors, stops, flutter::DlTileMode::kRepeat); paint.setColorSource(sweep); - builder.drawPaint(paint); - builder.restore(); + builder.DrawPaint(paint); + builder.Restore(); - builder.save(); - builder.translate(500, 500); - builder.clipRect(clip_bounds, SkClipOp::kIntersect, false); + builder.Save(); + builder.Translate(500, 500); + builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect, false); auto texture = CreateTextureForFixture("table_mountain_nx.png"); auto image = std::make_shared( DlImageImpeller::Make(texture), flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat); paint.setColorSource(image); - builder.drawPaint(paint); - builder.restore(); + builder.DrawPaint(paint); + builder.Restore(); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -987,48 +988,48 @@ TEST_P(DisplayListTest, CanBlendDstOverAndDstCorrectly) { flutter::DisplayListBuilder builder; { - builder.saveLayer(nullptr, nullptr); - builder.translate(100, 100); + builder.SaveLayer(nullptr, nullptr); + builder.Translate(100, 100); flutter::DlPaint paint; paint.setColor(flutter::DlColor::kRed()); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); paint.setColor(flutter::DlColor::kBlue().withAlpha(127)); paint.setBlendMode(flutter::DlBlendMode::kSrcOver); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); - builder.restore(); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); + builder.Restore(); } { - builder.saveLayer(nullptr, nullptr); - builder.translate(300, 100); + builder.SaveLayer(nullptr, nullptr); + builder.Translate(300, 100); flutter::DlPaint paint; paint.setColor(flutter::DlColor::kBlue().withAlpha(127)); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); paint.setColor(flutter::DlColor::kRed()); paint.setBlendMode(flutter::DlBlendMode::kDstOver); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); - builder.restore(); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); + builder.Restore(); } { - builder.saveLayer(nullptr, nullptr); - builder.translate(100, 300); + builder.SaveLayer(nullptr, nullptr); + builder.Translate(100, 300); flutter::DlPaint paint; paint.setColor(flutter::DlColor::kRed()); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); paint.setColor(flutter::DlColor::kBlue().withAlpha(127)); paint.setBlendMode(flutter::DlBlendMode::kSrc); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); - builder.restore(); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); + builder.Restore(); } { - builder.saveLayer(nullptr, nullptr); - builder.translate(300, 300); + builder.SaveLayer(nullptr, nullptr); + builder.Translate(300, 300); flutter::DlPaint paint; paint.setColor(flutter::DlColor::kBlue().withAlpha(127)); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); paint.setColor(flutter::DlColor::kRed()); paint.setBlendMode(flutter::DlBlendMode::kDst); - builder.drawRect(SkRect::MakeSize({200, 200}), paint); - builder.restore(); + builder.DrawRect(SkRect::MakeSize({200, 200}), paint); + builder.Restore(); } ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); @@ -1059,7 +1060,7 @@ TEST_P(DisplayListTest, CanDrawCorrectlyWithColorFilterAndImageFilter) { paint.setColor(flutter::DlColor::kRed()); paint.setColorFilter(green_color_filter); paint.setImageFilter(blue_image_filter); - builder.drawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint); + builder.DrawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -1085,12 +1086,12 @@ TEST_P(DisplayListTest, MaskBlursApplyCorrectlyToColorSources) { paint.setMaskFilter(blur_filter); paint.setDrawStyle(flutter::DlDrawStyle::kFill); - builder.drawRRect( + builder.DrawRRect( SkRRect::MakeRectXY(SkRect::MakeXYWH(100, offset, 100, 50), 30, 30), paint); paint.setDrawStyle(flutter::DlDrawStyle::kStroke); paint.setStrokeWidth(10); - builder.drawRRect( + builder.DrawRRect( SkRRect::MakeRectXY(SkRect::MakeXYWH(300, offset, 100, 50), 30, 30), paint); @@ -1118,8 +1119,8 @@ TEST_P(DisplayListTest, DrawVerticesSolidColorTrianglesWithoutIndices) { flutter::DlPaint paint; paint.setColor(flutter::DlColor::kRed().modulateOpacity(0.5)); - builder.scale(-1, -1); - builder.drawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); + builder.Scale(-1, -1); + builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -1145,7 +1146,7 @@ TEST_P(DisplayListTest, DrawVerticesLinearGradientWithoutIndices) { flutter::DlPaint paint; paint.setColorSource(linear); - builder.drawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); + builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -1164,7 +1165,7 @@ TEST_P(DisplayListTest, DrawVerticesSolidColorTrianglesWithIndices) { flutter::DlPaint paint; paint.setColor(flutter::DlColor::kWhite()); - builder.drawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); + builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint); ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -1188,21 +1189,21 @@ TEST_P(DisplayListTest, DrawShapes) { .setStrokeWidth(10); SkPath path = SkPath().addPoly({{150, 50}, {160, 50}}, false); - builder.translate(300, 50); - builder.scale(0.8, 0.8); + builder.Translate(300, 50); + builder.Scale(0.8, 0.8); for (auto join : joins) { paint.setStrokeJoin(join); stroke_paint.setStrokeJoin(join); - builder.drawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint); - builder.drawRect(SkRect::MakeXYWH(0, 150, 100, 100), stroke_paint); - builder.drawRRect( + builder.DrawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint); + builder.DrawRect(SkRect::MakeXYWH(0, 150, 100, 100), stroke_paint); + builder.DrawRRect( SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 0, 100, 100), 30, 30), paint); - builder.drawRRect( + builder.DrawRRect( SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 150, 100, 100), 30, 30), stroke_paint); - builder.drawCircle({350, 50}, 50, paint); - builder.drawCircle({350, 200}, 50, stroke_paint); - builder.translate(0, 300); + builder.DrawCircle({350, 50}, 50, paint); + builder.DrawCircle({350, 200}, 50, stroke_paint); + builder.Translate(0, 300); } ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } @@ -1290,7 +1291,7 @@ TEST_P(DisplayListTest, DrawVerticesBlendModes) { flutter::DlPaint paint; paint.setColor(toColor(src_color).modulateOpacity(src_alpha)); - builder.drawVertices(vertices, blend_mode_values[current_blend_index], + builder.DrawVertices(vertices, blend_mode_values[current_blend_index], paint); return builder.Build(); }; diff --git a/lib/ui/compositing/scene_builder.cc b/lib/ui/compositing/scene_builder.cc index 6f1c718fa1b5f..4a56612e704e4 100644 --- a/lib/ui/compositing/scene_builder.cc +++ b/lib/ui/compositing/scene_builder.cc @@ -24,7 +24,6 @@ #include "flutter/fml/build_config.h" #include "flutter/lib/ui/painting/matrix.h" #include "flutter/lib/ui/painting/shader.h" -#include "third_party/skia/include/core/SkColorFilter.h" #include "third_party/tonic/converter/dart_converter.h" #include "third_party/tonic/dart_args.h" #include "third_party/tonic/dart_binding_macros.h" @@ -209,7 +208,7 @@ void SceneBuilder::pushPhysicalShape(Dart_Handle layer_handle, int clipBehavior, const fml::RefPtr& oldLayer) { auto layer = std::make_shared( - static_cast(color), static_cast(shadow_color), + static_cast(color), static_cast(shadow_color), static_cast(elevation), path->path(), static_cast(clipBehavior)); PushLayer(layer); diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart index afe0979ed858b..6ad30bdcddced 100644 --- a/lib/ui/painting.dart +++ b/lib/ui/painting.dart @@ -4684,7 +4684,7 @@ class Vertices extends NativeFieldWrapperClass1 { /// Defines how a list of points is interpreted when drawing a set of points. /// /// Used by [Canvas.drawPoints] and [Canvas.drawRawPoints]. -// These enum values must be kept in sync with SkCanvas::PointMode. +// These enum values must be kept in sync with DlCanvas::PointMode. enum PointMode { /// Draw each point separately. /// diff --git a/lib/ui/painting/canvas.cc b/lib/ui/painting/canvas.cc index 0f7da4a50c6be..92f7043d2d090 100644 --- a/lib/ui/painting/canvas.cc +++ b/lib/ui/painting/canvas.cc @@ -92,7 +92,7 @@ void Canvas::restore() { int Canvas::getSaveCount() { if (display_list_builder_) { - return builder()->getSaveCount(); + return builder()->GetSaveCount(); } else { return 0; } @@ -144,7 +144,7 @@ void Canvas::transform(const tonic::Float64List& matrix4) { void Canvas::getTransform(Dart_Handle matrix4_handle) { if (display_list_builder_) { - SkM44 sk_m44 = builder()->getTransformFullPerspective(); + 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); @@ -159,7 +159,7 @@ void Canvas::clipRect(double left, double top, double right, double bottom, - SkClipOp clipOp, + DlCanvas::ClipOp clipOp, bool doAntiAlias) { if (display_list_builder_) { builder()->clipRect(SkRect::MakeLTRB(left, top, right, bottom), clipOp, @@ -169,7 +169,8 @@ void Canvas::clipRect(double left, void Canvas::clipRRect(const RRect& rrect, bool doAntiAlias) { if (display_list_builder_) { - builder()->clipRRect(rrect.sk_rrect, SkClipOp::kIntersect, doAntiAlias); + builder()->clipRRect(rrect.sk_rrect, DlCanvas::ClipOp::kIntersect, + doAntiAlias); } } @@ -180,14 +181,15 @@ void Canvas::clipPath(const CanvasPath* path, bool doAntiAlias) { return; } if (display_list_builder_) { - builder()->clipPath(path->path(), SkClipOp::kIntersect, doAntiAlias); + builder()->clipPath(path->path(), DlCanvas::ClipOp::kIntersect, + doAntiAlias); } } void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) { if (display_list_builder_) { auto rect = tonic::Float64List(rect_handle); - SkRect bounds = builder()->getDestinationClipBounds(); + SkRect bounds = builder()->GetDestinationClipBounds(); rect[0] = bounds.fLeft; rect[1] = bounds.fTop; rect[2] = bounds.fRight; @@ -198,7 +200,7 @@ void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) { void Canvas::getLocalClipBounds(Dart_Handle rect_handle) { if (display_list_builder_) { auto rect = tonic::Float64List(rect_handle); - SkRect bounds = builder()->getLocalClipBounds(); + SkRect bounds = builder()->GetLocalClipBounds(); rect[0] = bounds.fLeft; rect[1] = bounds.fTop; rect[2] = bounds.fRight; @@ -481,7 +483,7 @@ void Canvas::drawPicture(Picture* picture) { void Canvas::drawPoints(Dart_Handle paint_objects, Dart_Handle paint_data, - SkCanvas::PointMode point_mode, + DlCanvas::PointMode point_mode, const tonic::Float32List& points) { Paint paint(paint_objects, paint_data); @@ -491,13 +493,13 @@ void Canvas::drawPoints(Dart_Handle paint_objects, FML_DCHECK(paint.isNotNull()); if (display_list_builder_) { switch (point_mode) { - case SkCanvas::kPoints_PointMode: + case DlCanvas::PointMode::kPoints: paint.sync_to(builder(), kDrawPointsAsPointsFlags); break; - case SkCanvas::kLines_PointMode: + case DlCanvas::PointMode::kLines: paint.sync_to(builder(), kDrawPointsAsLinesFlags); break; - case SkCanvas::kPolygon_PointMode: + case DlCanvas::PointMode::kPolygon: paint.sync_to(builder(), kDrawPointsAsPolygonFlags); break; } diff --git a/lib/ui/painting/canvas.h b/lib/ui/painting/canvas.h index f953a31687e47..b431e15c92940 100644 --- a/lib/ui/painting/canvas.h +++ b/lib/ui/painting/canvas.h @@ -58,7 +58,7 @@ class Canvas : public RefCountedDartWrappable, DisplayListOpFlags { double top, double right, double bottom, - SkClipOp clipOp, + DlCanvas::ClipOp clipOp, bool doAntiAlias = true); void clipRRect(const RRect& rrect, bool doAntiAlias = true); void clipPath(const CanvasPath* path, bool doAntiAlias = true); @@ -161,7 +161,7 @@ class Canvas : public RefCountedDartWrappable, DisplayListOpFlags { void drawPoints(Dart_Handle paint_objects, Dart_Handle paint_data, - SkCanvas::PointMode point_mode, + DlCanvas::PointMode point_mode, const tonic::Float32List& points); void drawVertices(const Vertices* vertices, diff --git a/lib/ui/painting/display_list_deferred_image_gpu_skia.cc b/lib/ui/painting/display_list_deferred_image_gpu_skia.cc index 14874c2133c0e..8b8dfd6fc791e 100644 --- a/lib/ui/painting/display_list_deferred_image_gpu_skia.cc +++ b/lib/ui/painting/display_list_deferred_image_gpu_skia.cc @@ -81,9 +81,9 @@ SkISize DlDeferredImageGPUSkia::dimensions() const { // |DlImage| size_t DlDeferredImageGPUSkia::GetApproximateByteSize() const { - return sizeof(this) + (image_wrapper_ - ? image_wrapper_->image_info().computeMinByteSize() - : 0); + return sizeof(*this) + + (image_wrapper_ ? image_wrapper_->image_info().computeMinByteSize() + : 0); } std::optional DlDeferredImageGPUSkia::get_error() const { diff --git a/lib/ui/painting/display_list_image_gpu.cc b/lib/ui/painting/display_list_image_gpu.cc index ff52840568cf1..ce69f06a15007 100644 --- a/lib/ui/painting/display_list_image_gpu.cc +++ b/lib/ui/painting/display_list_image_gpu.cc @@ -53,10 +53,10 @@ SkISize DlImageGPU::dimensions() const { // |DlImage| size_t DlImageGPU::GetApproximateByteSize() const { - auto size = sizeof(this); + auto size = sizeof(*this); if (auto image = skia_image()) { const auto& info = image->imageInfo(); - const auto kMipmapOverhead = 4.0 / 3.0; + const auto kMipmapOverhead = image->hasMipmaps() ? 4.0 / 3.0 : 1.0; const size_t image_byte_size = info.computeMinByteSize() * kMipmapOverhead; size += image_byte_size; } diff --git a/shell/common/canvas_spy.cc b/shell/common/canvas_spy.cc index 592b686b20628..0f9dee034fa53 100644 --- a/shell/common/canvas_spy.cc +++ b/shell/common/canvas_spy.cc @@ -14,12 +14,17 @@ CanvasSpy::CanvasSpy(SkCanvas* target_canvas) { canvas_size.height()); n_way_canvas_->addCanvas(target_canvas); n_way_canvas_->addCanvas(did_draw_canvas_.get()); + adapter_.set_canvas(n_way_canvas_.get()); } -SkCanvas* CanvasSpy::GetSpyingCanvas() { - return n_way_canvas_.get(); +DlCanvas* CanvasSpy::GetSpyingCanvas() { + return &adapter_; } +SkCanvas* CanvasSpy::GetRawSpyingCanvas() { + return n_way_canvas_.get(); +}; + DidDrawCanvas::DidDrawCanvas(int width, int height) : SkCanvasVirtualEnforcer(width, height) {} diff --git a/shell/common/canvas_spy.h b/shell/common/canvas_spy.h index ed9b5e0728c98..4bfaef4c7400c 100644 --- a/shell/common/canvas_spy.h +++ b/shell/common/canvas_spy.h @@ -3,6 +3,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/skia/dl_sk_canvas.h" #include "flutter/fml/macros.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvasVirtualEnforcer.h" @@ -39,11 +40,17 @@ class CanvasSpy { /// @brief The returned canvas delegate all operations to the target /// canvas /// while spying on them. - SkCanvas* GetSpyingCanvas(); + DlCanvas* GetSpyingCanvas(); + + //---------------------------------------------------------------------------- + /// @brief The underlying Skia canvas that implements the spying + /// (mainly for testing) + SkCanvas* GetRawSpyingCanvas(); private: std::unique_ptr n_way_canvas_; std::unique_ptr did_draw_canvas_; + DlSkCanvasAdapter adapter_; FML_DISALLOW_COPY_AND_ASSIGN(CanvasSpy); }; diff --git a/shell/common/canvas_spy_unittests.cc b/shell/common/canvas_spy_unittests.cc index e499666c47c48..4c819b0d52331 100644 --- a/shell/common/canvas_spy_unittests.cc +++ b/shell/common/canvas_spy_unittests.cc @@ -15,16 +15,16 @@ TEST(CanvasSpyTest, DrawingIsTracked) { SkPictureRecorder picture_recorder; SkCanvas* canvas = picture_recorder.beginRecording(100, 100); CanvasSpy canvas_spy = CanvasSpy(canvas); - SkCanvas* spy = canvas_spy.GetSpyingCanvas(); + DlCanvas* spy = canvas_spy.GetSpyingCanvas(); ASSERT_FALSE(canvas_spy.DidDrawIntoCanvas()); - spy->translate(128, 128); - spy->clear(SK_ColorTRANSPARENT); + spy->Translate(128, 128); + spy->Clear(DlColor::kTransparent()); ASSERT_FALSE(canvas_spy.DidDrawIntoCanvas()); - SkPaint paint; - spy->drawCircle(0, 0, 60, paint); + DlPaint paint; + spy->DrawCircle({0, 0}, 60, paint); ASSERT_TRUE(canvas_spy.DidDrawIntoCanvas()); } @@ -38,7 +38,7 @@ TEST(CanvasSpyTest, SpiedCanvasIsDrawing) { SkCanvas* expected_canvas = expected_surface->getCanvas(); CanvasSpy canvas_spy = CanvasSpy(actual_canvas); - SkCanvas* spy = canvas_spy.GetSpyingCanvas(); + SkCanvas* spy = canvas_spy.GetRawSpyingCanvas(); SkNWayCanvas multi_canvas = SkNWayCanvas(100, 100); multi_canvas.addCanvas(spy); diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index f301e43947c90..734dbebf2b62e 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -494,7 +494,7 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( compositor_context_->ui_time().SetLapTime( frame_timings_recorder.GetBuildDuration()); - SkCanvas* embedder_root_canvas = nullptr; + DlCanvas* embedder_root_canvas = nullptr; if (external_view_embedder_) { FML_DCHECK(!external_view_embedder_->GetUsedThisFrame()); external_view_embedder_->SetUsedThisFrame(true); @@ -524,7 +524,7 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( embedder_root_canvas ? SkMatrix{} : surface_->GetRootTransformation(); auto root_surface_canvas = - embedder_root_canvas ? embedder_root_canvas : frame->SkiaCanvas(); + embedder_root_canvas ? embedder_root_canvas : frame->Canvas(); auto compositor_frame = compositor_context_->AcquireFrame( surface_->GetContext(), // skia GrContext @@ -630,12 +630,13 @@ static sk_sp ScreenshotLayerTreeAsPicture( SkMatrix root_surface_transformation; root_surface_transformation.reset(); + DlSkCanvasAdapter canvas(recorder.getRecordingCanvas()); // TODO(amirh): figure out how to take a screenshot with embedded UIView. // https://github.com/flutter/flutter/issues/23435 auto frame = compositor_context.AcquireFrame( - nullptr, recorder.getRecordingCanvas(), nullptr, - root_surface_transformation, false, true, nullptr, nullptr, nullptr); + nullptr, &canvas, nullptr, root_surface_transformation, false, true, + nullptr, nullptr, nullptr); frame->Raster(*tree, true, nullptr); #if defined(OS_FUCHSIA) @@ -694,9 +695,9 @@ sk_sp Rasterizer::ScreenshotLayerTreeAsImage( nullptr, // display list builder nullptr // aiks context ); - canvas->clear(SK_ColorTRANSPARENT); + canvas->Clear(DlColor::kTransparent()); frame->Raster(*tree, true, nullptr); - canvas->flush(); + canvas->Flush(); return snapshot_surface->GetRasterData(compressed); } diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index feb7e29a10fde..6ab77b53401ba 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -56,7 +56,7 @@ class MockSurface : public Surface { class MockExternalViewEmbedder : public ExternalViewEmbedder { public: - MOCK_METHOD0(GetRootCanvas, SkCanvas*()); + MOCK_METHOD0(GetRootCanvas, DlCanvas*()); MOCK_METHOD0(CancelFrame, void()); MOCK_METHOD4(BeginFrame, void(SkISize frame_size, @@ -69,9 +69,7 @@ class MockExternalViewEmbedder : public ExternalViewEmbedder { MOCK_METHOD1(PostPrerollAction, PostPrerollResult( fml::RefPtr raster_thread_merger)); - MOCK_METHOD0(GetCurrentCanvases, std::vector()); - MOCK_METHOD0(GetCurrentBuilders, std::vector()); - MOCK_METHOD1(CompositeEmbeddedView, EmbedderPaintContext(int64_t view_id)); + MOCK_METHOD1(CompositeEmbeddedView, DlCanvas*(int64_t view_id)); MOCK_METHOD2(SubmitFrame, void(GrDirectContext* context, std::unique_ptr frame)); @@ -161,7 +159,7 @@ TEST(RasterizerTest, auto surface_frame = std::make_unique( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -230,7 +228,7 @@ TEST( framebuffer_info.supports_readback = true; auto surface_frame = std::make_unique( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -300,7 +298,7 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); EXPECT_CALL(*surface, AcquireFrame(SkISize())) @@ -367,11 +365,11 @@ TEST(RasterizerTest, auto surface_frame1 = std::make_unique( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_frame2 = std::make_unique( /*surface=*/nullptr, framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()) .WillRepeatedly(Return(true)); @@ -588,7 +586,7 @@ TEST(RasterizerTest, framebuffer_info.supports_readback = true; auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); ON_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -645,7 +643,7 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(true)); ON_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -703,7 +701,7 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(false)); EXPECT_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -760,7 +758,7 @@ TEST( auto surface_frame = std::make_unique( /*surface=*/nullptr, /*framebuffer_info=*/framebuffer_info, - /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*submit_callback=*/[](const SurfaceFrame&, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); EXPECT_CALL(*surface, AllowsDrawingWhenGpuDisabled()).WillOnce(Return(false)); EXPECT_CALL(delegate, GetIsGpuDisabledSyncSwitch()) @@ -877,7 +875,7 @@ TEST(RasterizerTest, return std::make_unique( /*surface=*/nullptr, framebuffer_info, /*submit_callback=*/ - [](const SurfaceFrame& frame, SkCanvas*) { return true; }, + [](const SurfaceFrame& frame, DlCanvas*) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); })); ON_CALL(*surface, MakeRenderContextCurrent()) @@ -1057,7 +1055,7 @@ TEST(RasterizerTest, presentationTimeSetWhenVsyncTargetInFuture) { return std::make_unique( /*surface=*/nullptr, framebuffer_info, /*submit_callback=*/ - [&](const SurfaceFrame& frame, SkCanvas*) { + [&](const SurfaceFrame& frame, DlCanvas*) { const auto pres_time = *frame.submit_info().presentation_time; const auto diff = pres_time - first_timestamp; int num_frames_submitted = frames_submitted++; @@ -1140,7 +1138,7 @@ TEST(RasterizerTest, presentationTimeNotSetWhenVsyncTargetInPast) { return std::make_unique( /*surface=*/nullptr, framebuffer_info, /*submit_callback=*/ - [&](const SurfaceFrame& frame, SkCanvas*) { + [&](const SurfaceFrame& frame, DlCanvas*) { const std::optional pres_time = frame.submit_info().presentation_time; EXPECT_EQ(pres_time, std::nullopt); diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 16f92d0ef6e14..32088661e94a3 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -56,11 +56,7 @@ void ShellTestExternalViewEmbedder::PrerollCompositeEmbeddedView( std::unique_ptr params) { SkRect view_bounds = SkRect::Make(frame_size_); std::unique_ptr view; - if (params->display_list_enabled()) { - view = std::make_unique(view_bounds); - } else { - view = std::make_unique(view_bounds); - } + view = std::make_unique(view_bounds); slices_.insert_or_assign(view_id, std::move(view)); } @@ -71,17 +67,6 @@ PostPrerollResult ShellTestExternalViewEmbedder::PostPrerollAction( return post_preroll_result_; } -// |ExternalViewEmbedder| -std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { - return {}; -} - -// |ExternalViewEmbedder| -std::vector -ShellTestExternalViewEmbedder::GetCurrentBuilders() { - return {}; -} - // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); @@ -99,9 +84,9 @@ void ShellTestExternalViewEmbedder::PushFilterToVisitedPlatformViews( } } -EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( +DlCanvas* ShellTestExternalViewEmbedder::CompositeEmbeddedView( int64_t view_id) { - return {slices_[view_id]->canvas(), slices_[view_id]->builder()}; + return slices_[view_id]->canvas(); } // |ExternalViewEmbedder| @@ -129,7 +114,7 @@ void ShellTestExternalViewEmbedder::EndFrame( } // |ExternalViewEmbedder| -SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { +DlCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { return nullptr; } diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 913c19c281850..204472d5bc050 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -63,13 +63,7 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { fml::RefPtr raster_thread_merger) override; // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; - - // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; @@ -89,7 +83,7 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { fml::RefPtr raster_thread_merger) override; // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; + DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; diff --git a/shell/common/shell_test_platform_view_vulkan.cc b/shell/common/shell_test_platform_view_vulkan.cc index a10fa4790ec65..210bd0837a6a1 100644 --- a/shell/common/shell_test_platform_view_vulkan.cc +++ b/shell/common/shell_test_platform_view_vulkan.cc @@ -199,8 +199,8 @@ ShellTestPlatformViewVulkan::OffScreenSurface::AcquireFrame( auto surface = SkSurface::MakeRenderTarget( context_.get(), skgpu::Budgeted::kNo, image_info, 0, nullptr); SurfaceFrame::SubmitCallback callback = [](const SurfaceFrame&, - SkCanvas* canvas) -> bool { - canvas->flush(); + DlCanvas* canvas) -> bool { + canvas->Flush(); return true; }; diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index 2d767835b696b..9f2c492a76946 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -35,11 +35,11 @@ #include "flutter/shell/common/thread_host.h" #include "flutter/shell/common/vsync_waiter_fallback.h" #include "flutter/shell/version/version.h" +#include "flutter/testing/mock_canvas.h" #include "flutter/testing/testing.h" #include "gmock/gmock.h" #include "third_party/rapidjson/include/rapidjson/writer.h" #include "third_party/skia/include/codec/SkCodecAnimation.h" -#include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/tonic/converter/dart_converter.h" #ifdef SHELL_ENABLE_VULKAN @@ -279,10 +279,10 @@ static void PostSync(const fml::RefPtr& task_runner, } static sk_sp MakeSizedDisplayList(int width, int height) { - DisplayListCanvasRecorder recorder(SkRect::MakeXYWH(0, 0, width, height)); - recorder.drawRect(SkRect::MakeXYWH(0, 0, width, height), - SkPaint(SkColor4f::FromColor(SK_ColorRED))); - return recorder.Build(); + DisplayListBuilder builder(SkRect::MakeXYWH(0, 0, width, height)); + builder.DrawRect(SkRect::MakeXYWH(0, 0, width, height), + DlPaint(DlColor::kRed())); + return builder.Build(); } TEST_F(ShellTest, InitializeWithInvalidThreads) { @@ -1835,7 +1835,7 @@ class MockTexture : public Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions&) override {} + const DlImageSampling) override {} void OnGrContextCreated() override {} @@ -2453,11 +2453,11 @@ TEST_F(ShellTest, OnServiceProtocolEstimateRasterCacheMemoryWorks) { // 2.1. Rasterize the picture. Call Draw multiple times to pass the // access threshold (default to 3) so a cache can be generated. - SkCanvas dummy_canvas; - SkPaint paint; + MockCanvas dummy_canvas; + DlPaint paint; bool picture_cache_generated; DisplayListRasterCacheItem display_list_raster_cache_item( - display_list.get(), SkPoint(), true, false); + display_list, SkPoint(), true, false); for (int i = 0; i < 4; i += 1) { SkMatrix matrix = SkMatrix::I(); state_stack.set_preroll_delegate(matrix); @@ -2496,8 +2496,8 @@ TEST_F(ShellTest, OnServiceProtocolEstimateRasterCacheMemoryWorks) { rapidjson::Writer writer(buffer); document.Accept(writer); std::string expected_json = - "{\"type\":\"EstimateRasterCacheMemory\",\"layerBytes\":40000,\"picture" - "Bytes\":400}"; + "{\"type\":\"EstimateRasterCacheMemory\",\"layerBytes\":40024,\"picture" + "Bytes\":424}"; std::string actual_json = buffer.GetString(); ASSERT_EQ(actual_json, expected_json); diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index e5d6a8324a0d5..2a7386613c781 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/shell/gpu/gpu_surface_gl_impeller.cc @@ -92,7 +92,7 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( fml::MakeCopyable([renderer = impeller_renderer_, // aiks_context = aiks_context_, // surface = std::move(surface) // - ](SurfaceFrame& surface_frame, SkCanvas* canvas) mutable -> bool { + ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; } diff --git a/shell/gpu/gpu_surface_gl_skia.cc b/shell/gpu/gpu_surface_gl_skia.cc index 01be975ee831a..cdd8a24455d9f 100644 --- a/shell/gpu/gpu_surface_gl_skia.cc +++ b/shell/gpu/gpu_surface_gl_skia.cc @@ -227,7 +227,7 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( framebuffer_info.supports_readback = true; return std::make_unique( nullptr, framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, size); @@ -245,7 +245,7 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( surface->getCanvas()->setMatrix(root_surface_transformation); SurfaceFrame::SubmitCallback submit_callback = [weak = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame, - SkCanvas* canvas) { + DlCanvas* canvas) { return weak ? weak->PresentSurface(surface_frame, canvas) : false; }; @@ -259,7 +259,7 @@ std::unique_ptr GPUSurfaceGLSkia::AcquireFrame( } bool GPUSurfaceGLSkia::PresentSurface(const SurfaceFrame& frame, - SkCanvas* canvas) { + DlCanvas* canvas) { if (delegate_ == nullptr || canvas == nullptr || context_ == nullptr) { return false; } diff --git a/shell/gpu/gpu_surface_gl_skia.h b/shell/gpu/gpu_surface_gl_skia.h index 8e69f1f9cd945..6aef2096f94df 100644 --- a/shell/gpu/gpu_surface_gl_skia.h +++ b/shell/gpu/gpu_surface_gl_skia.h @@ -62,7 +62,7 @@ class GPUSurfaceGLSkia : public Surface { const SkISize& untransformed_size, const SkMatrix& root_surface_transformation); - bool PresentSurface(const SurfaceFrame& frame, SkCanvas* canvas); + bool PresentSurface(const SurfaceFrame& frame, DlCanvas* canvas); GPUSurfaceGLDelegate* delegate_; sk_sp context_; diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index b98c2be0abab5..bad9f26ca780d 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -69,7 +69,7 @@ fml::MakeCopyable([renderer = impeller_renderer_, // aiks_context = aiks_context_, // surface = std::move(surface) // - ](SurfaceFrame& surface_frame, SkCanvas* canvas) mutable -> bool { + ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; } diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index d61931ce0688f..4f625a9e724a8 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -99,7 +99,7 @@ if (!render_to_surface_) { return std::make_unique( nullptr, SurfaceFrame::FramebufferInfo(), - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { return true; }, frame_size); + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, frame_size); } PrecompileKnownSkSLsIfNecessary(); @@ -150,7 +150,7 @@ } auto submit_callback = [this, drawable](const SurfaceFrame& surface_frame, - SkCanvas* canvas) -> bool { + DlCanvas* canvas) -> bool { TRACE_EVENT0("flutter", "GPUSurfaceMetal::Submit"); if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; @@ -159,7 +159,7 @@ { TRACE_EVENT0("flutter", "SkCanvas::Flush"); - canvas->flush(); + canvas->Flush(); } if (!disable_partial_repaint_) { @@ -218,7 +218,7 @@ } auto submit_callback = [texture = texture, delegate = delegate_]( - const SurfaceFrame& surface_frame, SkCanvas* canvas) -> bool { + const SurfaceFrame& surface_frame, DlCanvas* canvas) -> bool { TRACE_EVENT0("flutter", "GPUSurfaceMetal::PresentTexture"); if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; @@ -227,7 +227,7 @@ { TRACE_EVENT0("flutter", "SkCanvas::Flush"); - canvas->flush(); + canvas->Flush(); } return delegate->PresentTexture(texture); diff --git a/shell/gpu/gpu_surface_software.cc b/shell/gpu/gpu_surface_software.cc index f72f2d4f8822b..efb905ba24ecb 100644 --- a/shell/gpu/gpu_surface_software.cc +++ b/shell/gpu/gpu_surface_software.cc @@ -36,7 +36,7 @@ std::unique_ptr GPUSurfaceSoftware::AcquireFrame( if (!render_to_surface_) { return std::make_unique( nullptr, framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, logical_size); @@ -66,13 +66,13 @@ std::unique_ptr GPUSurfaceSoftware::AcquireFrame( SurfaceFrame::SubmitCallback on_submit = [self = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame, - SkCanvas* canvas) -> bool { + DlCanvas* canvas) -> bool { // If the surface itself went away, there is nothing more to do. if (!self || !self->IsValid() || canvas == nullptr) { return false; } - canvas->flush(); + canvas->Flush(); return self->delegate_->PresentBackingStore(surface_frame.SkiaSurface()); }; diff --git a/shell/gpu/gpu_surface_vulkan.cc b/shell/gpu/gpu_surface_vulkan.cc index da2131c4f7cbc..ac5298a17b96b 100644 --- a/shell/gpu/gpu_surface_vulkan.cc +++ b/shell/gpu/gpu_surface_vulkan.cc @@ -43,7 +43,7 @@ std::unique_ptr GPUSurfaceVulkan::AcquireFrame( if (!render_to_surface_) { return std::make_unique( nullptr, SurfaceFrame::FramebufferInfo(), - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, frame_size); @@ -65,14 +65,14 @@ std::unique_ptr GPUSurfaceVulkan::AcquireFrame( SurfaceFrame::SubmitCallback callback = [image = image, delegate = delegate_]( const SurfaceFrame&, - SkCanvas* canvas) -> bool { + DlCanvas* canvas) -> bool { TRACE_EVENT0("flutter", "GPUSurfaceVulkan::PresentImage"); if (canvas == nullptr) { FML_DLOG(ERROR) << "Canvas not available."; return false; } - canvas->flush(); + canvas->Flush(); return delegate->PresentImage(reinterpret_cast(image.image), static_cast(image.format)); diff --git a/shell/gpu/gpu_surface_vulkan_impeller.cc b/shell/gpu/gpu_surface_vulkan_impeller.cc index 6717c3f8b1c3f..8797cdf34c821 100644 --- a/shell/gpu/gpu_surface_vulkan_impeller.cc +++ b/shell/gpu/gpu_surface_vulkan_impeller.cc @@ -71,7 +71,7 @@ std::unique_ptr GPUSurfaceVulkanImpeller::AcquireFrame( fml::MakeCopyable([renderer = impeller_renderer_, // aiks_context = aiks_context_, // surface = std::move(surface) // - ](SurfaceFrame& surface_frame, SkCanvas* canvas) mutable -> bool { + ](SurfaceFrame& surface_frame, DlCanvas* canvas) mutable -> bool { if (!aiks_context) { return false; } diff --git a/shell/platform/android/android_external_texture_gl.cc b/shell/platform/android/android_external_texture_gl.cc index 03c03a5c327ec..465c672092441 100644 --- a/shell/platform/android/android_external_texture_gl.cc +++ b/shell/platform/android/android_external_texture_gl.cc @@ -8,6 +8,7 @@ #include +#include "flutter/display_list/display_list_color_source.h" #include "third_party/skia/include/core/SkAlphaType.h" #include "third_party/skia/include/core/SkColorSpace.h" #include "third_party/skia/include/core/SkColorType.h" @@ -43,7 +44,7 @@ void AndroidExternalTextureGL::MarkNewFrameAvailable() { void AndroidExternalTextureGL::Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) { + const DlImageSampling sampling) { if (state_ == AttachmentState::detached) { return; } @@ -63,26 +64,27 @@ void AndroidExternalTextureGL::Paint(PaintContext& context, context.gr_context, backendTexture, kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); if (image) { - SkAutoCanvasRestore autoRestore(context.canvas, true); + DlAutoCanvasRestore autoRestore(context.canvas, true); // The incoming texture is vertically flipped, so we flip it // back. OpenGL's coordinate system has Positive Y equivalent to up, while // Skia's coordinate system has Negative Y equvalent to up. - context.canvas->translate(bounds.x(), bounds.y() + bounds.height()); - context.canvas->scale(bounds.width(), -bounds.height()); + context.canvas->Translate(bounds.x(), bounds.y() + bounds.height()); + context.canvas->Scale(bounds.width(), -bounds.height()); + auto dl_image = DlImage::Make(image); if (!transform.isIdentity()) { - sk_sp shader = image->makeShader( - SkTileMode::kRepeat, SkTileMode::kRepeat, sampling, transform); + DlImageColorSource source(dl_image, DlTileMode::kRepeat, + DlTileMode::kRepeat, sampling, &transform); - SkPaint paintWithShader; - if (context.sk_paint) { - paintWithShader = *context.sk_paint; + DlPaint paintWithShader; + if (context.paint) { + paintWithShader = *context.paint; } - paintWithShader.setShader(shader); - context.canvas->drawRect(SkRect::MakeWH(1, 1), paintWithShader); + paintWithShader.setColorSource(&source); + context.canvas->DrawRect(SkRect::MakeWH(1, 1), paintWithShader); } else { - context.canvas->drawImage(image, 0, 0, sampling, context.sk_paint); + context.canvas->DrawImage(dl_image, {0, 0}, sampling, context.paint); } } } diff --git a/shell/platform/android/android_external_texture_gl.h b/shell/platform/android/android_external_texture_gl.h index b2cc8d75f85f8..d1c8f08be3d2b 100644 --- a/shell/platform/android/android_external_texture_gl.h +++ b/shell/platform/android/android_external_texture_gl.h @@ -24,7 +24,7 @@ class AndroidExternalTextureGL : public flutter::Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) override; + const DlImageSampling sampling) override; void OnGrContextCreated() override; 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 8fd8285a158f4..5fd4dd33ff68b 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.cc +++ b/shell/platform/android/external_view_embedder/external_view_embedder.cc @@ -29,11 +29,7 @@ void AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView( SkRect view_bounds = SkRect::Make(frame_size_); std::unique_ptr view; - if (params->display_list_enabled()) { - view = std::make_unique(view_bounds); - } else { - view = std::make_unique(view_bounds); - } + view = std::make_unique(view_bounds); slices_.insert_or_assign(view_id, std::move(view)); composition_order_.push_back(view_id); @@ -46,37 +42,11 @@ void AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView( } // |ExternalViewEmbedder| -EmbedderPaintContext AndroidExternalViewEmbedder::CompositeEmbeddedView( - int64_t view_id) { +DlCanvas* AndroidExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) { if (slices_.count(view_id) == 1) { - return {slices_.at(view_id)->canvas(), slices_.at(view_id)->builder()}; - } - return {nullptr, nullptr}; -} - -// |ExternalViewEmbedder| -std::vector AndroidExternalViewEmbedder::GetCurrentCanvases() { - std::vector canvases; - for (size_t i = 0; i < composition_order_.size(); i++) { - int64_t view_id = composition_order_[i]; - if (slices_.count(view_id) == 1) { - canvases.push_back(slices_.at(view_id)->canvas()); - } + return slices_.at(view_id)->canvas(); } - return canvases; -} - -// |ExternalViewEmbedder| -std::vector -AndroidExternalViewEmbedder::GetCurrentBuilders() { - std::vector builders; - for (size_t i = 0; i < composition_order_.size(); i++) { - int64_t view_id = composition_order_[i]; - if (slices_.count(view_id) == 1) { - builders.push_back(slices_.at(view_id)->builder()); - } - } - return builders; + return nullptr; } SkRect AndroidExternalViewEmbedder::GetViewRect(int64_t view_id) const { @@ -103,13 +73,13 @@ void AndroidExternalViewEmbedder::SubmitFrame( } std::unordered_map overlay_layers; - SkCanvas* background_canvas = frame->SkiaCanvas(); + DlCanvas* background_canvas = frame->Canvas(); DisplayListBuilder* background_builder = frame->GetDisplayListBuilder().get(); auto current_frame_view_count = composition_order_.size(); // Restore the clip context after exiting this method since it's changed // below. - SkAutoCanvasRestore save(background_canvas, /*doSave=*/true); + DlAutoCanvasRestore save(background_canvas, /*doSave=*/true); for (size_t i = 0; i < current_frame_view_count; i++) { int64_t view_id = composition_order_[i]; @@ -161,7 +131,8 @@ void AndroidExternalViewEmbedder::SubmitFrame( overlay_layers.insert({view_id, full_joined_rect}); // Clip the background canvas, so it doesn't contain any of the pixels // drawn on the overlay layer. - background_canvas->clipRect(full_joined_rect, SkClipOp::kDifference); + background_canvas->ClipRect(full_joined_rect, + DlCanvas::ClipOp::kDifference); } if (background_builder) { slice->render_into(background_builder); @@ -170,8 +141,8 @@ void AndroidExternalViewEmbedder::SubmitFrame( } } - // Manually trigger the SkAutoCanvasRestore before we submit the frame - save.restore(); + // Manually trigger the DlAutoCanvasRestore before we submit the frame + save.Restore(); // Submit the background canvas frame before switching the GL context to // the overlay surfaces. @@ -234,11 +205,11 @@ AndroidExternalViewEmbedder::CreateSurfaceIfNeeded(GrDirectContext* context, rect.width(), // rect.height() // ); - SkCanvas* overlay_canvas = frame->SkiaCanvas(); - overlay_canvas->clear(SK_ColorTRANSPARENT); + DlCanvas* overlay_canvas = frame->Canvas(); + overlay_canvas->Clear(DlColor::kTransparent()); // Offset the picture since its absolute position on the scene is determined // by the position of the overlay view. - overlay_canvas->translate(-rect.x(), -rect.y()); + overlay_canvas->Translate(-rect.x(), -rect.y()); if (frame->GetDisplayListBuilder()) { slice->render_into(frame->GetDisplayListBuilder().get()); } else { @@ -280,7 +251,7 @@ bool AndroidExternalViewEmbedder::FrameHasPlatformLayers() { } // |ExternalViewEmbedder| -SkCanvas* AndroidExternalViewEmbedder::GetRootCanvas() { +DlCanvas* AndroidExternalViewEmbedder::GetRootCanvas() { // On Android, the root surface is created from the on-screen render target. return nullptr; } 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 c171e4a1b8354..03bae5ecb8e1a 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.h +++ b/shell/platform/android/external_view_embedder/external_view_embedder.h @@ -42,16 +42,7 @@ class AndroidExternalViewEmbedder final : public ExternalViewEmbedder { std::unique_ptr params) override; // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; - - // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - // Similar call to GetCurrentCanvases but will return the array of - // builders being used by PlatformViews on platforms that provide - // optional DisplayListBuilder objects for rendering. - std::vector GetCurrentBuilders() override; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| void SubmitFrame(GrDirectContext* context, @@ -62,7 +53,7 @@ class AndroidExternalViewEmbedder final : public ExternalViewEmbedder { fml::RefPtr raster_thread_merger) override; // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; + DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| void BeginFrame( 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 76e0115c896de..b9c527b16c710 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 @@ -104,76 +104,20 @@ TaskRunners GetTaskRunnersForFixture() { }; } -TEST(AndroidExternalViewEmbedder, GetCurrentCanvases) { - auto jni_mock = std::make_shared(); - - auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware); - auto embedder = std::make_unique( - android_context, jni_mock, nullptr, GetTaskRunnersForFixture()); - fml::Thread rasterizer_thread("rasterizer"); - auto raster_thread_merger = - GetThreadMergerFromPlatformThread(&rasterizer_thread); - - EXPECT_CALL(*jni_mock, FlutterViewBeginFrame()); - embedder->BeginFrame(SkISize::Make(10, 20), nullptr, 1.0, - raster_thread_merger); - - embedder->PrerollCompositeEmbeddedView( - 0, std::make_unique()); - embedder->PrerollCompositeEmbeddedView( - 1, std::make_unique()); - - auto canvases = embedder->GetCurrentCanvases(); - ASSERT_EQ(2UL, canvases.size()); - ASSERT_EQ(SkISize::Make(10, 20), canvases[0]->getBaseLayerSize()); - ASSERT_EQ(SkISize::Make(10, 20), canvases[1]->getBaseLayerSize()); - - auto builders = embedder->GetCurrentBuilders(); - ASSERT_EQ(2UL, builders.size()); -} - -TEST(AndroidExternalViewEmbedder, GetCurrentCanvasesCompositeOrder) { - auto jni_mock = std::make_shared(); - - auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware); - auto embedder = std::make_unique( - android_context, jni_mock, nullptr, GetTaskRunnersForFixture()); - fml::Thread rasterizer_thread("rasterizer"); - auto raster_thread_merger = - GetThreadMergerFromPlatformThread(&rasterizer_thread); - - EXPECT_CALL(*jni_mock, FlutterViewBeginFrame()); - embedder->BeginFrame(SkISize::Make(10, 20), nullptr, 1.0, - raster_thread_merger); - - embedder->PrerollCompositeEmbeddedView( - 0, std::make_unique()); - embedder->PrerollCompositeEmbeddedView( - 1, std::make_unique()); - - auto canvases = embedder->GetCurrentCanvases(); - ASSERT_EQ(2UL, canvases.size()); - ASSERT_EQ(embedder->CompositeEmbeddedView(0).canvas, canvases[0]); - ASSERT_EQ(embedder->CompositeEmbeddedView(1).canvas, canvases[1]); - - auto builders = embedder->GetCurrentBuilders(); - ASSERT_EQ(2UL, builders.size()); -} - TEST(AndroidExternalViewEmbedder, CompositeEmbeddedView) { auto android_context = AndroidContext(AndroidRenderingAPI::kSoftware); auto embedder = std::make_unique( android_context, nullptr, nullptr, GetTaskRunnersForFixture()); - ASSERT_EQ(nullptr, embedder->CompositeEmbeddedView(0).canvas); + ASSERT_EQ(nullptr, embedder->CompositeEmbeddedView(0)); embedder->PrerollCompositeEmbeddedView( 0, std::make_unique()); - ASSERT_NE(nullptr, embedder->CompositeEmbeddedView(0).canvas); + ASSERT_NE(nullptr, embedder->CompositeEmbeddedView(0)); - ASSERT_EQ(nullptr, embedder->CompositeEmbeddedView(1).canvas); + ASSERT_EQ(nullptr, embedder->CompositeEmbeddedView(1)); embedder->PrerollCompositeEmbeddedView( 1, std::make_unique()); - ASSERT_NE(nullptr, embedder->CompositeEmbeddedView(1).canvas); + ASSERT_NE(nullptr, embedder->CompositeEmbeddedView(1)); } TEST(AndroidExternalViewEmbedder, CancelFrame) { @@ -185,11 +129,7 @@ TEST(AndroidExternalViewEmbedder, CancelFrame) { 0, std::make_unique()); embedder->CancelFrame(); - auto canvases = embedder->GetCurrentCanvases(); - ASSERT_EQ(0UL, canvases.size()); - - auto builders = embedder->GetCurrentBuilders(); - ASSERT_EQ(0UL, builders.size()); + ASSERT_EQ(embedder->CompositeEmbeddedView(0), nullptr); } TEST(AndroidExternalViewEmbedder, RasterizerRunsOnPlatformThread) { @@ -327,13 +267,13 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); auto surface_frame_2 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -366,7 +306,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, [&did_submit_frame](const SurfaceFrame& surface_frame, - SkCanvas* canvas) mutable { + DlCanvas* canvas) mutable { if (canvas != nullptr) { did_submit_frame = true; } @@ -406,17 +346,17 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1)); // This is the recording canvas flow writes to. - auto canvas_1 = embedder->CompositeEmbeddedView(0).canvas; + auto canvas_1 = embedder->CompositeEmbeddedView(0); - auto rect_paint = SkPaint(); - rect_paint.setColor(SkColors::kCyan); - rect_paint.setStyle(SkPaint::Style::kFill_Style); + auto rect_paint = DlPaint(); + rect_paint.setColor(DlColor::kCyan()); + rect_paint.setDrawStyle(DlDrawStyle::kFill); // This simulates Flutter UI that doesn't intersect with the Android view. - canvas_1->drawRect(SkRect::MakeXYWH(0, 0, 50, 50), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(0, 0, 50, 50), rect_paint); // This simulates Flutter UI that intersects with the Android view. - canvas_1->drawRect(SkRect::MakeXYWH(50, 50, 200, 200), rect_paint); - canvas_1->drawRect(SkRect::MakeXYWH(150, 150, 100, 100), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(50, 50, 200, 200), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(150, 150, 100, 100), rect_paint); // Create a new overlay surface. EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -434,7 +374,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, [&did_submit_frame](const SurfaceFrame& surface_frame, - SkCanvas* canvas) mutable { + DlCanvas* canvas) mutable { if (canvas != nullptr) { did_submit_frame = true; } @@ -474,17 +414,17 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1)); // This is the recording canvas flow writes to. - auto canvas_1 = embedder->CompositeEmbeddedView(0).canvas; + auto canvas_1 = embedder->CompositeEmbeddedView(0); - auto rect_paint = SkPaint(); - rect_paint.setColor(SkColors::kCyan); - rect_paint.setStyle(SkPaint::Style::kFill_Style); + auto rect_paint = DlPaint(); + rect_paint.setColor(DlColor::kCyan()); + rect_paint.setDrawStyle(DlDrawStyle::kFill); // This simulates Flutter UI that doesn't intersect with the Android view. - canvas_1->drawRect(SkRect::MakeXYWH(0, 0, 50, 50), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(0, 0, 50, 50), rect_paint); // This simulates Flutter UI that intersects with the Android view. - canvas_1->drawRect(SkRect::MakeXYWH(50, 50, 200, 200), rect_paint); - canvas_1->drawRect(SkRect::MakeXYWH(150, 150, 100, 100), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(50, 50, 200, 200), rect_paint); + canvas_1->DrawRect(SkRect::MakeXYWH(150, 150, 100, 100), rect_paint); // Don't create a new overlay surface since it's recycled from the first // frame. @@ -500,7 +440,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, [&did_submit_frame](const SurfaceFrame& surface_frame, - SkCanvas* canvas) mutable { + DlCanvas* canvas) mutable { if (canvas != nullptr) { did_submit_frame = true; } @@ -535,7 +475,7 @@ TEST(AndroidExternalViewEmbedder, OverlayCoverTwoPlatformViews) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -586,15 +526,15 @@ TEST(AndroidExternalViewEmbedder, OverlayCoverTwoPlatformViews) { EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView( 1, 300, 100, 100, 100, 150, 150, stack)); } - auto rect_paint = SkPaint(); - rect_paint.setColor(SkColors::kCyan); - rect_paint.setStyle(SkPaint::Style::kFill_Style); + auto rect_paint = DlPaint(); + rect_paint.setColor(DlColor::kCyan()); + rect_paint.setDrawStyle(DlDrawStyle::kFill); // This simulates Flutter UI that intersects with the two Android views. // Since we will compute the intersection for each android view in turn, and // finally merge The final size of the overlay will be smaller than the // width and height of the rect. - embedder->CompositeEmbeddedView(1).canvas->drawRect( + embedder->CompositeEmbeddedView(1)->DrawRect( SkRect::MakeXYWH(150, 50, 200, 200), rect_paint); EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -610,7 +550,7 @@ TEST(AndroidExternalViewEmbedder, OverlayCoverTwoPlatformViews) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) mutable { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -634,7 +574,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -675,12 +615,12 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { 300, 300, stack)); } - auto rect_paint = SkPaint(); - rect_paint.setColor(SkColors::kCyan); - rect_paint.setStyle(SkPaint::Style::kFill_Style); + auto rect_paint = DlPaint(); + rect_paint.setColor(DlColor::kCyan()); + rect_paint.setDrawStyle(DlDrawStyle::kFill); // This simulates Flutter UI that intersects with the first Android view. - embedder->CompositeEmbeddedView(0).canvas->drawRect( + embedder->CompositeEmbeddedView(0)->DrawRect( SkRect::MakeXYWH(25, 25, 80, 150), rect_paint); { @@ -697,10 +637,10 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { } // This simulates Flutter UI that intersects with the first and second Android // views. - embedder->CompositeEmbeddedView(1).canvas->drawRect( - SkRect::MakeXYWH(25, 25, 80, 50), rect_paint); + embedder->CompositeEmbeddedView(1)->DrawRect(SkRect::MakeXYWH(25, 25, 80, 50), + rect_paint); - embedder->CompositeEmbeddedView(1).canvas->drawRect( + embedder->CompositeEmbeddedView(1)->DrawRect( SkRect::MakeXYWH(75, 75, 30, 100), rect_paint); EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -714,7 +654,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFrameOverlayComposition) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) mutable { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -738,7 +678,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFramePlatformViewWithoutAnyOverlay) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -783,7 +723,7 @@ TEST(AndroidExternalViewEmbedder, SubmitFramePlatformViewWithoutAnyOverlay) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) mutable { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) mutable { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -827,7 +767,7 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -869,8 +809,8 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) { embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1)); // This simulates Flutter UI that intersects with the Android view. - embedder->CompositeEmbeddedView(0).canvas->drawRect( - SkRect::MakeXYWH(50, 50, 200, 200), SkPaint()); + embedder->CompositeEmbeddedView(0)->DrawRect( + SkRect::MakeXYWH(50, 50, 200, 200), DlPaint()); // Create a new overlay surface. EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -886,7 +826,7 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) { SurfaceFrame::FramebufferInfo framebuffer_info; auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -916,7 +856,7 @@ TEST(AndroidExternalViewEmbedder, DoesNotDestroyOverlayLayersOnSizeChange) { [&android_context, gr_context, window, frame_size, framebuffer_info]() { auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -958,8 +898,8 @@ TEST(AndroidExternalViewEmbedder, DoesNotDestroyOverlayLayersOnSizeChange) { embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1)); // This simulates Flutter UI that intersects with the Android view. - embedder->CompositeEmbeddedView(0).canvas->drawRect( - SkRect::MakeXYWH(50, 50, 200, 200), SkPaint()); + embedder->CompositeEmbeddedView(0)->DrawRect( + SkRect::MakeXYWH(50, 50, 200, 200), DlPaint()); // Create a new overlay surface. EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -974,7 +914,7 @@ TEST(AndroidExternalViewEmbedder, DoesNotDestroyOverlayLayersOnSizeChange) { auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -1042,7 +982,7 @@ TEST(AndroidExternalViewEmbedder, Teardown) { SurfaceFrame::FramebufferInfo framebuffer_info; auto surface_frame_1 = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); @@ -1076,8 +1016,8 @@ TEST(AndroidExternalViewEmbedder, Teardown) { embedder->PrerollCompositeEmbeddedView(0, std::move(view_params)); // This simulates Flutter UI that intersects with the Android view. - embedder->CompositeEmbeddedView(0).canvas->drawRect( - SkRect::MakeXYWH(50, 50, 200, 200), SkPaint()); + embedder->CompositeEmbeddedView(0)->DrawRect( + SkRect::MakeXYWH(50, 50, 200, 200), DlPaint()); // Create a new overlay surface. EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()) @@ -1088,7 +1028,7 @@ TEST(AndroidExternalViewEmbedder, Teardown) { SurfaceFrame::FramebufferInfo framebuffer_info; auto surface_frame = std::make_unique( SkSurface::MakeNull(1000, 1000), framebuffer_info, - [](const SurfaceFrame& surface_frame, SkCanvas* canvas) { return true; }, + [](const SurfaceFrame& surface_frame, DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); embedder->SubmitFrame(gr_context.get(), std::move(surface_frame)); diff --git a/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.h b/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.h index 46fcf8d42ced6..25bc6c6d54d79 100644 --- a/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.h +++ b/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.h @@ -36,7 +36,7 @@ - (void)paintContext:(flutter::Texture::PaintContext&)context bounds:(const SkRect&)bounds freeze:(BOOL)freeze - sampling:(const SkSamplingOptions&)sampling; + sampling:(const flutter::DlImageSampling)sampling; - (void)onGrContextCreated; diff --git a/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.mm b/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.mm index c1e685ab11e3d..6e1cea4c1c7b5 100644 --- a/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.mm +++ b/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.mm @@ -53,7 +53,7 @@ - (void)dealloc { - (void)paintContext:(flutter::Texture::PaintContext&)context bounds:(const SkRect&)bounds freeze:(BOOL)freeze - sampling:(const SkSamplingOptions&)sampling { + sampling:(const flutter::DlImageSampling)sampling { const bool needsUpdatedTexture = (!freeze && _textureFrameAvailable) || !_externalImage; if (needsUpdatedTexture) { @@ -61,25 +61,12 @@ - (void)paintContext:(flutter::Texture::PaintContext&)context } if (_externalImage) { - if (_enableImpeller) { - context.builder->drawImageRect( - _externalImage, // image - SkRect::Make(_externalImage->bounds()), // source rect - bounds, // destination rect - flutter::ToDl(sampling), // sampling - context.dl_paint, // paint - SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint // constraint - ); - return; - } - - context.canvas->drawImageRect( - _externalImage->skia_image(), // image - SkRect::Make(_externalImage->bounds()), // source rect - bounds, // destination rect - sampling, // sampling - context.sk_paint, // paint - SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint // constraint + context.canvas->DrawImageRect(_externalImage, // image + SkRect::Make(_externalImage->bounds()), // source rect + bounds, // destination rect + sampling, // sampling + context.paint, // paint + false // enforce edges ); } } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 7bdf4c0aaec6d..1665024ccf7db 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -388,11 +388,7 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, SkRect view_bounds = SkRect::Make(frame_size_); std::unique_ptr view; - if (params->display_list_enabled()) { - view = std::make_unique(view_bounds); - } else { - view = std::make_unique(view_bounds); - } + view = std::make_unique(view_bounds); slices_.insert_or_assign(view_id, std::move(view)); composition_order_.push_back(view_id); @@ -406,6 +402,10 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, views_to_recomposite_.insert(view_id); } +size_t FlutterPlatformViewsController::EmbeddedViewCount() { + return composition_order_.size(); +} + UIView* FlutterPlatformViewsController::GetPlatformViewByID(int64_t view_id) { if (views_.empty()) { return nil; @@ -422,24 +422,6 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, return -1; } -std::vector FlutterPlatformViewsController::GetCurrentCanvases() { - std::vector canvases; - for (size_t i = 0; i < composition_order_.size(); i++) { - int64_t view_id = composition_order_[i]; - canvases.push_back(slices_[view_id]->canvas()); - } - return canvases; -} - -std::vector FlutterPlatformViewsController::GetCurrentBuilders() { - std::vector builders; - for (size_t i = 0; i < composition_order_.size(); i++) { - int64_t view_id = composition_order_[i]; - builders.push_back(slices_[view_id]->builder()); - } - return builders; -} - int FlutterPlatformViewsController::CountClips(const MutatorsStack& mutators_stack) { std::vector>::const_reverse_iterator iter = mutators_stack.Bottom(); int clipCount = 0; @@ -612,16 +594,16 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, ApplyMutators(mutatorStack, touchInterceptor, rect); } -EmbedderPaintContext FlutterPlatformViewsController::CompositeEmbeddedView(int64_t view_id) { +DlCanvas* FlutterPlatformViewsController::CompositeEmbeddedView(int64_t view_id) { // Any UIKit related code has to run on main thread. FML_DCHECK([[NSThread currentThread] isMainThread]); // Do nothing if the view doesn't need to be composited. if (views_to_recomposite_.count(view_id) == 0) { - return {slices_[view_id]->canvas(), slices_[view_id]->builder()}; + return slices_[view_id]->canvas(); } CompositeWithParams(view_id, current_composition_params_[view_id]); views_to_recomposite_.erase(view_id); - return {slices_[view_id]->canvas(), slices_[view_id]->builder()}; + return slices_[view_id]->canvas(); } void FlutterPlatformViewsController::Reset() { @@ -667,15 +649,14 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, DisposeViews(); - SkCanvas* background_canvas = frame->SkiaCanvas(); - DisplayListBuilder* background_builder = frame->GetDisplayListBuilder().get(); + DlCanvas* background_canvas = frame->Canvas(); // Resolve all pending GPU operations before allocating a new surface. - background_canvas->flush(); + background_canvas->Flush(); // Clipping the background canvas before drawing the picture recorders requires // saving and restoring the clip context. - SkAutoCanvasRestore save(background_canvas, /*doSave=*/true); + DlAutoCanvasRestore save(background_canvas, /*doSave=*/true); // Maps a platform view id to a vector of `FlutterPlatformViewLayer`. LayersMap platform_view_layers; @@ -727,7 +708,7 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, std::ceil(joined_rect.right()), std::ceil(joined_rect.bottom())); // Clip the background canvas, so it doesn't contain any of the pixels drawn // on the overlay layer. - background_canvas->clipRect(joined_rect, SkClipOp::kDifference); + background_canvas->ClipRect(joined_rect, DlCanvas::ClipOp::kDifference); // Get a new host layer. std::shared_ptr layer = GetLayer(gr_context, // ios_context, // @@ -741,15 +722,11 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, overlay_id++; } } - if (background_builder) { - slice->render_into(background_builder); - } else { - slice->render_into(background_canvas); - } + slice->render_into(background_canvas); } // Manually trigger the SkAutoCanvasRestore before we submit the frame - save.restore(); + save.Restore(); // If a layer was allocated in the previous frame, but it's not used in the current frame, // then it can be removed from the scene. @@ -820,17 +797,13 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, if (!frame) { return layer; } - SkCanvas* overlay_canvas = frame->SkiaCanvas(); - int restore_count = overlay_canvas->getSaveCount(); - overlay_canvas->save(); - overlay_canvas->clipRect(rect); - overlay_canvas->clear(SK_ColorTRANSPARENT); - if (frame->GetDisplayListBuilder()) { - slice->render_into(frame->GetDisplayListBuilder().get()); - } else { - slice->render_into(overlay_canvas); - } - overlay_canvas->restoreToCount(restore_count); + DlCanvas* overlay_canvas = frame->Canvas(); + int restore_count = overlay_canvas->GetSaveCount(); + overlay_canvas->Save(); + overlay_canvas->ClipRect(rect); + overlay_canvas->Clear(DlColor::kTransparent()); + slice->render_into(overlay_canvas); + overlay_canvas->RestoreToCount(restore_count); layer->did_submit_last_frame = frame->Submit(); return layer; diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index 2bd834f937a03..5c0c20c2792cf 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -2223,7 +2223,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashin flutter::SurfaceFrame::FramebufferInfo framebuffer_info; auto mock_surface = std::make_unique( nullptr, framebuffer_info, - [](const flutter::SurfaceFrame& surface_frame, SkCanvas* canvas) { return false; }, + [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return false; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertFalse( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); @@ -2234,7 +2234,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashin flutterPlatformViewsController->CompositeEmbeddedView(2); auto mock_surface_submit_true = std::make_unique( nullptr, framebuffer_info, - [](const flutter::SurfaceFrame& surface_frame, SkCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue(flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface_submit_true))); @@ -2321,7 +2321,7 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { arguments:@{@"id" : @0, @"viewType" : @"MockFlutterPlatformView"}], result); - // First frame, |GetCurrentCanvases| is not empty after composite. + // First frame, |EmbeddedViewCount| is not empty after composite. flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300)); flutter::MutatorsStack stack; SkMatrix finalMatrix; @@ -2329,20 +2329,17 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { std::make_unique(finalMatrix, SkSize::Make(300, 300), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1)); flutterPlatformViewsController->CompositeEmbeddedView(0); - XCTAssertEqual(flutterPlatformViewsController->GetCurrentCanvases().size(), 1UL); - XCTAssertEqual(flutterPlatformViewsController->GetCurrentBuilders().size(), 1UL); + XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL); - // Second frame, |GetCurrentCanvases| should be empty at the start + // Second frame, |EmbeddedViewCount| should be empty at the start flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300)); - XCTAssertTrue(flutterPlatformViewsController->GetCurrentCanvases().empty()); - XCTAssertTrue(flutterPlatformViewsController->GetCurrentBuilders().empty()); + XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 0UL); auto embeddedViewParams2 = std::make_unique(finalMatrix, SkSize::Make(300, 300), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams2)); flutterPlatformViewsController->CompositeEmbeddedView(0); - XCTAssertEqual(flutterPlatformViewsController->GetCurrentCanvases().size(), 1UL); - XCTAssertEqual(flutterPlatformViewsController->GetCurrentBuilders().size(), 1UL); + XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL); } - (void)testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectly { @@ -2403,7 +2400,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectly flutter::SurfaceFrame::FramebufferInfo framebuffer_info; auto mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, - [](const flutter::SurfaceFrame& surface_frame, SkCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( @@ -2431,7 +2428,7 @@ - (void)testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectly mock_sk_surface = SkSurface::MakeRaster(image_info); mock_surface = std::make_unique( std::move(mock_sk_surface), framebuffer_info, - [](const flutter::SurfaceFrame& surface_frame, SkCanvas* canvas) { return true; }, + [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; }, /*frame_size=*/SkISize::Make(800, 600)); XCTAssertTrue( flutterPlatformViewsController->SubmitFrame(nullptr, nullptr, std::move(mock_surface))); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index ff8c8630da032..08120c7cd9a32 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -203,6 +203,8 @@ class FlutterPlatformViewsController { void PrerollCompositeEmbeddedView(int64_t view_id, std::unique_ptr params); + size_t EmbeddedViewCount(); + // Returns the `FlutterPlatformView`'s `view` object associated with the view_id. // // If the `FlutterPlatformViewsController` does not contain any `FlutterPlatformView` object or @@ -216,11 +218,7 @@ class FlutterPlatformViewsController { void EndFrame(bool should_resubmit_frame, const fml::RefPtr& raster_thread_merger); - std::vector GetCurrentCanvases(); - - std::vector GetCurrentBuilders(); - - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id); + DlCanvas* CompositeEmbeddedView(int64_t view_id); // The rect of the platform view at index view_id. This rect has been translated into the // host view coordinate system. Units are device screen pixels. diff --git a/shell/platform/darwin/ios/ios_external_texture_metal.h b/shell/platform/darwin/ios/ios_external_texture_metal.h index 41e6c95b05d41..5a6dfd2973c6b 100644 --- a/shell/platform/darwin/ios/ios_external_texture_metal.h +++ b/shell/platform/darwin/ios/ios_external_texture_metal.h @@ -29,7 +29,7 @@ class IOSExternalTextureMetal final : public Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) override; + const DlImageSampling sampling) override; // |Texture| void OnGrContextCreated() override; diff --git a/shell/platform/darwin/ios/ios_external_texture_metal.mm b/shell/platform/darwin/ios/ios_external_texture_metal.mm index 4f3f812ee0d4d..65171b9186907 100644 --- a/shell/platform/darwin/ios/ios_external_texture_metal.mm +++ b/shell/platform/darwin/ios/ios_external_texture_metal.mm @@ -17,7 +17,7 @@ void IOSExternalTextureMetal::Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) { + const DlImageSampling sampling) { [darwin_external_texture_metal_ paintContext:context bounds:bounds freeze:freeze diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 0fc80e9e780ec..3893ccec0c1ab 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -25,7 +25,7 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { std::shared_ptr ios_context_; // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; + DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| void CancelFrame() override; @@ -47,13 +47,7 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { fml::RefPtr raster_thread_merger) override; // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; - - // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| void SubmitFrame(GrDirectContext* context, diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 1372df7168261..4e28b6cfcca82 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -16,7 +16,7 @@ IOSExternalViewEmbedder::~IOSExternalViewEmbedder() = default; // |ExternalViewEmbedder| -SkCanvas* IOSExternalViewEmbedder::GetRootCanvas() { +DlCanvas* IOSExternalViewEmbedder::GetRootCanvas() { // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the // various overlays are controlled by this class. return nullptr; @@ -59,19 +59,7 @@ } // |ExternalViewEmbedder| -std::vector IOSExternalViewEmbedder::GetCurrentCanvases() { - FML_CHECK(platform_views_controller_); - return platform_views_controller_->GetCurrentCanvases(); -} - -// |ExternalViewEmbedder| -std::vector IOSExternalViewEmbedder::GetCurrentBuilders() { - FML_CHECK(platform_views_controller_); - return platform_views_controller_->GetCurrentBuilders(); -} - -// |ExternalViewEmbedder| -EmbedderPaintContext IOSExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) { +DlCanvas* IOSExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) { TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CompositeEmbeddedView"); FML_CHECK(platform_views_controller_); return platform_views_controller_->CompositeEmbeddedView(view_id); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureTest.mm index 55a6ade04a6f6..646d1fdbe81a4 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureTest.mm @@ -8,6 +8,7 @@ #include #include +#import "flutter/display_list/skia/dl_sk_canvas.h" #import "flutter/shell/platform/darwin/graphics/FlutterDarwinContextMetalSkia.h" #import "flutter/shell/platform/darwin/graphics/FlutterDarwinExternalTextureMetal.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterExternalTexture.h" @@ -110,9 +111,10 @@ - (CVPixelBufferRef)pixelBuffer { std::unique_ptr texture = std::make_unique(texture_id, callback); SkRect bounds = SkRect::MakeWH(info.width(), info.height()); - SkSamplingOptions sampling = SkSamplingOptions(SkFilterMode::kNearest); + DlImageSampling sampling = DlImageSampling::kNearestNeighbor; + DlSkCanvasAdapter canvas(gpuSurface->getCanvas()); flutter::Texture::PaintContext context{ - .canvas = gpuSurface->getCanvas(), + .canvas = &canvas, .gr_context = grContext, }; texture->Paint(context, bounds, /*freeze=*/false, sampling); @@ -164,9 +166,10 @@ - (CVPixelBufferRef)pixelBuffer { std::unique_ptr texture = std::make_unique(texture_id, callback); SkRect bounds = SkRect::MakeWH(info.width(), info.height()); - SkSamplingOptions sampling = SkSamplingOptions(SkFilterMode::kNearest); + DlImageSampling sampling = DlImageSampling::kNearestNeighbor; + DlSkCanvasAdapter canvas(gpuSurface->getCanvas()); flutter::Texture::PaintContext context{ - .canvas = gpuSurface->getCanvas(), + .canvas = &canvas, .gr_context = grContext, }; texture->Paint(context, bounds, /*freeze=*/false, sampling); @@ -218,9 +221,10 @@ - (CVPixelBufferRef)pixelBuffer { std::unique_ptr texture = std::make_unique(texture_id, callback); SkRect bounds = SkRect::MakeWH(info.width(), info.height()); - SkSamplingOptions sampling = SkSamplingOptions(SkFilterMode::kNearest); + DlImageSampling sampling = DlImageSampling::kNearestNeighbor; + DlSkCanvasAdapter canvas(gpuSurface->getCanvas()); flutter::Texture::PaintContext context{ - .canvas = gpuSurface->getCanvas(), + .canvas = &canvas, .gr_context = grContext, }; texture->Paint(context, bounds, /*freeze=*/false, sampling); @@ -272,9 +276,10 @@ - (CVPixelBufferRef)pixelBuffer { std::unique_ptr texture = std::make_unique(texture_id, callback); SkRect bounds = SkRect::MakeWH(info.width(), info.height()); - SkSamplingOptions sampling = SkSamplingOptions(SkFilterMode::kNearest); + DlImageSampling sampling = DlImageSampling::kNearestNeighbor; + DlSkCanvasAdapter canvas(gpuSurface->getCanvas()); flutter::Texture::PaintContext context{ - .canvas = gpuSurface->getCanvas(), + .canvas = &canvas, .gr_context = grContext, }; texture->Paint(context, bounds, /*freeze=*/false, sampling); diff --git a/shell/platform/embedder/embedder_external_texture_gl.cc b/shell/platform/embedder/embedder_external_texture_gl.cc index 2454ce8782ba4..c5d503fdeaad0 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.cc +++ b/shell/platform/embedder/embedder_external_texture_gl.cc @@ -30,7 +30,7 @@ EmbedderExternalTextureGL::~EmbedderExternalTextureGL() = default; void EmbedderExternalTextureGL::Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) { + const DlImageSampling sampling) { if (last_image_ == nullptr) { last_image_ = ResolveTexture(Id(), // @@ -39,19 +39,20 @@ void EmbedderExternalTextureGL::Paint(PaintContext& context, ); } - SkCanvas& canvas = *context.canvas; - const SkPaint* paint = context.sk_paint; + DlCanvas* canvas = context.canvas; + const DlPaint* paint = context.paint; if (last_image_) { - if (bounds != SkRect::Make(last_image_->bounds())) { - canvas.drawImageRect(last_image_, bounds, sampling, paint); + SkRect image_bounds = SkRect::Make(last_image_->bounds()); + if (bounds != image_bounds) { + canvas->DrawImageRect(last_image_, image_bounds, bounds, sampling, paint); } else { - canvas.drawImage(last_image_, bounds.x(), bounds.y(), sampling, paint); + canvas->DrawImage(last_image_, {bounds.x(), bounds.y()}, sampling, paint); } } } -sk_sp EmbedderExternalTextureGL::ResolveTexture( +sk_sp EmbedderExternalTextureGL::ResolveTexture( int64_t texture_id, GrDirectContext* context, const SkISize& size) { @@ -99,7 +100,7 @@ sk_sp EmbedderExternalTextureGL::ResolveTexture( return nullptr; } - return image; + return DlImage::Make(std::move(image)); } // |flutter::Texture| diff --git a/shell/platform/embedder/embedder_external_texture_gl.h b/shell/platform/embedder/embedder_external_texture_gl.h index 6d5585f352493..b01991d0cf1df 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.h +++ b/shell/platform/embedder/embedder_external_texture_gl.h @@ -8,7 +8,6 @@ #include "flutter/common/graphics/texture.h" #include "flutter/fml/macros.h" #include "flutter/shell/platform/embedder/embedder.h" -#include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkSize.h" namespace flutter { @@ -25,9 +24,9 @@ class EmbedderExternalTextureGL : public flutter::Texture { private: const ExternalTextureCallback& external_texture_callback_; - sk_sp last_image_; + sk_sp last_image_; - sk_sp ResolveTexture(int64_t texture_id, + sk_sp ResolveTexture(int64_t texture_id, GrDirectContext* context, const SkISize& size); @@ -35,7 +34,7 @@ class EmbedderExternalTextureGL : public flutter::Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) override; + const DlImageSampling sampling) override; // |flutter::Texture| void OnGrContextCreated() override; diff --git a/shell/platform/embedder/embedder_external_texture_metal.h b/shell/platform/embedder/embedder_external_texture_metal.h index 6aa0908aeda75..ac72fb28b9ccc 100644 --- a/shell/platform/embedder/embedder_external_texture_metal.h +++ b/shell/platform/embedder/embedder_external_texture_metal.h @@ -25,9 +25,9 @@ class EmbedderExternalTextureMetal : public flutter::Texture { private: const ExternalTextureCallback& external_texture_callback_; - sk_sp last_image_; + sk_sp last_image_; - sk_sp ResolveTexture(int64_t texture_id, + sk_sp ResolveTexture(int64_t texture_id, GrDirectContext* context, const SkISize& size); @@ -35,7 +35,7 @@ class EmbedderExternalTextureMetal : public flutter::Texture { void Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) override; + const DlImageSampling sampling) override; // |flutter::Texture| void OnGrContextCreated() override; diff --git a/shell/platform/embedder/embedder_external_texture_metal.mm b/shell/platform/embedder/embedder_external_texture_metal.mm index e71e1ab77e9d1..ac759d5211ef6 100644 --- a/shell/platform/embedder/embedder_external_texture_metal.mm +++ b/shell/platform/embedder/embedder_external_texture_metal.mm @@ -35,25 +35,26 @@ static bool ValidNumTextures(int expected, int actual) { void EmbedderExternalTextureMetal::Paint(PaintContext& context, const SkRect& bounds, bool freeze, - const SkSamplingOptions& sampling) { + const DlImageSampling sampling) { if (last_image_ == nullptr) { last_image_ = ResolveTexture(Id(), context.gr_context, SkISize::Make(bounds.width(), bounds.height())); } - SkCanvas& canvas = *context.canvas; - const SkPaint* paint = context.sk_paint; + DlCanvas* canvas = context.canvas; + const DlPaint* paint = context.paint; if (last_image_) { - if (bounds != SkRect::Make(last_image_->bounds())) { - canvas.drawImageRect(last_image_, bounds, sampling, paint); + SkRect image_bounds = SkRect::Make(last_image_->bounds()); + if (bounds != image_bounds) { + canvas->DrawImageRect(last_image_, image_bounds, bounds, sampling, paint); } else { - canvas.drawImage(last_image_, bounds.x(), bounds.y(), sampling, paint); + canvas->DrawImage(last_image_, {bounds.x(), bounds.y()}, sampling, paint); } } } -sk_sp EmbedderExternalTextureMetal::ResolveTexture(int64_t texture_id, +sk_sp EmbedderExternalTextureMetal::ResolveTexture(int64_t texture_id, GrDirectContext* context, const SkISize& size) { std::unique_ptr texture = @@ -99,7 +100,7 @@ static bool ValidNumTextures(int expected, int actual) { FML_LOG(ERROR) << "Could not create external texture: " << texture_id; } - return image; + return DlImage::Make(std::move(image)); } // |flutter::Texture| diff --git a/shell/platform/embedder/embedder_external_view.cc b/shell/platform/embedder/embedder_external_view.cc index e5ca23d0fb130..34044b41b493d 100644 --- a/shell/platform/embedder/embedder_external_view.cc +++ b/shell/platform/embedder/embedder_external_view.cc @@ -42,7 +42,7 @@ EmbedderExternalView::CreateRenderTargetDescriptor() const { return {view_identifier_, render_surface_size_}; } -SkCanvas* EmbedderExternalView::GetCanvas() const { +DlCanvas* EmbedderExternalView::GetCanvas() { return canvas_spy_->GetSpyingCanvas(); } diff --git a/shell/platform/embedder/embedder_external_view.h b/shell/platform/embedder/embedder_external_view.h index 59fcf4260b2cf..a7648dfd16a5b 100644 --- a/shell/platform/embedder/embedder_external_view.h +++ b/shell/platform/embedder/embedder_external_view.h @@ -105,7 +105,7 @@ class EmbedderExternalView { RenderTargetDescriptor CreateRenderTargetDescriptor() const; - SkCanvas* GetCanvas() const; + DlCanvas* GetCanvas(); SkISize GetRenderSurfaceSize() const; diff --git a/shell/platform/embedder/embedder_external_view_embedder.cc b/shell/platform/embedder/embedder_external_view_embedder.cc index ef98b0cd276e3..380b404a13046 100644 --- a/shell/platform/embedder/embedder_external_view_embedder.cc +++ b/shell/platform/embedder/embedder_external_view_embedder.cc @@ -86,7 +86,7 @@ void EmbedderExternalViewEmbedder::PrerollCompositeEmbeddedView( } // |ExternalViewEmbedder| -SkCanvas* EmbedderExternalViewEmbedder::GetRootCanvas() { +DlCanvas* EmbedderExternalViewEmbedder::GetRootCanvas() { auto found = pending_views_.find(EmbedderExternalView::ViewIdentifier{}); if (found == pending_views_.end()) { FML_DLOG(WARNING) @@ -99,35 +99,15 @@ SkCanvas* EmbedderExternalViewEmbedder::GetRootCanvas() { } // |ExternalViewEmbedder| -std::vector EmbedderExternalViewEmbedder::GetCurrentCanvases() { - std::vector canvases; - for (const auto& view : pending_views_) { - const auto& external_view = view.second; - // This method (for legacy reasons) expects non-root current canvases. - if (!external_view->IsRootView()) { - canvases.push_back(external_view->GetCanvas()); - } - } - return canvases; -} - -// |ExternalViewEmbedder| -std::vector -EmbedderExternalViewEmbedder::GetCurrentBuilders() { - return std::vector({}); -} - -// |ExternalViewEmbedder| -EmbedderPaintContext EmbedderExternalViewEmbedder::CompositeEmbeddedView( - int64_t view_id) { +DlCanvas* EmbedderExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) { auto vid = EmbedderExternalView::ViewIdentifier(view_id); auto found = pending_views_.find(vid); if (found == pending_views_.end()) { FML_DCHECK(false) << "Attempted to composite a view that was not " "pre-rolled."; - return {nullptr, nullptr}; + return nullptr; } - return {found->second->GetCanvas(), nullptr}; + return found->second->GetCanvas(); } static FlutterBackingStoreConfig MakeBackingStoreConfig( diff --git a/shell/platform/embedder/embedder_external_view_embedder.h b/shell/platform/embedder/embedder_external_view_embedder.h index b6efa3321426c..55a08f0627a72 100644 --- a/shell/platform/embedder/embedder_external_view_embedder.h +++ b/shell/platform/embedder/embedder_external_view_embedder.h @@ -91,20 +91,14 @@ class EmbedderExternalViewEmbedder final : public ExternalViewEmbedder { std::unique_ptr params) override; // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; - - // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| void SubmitFrame(GrDirectContext* context, std::unique_ptr frame) override; // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; + DlCanvas* GetRootCanvas() override; private: const bool avoid_backing_store_cache_; diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index e16a7414ae4a7..65d698d01448b 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -4044,27 +4044,27 @@ TEST_F(EmbedderTest, ExternalTextureGLRefreshedTooOften) { EmbedderExternalTextureGL texture(1, callback); auto skia_surface = surface.GetOnscreenSurface(); - auto canvas = skia_surface->getCanvas(); + DlSkCanvasAdapter canvas(skia_surface->getCanvas()); Texture* texture_ = &texture; Texture::PaintContext ctx{ - .canvas = canvas, + .canvas = &canvas, .gr_context = context.get(), }; texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + DlImageSampling::kLinear); EXPECT_TRUE(resolve_called); resolve_called = false; texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + DlImageSampling::kLinear); EXPECT_FALSE(resolve_called); texture_->MarkNewFrameAvailable(); texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + DlImageSampling::kLinear); EXPECT_TRUE(resolve_called); } diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index d341cc2d68e09..7974dc32cf5ea 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -10,6 +10,7 @@ #import #include "embedder.h" +#include "flutter/display_list/skia/dl_sk_canvas.h" #include "flutter/fml/synchronization/count_down_latch.h" #include "flutter/shell/platform/embedder/tests/embedder_assertions.h" #include "flutter/shell/platform/embedder/tests/embedder_config_builder.h" @@ -514,28 +515,26 @@ void Collect() { auto surface = TestMetalSurface::Create(*metal_context, SkISize::Make(100, 100)); auto skia_surface = surface->GetSurface(); - auto canvas = skia_surface->getCanvas(); + DlSkCanvasAdapter canvas(skia_surface->getCanvas()); Texture* texture_ = &texture; + DlImageSampling sampling = DlImageSampling::kLinear; Texture::PaintContext ctx{ - .canvas = canvas, + .canvas = &canvas, .gr_context = surface->GetGrContext().get(), }; - texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, sampling); EXPECT_TRUE(resolve_called); resolve_called = false; - texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, sampling); EXPECT_FALSE(resolve_called); texture_->MarkNewFrameAvailable(); - texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, - SkSamplingOptions(SkFilterMode::kLinear)); + texture_->Paint(ctx, SkRect::MakeXYWH(0, 0, 100, 100), false, sampling); EXPECT_TRUE(resolve_called); } diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc index 03539878bb8cf..901bd8c078e97 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc @@ -66,7 +66,7 @@ FlatlandExternalViewEmbedder::FlatlandExternalViewEmbedder( FlatlandExternalViewEmbedder::~FlatlandExternalViewEmbedder() = default; -SkCanvas* FlatlandExternalViewEmbedder::GetRootCanvas() { +flutter::DlCanvas* FlatlandExternalViewEmbedder::GetRootCanvas() { auto found = frame_layers_.find(kRootLayerId); if (found == frame_layers_.end()) { FML_LOG(WARNING) @@ -79,22 +79,6 @@ SkCanvas* FlatlandExternalViewEmbedder::GetRootCanvas() { return found->second.canvas_spy->GetSpyingCanvas(); } -std::vector FlatlandExternalViewEmbedder::GetCurrentCanvases() { - std::vector canvases; - for (const auto& layer : frame_layers_) { - // This method (for legacy reasons) expects non-root current canvases. - if (layer.first.has_value()) { - canvases.push_back(layer.second.canvas_spy->GetSpyingCanvas()); - } - } - return canvases; -} - -std::vector -FlatlandExternalViewEmbedder::GetCurrentBuilders() { - return std::vector(); -} - void FlatlandExternalViewEmbedder::PrerollCompositeEmbeddedView( int64_t view_id, std::unique_ptr params) { @@ -107,13 +91,13 @@ void FlatlandExternalViewEmbedder::PrerollCompositeEmbeddedView( frame_composition_order_.push_back(handle); } -flutter::EmbedderPaintContext -FlatlandExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) { +flutter::DlCanvas* FlatlandExternalViewEmbedder::CompositeEmbeddedView( + int64_t view_id) { zx_handle_t handle = static_cast(view_id); auto found = frame_layers_.find(handle); FML_CHECK(found != frame_layers_.end()); - return {found->second.canvas_spy->GetSpyingCanvas(), nullptr}; + return found->second.canvas_spy->GetSpyingCanvas(); } flutter::PostPrerollResult FlatlandExternalViewEmbedder::PostPrerollAction( diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h index 45832e718f6cc..402cdc159735d 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h @@ -21,7 +21,6 @@ #include "flutter/fml/logging.h" #include "flutter/fml/macros.h" #include "flutter/shell/common/canvas_spy.h" -#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkPoint.h" #include "third_party/skia/include/core/SkRect.h" @@ -60,13 +59,7 @@ class FlatlandExternalViewEmbedder final ~FlatlandExternalViewEmbedder(); // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; + flutter::DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| void PrerollCompositeEmbeddedView( @@ -74,7 +67,7 @@ class FlatlandExternalViewEmbedder final std::unique_ptr params) override; // |ExternalViewEmbedder| - flutter::EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + flutter::DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| flutter::PostPrerollResult PostPrerollAction( diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc index 86aa0b2211c1e..21c6810c4e11b 100644 --- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc @@ -140,7 +140,7 @@ GfxExternalViewEmbedder::GfxExternalViewEmbedder( GfxExternalViewEmbedder::~GfxExternalViewEmbedder() = default; -SkCanvas* GfxExternalViewEmbedder::GetRootCanvas() { +flutter::DlCanvas* GfxExternalViewEmbedder::GetRootCanvas() { auto found = frame_layers_.find(kRootLayerId); if (found == frame_layers_.end()) { FML_LOG(WARNING) @@ -153,22 +153,6 @@ SkCanvas* GfxExternalViewEmbedder::GetRootCanvas() { return found->second.canvas_spy->GetSpyingCanvas(); } -std::vector GfxExternalViewEmbedder::GetCurrentCanvases() { - std::vector canvases; - for (const auto& layer : frame_layers_) { - // This method (for legacy reasons) expects non-root current canvases. - if (layer.first.has_value()) { - canvases.push_back(layer.second.canvas_spy->GetSpyingCanvas()); - } - } - return canvases; -} - -std::vector -GfxExternalViewEmbedder::GetCurrentBuilders() { - return std::vector({}); -} - void GfxExternalViewEmbedder::PrerollCompositeEmbeddedView( int64_t view_id, std::unique_ptr params) { @@ -181,13 +165,13 @@ void GfxExternalViewEmbedder::PrerollCompositeEmbeddedView( frame_composition_order_.push_back(handle); } -flutter::EmbedderPaintContext GfxExternalViewEmbedder::CompositeEmbeddedView( +flutter::DlCanvas* GfxExternalViewEmbedder::CompositeEmbeddedView( int64_t view_id) { zx_handle_t handle = static_cast(view_id); auto found = frame_layers_.find(handle); FML_CHECK(found != frame_layers_.end()); - return {found->second.canvas_spy->GetSpyingCanvas(), nullptr}; + return found->second.canvas_spy->GetSpyingCanvas(); } flutter::PostPrerollResult GfxExternalViewEmbedder::PostPrerollAction( diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h index 5f840c3d929b1..11ba6832020ad 100644 --- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h @@ -82,13 +82,7 @@ class GfxExternalViewEmbedder final : public flutter::ExternalViewEmbedder { ~GfxExternalViewEmbedder(); // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; + flutter::DlCanvas* GetRootCanvas() override; // |ExternalViewEmbedder| void PrerollCompositeEmbeddedView( @@ -96,7 +90,7 @@ class GfxExternalViewEmbedder final : public flutter::ExternalViewEmbedder { std::unique_ptr params) override; // |ExternalViewEmbedder| - flutter::EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override; + flutter::DlCanvas* CompositeEmbeddedView(int64_t view_id) override; // |ExternalViewEmbedder| flutter::PostPrerollResult PostPrerollAction( diff --git a/shell/platform/fuchsia/flutter/platform_view_unittest.cc b/shell/platform/fuchsia/flutter/platform_view_unittest.cc index b1fe0b5fcb176..624ad33b51699 100644 --- a/shell/platform/fuchsia/flutter/platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/platform_view_unittest.cc @@ -44,13 +44,7 @@ namespace { class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { public: - SkCanvas* GetRootCanvas() override { return nullptr; } - std::vector GetCurrentCanvases() override { - return std::vector(); - } - std::vector GetCurrentBuilders() override { - return std::vector(); - } + flutter::DlCanvas* GetRootCanvas() override { return nullptr; } void CancelFrame() override {} void BeginFrame( @@ -58,17 +52,16 @@ class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { GrDirectContext* context, double device_pixel_ratio, fml::RefPtr raster_thread_merger) override {} + void SubmitFrame(GrDirectContext* context, - std::unique_ptr frame) override { - return; - } + std::unique_ptr frame) override {} void PrerollCompositeEmbeddedView( int64_t view_id, std::unique_ptr params) override {} - flutter::EmbedderPaintContext CompositeEmbeddedView( - int64_t view_id) override { - return {nullptr, nullptr}; + + flutter::DlCanvas* CompositeEmbeddedView(int64_t view_id) override { + return nullptr; } }; diff --git a/shell/platform/fuchsia/flutter/surface.cc b/shell/platform/fuchsia/flutter/surface.cc index 5b9c5be50e4d0..49d06f023cbf8 100644 --- a/shell/platform/fuchsia/flutter/surface.cc +++ b/shell/platform/fuchsia/flutter/surface.cc @@ -34,9 +34,8 @@ std::unique_ptr Surface::AcquireFrame( framebuffer_info.supports_readback = true; return std::make_unique( nullptr, std::move(framebuffer_info), - [](const flutter::SurfaceFrame& surface_frame, SkCanvas* canvas) { - return true; - }, + [](const flutter::SurfaceFrame& surface_frame, + flutter::DlCanvas* canvas) { return true; }, size); } diff --git a/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc index 46d2fd37f77c3..22ce7acda3a7c 100644 --- a/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc +++ b/shell/platform/fuchsia/flutter/tests/flatland_external_view_embedder_unittests.cc @@ -324,10 +324,10 @@ fuchsia::ui::composition::OnNextFrameBeginValues WithPresentCredits( void DrawSimpleFrame(FlatlandExternalViewEmbedder& external_view_embedder, SkISize frame_size, float frame_dpr, - std::function draw_callback) { + std::function draw_callback) { external_view_embedder.BeginFrame(frame_size, nullptr, frame_dpr, nullptr); { - SkCanvas* root_canvas = external_view_embedder.GetRootCanvas(); + flutter::DlCanvas* root_canvas = external_view_embedder.GetRootCanvas(); external_view_embedder.PostPrerollAction(nullptr); draw_callback(root_canvas); } @@ -338,26 +338,27 @@ void DrawSimpleFrame(FlatlandExternalViewEmbedder& external_view_embedder, nullptr, std::make_unique( nullptr, std::move(framebuffer_info), [](const flutter::SurfaceFrame& surface_frame, - SkCanvas* canvas) { return true; }, + flutter::DlCanvas* canvas) { return true; }, frame_size)); } -void DrawFrameWithView(FlatlandExternalViewEmbedder& external_view_embedder, - SkISize frame_size, - float frame_dpr, - int view_id, - flutter::EmbeddedViewParams& view_params, - std::function background_draw_callback, - std::function overlay_draw_callback) { +void DrawFrameWithView( + FlatlandExternalViewEmbedder& external_view_embedder, + SkISize frame_size, + float frame_dpr, + int view_id, + flutter::EmbeddedViewParams& view_params, + std::function background_draw_callback, + std::function overlay_draw_callback) { external_view_embedder.BeginFrame(frame_size, nullptr, frame_dpr, nullptr); { - SkCanvas* root_canvas = external_view_embedder.GetRootCanvas(); + flutter::DlCanvas* root_canvas = external_view_embedder.GetRootCanvas(); external_view_embedder.PrerollCompositeEmbeddedView( view_id, std::make_unique(view_params)); external_view_embedder.PostPrerollAction(nullptr); background_draw_callback(root_canvas); - SkCanvas* overlay_canvas = - external_view_embedder.CompositeEmbeddedView(view_id).canvas; + flutter::DlCanvas* overlay_canvas = + external_view_embedder.CompositeEmbeddedView(view_id); overlay_draw_callback(overlay_canvas); } external_view_embedder.EndFrame(false, nullptr); @@ -367,7 +368,7 @@ void DrawFrameWithView(FlatlandExternalViewEmbedder& external_view_embedder, nullptr, std::make_unique( nullptr, std::move(framebuffer_info), [](const flutter::SurfaceFrame& surface_frame, - SkCanvas* canvas) { return true; }, + flutter::DlCanvas* canvas) { return true; }, frame_size)); } @@ -502,18 +503,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, SimpleScene) { const fuchsia::math::SizeU frame_size{ static_cast(frame_size_signed.width()), static_cast(frame_size_signed.height())}; - DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); EXPECT_THAT(fake_flatland().graph(), IsFlutterGraph(parent_viewport_watcher, viewport_creation_token, view_ref)); @@ -615,25 +618,27 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneView) { DrawFrameWithView( external_view_embedder, frame_size_signed, kDPR, child_view_id, child_view_params, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorRED); - canvas->translate(canvas_size.width() * 3.f / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->Translate(canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }); @@ -702,18 +707,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneView) { {kInvDPR, kInvDPR})); // Draw another frame without the view. The scene graph shouldn't change yet. - DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); EXPECT_THAT( fake_flatland().graph(), IsFlutterGraph( @@ -848,25 +855,27 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneClippedView) { DrawFrameWithView( external_view_embedder, frame_size_signed, kDPR, child_view_id, child_view_params, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorRED); - canvas->translate(canvas_size.width() * 3.f / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->Translate(canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }); @@ -921,25 +930,27 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneClippedView) { DrawFrameWithView( external_view_embedder, frame_size_signed, kDPR, child_view_id, new_child_view_params, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorRED); - canvas->translate(canvas_size.width() * 3.f / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->Translate(canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }); @@ -975,18 +986,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneClippedView) { // Destroy the view and draw another frame without the view. external_view_embedder.DestroyView( child_view_id, [](fuchsia::ui::composition::ContentId) {}); - DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); loop().RunUntilIdle(); EXPECT_THAT( fake_flatland().graph(), @@ -1068,18 +1081,19 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneView_NoOverlay) { DrawFrameWithView( external_view_embedder, frame_size_signed, 1.f, child_view_id, child_view_params, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }, - [](SkCanvas* canvas) {}); + [](flutter::DlCanvas* canvas) {}); EXPECT_THAT(fake_flatland().graph(), IsFlutterGraph(parent_viewport_watcher, viewport_creation_token, view_ref)); @@ -1126,18 +1140,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, SceneWithOneView_NoOverlay) { kOpacityFloat)})); // Draw another frame without the view. The scene graph shouldn't change yet. - DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); EXPECT_THAT( fake_flatland().graph(), @@ -1217,18 +1233,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, const fuchsia::math::SizeU frame_size{ static_cast(frame_size_signed.width()), static_cast(frame_size_signed.height())}; - DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor().kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); // Pump the message loop. The scene updates should propagate to flatland. loop().RunUntilIdle(); @@ -1273,18 +1291,20 @@ TEST_F(FlatlandExternalViewEmbedderTest, const fuchsia::math::SizeU new_frame_size{ static_cast(new_frame_size_signed.width()), static_cast(new_frame_size_signed.height())}; - DrawSimpleFrame( - external_view_embedder, new_frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, - canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, - canvas_size.height() / 32.f), - rect_paint); - }); + DrawSimpleFrame(external_view_embedder, new_frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, + canvas_size.height() / 2.f); + canvas->DrawRect( + SkRect::MakeWH(canvas_size.width() / 32.f, + canvas_size.height() / 32.f), + rect_paint); + }); EXPECT_THAT( fake_flatland().graph(), IsFlutterGraph( @@ -1356,9 +1376,11 @@ TEST_F(FlatlandExternalViewEmbedderTest, SimpleScene_DisjointHitRegions) { static_cast(frame_size_signed.width()), static_cast(frame_size_signed.height())}; DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); + external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); SkRect paint_region_1, paint_region_2; @@ -1366,16 +1388,16 @@ TEST_F(FlatlandExternalViewEmbedderTest, SimpleScene_DisjointHitRegions) { canvas_size.width() / 4.f, canvas_size.height() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->drawRect(paint_region_1, rect_paint); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->DrawRect(paint_region_1, rect_paint); paint_region_2 = SkRect::MakeXYWH( canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - rect_paint.setColor(SK_ColorRED); - canvas->drawRect(paint_region_2, rect_paint); + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->DrawRect(paint_region_2, rect_paint); }); EXPECT_THAT(fake_flatland().graph(), IsFlutterGraph(parent_viewport_watcher, viewport_creation_token, @@ -1447,9 +1469,11 @@ TEST_F(FlatlandExternalViewEmbedderTest, SimpleScene_OverlappingHitRegions) { static_cast(frame_size_signed.width()), static_cast(frame_size_signed.height())}; DrawSimpleFrame( - external_view_embedder, frame_size_signed, 1.f, [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); + external_view_embedder, frame_size_signed, 1.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); SkRect paint_region_1, paint_region_2; @@ -1457,16 +1481,16 @@ TEST_F(FlatlandExternalViewEmbedderTest, SimpleScene_OverlappingHitRegions) { canvas_size.width() / 4.f, canvas_size.height() / 2.f, 3.f * canvas_size.width() / 8.f, canvas_size.height() / 4.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->drawRect(paint_region_1, rect_paint); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->DrawRect(paint_region_1, rect_paint); paint_region_2 = SkRect::MakeXYWH( canvas_size.width() * 3.f / 8.f, canvas_size.height() / 2.f, 3.f * canvas_size.width() / 8.f, canvas_size.height() / 4.f); - rect_paint.setColor(SK_ColorRED); - canvas->drawRect(paint_region_2, rect_paint); + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->DrawRect(paint_region_2, rect_paint); }); EXPECT_THAT(fake_flatland().graph(), IsFlutterGraph(parent_viewport_watcher, viewport_creation_token, @@ -1571,25 +1595,27 @@ TEST_F(FlatlandExternalViewEmbedderTest, ViewportCoveredWithInputInterceptor) { DrawFrameWithView( external_view_embedder, frame_size_signed, kDPR, child_view_id, child_view_params, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->translate(canvas_size.width() / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kGreen()); + canvas->Translate(canvas_size.width() / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }, - [](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorRED); - canvas->translate(canvas_size.width() * 3.f / 4.f, + [](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint; + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->Translate(canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f); - canvas->drawRect(SkRect::MakeWH(canvas_size.width() / 32.f, + canvas->DrawRect(SkRect::MakeWH(canvas_size.width() / 32.f, canvas_size.height() / 32.f), rect_paint); }); diff --git a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc index dc44476b93beb..c1ffbcd96ab66 100644 --- a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc @@ -43,13 +43,7 @@ namespace { class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { public: - SkCanvas* GetRootCanvas() override { return nullptr; } - std::vector GetCurrentCanvases() override { - return std::vector(); - } - std::vector GetCurrentBuilders() override { - return std::vector(); - } + flutter::DlCanvas* GetRootCanvas() override { return nullptr; } void CancelFrame() override {} void BeginFrame( @@ -57,17 +51,16 @@ class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { GrDirectContext* context, double device_pixel_ratio, fml::RefPtr raster_thread_merger) override {} + void SubmitFrame(GrDirectContext* context, - std::unique_ptr frame) override { - return; - } + std::unique_ptr frame) override {} void PrerollCompositeEmbeddedView( int64_t view_id, std::unique_ptr params) override {} - flutter::EmbedderPaintContext CompositeEmbeddedView( - int64_t view_id) override { - return {nullptr, nullptr}; + + flutter::DlCanvas* CompositeEmbeddedView(int64_t view_id) override { + return nullptr; } }; diff --git a/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc b/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc index ef0569d5c8a5c..45f570075ca3a 100644 --- a/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc +++ b/shell/platform/fuchsia/flutter/tests/gfx_external_view_embedder_unittests.cc @@ -28,7 +28,6 @@ #include "flutter/fml/logging.h" #include "flutter/fml/time/time_delta.h" #include "flutter/fml/time/time_point.h" -#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkSize.h" #include "third_party/skia/include/core/SkSurface.h" @@ -449,10 +448,10 @@ std::vector ExtractLayersFromSceneGraph( void DrawSimpleFrame(GfxExternalViewEmbedder& external_view_embedder, SkISize frame_size, float frame_dpr, - std::function draw_callback) { + std::function draw_callback) { external_view_embedder.BeginFrame(frame_size, nullptr, frame_dpr, nullptr); { - SkCanvas* root_canvas = external_view_embedder.GetRootCanvas(); + flutter::DlCanvas* root_canvas = external_view_embedder.GetRootCanvas(); external_view_embedder.PostPrerollAction(nullptr); draw_callback(root_canvas); } @@ -462,26 +461,27 @@ void DrawSimpleFrame(GfxExternalViewEmbedder& external_view_embedder, nullptr, std::make_unique( nullptr, framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, - SkCanvas* canvas) { return true; }, + flutter::DlCanvas* canvas) { return true; }, frame_size)); } -void DrawFrameWithView(GfxExternalViewEmbedder& external_view_embedder, - SkISize frame_size, - float frame_dpr, - int view_id, - flutter::EmbeddedViewParams& view_params, - std::function background_draw_callback, - std::function overlay_draw_callback) { +void DrawFrameWithView( + GfxExternalViewEmbedder& external_view_embedder, + SkISize frame_size, + float frame_dpr, + int view_id, + flutter::EmbeddedViewParams& view_params, + std::function background_draw_callback, + std::function overlay_draw_callback) { external_view_embedder.BeginFrame(frame_size, nullptr, frame_dpr, nullptr); { - SkCanvas* root_canvas = external_view_embedder.GetRootCanvas(); + flutter::DlCanvas* root_canvas = external_view_embedder.GetRootCanvas(); external_view_embedder.PrerollCompositeEmbeddedView( view_id, std::make_unique(view_params)); external_view_embedder.PostPrerollAction(nullptr); background_draw_callback(root_canvas); - SkCanvas* overlay_canvas = - external_view_embedder.CompositeEmbeddedView(view_id).canvas; + flutter::DlCanvas* overlay_canvas = + external_view_embedder.CompositeEmbeddedView(view_id); overlay_draw_callback(overlay_canvas); } external_view_embedder.EndFrame(false, nullptr); @@ -490,7 +490,7 @@ void DrawFrameWithView(GfxExternalViewEmbedder& external_view_embedder, nullptr, std::make_unique( nullptr, framebuffer_info, [](const flutter::SurfaceFrame& surface_frame, - SkCanvas* canvas) { return true; }, + flutter::DlCanvas* canvas) { return true; }, frame_size)); } @@ -627,20 +627,20 @@ TEST_F(GfxExternalViewEmbedderTest, SimpleScene) { // Draw the scene. The scene graph shouldn't change yet. const SkISize frame_size = SkISize::Make(512, 512); SkRect paint_region; - DrawSimpleFrame( - external_view_embedder, frame_size, 1.f, - [&paint_region](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - - paint_region = SkRect::MakeXYWH( - canvas_size.width() / 4.f, canvas_size.height() / 2.f, - canvas_size.width() / 32.f, canvas_size.height() / 32.f); - - canvas->drawRect(paint_region, rect_paint); - }); + DrawSimpleFrame(external_view_embedder, frame_size, 1.f, + [&paint_region](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + flutter::DlPaint rect_paint(flutter::DlColor::kGreen()); + + paint_region = SkRect::MakeXYWH( + canvas_size.width() / 4.f, canvas_size.height() / 2.f, + canvas_size.width() / 32.f, + canvas_size.height() / 32.f); + + canvas->DrawRect(paint_region, rect_paint); + }); ExpectRootSceneGraph(fake_session().SceneGraph(), debug_name, view_holder_token, view_ref); @@ -690,28 +690,28 @@ TEST_F(GfxExternalViewEmbedderTest, SceneWithOneView) { DrawFrameWithView( external_view_embedder, frame_size, 1.f, child_view_id, child_view_params, - [&main_surface_paint_region](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); + [&main_surface_paint_region](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); main_surface_paint_region = SkRect::MakeXYWH( canvas_size.width() / 4.f, canvas_size.width() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->drawRect(main_surface_paint_region, rect_paint); + flutter::DlPaint rect_paint(flutter::DlColor::kGreen()); + canvas->DrawRect(main_surface_paint_region, rect_paint); }, - [&overlay_paint_region](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); + [&overlay_paint_region](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); overlay_paint_region = SkRect::MakeXYWH( canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorRED); - canvas->drawRect(overlay_paint_region, rect_paint); + flutter::DlPaint rect_paint(flutter::DlColor::kRed()); + canvas->DrawRect(overlay_paint_region, rect_paint); }); ExpectRootSceneGraph(fake_session().SceneGraph(), debug_name, view_holder_token, view_ref); @@ -765,24 +765,24 @@ TEST_F(GfxExternalViewEmbedderTest, SimpleSceneDisjointHitRegions) { const SkISize frame_size = SkISize::Make(512, 512); DrawSimpleFrame( external_view_embedder, frame_size, 1.f, - [&paint_region_1, &paint_region_2](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); + [&paint_region_1, &paint_region_2](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); paint_region_1 = SkRect::MakeXYWH( canvas_size.width() / 4.f, canvas_size.height() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->drawRect(paint_region_1, rect_paint); + flutter::DlPaint rect_paint(flutter::DlColor::kGreen()); + canvas->DrawRect(paint_region_1, rect_paint); paint_region_2 = SkRect::MakeXYWH( canvas_size.width() * 3.f / 4.f, canvas_size.height() / 2.f, canvas_size.width() / 32.f, canvas_size.height() / 32.f); - rect_paint.setColor(SK_ColorRED); - canvas->drawRect(paint_region_2, rect_paint); + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->DrawRect(paint_region_2, rect_paint); }); ExpectRootSceneGraph(fake_session().SceneGraph(), debug_name, view_holder_token, view_ref); @@ -822,28 +822,28 @@ TEST_F(GfxExternalViewEmbedderTest, SimpleSceneOverlappingHitRegions) { // Draw the scene. The scene graph shouldn't change yet. SkRect joined_paint_region = SkRect::MakeEmpty(); const SkISize frame_size = SkISize::Make(512, 512); - DrawSimpleFrame( - external_view_embedder, frame_size, 1.f, - [&joined_paint_region](SkCanvas* canvas) { - const SkSize canvas_size = SkSize::Make(canvas->imageInfo().width(), - canvas->imageInfo().height()); - - auto paint_region_1 = SkRect::MakeXYWH( - canvas_size.width() / 4.f, canvas_size.height() / 4.f, - canvas_size.width() / 2.f, canvas_size.height() / 2.f); - SkPaint rect_paint; - rect_paint.setColor(SK_ColorGREEN); - canvas->drawRect(paint_region_1, rect_paint); - - auto paint_region_2 = SkRect::MakeXYWH( - canvas_size.width() * 3.f / 8.f, canvas_size.height() / 4.f, - canvas_size.width() / 2.f, canvas_size.height() / 2.f); - rect_paint.setColor(SK_ColorRED); - canvas->drawRect(paint_region_2, rect_paint); - - joined_paint_region.join(paint_region_1); - joined_paint_region.join(paint_region_2); - }); + DrawSimpleFrame(external_view_embedder, frame_size, 1.f, + [&joined_paint_region](flutter::DlCanvas* canvas) { + const SkISize layer_size = canvas->GetBaseLayerSize(); + const SkSize canvas_size = + SkSize::Make(layer_size.width(), layer_size.height()); + + auto paint_region_1 = SkRect::MakeXYWH( + canvas_size.width() / 4.f, canvas_size.height() / 4.f, + canvas_size.width() / 2.f, canvas_size.height() / 2.f); + flutter::DlPaint rect_paint(flutter::DlColor::kGreen()); + canvas->DrawRect(paint_region_1, rect_paint); + + auto paint_region_2 = SkRect::MakeXYWH( + canvas_size.width() * 3.f / 8.f, + canvas_size.height() / 4.f, canvas_size.width() / 2.f, + canvas_size.height() / 2.f); + rect_paint.setColor(flutter::DlColor::kRed()); + canvas->DrawRect(paint_region_2, rect_paint); + + joined_paint_region.join(paint_region_1); + joined_paint_region.join(paint_region_2); + }); ExpectRootSceneGraph(fake_session().SceneGraph(), debug_name, view_holder_token, view_ref); diff --git a/shell/testing/tester_main.cc b/shell/testing/tester_main.cc index f946baab6ca19..7fb8fa1d523d3 100644 --- a/shell/testing/tester_main.cc +++ b/shell/testing/tester_main.cc @@ -41,7 +41,7 @@ namespace flutter { class TesterExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override { return nullptr; } + DlCanvas* GetRootCanvas() override { return nullptr; } // |ExternalViewEmbedder| void CancelFrame() override {} @@ -59,18 +59,12 @@ class TesterExternalViewEmbedder : public ExternalViewEmbedder { std::unique_ptr params) override {} // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override { return {&canvas_}; } - - // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override { return {}; } - - // |ExternalViewEmbedder| - EmbedderPaintContext CompositeEmbeddedView(int64_t view_id) override { - return {&canvas_, nullptr}; + DlCanvas* CompositeEmbeddedView(int64_t view_id) override { + return &builder_; } private: - SkCanvas canvas_; + DisplayListBuilder builder_; }; class TesterGPUSurfaceSoftware : public GPUSurfaceSoftware { diff --git a/testing/BUILD.gn b/testing/BUILD.gn index 8ca7c4f0a74a7..84fab9e41306e 100644 --- a/testing/BUILD.gn +++ b/testing/BUILD.gn @@ -19,6 +19,8 @@ source_set("testing_lib") { "assertions.h", "display_list_testing.cc", "display_list_testing.h", + "mock_canvas.cc", + "mock_canvas.h", "post_task_sync.cc", "post_task_sync.h", "testing.cc", @@ -81,8 +83,6 @@ source_set("skia") { "assertions_skia.cc", "assertions_skia.h", "canvas_test.h", - "mock_canvas.cc", - "mock_canvas.h", ] public_deps = [ diff --git a/testing/canvas_test.h b/testing/canvas_test.h index 0d9eda9080c13..17734af725b2e 100644 --- a/testing/canvas_test.h +++ b/testing/canvas_test.h @@ -19,10 +19,11 @@ class CanvasTestBase : public BaseT { CanvasTestBase() = default; MockCanvas& mock_canvas() { return canvas_; } - SkColorSpace* mock_color_space() { return canvas_.imageInfo().colorSpace(); } + SkColorSpace* mock_color_space() { return color_space_.get(); } private: MockCanvas canvas_; + sk_sp color_space_ = SkColorSpace::MakeSRGB(); FML_DISALLOW_COPY_AND_ASSIGN(CanvasTestBase); }; diff --git a/testing/display_list_testing.cc b/testing/display_list_testing.cc index 007cd71971481..e0dec0fdadd94 100644 --- a/testing/display_list_testing.cc +++ b/testing/display_list_testing.cc @@ -46,6 +46,39 @@ std::ostream& operator<<(std::ostream& os, return os; } +std::ostream& operator<<(std::ostream& os, const DlPaint& paint) { + os << "DlPaint(" + << "isaa: " << paint.isAntiAlias() << ", " + << paint.getColor() << ", " + << paint.getBlendMode() << ", " + << paint.getDrawStyle(); + if (paint.getDrawStyle() != DlDrawStyle::kFill) { + os << ", width: " << paint.getStrokeWidth() + << ", miter: " << paint.getStrokeMiter() + << ", " << paint.getStrokeCap() + << ", " << paint.getStrokeJoin(); + } + if (paint.getColorSource()) { + os << ", " << paint.getColorSource(); + } + if (paint.getColorFilter()) { + os << ", " << paint.getColorFilter(); + } + if (paint.getImageFilter()) { + os << ", " << paint.getImageFilter(); + } + if (paint.getMaskFilter()) { + os << ", " << paint.getMaskFilter(); + } + if (paint.isDither()) { + os << ", dither: " << paint.isDither(); + } + if (paint.isInvertColors()) { + os << ", invertColors: " << paint.isInvertColors(); + } + return os << ")"; +} + std::ostream& operator<<(std::ostream& os, const DlBlendMode& mode) { switch (mode) { case DlBlendMode::kClear: return os << "BlendMode::kClear"; @@ -160,16 +193,16 @@ static std::ostream& operator<<(std::ostream& os, const SkRSXform& xform) { << "ty: " << xform.fTy << ")"; } -static std::ostream& operator<<(std::ostream& os, const SkClipOp& op) { +std::ostream& operator<<(std::ostream& os, const DlCanvas::ClipOp& op) { switch (op) { - case SkClipOp::kDifference: return os << "ClipOp::kDifference"; - case SkClipOp::kIntersect: return os << "ClipOp::kIntersect"; + case DlCanvas::ClipOp::kDifference: return os << "ClipOp::kDifference"; + case DlCanvas::ClipOp::kIntersect: return os << "ClipOp::kIntersect"; default: return os << "ClipOp::????"; } } -static std::ostream& operator<<(std::ostream& os, const DlStrokeCap& cap) { +std::ostream& operator<<(std::ostream& os, const DlStrokeCap& cap) { switch (cap) { case DlStrokeCap::kButt: return os << "Cap::kButt"; case DlStrokeCap::kRound: return os << "Cap::kRound"; @@ -179,7 +212,7 @@ static std::ostream& operator<<(std::ostream& os, const DlStrokeCap& cap) { } } -static std::ostream& operator<<(std::ostream& os, const DlStrokeJoin& join) { +std::ostream& operator<<(std::ostream& os, const DlStrokeJoin& join) { switch (join) { case DlStrokeJoin::kMiter: return os << "Join::kMiter"; case DlStrokeJoin::kRound: return os << "Join::kRound"; @@ -189,7 +222,7 @@ static std::ostream& operator<<(std::ostream& os, const DlStrokeJoin& join) { } } -static std::ostream& operator<<(std::ostream& os, const DlDrawStyle& style) { +std::ostream& operator<<(std::ostream& os, const DlDrawStyle& style) { switch (style) { case DlDrawStyle::kFill: return os << "Style::kFill"; case DlDrawStyle::kStroke: return os << "Style::kStroke"; @@ -199,7 +232,7 @@ static std::ostream& operator<<(std::ostream& os, const DlDrawStyle& style) { } } -static std::ostream& operator<<(std::ostream& os, const SkBlurStyle& style) { +std::ostream& operator<<(std::ostream& os, const SkBlurStyle& style) { switch (style) { case kNormal_SkBlurStyle: return os << "BlurStyle::kNormal"; case kSolid_SkBlurStyle: return os << "BlurStyle::kSolid"; @@ -211,17 +244,17 @@ static std::ostream& operator<<(std::ostream& os, const SkBlurStyle& style) { } static std::ostream& operator<<(std::ostream& os, - const SkCanvas::PointMode& mode) { + const DlCanvas::PointMode& mode) { switch (mode) { - case SkCanvas::kPoints_PointMode: return os << "PointMode::kPoints"; - case SkCanvas::kLines_PointMode: return os << "PointMode::kLines"; - case SkCanvas::kPolygon_PointMode: return os << "PointMode::kPolygon"; + case DlCanvas::PointMode::kPoints: return os << "PointMode::kPoints"; + case DlCanvas::PointMode::kLines: return os << "PointMode::kLines"; + case DlCanvas::PointMode::kPolygon: return os << "PointMode::kPolygon"; default: return os << "PointMode::????"; } } -static std::ostream& operator<<(std::ostream& os, const DlFilterMode& mode) { +std::ostream& operator<<(std::ostream& os, const DlFilterMode& mode) { switch (mode) { case DlFilterMode::kNearest: return os << "FilterMode::kNearest"; case DlFilterMode::kLinear: return os << "FilterMode::kLinear"; @@ -230,12 +263,11 @@ static std::ostream& operator<<(std::ostream& os, const DlFilterMode& mode) { } } -static std::ostream& operator<<(std::ostream& os, const DlColor& color) { +std::ostream& operator<<(std::ostream& os, const DlColor& color) { return os << "DlColor(" << std::hex << color.argb << std::dec << ")"; } -static std::ostream& operator<<(std::ostream& os, - DlImageSampling sampling) { +std::ostream& operator<<(std::ostream& os, DlImageSampling sampling) { switch (sampling) { case DlImageSampling::kNearestNeighbor: { return os << "NearestSampling"; @@ -259,7 +291,7 @@ static std::ostream& operator<<(std::ostream& os, const SkTextBlob* blob) { return os << "&SkTextBlob(ID: " << blob->uniqueID() << ", " << blob->bounds() << ")"; } -static std::ostream& operator<<(std::ostream& os, const DlVertexMode& mode) { +std::ostream& operator<<(std::ostream& os, const DlVertexMode& mode) { switch (mode) { case DlVertexMode::kTriangles: return os << "VertexMode::kTriangles"; case DlVertexMode::kTriangleStrip: return os << "VertexMode::kTriangleStrip"; @@ -269,7 +301,7 @@ static std::ostream& operator<<(std::ostream& os, const DlVertexMode& mode) { } } -static std::ostream& operator<<(std::ostream& os, const DlTileMode& mode) { +std::ostream& operator<<(std::ostream& os, const DlTileMode& mode) { switch (mode) { case DlTileMode::kClamp: return os << "TileMode::kClamp"; case DlTileMode::kRepeat: return os << "TileMode::kRepeat"; @@ -280,7 +312,7 @@ static std::ostream& operator<<(std::ostream& os, const DlTileMode& mode) { } } -static std::ostream& operator<<(std::ostream& os, const DlImage* image) { +std::ostream& operator<<(std::ostream& os, const DlImage* image) { if (image == nullptr) { return os << "null image"; } @@ -659,7 +691,7 @@ void DisplayListStreamDispatcher::transformReset() { startl() << "transformReset();" << std::endl; } -void DisplayListStreamDispatcher::clipRect(const SkRect& rect, SkClipOp clip_op, +void DisplayListStreamDispatcher::clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) { startl() << "clipRect(" << rect << ", " @@ -668,7 +700,7 @@ void DisplayListStreamDispatcher::clipRect(const SkRect& rect, SkClipOp clip_op, << ");" << std::endl; } void DisplayListStreamDispatcher::clipRRect(const SkRRect& rrect, - SkClipOp clip_op, + ClipOp clip_op, bool is_aa) { startl() << "clipRRect(" << rrect << ", " @@ -676,7 +708,7 @@ void DisplayListStreamDispatcher::clipRRect(const SkRRect& rrect, << "isaa: " << is_aa << ");" << std::endl; } -void DisplayListStreamDispatcher::clipPath(const SkPath& path, SkClipOp clip_op, +void DisplayListStreamDispatcher::clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) { startl() << "clipPath(" << path << ", " @@ -730,7 +762,7 @@ void DisplayListStreamDispatcher::drawArc(const SkRect& oval_bounds, << "use_center: " << use_center << ");" << std::endl; } -void DisplayListStreamDispatcher::drawPoints(SkCanvas::PointMode mode, +void DisplayListStreamDispatcher::drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) { startl() << "drawPoints(" << mode << ", "; diff --git a/testing/display_list_testing.h b/testing/display_list_testing.h index d9e46c15351c0..c348708313f64 100644 --- a/testing/display_list_testing.h +++ b/testing/display_list_testing.h @@ -33,6 +33,19 @@ bool inline DisplayListsNE_Verbose(sk_sp a, extern std::ostream& operator<<(std::ostream& os, const DisplayList& display_list); +extern std::ostream& operator<<(std::ostream& os, const DlPaint& paint); +extern std::ostream& operator<<(std::ostream& os, const DlBlendMode& mode); +extern std::ostream& operator<<(std::ostream& os, const DlCanvas::ClipOp& op); +extern std::ostream& operator<<(std::ostream& os, const DlStrokeCap& cap); +extern std::ostream& operator<<(std::ostream& os, const DlStrokeJoin& join); +extern std::ostream& operator<<(std::ostream& os, const DlDrawStyle& style); +extern std::ostream& operator<<(std::ostream& os, const SkBlurStyle& style); +extern std::ostream& operator<<(std::ostream& os, const DlFilterMode& mode); +extern std::ostream& operator<<(std::ostream& os, const DlColor& color); +extern std::ostream& operator<<(std::ostream& os, DlImageSampling sampling); +extern std::ostream& operator<<(std::ostream& os, const DlVertexMode& mode); +extern std::ostream& operator<<(std::ostream& os, const DlTileMode& mode); +extern std::ostream& operator<<(std::ostream& os, const DlImage* image); class DisplayListStreamDispatcher final : public Dispatcher { public: @@ -79,9 +92,9 @@ class DisplayListStreamDispatcher final : public Dispatcher { // clang-format on void transformReset() override; - void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override; - void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override; - void clipPath(const SkPath& path, SkClipOp clip_op, bool is_aa) override; + void clipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; + void clipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; + void clipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; void drawColor(DlColor color, DlBlendMode mode) override; void drawPaint() override; @@ -96,7 +109,7 @@ class DisplayListStreamDispatcher final : public Dispatcher { SkScalar start_degrees, SkScalar sweep_degrees, bool use_center) override; - void drawPoints(SkCanvas::PointMode mode, + void drawPoints(PointMode mode, uint32_t count, const SkPoint points[]) override; void drawSkVertices(const sk_sp vertices, diff --git a/testing/mock_canvas.cc b/testing/mock_canvas.cc index b53a01ca51caf..837d336c8cbba 100644 --- a/testing/mock_canvas.cc +++ b/testing/mock_canvas.cc @@ -5,6 +5,7 @@ #include "flutter/testing/mock_canvas.h" #include "flutter/fml/logging.h" +#include "flutter/testing/display_list_testing.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkSerialProcs.h" @@ -17,75 +18,142 @@ namespace testing { constexpr SkISize kSize = SkISize::Make(64, 64); MockCanvas::MockCanvas() - : SkCanvasVirtualEnforcer(kSize.fWidth, kSize.fHeight), - internal_canvas_(imageInfo().width(), imageInfo().height()), - current_layer_(0) { - internal_canvas_.addCanvas(this); -} + : tracker_(SkRect::Make(kSize), SkMatrix::I()), current_layer_(0) {} + +MockCanvas::MockCanvas(int width, int height) + : tracker_(SkRect::MakeIWH(width, height), SkMatrix::I()), + current_layer_(0) {} MockCanvas::~MockCanvas() { EXPECT_EQ(current_layer_, 0); } -void MockCanvas::willSave() { +SkISize MockCanvas::GetBaseLayerSize() const { + return tracker_.base_device_cull_rect().roundOut().size(); +} + +SkImageInfo MockCanvas::GetImageInfo() const { + SkISize size = GetBaseLayerSize(); + return SkImageInfo::MakeUnknown(size.width(), size.height()); +} + +void MockCanvas::Save() { draw_calls_.emplace_back( DrawCall{current_layer_, SaveData{current_layer_ + 1}}); + tracker_.save(); current_layer_++; // Must go here; func params order of eval is undefined } -SkCanvas::SaveLayerStrategy MockCanvas::getSaveLayerStrategy( - const SaveLayerRec& rec) { +void MockCanvas::SaveLayer(const SkRect* bounds, + const DlPaint* paint, + const DlImageFilter* backdrop) { // saveLayer calls this prior to running, so we use it to track saveLayer // calls draw_calls_.emplace_back(DrawCall{ current_layer_, - SaveLayerData{rec.fBounds ? *rec.fBounds : SkRect(), - rec.fPaint ? *rec.fPaint : SkPaint(), - rec.fBackdrop ? sk_ref_sp(rec.fBackdrop) - : sk_sp(), + SaveLayerData{bounds ? *bounds : SkRect(), paint ? *paint : DlPaint(), + backdrop ? backdrop->shared() : nullptr, current_layer_ + 1}}); + tracker_.save(); current_layer_++; // Must go here; func params order of eval is undefined - return kNoLayer_SaveLayerStrategy; } -void MockCanvas::willRestore() { +void MockCanvas::Restore() { FML_DCHECK(current_layer_ > 0); draw_calls_.emplace_back( DrawCall{current_layer_, RestoreData{current_layer_ - 1}}); + tracker_.restore(); current_layer_--; // Must go here; func params order of eval is undefined } -void MockCanvas::didConcat44(const SkM44& matrix) { - draw_calls_.emplace_back(DrawCall{current_layer_, ConcatMatrixData{matrix}}); +// clang-format off + +// 2x3 2D affine subset of a 4x4 transform in row major order +void MockCanvas::Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) { + Transform(SkMatrix::MakeAll(mxx, mxy, mxt, myx, myy, myt, 0, 0, 1)); +} + +// full 4x4 transform in row major order +void MockCanvas::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) { + Transform(SkM44(mxx, mxy, mxz, mxt, + myx, myy, myz, myt, + mzx, mzy, mzz, mzt, + mwx, mwy, mwz, mwt)); +} + +// clang-format on + +void MockCanvas::Transform(const SkMatrix* matrix) { + draw_calls_.emplace_back( + DrawCall{current_layer_, ConcatMatrixData{SkM44(*matrix)}}); + tracker_.transform(*matrix); +} + +void MockCanvas::Transform(const SkM44* matrix) { + draw_calls_.emplace_back(DrawCall{current_layer_, ConcatMatrixData{*matrix}}); + tracker_.transform(*matrix); } -void MockCanvas::didSetM44(const SkM44& matrix) { - draw_calls_.emplace_back(DrawCall{current_layer_, SetMatrixData{matrix}}); +void MockCanvas::SetTransform(const SkMatrix* matrix) { + draw_calls_.emplace_back( + DrawCall{current_layer_, SetMatrixData{SkM44(*matrix)}}); + tracker_.setTransform(*matrix); } -void MockCanvas::didScale(SkScalar x, SkScalar y) { - this->didConcat44(SkM44::Scale(x, y)); +void MockCanvas::SetTransform(const SkM44* matrix) { + draw_calls_.emplace_back(DrawCall{current_layer_, SetMatrixData{*matrix}}); + tracker_.setTransform(*matrix); } -void MockCanvas::didTranslate(SkScalar x, SkScalar y) { - this->didConcat44(SkM44::Translate(x, y)); +void MockCanvas::TransformReset() { + draw_calls_.emplace_back(DrawCall{current_layer_, SetMatrixData{SkM44()}}); + tracker_.setIdentity(); } -void MockCanvas::onDrawTextBlob(const SkTextBlob* text, - SkScalar x, - SkScalar y, - const SkPaint& paint) { +void MockCanvas::Translate(SkScalar x, SkScalar y) { + this->Transform(SkM44::Translate(x, y)); +} + +void MockCanvas::Scale(SkScalar x, SkScalar y) { + this->Transform(SkM44::Scale(x, y)); +} + +void MockCanvas::Rotate(SkScalar degrees) { + this->Transform(SkMatrix::RotateDeg(degrees)); +} + +void MockCanvas::Skew(SkScalar sx, SkScalar sy) { + this->Transform(SkMatrix::Skew(sx, sy)); +} + +SkM44 MockCanvas::GetTransformFullPerspective() const { + return tracker_.matrix_4x4(); +} + +SkMatrix MockCanvas::GetTransform() const { + return tracker_.matrix_3x3(); +} + +void MockCanvas::DrawTextBlob(const sk_sp& text, + SkScalar x, + SkScalar y, + const DlPaint& paint) { // This duplicates existing logic in SkCanvas::onDrawPicture // that should probably be split out so it doesn't need to be here as well. - SkRect storage; - if (paint.canComputeFastBounds()) { - storage = text->bounds().makeOffset(x, y); - SkRect tmp; - if (this->quickReject(paint.computeFastBounds(storage, &tmp))) { - return; - } - } + // SkRect storage; + // if (paint.canComputeFastBounds()) { + // storage = text->bounds().makeOffset(x, y); + // SkRect tmp; + // if (this->quickReject(paint.computeFastBounds(storage, &tmp))) { + // return; + // } + // } draw_calls_.emplace_back(DrawCall{ current_layer_, DrawTextData{text ? text->serialize(SkSerialProcs{}) @@ -93,193 +161,200 @@ void MockCanvas::onDrawTextBlob(const SkTextBlob* text, paint, SkPoint::Make(x, y)}}); } -void MockCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { +void MockCanvas::DrawRect(const SkRect& rect, const DlPaint& paint) { draw_calls_.emplace_back(DrawCall{current_layer_, DrawRectData{rect, paint}}); } -void MockCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { +void MockCanvas::DrawPath(const SkPath& path, const DlPaint& paint) { draw_calls_.emplace_back(DrawCall{current_layer_, DrawPathData{path, paint}}); } -void MockCanvas::onDrawShadowRec(const SkPath& path, - const SkDrawShadowRec& rec) { - // See: https://bugs.chromium.org/p/skia/issues/detail?id=12125 - (void)rec; // Can't use b/c Skia keeps this type anonymous. - draw_calls_.emplace_back(DrawCall{current_layer_, DrawShadowData{path}}); +void MockCanvas::DrawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) { + draw_calls_.emplace_back(DrawCall{ + current_layer_, + DrawShadowData{path, color, elevation, transparent_occluder, dpr}}); } -void MockCanvas::onDrawImage2(const SkImage* image, - SkScalar x, - SkScalar y, - const SkSamplingOptions& options, - const SkPaint* paint) { +void MockCanvas::DrawImage(const sk_sp& image, + SkPoint point, + const DlImageSampling options, + const DlPaint* paint) { if (paint) { draw_calls_.emplace_back( DrawCall{current_layer_, - DrawImageData{sk_ref_sp(image), x, y, options, *paint}}); + DrawImageData{image, point.fX, point.fY, options, *paint}}); } else { - draw_calls_.emplace_back(DrawCall{ - current_layer_, DrawImageDataNoPaint{sk_ref_sp(image), x, y, options}}); + draw_calls_.emplace_back( + DrawCall{current_layer_, + DrawImageDataNoPaint{image, point.fX, point.fY, options}}); } } -void MockCanvas::onDrawPicture(const SkPicture* picture, - const SkMatrix* matrix, - const SkPaint* paint) { - // This duplicates existing logic in SkCanvas::onDrawPicture - // that should probably be split out so it doesn't need to be here as well. - if (!paint || paint->canComputeFastBounds()) { - SkRect bounds = picture->cullRect(); - if (paint) { - paint->computeFastBounds(bounds, &bounds); - } - if (matrix) { - matrix->mapRect(&bounds); - } - if (this->quickReject(bounds)) { - return; - } - } - - draw_calls_.emplace_back(DrawCall{ - current_layer_, - DrawPictureData{ - picture ? picture->serialize() : SkData::MakeUninitialized(0), - paint ? *paint : SkPaint(), matrix ? *matrix : SkMatrix()}}); +void MockCanvas::DrawDisplayList(const sk_sp display_list, + SkScalar opacity) { + draw_calls_.emplace_back( + DrawCall{current_layer_, DrawDisplayListData{display_list, opacity}}); } -void MockCanvas::onClipRect(const SkRect& rect, - SkClipOp op, - ClipEdgeStyle style) { +void MockCanvas::ClipRect(const SkRect& rect, ClipOp op, bool is_aa) { + ClipEdgeStyle style = is_aa ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; draw_calls_.emplace_back( DrawCall{current_layer_, ClipRectData{rect, op, style}}); - // quickReject() is handled by base class and needs accurate clip information - SkCanvas::onClipRect(rect, op, style); + tracker_.clipRect(rect, op, is_aa); } -void MockCanvas::onClipRRect(const SkRRect& rrect, - SkClipOp op, - ClipEdgeStyle style) { +void MockCanvas::ClipRRect(const SkRRect& rrect, ClipOp op, bool is_aa) { + ClipEdgeStyle style = is_aa ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; draw_calls_.emplace_back( DrawCall{current_layer_, ClipRRectData{rrect, op, style}}); - // quickReject() is handled by base class and needs accurate clip information - SkCanvas::onClipRRect(rrect, op, style); + tracker_.clipRRect(rrect, op, is_aa); } -void MockCanvas::onClipPath(const SkPath& path, - SkClipOp op, - ClipEdgeStyle style) { +void MockCanvas::ClipPath(const SkPath& path, ClipOp op, bool is_aa) { + ClipEdgeStyle style = is_aa ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; draw_calls_.emplace_back( DrawCall{current_layer_, ClipPathData{path, op, style}}); - // quickReject() is handled by base class and needs accurate clip information - SkCanvas::onClipPath(path, op, style); + tracker_.clipPath(path, op, is_aa); } -bool MockCanvas::onDoSaveBehind(const SkRect*) { - FML_DCHECK(false); - return false; +SkRect MockCanvas::GetDestinationClipBounds() const { + return tracker_.device_cull_rect(); } -void MockCanvas::onDrawAnnotation(const SkRect&, const char[], SkData*) { - FML_DCHECK(false); +SkRect MockCanvas::GetLocalClipBounds() const { + return tracker_.local_cull_rect(); } -void MockCanvas::onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) { - FML_DCHECK(false); +bool MockCanvas::QuickReject(const SkRect& bounds) const { + return tracker_.content_culled(bounds); } -void MockCanvas::onDrawDrawable(SkDrawable*, const SkMatrix*) { +void MockCanvas::DrawDRRect(const SkRRect&, const SkRRect&, const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawPatch(const SkPoint[12], - const SkColor[4], - const SkPoint[4], - SkBlendMode, - const SkPaint&) { - FML_DCHECK(false); +void MockCanvas::DrawPaint(const DlPaint& paint) { + draw_calls_.emplace_back(DrawCall{current_layer_, DrawPaintData{paint}}); } -void MockCanvas::onDrawPaint(const SkPaint& skPaint) { - draw_calls_.emplace_back(DrawCall{current_layer_, DrawPaint{skPaint}}); +void MockCanvas::DrawColor(DlColor color, DlBlendMode mode) { + DrawPaint(DlPaint(color).setBlendMode(mode)); } -void MockCanvas::onDrawBehind(const SkPaint&) { +void MockCanvas::DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) { FML_DCHECK(false); } -void MockCanvas::onDrawPoints(PointMode, - size_t, - const SkPoint[], - const SkPaint&) { +void MockCanvas::DrawPoints(PointMode, + uint32_t, + const SkPoint[], + const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawRegion(const SkRegion&, const SkPaint&) { +void MockCanvas::DrawOval(const SkRect&, const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawOval(const SkRect&, const SkPaint&) { +void MockCanvas::DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) { FML_DCHECK(false); } -void MockCanvas::onDrawArc(const SkRect&, - SkScalar, - SkScalar, - bool, - const SkPaint&) { +void MockCanvas::DrawArc(const SkRect&, + SkScalar, + SkScalar, + bool, + const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawRRect(const SkRRect&, const SkPaint&) { +void MockCanvas::DrawRRect(const SkRRect&, const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawImageRect2(const SkImage*, - const SkRect&, - const SkRect&, - const SkSamplingOptions&, - const SkPaint*, - SrcRectConstraint) { +void MockCanvas::DrawImageRect(const sk_sp&, + const SkRect&, + const SkRect&, + const DlImageSampling, + const DlPaint*, + bool enforce_src_edges) { FML_DCHECK(false); } -void MockCanvas::onDrawImageLattice2(const SkImage*, - const Lattice&, - const SkRect&, - SkFilterMode, - const SkPaint*) { +void MockCanvas::DrawImageNine(const sk_sp& image, + const SkIRect& center, + const SkRect& dst, + DlFilterMode filter, + const DlPaint* paint) { FML_DCHECK(false); } -void MockCanvas::onDrawVerticesObject(const SkVertices*, - SkBlendMode, - const SkPaint&) { +void MockCanvas::DrawVertices(const DlVertices*, DlBlendMode, const DlPaint&) { FML_DCHECK(false); } -void MockCanvas::onDrawAtlas2(const SkImage*, - const SkRSXform[], - const SkRect[], - const SkColor[], - int, - SkBlendMode, - const SkSamplingOptions&, - const SkRect*, - const SkPaint*) { +void MockCanvas::DrawAtlas(const sk_sp&, + const SkRSXform[], + const SkRect[], + const DlColor[], + int, + DlBlendMode, + const DlImageSampling, + const SkRect*, + const DlPaint*) { FML_DCHECK(false); } -void MockCanvas::onDrawEdgeAAQuad(const SkRect&, - const SkPoint[4], - QuadAAFlags, - const SkColor4f&, - SkBlendMode) { +void MockCanvas::Flush() { FML_DCHECK(false); } -void MockCanvas::onClipRegion(const SkRegion&, SkClipOp) { - FML_DCHECK(false); +// -------------------------------------------------------- +// A few ostream operators duplicated from assertions_skia.cc +// In the short term, there are issues trying to include that file +// here because it appears in a skia-targeted testing source set +// and in the long term, DlCanvas, and therefore this file will +// eventually be cleaned of these SkObject dependencies and these +// ostream operators will be converted to their DL equivalents. +static std::ostream& operator<<(std::ostream& os, const SkPoint& r) { + return os << "XY: " << r.fX << ", " << r.fY; +} + +static std::ostream& operator<<(std::ostream& os, const SkRect& r) { + return os << "LTRB: " << r.fLeft << ", " << r.fTop << ", " << r.fRight << ", " + << r.fBottom; +} + +static std::ostream& operator<<(std::ostream& os, const SkRRect& r) { + return os << "LTRB: " << r.rect().fLeft << ", " << r.rect().fTop << ", " + << r.rect().fRight << ", " << r.rect().fBottom; +} + +static std::ostream& operator<<(std::ostream& os, const SkPath& r) { + return os << "Valid: " << r.isValid() + << ", FillType: " << static_cast(r.getFillType()) + << ", Bounds: " << r.getBounds(); +} +// -------------------------------------------------------- + +static std::ostream& operator<<(std::ostream& os, const SkM44& m) { + os << m.rc(0, 0) << ", " << m.rc(0, 1) << ", " << m.rc(0, 2) << ", " + << m.rc(0, 3) << std::endl; + os << m.rc(1, 0) << ", " << m.rc(1, 1) << ", " << m.rc(1, 2) << ", " + << m.rc(1, 3) << std::endl; + os << m.rc(2, 0) << ", " << m.rc(2, 1) << ", " << m.rc(2, 2) << ", " + << m.rc(2, 3) << std::endl; + os << m.rc(3, 0) << ", " << m.rc(3, 1) << ", " << m.rc(3, 2) << ", " + << m.rc(3, 3); + return os; } bool operator==(const MockCanvas::SaveData& a, const MockCanvas::SaveData& b) { @@ -293,7 +368,7 @@ std::ostream& operator<<(std::ostream& os, const MockCanvas::SaveData& data) { bool operator==(const MockCanvas::SaveLayerData& a, const MockCanvas::SaveLayerData& b) { return a.save_bounds == b.save_bounds && a.restore_paint == b.restore_paint && - a.backdrop_filter == b.backdrop_filter && + Equals(a.backdrop_filter, b.backdrop_filter) && a.save_to_layer == b.save_to_layer; } @@ -388,26 +463,28 @@ std::ostream& operator<<(std::ostream& os, << data.options; } -bool operator==(const MockCanvas::DrawPictureData& a, - const MockCanvas::DrawPictureData& b) { - return a.serialized_picture->equals(b.serialized_picture.get()) && - a.paint == b.paint && a.matrix == b.matrix; +bool operator==(const MockCanvas::DrawDisplayListData& a, + const MockCanvas::DrawDisplayListData& b) { + return a.display_list->Equals(b.display_list) && a.opacity == b.opacity; } std::ostream& operator<<(std::ostream& os, - const MockCanvas::DrawPictureData& data) { - return os << data.serialized_picture << " " << data.paint << " " - << data.matrix; + const MockCanvas::DrawDisplayListData& data) { + auto dl = data.display_list; + return os << "[" << dl->unique_id() << " " << dl->op_count() << " " + << dl->bytes() << "] " << data.opacity; } bool operator==(const MockCanvas::DrawShadowData& a, const MockCanvas::DrawShadowData& b) { - return a.path == b.path; + return a.path == b.path && a.color == b.color && a.elevation == b.elevation && + a.transparent_occluder == b.transparent_occluder && a.dpr == b.dpr; } std::ostream& operator<<(std::ostream& os, const MockCanvas::DrawShadowData& data) { - return os << data.path; + return os << data.path << " " << data.color << " " << data.elevation << " " + << data.transparent_occluder << " " << data.dpr; } bool operator==(const MockCanvas::ClipRectData& a, @@ -415,6 +492,12 @@ bool operator==(const MockCanvas::ClipRectData& a, return a.rect == b.rect && a.clip_op == b.clip_op && a.style == b.style; } +static std::ostream& operator<<(std::ostream& os, + const MockCanvas::ClipEdgeStyle& style) { + return os << (style == MockCanvas::kSoft_ClipEdgeStyle ? "kSoftEdges" + : "kHardEdges"); +} + std::ostream& operator<<(std::ostream& os, const MockCanvas::ClipRectData& data) { return os << data.rect << " " << data.clip_op << " " << data.style; @@ -454,12 +537,13 @@ std::ostream& operator<<(std::ostream& os, const MockCanvas::DrawCall& draw) { return os << "[Layer: " << draw.layer << ", Data: " << draw.data << "]"; } -bool operator==(const MockCanvas::DrawPaint& a, - const MockCanvas::DrawPaint& b) { +bool operator==(const MockCanvas::DrawPaintData& a, + const MockCanvas::DrawPaintData& b) { return a.paint == b.paint; } -std::ostream& operator<<(std::ostream& os, const MockCanvas::DrawPaint& data) { +std::ostream& operator<<(std::ostream& os, + const MockCanvas::DrawPaintData& data) { return os << data.paint; } diff --git a/testing/mock_canvas.h b/testing/mock_canvas.h index 345adbc0cde18..5473432509a11 100644 --- a/testing/mock_canvas.h +++ b/testing/mock_canvas.h @@ -9,7 +9,8 @@ #include #include -#include "flutter/testing/assertions_skia.h" +#include "flutter/display_list/display_list_matrix_clip_tracker.h" +#include "flutter/display_list/dl_canvas.h" #include "gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvasVirtualEnforcer.h" @@ -33,10 +34,12 @@ static constexpr SkRect kEmptyRect = SkRect::MakeEmpty(); // // The |MockCanvas| stores a list of |DrawCall| that the test can later verify // against the expected list of primitives to be drawn. -class MockCanvas : public SkCanvasVirtualEnforcer { +class MockCanvas final : public DlCanvas { public: - using SkCanvas::kHard_ClipEdgeStyle; - using SkCanvas::kSoft_ClipEdgeStyle; + enum ClipEdgeStyle { + kHard_ClipEdgeStyle, + kSoft_ClipEdgeStyle, + }; struct SaveData { int save_to_layer; @@ -44,8 +47,8 @@ class MockCanvas : public SkCanvasVirtualEnforcer { struct SaveLayerData { SkRect save_bounds; - SkPaint restore_paint; - sk_sp backdrop_filter; + DlPaint restore_paint; + std::shared_ptr backdrop_filter; int save_to_layer; }; @@ -63,65 +66,68 @@ class MockCanvas : public SkCanvasVirtualEnforcer { struct DrawRectData { SkRect rect; - SkPaint paint; + DlPaint paint; }; struct DrawPathData { SkPath path; - SkPaint paint; + DlPaint paint; }; struct DrawTextData { sk_sp serialized_text; - SkPaint paint; + DlPaint paint; SkPoint offset; }; struct DrawImageDataNoPaint { - sk_sp image; + sk_sp image; SkScalar x; SkScalar y; - SkSamplingOptions options; + DlImageSampling options; }; struct DrawImageData { - sk_sp image; + sk_sp image; SkScalar x; SkScalar y; - SkSamplingOptions options; - SkPaint paint; + DlImageSampling options; + DlPaint paint; }; - struct DrawPictureData { - sk_sp serialized_picture; - SkPaint paint; - SkMatrix matrix; + struct DrawDisplayListData { + sk_sp display_list; + SkScalar opacity; }; struct DrawShadowData { SkPath path; + DlColor color; + SkScalar elevation; + bool transparent_occluder; + SkScalar dpr; }; struct ClipRectData { SkRect rect; - SkClipOp clip_op; + ClipOp clip_op; ClipEdgeStyle style; }; struct ClipRRectData { SkRRect rrect; - SkClipOp clip_op; + ClipOp clip_op; ClipEdgeStyle style; }; struct ClipPathData { SkPath path; - SkClipOp clip_op; + ClipOp clip_op; ClipEdgeStyle style; }; - struct DrawPaint { - SkPaint paint; + struct DrawPaintData { + DlPaint paint; }; // Discriminated union of all the different |DrawCall| types. It is roughly @@ -136,12 +142,12 @@ class MockCanvas : public SkCanvasVirtualEnforcer { DrawTextData, DrawImageDataNoPaint, DrawImageData, - DrawPictureData, + DrawDisplayListData, DrawShadowData, ClipRectData, ClipRRectData, ClipPathData, - DrawPaint>; + DrawPaintData>; // A single call made against this canvas. struct DrawCall { @@ -150,107 +156,134 @@ class MockCanvas : public SkCanvasVirtualEnforcer { }; MockCanvas(); - ~MockCanvas() override; + MockCanvas(int width, int height); + ~MockCanvas(); - SkNWayCanvas* internal_canvas() { return &internal_canvas_; } + // SkNWayCanvas* internal_canvas() { return &internal_canvas_; } const std::vector& draw_calls() const { return draw_calls_; } void reset_draw_calls() { draw_calls_.clear(); } - protected: - // Save/restore/set operations that we track. - void willSave() override; - SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override; - void willRestore() override; - void didRestore() override {} - void didConcat44(const SkM44&) override; - void didSetM44(const SkM44&) override; - void didScale(SkScalar x, SkScalar y) override; - void didTranslate(SkScalar x, SkScalar y) override; - - // Draw and clip operations that we track. - void onDrawRect(const SkRect& rect, const SkPaint& paint) override; - void onDrawPath(const SkPath& path, const SkPaint& paint) override; - void onDrawTextBlob(const SkTextBlob* text, - SkScalar x, - SkScalar y, - const SkPaint& paint) override; - void onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) override; - void onDrawPicture(const SkPicture* picture, - const SkMatrix* matrix, - const SkPaint* paint) override; - void onClipRect(const SkRect& rect, - SkClipOp op, - ClipEdgeStyle style) override; - void onClipRRect(const SkRRect& rrect, - SkClipOp op, - ClipEdgeStyle style) override; - void onClipPath(const SkPath& path, - SkClipOp op, - ClipEdgeStyle style) override; - - // Operations that we don't track. - bool onDoSaveBehind(const SkRect*) override; - void onDrawAnnotation(const SkRect&, const char[], SkData*) override; - void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; - void onDrawDrawable(SkDrawable*, const SkMatrix*) override; - void onDrawPatch(const SkPoint[12], - const SkColor[4], - const SkPoint[4], - SkBlendMode, - const SkPaint&) override; - void onDrawPaint(const SkPaint&) override; - void onDrawBehind(const SkPaint&) override; - void onDrawPoints(PointMode, - size_t, - const SkPoint[], - const SkPaint&) override; - void onDrawRegion(const SkRegion&, const SkPaint&) override; - void onDrawOval(const SkRect&, const SkPaint&) override; - void onDrawArc(const SkRect&, - SkScalar, - SkScalar, - bool, - const SkPaint&) override; - void onDrawRRect(const SkRRect&, const SkPaint&) override; - void onDrawImage2(const SkImage* image, + SkISize GetBaseLayerSize() const override; + SkImageInfo GetImageInfo() const override; + + void Save() override; + void SaveLayer(const SkRect* bounds, + const DlPaint* paint = nullptr, + const DlImageFilter* backdrop = nullptr) override; + void Restore() override; + int GetSaveCount() const { return current_layer_; } + void RestoreToCount(int restore_count) { + while (current_layer_ > restore_count) { + Restore(); + } + } + + // clang-format off + + // 2x3 2D affine subset of a 4x4 transform in row major order + void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, + SkScalar myx, SkScalar myy, SkScalar myt) override; + // full 4x4 transform in row major order + 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 + + void Translate(SkScalar tx, SkScalar ty) override; + void Scale(SkScalar sx, SkScalar sy) override; + void Rotate(SkScalar degrees) override; + void Skew(SkScalar sx, SkScalar sy) override; + void TransformReset() override; + void Transform(const SkMatrix* matrix) override; + void Transform(const SkM44* matrix44) override; + void SetTransform(const SkMatrix* matrix) override; + void SetTransform(const SkM44* matrix44) override; + using DlCanvas::SetTransform; + using DlCanvas::Transform; + + SkM44 GetTransformFullPerspective() const override; + SkMatrix GetTransform() const override; + + void ClipRect(const SkRect& rect, ClipOp clip_op, bool is_aa) override; + void ClipRRect(const SkRRect& rrect, ClipOp clip_op, bool is_aa) override; + void ClipPath(const SkPath& path, ClipOp clip_op, bool is_aa) override; + + SkRect GetDestinationClipBounds() const override; + SkRect GetLocalClipBounds() const override; + bool QuickReject(const SkRect& bounds) const override; + + void DrawPaint(const DlPaint& paint) override; + void DrawColor(DlColor color, DlBlendMode mode) override; + void DrawLine(const SkPoint& p0, + const SkPoint& p1, + const DlPaint& paint) override; + void DrawRect(const SkRect& rect, const DlPaint& paint) override; + void DrawOval(const SkRect& bounds, const DlPaint& paint) override; + void DrawCircle(const SkPoint& center, + SkScalar radius, + const DlPaint& paint) override; + void DrawRRect(const SkRRect& rrect, const DlPaint& paint) override; + void DrawDRRect(const SkRRect& outer, + const SkRRect& inner, + const DlPaint& paint) override; + void DrawPath(const SkPath& path, const DlPaint& paint) override; + void DrawArc(const SkRect& bounds, + SkScalar start, + SkScalar sweep, + bool useCenter, + const DlPaint& paint) override; + void DrawPoints(PointMode mode, + uint32_t count, + const SkPoint pts[], + const DlPaint& paint) override; + void DrawVertices(const DlVertices* vertices, + DlBlendMode mode, + const DlPaint& paint) override; + + void DrawImage(const sk_sp& image, + const SkPoint point, + DlImageSampling sampling, + const DlPaint* paint = nullptr) override; + void DrawImageRect(const sk_sp& image, + const SkRect& src, + const SkRect& dst, + DlImageSampling sampling, + const DlPaint* paint = nullptr, + bool enforce_src_edges = false) override; + void DrawImageNine(const sk_sp& image, + const SkIRect& center, + const SkRect& dst, + DlFilterMode filter, + const DlPaint* paint = nullptr) override; + void DrawAtlas(const sk_sp& atlas, + const SkRSXform xform[], + const SkRect tex[], + const DlColor colors[], + int count, + DlBlendMode mode, + DlImageSampling sampling, + const SkRect* cullRect, + const DlPaint* paint = nullptr) override; + + void DrawDisplayList(const sk_sp display_list, + SkScalar opacity) override; + void DrawTextBlob(const sk_sp& blob, SkScalar x, SkScalar y, - const SkSamplingOptions&, - const SkPaint* paint) override; - void onDrawImageRect2(const SkImage*, - const SkRect&, - const SkRect&, - const SkSamplingOptions&, - const SkPaint*, - SrcRectConstraint) override; - void onDrawImageLattice2(const SkImage*, - const Lattice&, - const SkRect&, - SkFilterMode, - const SkPaint*) override; - void onDrawVerticesObject(const SkVertices*, - SkBlendMode, - const SkPaint&) override; - void onDrawAtlas2(const SkImage*, - const SkRSXform[], - const SkRect[], - const SkColor[], - int, - SkBlendMode, - const SkSamplingOptions&, - const SkRect*, - const SkPaint*) override; - void onDrawEdgeAAQuad(const SkRect&, - const SkPoint[4], - QuadAAFlags, - const SkColor4f&, - SkBlendMode) override; - void onClipRegion(const SkRegion&, SkClipOp) override; + const DlPaint& paint) override; + void DrawShadow(const SkPath& path, + const DlColor color, + const SkScalar elevation, + bool transparent_occluder, + SkScalar dpr) override; - private: - SkNWayCanvas internal_canvas_; + void Flush() override; + private: + DisplayListMatrixClipTracker tracker_; std::vector draw_calls_; int current_layer_; }; @@ -295,10 +328,10 @@ extern bool operator==(const MockCanvas::DrawImageDataNoPaint& a, const MockCanvas::DrawImageDataNoPaint& b); extern std::ostream& operator<<(std::ostream& os, const MockCanvas::DrawImageDataNoPaint& data); -extern bool operator==(const MockCanvas::DrawPictureData& a, - const MockCanvas::DrawPictureData& b); +extern bool operator==(const MockCanvas::DrawDisplayListData& a, + const MockCanvas::DrawDisplayListData& b); extern std::ostream& operator<<(std::ostream& os, - const MockCanvas::DrawPictureData& data); + const MockCanvas::DrawDisplayListData& data); extern bool operator==(const MockCanvas::DrawShadowData& a, const MockCanvas::DrawShadowData& b); extern std::ostream& operator<<(std::ostream& os, @@ -321,10 +354,10 @@ extern bool operator==(const MockCanvas::DrawCall& a, const MockCanvas::DrawCall& b); extern std::ostream& operator<<(std::ostream& os, const MockCanvas::DrawCall& draw); -extern bool operator==(const MockCanvas::DrawPaint& a, - const MockCanvas::DrawPaint& b); +extern bool operator==(const MockCanvas::DrawPaintData& a, + const MockCanvas::DrawPaintData& b); extern std::ostream& operator<<(std::ostream& os, - const MockCanvas::DrawPaint& data); + const MockCanvas::DrawPaintData& data); } // namespace testing } // namespace flutter diff --git a/testing/mock_canvas_unittests.cc b/testing/mock_canvas_unittests.cc index 7e8d624642064..c615918defc5d 100644 --- a/testing/mock_canvas_unittests.cc +++ b/testing/mock_canvas_unittests.cc @@ -14,17 +14,17 @@ using MockCanvasTest = CanvasTest; #ifndef NDEBUG TEST_F(MockCanvasTest, DrawRRectDies) { - EXPECT_DEATH_IF_SUPPORTED(mock_canvas().drawRRect(SkRRect(), SkPaint()), ""); + EXPECT_DEATH_IF_SUPPORTED(mock_canvas().DrawRRect(SkRRect(), DlPaint()), ""); } #endif TEST_F(MockCanvasTest, DrawCalls) { const SkRect rect = SkRect::MakeWH(5.0f, 5.0f); - const SkPaint paint = SkPaint(SkColors::kGreen); + const DlPaint paint = DlPaint(DlColor::kGreen()); const auto expected_draw_calls = std::vector{ MockCanvas::DrawCall{0, MockCanvas::DrawRectData{rect, paint}}}; - mock_canvas().drawRect(rect, paint); + mock_canvas().DrawRect(rect, paint); EXPECT_EQ(mock_canvas().draw_calls(), expected_draw_calls); } diff --git a/third_party/txt/src/skia/paragraph_skia.cc b/third_party/txt/src/skia/paragraph_skia.cc index 9c9d76b164074..f78890331df09 100644 --- a/third_party/txt/src/skia/paragraph_skia.cc +++ b/third_party/txt/src/skia/paragraph_skia.cc @@ -76,7 +76,7 @@ class DisplayListParagraphPainter : public skt::ParagraphPainter { } size_t paint_id = std::get(paint); FML_DCHECK(paint_id < dl_paints_.size()); - builder_->drawTextBlob(blob, x, y, dl_paints_[paint_id]); + builder_->DrawTextBlob(blob, x, y, dl_paints_[paint_id]); } void drawTextShadow(const sk_sp& blob, @@ -94,24 +94,24 @@ class DisplayListParagraphPainter : public skt::ParagraphPainter { false); paint.setMaskFilter(&filter); } - builder_->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(paint); FML_DCHECK(paint_id < dl_paints_.size()); - builder_->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); - builder_->drawRect(rect, paint); + builder_->DrawRect(rect, paint); } void drawPath(const SkPath& path, const DecorationStyle& decor_style) override { - builder_->drawPath(path, toDlPaint(decor_style)); + builder_->DrawPath(path, toDlPaint(decor_style)); } void drawLine(SkScalar x0, @@ -119,21 +119,21 @@ class DisplayListParagraphPainter : public skt::ParagraphPainter { SkScalar x1, SkScalar y1, const DecorationStyle& decor_style) override { - builder_->drawLine(SkPoint::Make(x0, y0), SkPoint::Make(x1, y1), + builder_->DrawLine(SkPoint::Make(x0, y0), SkPoint::Make(x1, y1), toDlPaint(decor_style)); } void clipRect(const SkRect& rect) override { - builder_->clipRect(rect, SkClipOp::kIntersect, false); + builder_->ClipRect(rect, DlCanvas::ClipOp::kIntersect, false); } void translate(SkScalar dx, SkScalar dy) override { - builder_->translate(dx, dy); + builder_->Translate(dx, dy); } - void save() override { builder_->save(); } + void save() override { builder_->Save(); } - void restore() override { builder_->restore(); } + void restore() override { builder_->Restore(); } private: DisplayListBuilder* builder_; From c8f9b39f5b083359dcc80debdf1e3aec3ecd835a Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Thu, 23 Feb 2023 18:55:43 -0800 Subject: [PATCH 2/2] fix android embedder tests --- display_list/display_list_canvas_dispatcher.cc | 2 +- display_list/display_list_canvas_dispatcher.h | 5 ++++- flow/embedded_views.cc | 4 ---- flow/embedded_views.h | 2 -- impeller/display_list/display_list_dispatcher.cc | 4 ++++ impeller/display_list/display_list_dispatcher.h | 1 + shell/common/shell_test_external_view_embedder.cc | 3 +-- .../external_view_embedder.cc | 13 ++----------- 8 files changed, 13 insertions(+), 21 deletions(-) diff --git a/display_list/display_list_canvas_dispatcher.cc b/display_list/display_list_canvas_dispatcher.cc index 9b6529bd7523c..39dad68f45698 100644 --- a/display_list/display_list_canvas_dispatcher.cc +++ b/display_list/display_list_canvas_dispatcher.cc @@ -117,7 +117,7 @@ void DisplayListCanvasDispatcher::transformFullPerspective( } // clang-format on void DisplayListCanvasDispatcher::transformReset() { - canvas_->resetMatrix(); + canvas_->setMatrix(original_transform_); } void DisplayListCanvasDispatcher::clipRect(const SkRect& rect, diff --git a/display_list/display_list_canvas_dispatcher.h b/display_list/display_list_canvas_dispatcher.h index 17162e5d8efbe..68119b363d4b1 100644 --- a/display_list/display_list_canvas_dispatcher.h +++ b/display_list/display_list_canvas_dispatcher.h @@ -24,7 +24,9 @@ class DisplayListCanvasDispatcher : public virtual Dispatcher, public: explicit DisplayListCanvasDispatcher(SkCanvas* canvas, SkScalar opacity = SK_Scalar1) - : SkPaintDispatchHelper(opacity), canvas_(canvas) {} + : SkPaintDispatchHelper(opacity), + canvas_(canvas), + original_transform_(canvas->getLocalToDevice()) {} const SkPaint* safe_paint(bool use_attributes); @@ -128,6 +130,7 @@ class DisplayListCanvasDispatcher : public virtual Dispatcher, private: SkCanvas* canvas_; + const SkM44 original_transform_; SkPaint temp_paint_; }; diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index fd0ce1178ae60..0d4152f9ce723 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -30,10 +30,6 @@ void DisplayListEmbedderViewSlice::render_into(DlCanvas* canvas) { canvas->DrawDisplayList(display_list_); } -void DisplayListEmbedderViewSlice::render_into(DisplayListBuilder* builder) { - builder->drawDisplayList(display_list_); -} - void ExternalViewEmbedder::SubmitFrame(GrDirectContext* context, std::unique_ptr frame) { frame->Submit(); diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 18cbe77a73508..835ce854fcaf3 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -338,7 +338,6 @@ class EmbedderViewSlice { virtual std::list searchNonOverlappingDrawnRects( const SkRect& query) const = 0; virtual void render_into(DlCanvas* canvas) = 0; - virtual void render_into(DisplayListBuilder* builder) = 0; }; class DisplayListEmbedderViewSlice : public EmbedderViewSlice { @@ -351,7 +350,6 @@ class DisplayListEmbedderViewSlice : public EmbedderViewSlice { std::list searchNonOverlappingDrawnRects( const SkRect& query) const override; void render_into(DlCanvas* canvas) override; - void render_into(DisplayListBuilder* builder) override; private: std::unique_ptr builder_; diff --git a/impeller/display_list/display_list_dispatcher.cc b/impeller/display_list/display_list_dispatcher.cc index 019c2c28c5af7..effd468f45909 100644 --- a/impeller/display_list/display_list_dispatcher.cc +++ b/impeller/display_list/display_list_dispatcher.cc @@ -874,6 +874,7 @@ void DisplayListDispatcher::transformFullPerspective(SkScalar mxx, // |flutter::Dispatcher| void DisplayListDispatcher::transformReset() { canvas_.ResetTransform(); + canvas_.Transform(initial_matrix_); } static Rect ToRect(const SkRect& rect) { @@ -1233,9 +1234,12 @@ void DisplayListDispatcher::drawDisplayList( const sk_sp display_list) { int saveCount = canvas_.GetSaveCount(); Paint savePaint = paint_; + Matrix saveMatrix = initial_matrix_; paint_ = Paint(); + initial_matrix_ = canvas_.GetCurrentTransformation(); display_list->Dispatch(*this); paint_ = savePaint; + initial_matrix_ = saveMatrix; canvas_.RestoreToCount(saveCount); } diff --git a/impeller/display_list/display_list_dispatcher.h b/impeller/display_list/display_list_dispatcher.h index d280459ccabbf..dc08f9724f540 100644 --- a/impeller/display_list/display_list_dispatcher.h +++ b/impeller/display_list/display_list_dispatcher.h @@ -239,6 +239,7 @@ class DisplayListDispatcher final : public flutter::Dispatcher { private: Paint paint_; Canvas canvas_; + Matrix initial_matrix_; FML_DISALLOW_COPY_AND_ASSIGN(DisplayListDispatcher); }; diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 32088661e94a3..2536bb62ac6a2 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -55,8 +55,7 @@ void ShellTestExternalViewEmbedder::PrerollCompositeEmbeddedView( int64_t view_id, std::unique_ptr params) { SkRect view_bounds = SkRect::Make(frame_size_); - std::unique_ptr view; - view = std::make_unique(view_bounds); + auto view = std::make_unique(view_bounds); slices_.insert_or_assign(view_id, std::move(view)); } 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 5fd4dd33ff68b..f1d8af9f6a710 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.cc +++ b/shell/platform/android/external_view_embedder/external_view_embedder.cc @@ -74,7 +74,6 @@ void AndroidExternalViewEmbedder::SubmitFrame( std::unordered_map overlay_layers; DlCanvas* background_canvas = frame->Canvas(); - DisplayListBuilder* background_builder = frame->GetDisplayListBuilder().get(); auto current_frame_view_count = composition_order_.size(); // Restore the clip context after exiting this method since it's changed @@ -134,11 +133,7 @@ void AndroidExternalViewEmbedder::SubmitFrame( background_canvas->ClipRect(full_joined_rect, DlCanvas::ClipOp::kDifference); } - if (background_builder) { - slice->render_into(background_builder); - } else { - slice->render_into(background_canvas); - } + slice->render_into(background_canvas); } // Manually trigger the DlAutoCanvasRestore before we submit the frame @@ -210,11 +205,7 @@ AndroidExternalViewEmbedder::CreateSurfaceIfNeeded(GrDirectContext* context, // Offset the picture since its absolute position on the scene is determined // by the position of the overlay view. overlay_canvas->Translate(-rect.x(), -rect.y()); - if (frame->GetDisplayListBuilder()) { - slice->render_into(frame->GetDisplayListBuilder().get()); - } else { - slice->render_into(overlay_canvas); - } + slice->render_into(overlay_canvas); return frame; }