Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
scene.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/lib/ui/compositing/scene.h"
6
7#include "flutter/fml/trace_event.h"
8#include "flutter/lib/ui/painting/display_list_deferred_image_gpu_skia.h"
9#include "flutter/lib/ui/painting/image.h"
10#include "flutter/lib/ui/painting/picture.h"
11#include "flutter/lib/ui/ui_dart_state.h"
12#include "flutter/lib/ui/window/platform_configuration.h"
13#if IMPELLER_SUPPORTS_RENDERING
14#include "flutter/lib/ui/painting/display_list_deferred_image_gpu_impeller.h"
15#endif // IMPELLER_SUPPORTS_RENDERING
22
23namespace flutter {
24
26
27void Scene::create(Dart_Handle scene_handle,
28 std::shared_ptr<flutter::Layer> rootLayer,
29 uint32_t rasterizerTracingThreshold,
30 bool checkerboardRasterCacheImages,
31 bool checkerboardOffscreenLayers) {
32 auto scene = fml::MakeRefCounted<Scene>(
33 std::move(rootLayer), rasterizerTracingThreshold,
34 checkerboardRasterCacheImages, checkerboardOffscreenLayers);
35 scene->AssociateWithDartWrapper(scene_handle);
36}
37
38Scene::Scene(std::shared_ptr<flutter::Layer> rootLayer,
39 uint32_t rasterizerTracingThreshold,
40 bool checkerboardRasterCacheImages,
41 bool checkerboardOffscreenLayers) {
42 layer_tree_config_.root_layer = std::move(rootLayer);
43 layer_tree_config_.rasterizer_tracing_threshold = rasterizerTracingThreshold;
44 layer_tree_config_.checkerboard_raster_cache_images =
45 checkerboardRasterCacheImages;
46 layer_tree_config_.checkerboard_offscreen_layers =
47 checkerboardOffscreenLayers;
48}
49
51
52bool Scene::valid() {
53 return layer_tree_config_.root_layer != nullptr;
54}
55
57 layer_tree_config_.root_layer.reset();
59}
60
62 uint32_t height,
63 Dart_Handle raw_image_handle) {
64 TRACE_EVENT0("flutter", "Scene::toImageSync");
65
66 if (!valid()) {
67 return tonic::ToDart("Scene has been disposed.");
68 }
69
70 Scene::RasterizeToImage(width, height, raw_image_handle);
71 return Dart_Null();
72}
73
75 uint32_t height,
76 Dart_Handle raw_image_callback) {
77 TRACE_EVENT0("flutter", "Scene::toImage");
78
79 if (!valid()) {
80 return tonic::ToDart("Scene has been disposed.");
81 }
82
83 return Picture::RasterizeLayerTreeToImage(BuildLayerTree(width, height),
84 raw_image_callback);
85}
86
88 bool impeller,
89 std::unique_ptr<LayerTree> layer_tree,
91 fml::RefPtr<fml::TaskRunner> raster_task_runner,
92 fml::RefPtr<SkiaUnrefQueue> unref_queue) {
93#if IMPELLER_SUPPORTS_RENDERING
94 if (impeller) {
95 return DlDeferredImageGPUImpeller::Make(std::move(layer_tree),
96 std::move(snapshot_delegate),
97 std::move(raster_task_runner));
98 }
99#endif // IMPELLER_SUPPORTS_RENDERING
100
101 const auto& frame_size = layer_tree->frame_size();
102 const SkImageInfo image_info =
103 SkImageInfo::Make(frame_size.width(), frame_size.height(),
106 image_info, std::move(layer_tree), std::move(snapshot_delegate),
107 raster_task_runner, std::move(unref_queue));
108}
109
110void Scene::RasterizeToImage(uint32_t width,
111 uint32_t height,
112 Dart_Handle raw_image_handle) {
113 auto* dart_state = UIDartState::Current();
114 if (!dart_state) {
115 return;
116 }
117 auto unref_queue = dart_state->GetSkiaUnrefQueue();
118 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
119 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
120
121 auto image = CanvasImage::Create();
122 auto dl_image = CreateDeferredImage(
123 dart_state->IsImpellerEnabled(), BuildLayerTree(width, height),
124 std::move(snapshot_delegate), std::move(raster_task_runner),
125 std::move(unref_queue));
126 image->set_image(dl_image);
127 image->AssociateWithDartWrapper(raw_image_handle);
128}
129
130std::unique_ptr<flutter::LayerTree> Scene::takeLayerTree(uint64_t width,
131 uint64_t height) {
132 return BuildLayerTree(width, height);
133}
134
135std::unique_ptr<LayerTree> Scene::BuildLayerTree(uint32_t width,
136 uint32_t height) {
137 if (!valid()) {
138 return nullptr;
139 }
140 return std::make_unique<LayerTree>(layer_tree_config_,
142}
143
144} // namespace flutter
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition SkAlphaType.h:29
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
Definition SkColorType.h:24
static fml::RefPtr< CanvasImage > Create()
Definition image.h:28
static sk_sp< DlDeferredImageGPUImpeller > Make(std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner)
static sk_sp< DlDeferredImageGPUSkia > MakeFromLayerTree(const SkImageInfo &image_info, std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, fml::RefPtr< SkiaUnrefQueue > unref_queue)
static Dart_Handle RasterizeLayerTreeToImage(std::unique_ptr< LayerTree > layer_tree, Dart_Handle raw_image_callback)
Definition picture.cc:124
static void create(Dart_Handle scene_handle, std::shared_ptr< flutter::Layer > rootLayer, uint32_t rasterizerTracingThreshold, bool checkerboardRasterCacheImages, bool checkerboardOffscreenLayers)
Definition scene.cc:27
std::unique_ptr< flutter::LayerTree > takeLayerTree(uint64_t width, uint64_t height)
Definition scene.cc:130
Dart_Handle toImage(uint32_t width, uint32_t height, Dart_Handle raw_image_handle)
Definition scene.cc:74
void dispose()
Definition scene.cc:56
~Scene() override
Definition scene.cc:50
Dart_Handle toImageSync(uint32_t width, uint32_t height, Dart_Handle raw_image_handle)
Definition scene.cc:61
static UIDartState * Current()
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
DART_EXPORT Dart_Handle Dart_Null(void)
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
sk_sp< SkImage > image
Definition examples.cpp:29
static sk_sp< DlImage > CreateDeferredImage(bool impeller, std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner, fml::RefPtr< SkiaUnrefQueue > unref_queue)
Definition scene.cc:87
Dart_Handle ToDart(const T &object)
int32_t height
int32_t width
static constexpr SkISize Make(int32_t w, int32_t h)
Definition SkSize.h:20
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
std::shared_ptr< Layer > root_layer
Definition layer_tree.h:25
uint32_t rasterizer_tracing_threshold
Definition layer_tree.h:26
#define TRACE_EVENT0(category_group, name)