Flutter Engine
 
Loading...
Searching...
No Matches
scene_builder.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
6#include <cstdint>
7
8#include "dart_api.h"
30
31namespace flutter {
32
34
35SceneBuilder::SceneBuilder() {
36 // Add a ContainerLayer as the root layer, so that AddLayer operations are
37 // always valid.
38 PushLayer(std::make_shared<flutter::ContainerLayer>());
39}
40
42
43void SceneBuilder::pushTransform(Dart_Handle layer_handle,
44 tonic::Float64List& matrix4,
45 const fml::RefPtr<EngineLayer>& old_layer) {
46 DlMatrix matrix = ToDlMatrix(matrix4);
47 auto layer = std::make_shared<flutter::TransformLayer>(matrix);
48 PushLayer(layer);
49 // matrix4 has to be released before we can return another Dart object
50 matrix4.Release();
51 EngineLayer::MakeRetained(layer_handle, layer);
52
53 if (old_layer && old_layer->Layer()) {
54 layer->AssignOldLayer(old_layer->Layer().get());
55 }
56}
57
58void SceneBuilder::pushOffset(Dart_Handle layer_handle,
59 double dx,
60 double dy,
61 const fml::RefPtr<EngineLayer>& old_layer) {
63 auto layer = std::make_shared<flutter::TransformLayer>(matrix);
64 PushLayer(layer);
65 EngineLayer::MakeRetained(layer_handle, layer);
66
67 if (old_layer && old_layer->Layer()) {
68 layer->AssignOldLayer(old_layer->Layer().get());
69 }
70}
71
72void SceneBuilder::pushClipRect(Dart_Handle layer_handle,
73 double left,
74 double right,
75 double top,
76 double bottom,
77 int clip_behavior,
78 const fml::RefPtr<EngineLayer>& old_layer) {
79 DlRect clip_rect = DlRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
80 SafeNarrow(right), SafeNarrow(bottom));
81 auto layer = std::make_shared<flutter::ClipRectLayer>(
82 clip_rect, static_cast<flutter::Clip>(clip_behavior));
83 PushLayer(layer);
84 EngineLayer::MakeRetained(layer_handle, layer);
85
86 if (old_layer && old_layer->Layer()) {
87 layer->AssignOldLayer(old_layer->Layer().get());
88 }
89}
90
91void SceneBuilder::pushClipRRect(Dart_Handle layer_handle,
92 const RRect& rrect,
93 int clip_behavior,
94 const fml::RefPtr<EngineLayer>& old_layer) {
95 auto layer = std::make_shared<flutter::ClipRRectLayer>(
96 rrect.rrect, static_cast<flutter::Clip>(clip_behavior));
97 PushLayer(layer);
98 EngineLayer::MakeRetained(layer_handle, layer);
99
100 if (old_layer && old_layer->Layer()) {
101 layer->AssignOldLayer(old_layer->Layer().get());
102 }
103}
104
106 Dart_Handle layer_handle,
107 const RSuperellipse* rse,
108 int clip_behavior,
109 const fml::RefPtr<EngineLayer>& old_layer) {
110 auto layer = std::make_shared<flutter::ClipRSuperellipseLayer>(
111 rse->rsuperellipse(), static_cast<flutter::Clip>(clip_behavior));
112 PushLayer(layer);
113 EngineLayer::MakeRetained(layer_handle, layer);
114
115 if (old_layer && old_layer->Layer()) {
116 layer->AssignOldLayer(old_layer->Layer().get());
117 }
118}
119
120void SceneBuilder::pushClipPath(Dart_Handle layer_handle,
121 const CanvasPath* path,
122 int clip_behavior,
123 const fml::RefPtr<EngineLayer>& old_layer) {
124 flutter::Clip flutter_clip_behavior =
125 static_cast<flutter::Clip>(clip_behavior);
126 FML_DCHECK(flutter_clip_behavior != flutter::Clip::kNone);
127 auto layer = std::make_shared<flutter::ClipPathLayer>(
128 path->path(), static_cast<flutter::Clip>(flutter_clip_behavior));
129 PushLayer(layer);
130 EngineLayer::MakeRetained(layer_handle, layer);
131
132 if (old_layer && old_layer->Layer()) {
133 layer->AssignOldLayer(old_layer->Layer().get());
134 }
135}
136
137void SceneBuilder::pushOpacity(Dart_Handle layer_handle,
138 int alpha,
139 double dx,
140 double dy,
141 const fml::RefPtr<EngineLayer>& old_layer) {
142 auto layer = std::make_shared<flutter::OpacityLayer>(
143 alpha, DlPoint(SafeNarrow(dx), SafeNarrow(dy)));
144 PushLayer(layer);
145 EngineLayer::MakeRetained(layer_handle, layer);
146
147 if (old_layer && old_layer->Layer()) {
148 layer->AssignOldLayer(old_layer->Layer().get());
149 }
150}
151
152void SceneBuilder::pushColorFilter(Dart_Handle layer_handle,
153 const ColorFilter* color_filter,
154 const fml::RefPtr<EngineLayer>& old_layer) {
155 auto layer =
156 std::make_shared<flutter::ColorFilterLayer>(color_filter->filter());
157 PushLayer(layer);
158 EngineLayer::MakeRetained(layer_handle, layer);
159
160 if (old_layer && old_layer->Layer()) {
161 layer->AssignOldLayer(old_layer->Layer().get());
162 }
163}
164
165void SceneBuilder::pushImageFilter(Dart_Handle layer_handle,
166 const ImageFilter* image_filter,
167 double dx,
168 double dy,
169 const fml::RefPtr<EngineLayer>& old_layer) {
170 auto layer = std::make_shared<flutter::ImageFilterLayer>(
171 image_filter->filter(DlTileMode::kDecal),
172 DlPoint(SafeNarrow(dx), SafeNarrow(dy)));
173 PushLayer(layer);
174 EngineLayer::MakeRetained(layer_handle, layer);
175
176 if (old_layer && old_layer->Layer()) {
177 layer->AssignOldLayer(old_layer->Layer().get());
178 }
179}
180
182 Dart_Handle layer_handle,
183 ImageFilter* filter,
184 int blend_mode,
185 Dart_Handle backdrop_id,
186 const fml::RefPtr<EngineLayer>& old_layer) {
187 std::optional<int64_t> converted_backdrop_id;
188 if (Dart_IsInteger(backdrop_id)) {
189 int64_t out;
190 Dart_IntegerToInt64(backdrop_id, &out);
191 converted_backdrop_id = out;
192 }
193
194 auto layer = std::make_shared<flutter::BackdropFilterLayer>(
195 filter->filter(DlTileMode::kMirror), static_cast<DlBlendMode>(blend_mode),
196 converted_backdrop_id);
197 PushLayer(layer);
198 EngineLayer::MakeRetained(layer_handle, layer);
199
200 if (old_layer && old_layer->Layer()) {
201 layer->AssignOldLayer(old_layer->Layer().get());
202 }
203}
204
205void SceneBuilder::pushShaderMask(Dart_Handle layer_handle,
206 Shader* shader,
207 double mask_rect_left,
208 double mask_rect_right,
209 double mask_rect_top,
210 double mask_rect_bottom,
211 int blend_mode,
212 int filter_quality_index,
213 const fml::RefPtr<EngineLayer>& old_layer) {
215 SafeNarrow(mask_rect_left), SafeNarrow(mask_rect_top),
216 SafeNarrow(mask_rect_right), SafeNarrow(mask_rect_bottom));
217 auto sampling = ImageFilter::SamplingFromIndex(filter_quality_index);
218 auto layer = std::make_shared<flutter::ShaderMaskLayer>(
219 shader->shader(sampling), rect, static_cast<DlBlendMode>(blend_mode));
220 PushLayer(layer);
221 EngineLayer::MakeRetained(layer_handle, layer);
222
223 if (old_layer && old_layer->Layer()) {
224 layer->AssignOldLayer(old_layer->Layer().get());
225 }
226}
227
229 AddLayer(retained_layer->Layer());
230}
231
233 PopLayer();
234}
235
237 double dy,
238 Picture* picture,
239 int hints) {
240 if (!picture) {
241 // Picture::dispose was called and it has been collected.
242 return;
243 }
244
245 // Explicitly check for display_list, since the picture object might have
246 // been disposed but not collected yet, but the display list is null.
247 if (picture->display_list()) {
248 auto layer = std::make_unique<flutter::DisplayListLayer>(
249 DlPoint(SafeNarrow(dx), SafeNarrow(dy)), picture->display_list(),
250 !!(hints & 1), !!(hints & 2));
251 AddLayer(std::move(layer));
252 }
253}
254
256 double dy,
257 double width,
258 double height,
259 int64_t texture_id,
260 bool freeze,
261 int filter_quality_index) {
262 auto sampling = ImageFilter::SamplingFromIndex(filter_quality_index);
263 auto layer = std::make_unique<flutter::TextureLayer>(
264 DlPoint(SafeNarrow(dx), SafeNarrow(dy)),
266 sampling);
267 AddLayer(std::move(layer));
268}
269
271 double dy,
272 double width,
273 double height,
274 int64_t view_id) {
275 auto layer = std::make_unique<flutter::PlatformViewLayer>(
276 DlPoint(SafeNarrow(dx), SafeNarrow(dy)),
278 AddLayer(std::move(layer));
279}
280
281void SceneBuilder::addPerformanceOverlay(uint64_t enabled_options,
282 double left,
283 double right,
284 double top,
285 double bottom) {
286 DlRect rect = DlRect::MakeLTRB(SafeNarrow(left), SafeNarrow(top),
287 SafeNarrow(right), SafeNarrow(bottom));
288 auto layer =
289 std::make_unique<flutter::PerformanceOverlayLayer>(enabled_options);
290 layer->set_paint_bounds(rect);
291 AddLayer(std::move(layer));
292}
293
294void SceneBuilder::build(Dart_Handle scene_handle) {
295 FML_DCHECK(layer_stack_.size() >= 1);
296
297 Scene::create(scene_handle, std::move(layer_stack_[0]));
298 layer_stack_.clear();
299 ClearDartWrapper(); // may delete this object.
300}
301
302void SceneBuilder::AddLayer(std::shared_ptr<Layer> layer) {
303 FML_DCHECK(layer);
304
305 if (!layer_stack_.empty()) {
306 layer_stack_.back()->Add(std::move(layer));
307 }
308}
309
310void SceneBuilder::PushLayer(std::shared_ptr<ContainerLayer> layer) {
311 AddLayer(layer);
312 layer_stack_.push_back(std::move(layer));
313}
314
315void SceneBuilder::PopLayer() {
316 // We never pop the root layer, so that AddLayer operations are always valid.
317 if (layer_stack_.size() > 1) {
318 layer_stack_.pop_back();
319 }
320}
321
322} // namespace flutter
const std::shared_ptr< const DlColorFilter > filter() const
static void MakeRetained(Dart_Handle dart_handle, const std::shared_ptr< flutter::ContainerLayer > &layer)
static DlImageSampling SamplingFromIndex(int filterQualityIndex)
const std::shared_ptr< DlImageFilter > filter(DlTileMode mode) const
sk_sp< DisplayList > display_list() const
Definition picture.h:27
DlRoundRect rrect
Definition rrect.h:17
flutter::DlRoundSuperellipse rsuperellipse() const
void pushOffset(Dart_Handle layer_handle, double dx, double dy, const fml::RefPtr< EngineLayer > &old_layer)
~SceneBuilder() override
void pushClipPath(Dart_Handle layer_handle, const CanvasPath *path, int clip_behavior, const fml::RefPtr< EngineLayer > &old_layer)
void build(Dart_Handle scene_handle)
void pushTransform(Dart_Handle layer_handle, tonic::Float64List &matrix4, const fml::RefPtr< EngineLayer > &old_layer)
void pushColorFilter(Dart_Handle layer_handle, const ColorFilter *color_filter, const fml::RefPtr< EngineLayer > &old_layer)
void pushBackdropFilter(Dart_Handle layer_handle, ImageFilter *filter, int blend_mode, Dart_Handle backdrop_id, const fml::RefPtr< EngineLayer > &old_layer)
void pushClipRSuperellipse(Dart_Handle layer_handle, const RSuperellipse *rse, int clip_behavior, const fml::RefPtr< EngineLayer > &old_layer)
void addRetained(const fml::RefPtr< EngineLayer > &retained_layer)
void addTexture(double dx, double dy, double width, double height, int64_t texture_id, bool freeze, int filter_quality)
void pushShaderMask(Dart_Handle layer_handle, Shader *shader, double mask_rect_left, double mask_rect_right, double mask_rect_top, double mask_rect_bottom, int blend_mode, int filter_quality_index, const fml::RefPtr< EngineLayer > &old_layer)
void addPerformanceOverlay(uint64_t enabled_options, double left, double right, double top, double bottom)
void pushClipRRect(Dart_Handle layer_handle, const RRect &rrect, int clip_behavior, const fml::RefPtr< EngineLayer > &old_layer)
void pushClipRect(Dart_Handle layer_handle, double left, double right, double top, double bottom, int clip_behavior, const fml::RefPtr< EngineLayer > &old_layer)
void addPicture(double dx, double dy, Picture *picture, int hints)
void pushOpacity(Dart_Handle layer_handle, int alpha, double dx, double dy, const fml::RefPtr< EngineLayer > &old_layer)
void pushImageFilter(Dart_Handle layer_handle, const ImageFilter *image_filter, double dx, double dy, const fml::RefPtr< EngineLayer > &old_layer)
void addPlatformView(double dx, double dy, double width, double height, int64_t view_id)
static void create(Dart_Handle scene_handle, std::shared_ptr< flutter::Layer > rootLayer)
Definition scene.cc:27
virtual std::shared_ptr< DlColorSource > shader(DlImageSampling)=0
T * get() const
Definition ref_ptr.h:117
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
G_BEGIN_DECLS FlutterViewId view_id
#define FML_DCHECK(condition)
Definition logging.h:122
@ kNone
Definition layer.h:43
impeller::Size DlSize
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switch_defs.h:52
static float SafeNarrow(double value)
DlMatrix ToDlMatrix(const SkMatrix &matrix)
impeller::Point DlPoint
BlendMode
Definition color.h:58
int32_t height
int32_t width
A 4x4 matrix using column-major storage.
Definition matrix.h:37
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition matrix.h:95
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition rect.h:129
int64_t texture_id