• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/image.h"
9 #include "flutter/lib/ui/painting/picture.h"
10 #include "third_party/skia/include/core/SkImageInfo.h"
11 #include "third_party/skia/include/core/SkSurface.h"
12 
13 namespace flutter {
14 
15 IMPLEMENT_WRAPPERTYPEINFO(ui, Scene);
16 
17 #define FOR_EACH_BINDING(V) \
18   V(Scene, toImage)         \
19   V(Scene, dispose)
20 
DART_BIND_ALL(Scene,FOR_EACH_BINDING)21 DART_BIND_ALL(Scene, FOR_EACH_BINDING)
22 
23 fml::RefPtr<Scene> Scene::create(std::shared_ptr<flutter::Layer> rootLayer,
24                                  uint32_t rasterizerTracingThreshold,
25                                  bool checkerboardRasterCacheImages,
26                                  bool checkerboardOffscreenLayers) {
27   return fml::MakeRefCounted<Scene>(
28       std::move(rootLayer), rasterizerTracingThreshold,
29       checkerboardRasterCacheImages, checkerboardOffscreenLayers);
30 }
31 
Scene(std::shared_ptr<flutter::Layer> rootLayer,uint32_t rasterizerTracingThreshold,bool checkerboardRasterCacheImages,bool checkerboardOffscreenLayers)32 Scene::Scene(std::shared_ptr<flutter::Layer> rootLayer,
33              uint32_t rasterizerTracingThreshold,
34              bool checkerboardRasterCacheImages,
35              bool checkerboardOffscreenLayers)
36     : m_layerTree(new flutter::LayerTree()) {
37   m_layerTree->set_root_layer(std::move(rootLayer));
38   m_layerTree->set_rasterizer_tracing_threshold(rasterizerTracingThreshold);
39   m_layerTree->set_checkerboard_raster_cache_images(
40       checkerboardRasterCacheImages);
41   m_layerTree->set_checkerboard_offscreen_layers(checkerboardOffscreenLayers);
42 }
43 
~Scene()44 Scene::~Scene() {}
45 
dispose()46 void Scene::dispose() {
47   ClearDartWrapper();
48 }
49 
toImage(uint32_t width,uint32_t height,Dart_Handle raw_image_callback)50 Dart_Handle Scene::toImage(uint32_t width,
51                            uint32_t height,
52                            Dart_Handle raw_image_callback) {
53   TRACE_EVENT0("flutter", "Scene::toImage");
54 
55   if (!m_layerTree) {
56     return reinterpret_cast<Dart_Handle>("Scene did not contain a layer tree.");
57   }
58 
59   auto picture = m_layerTree->Flatten(SkRect::MakeWH(width, height));
60   if (!picture) {
61     return reinterpret_cast<Dart_Handle>("Could not flatten scene into a layer tree.");
62   }
63 
64   return Picture::RasterizeToImage(picture, width, height, raw_image_callback);
65 }
66 
takeLayerTree()67 std::unique_ptr<flutter::LayerTree> Scene::takeLayerTree() {
68   return std::move(m_layerTree);
69 }
70 
71 }  // namespace flutter
72