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/dart_ui.h"
6
7 #include "flutter/fml/build_config.h"
8 #include "flutter/lib/ui/compositing/scene.h"
9 #include "flutter/lib/ui/compositing/scene_builder.h"
10 #include "flutter/lib/ui/dart_runtime_hooks.h"
11 #include "flutter/lib/ui/isolate_name_server/isolate_name_server_natives.h"
12 #include "flutter/lib/ui/painting/canvas.h"
13 #include "flutter/lib/ui/painting/codec.h"
14 #include "flutter/lib/ui/painting/color_filter.h"
15 #include "flutter/lib/ui/painting/engine_layer.h"
16 #include "flutter/lib/ui/painting/frame_info.h"
17 #include "flutter/lib/ui/painting/gradient.h"
18 #include "flutter/lib/ui/painting/image.h"
19 #include "flutter/lib/ui/painting/image_filter.h"
20 #include "flutter/lib/ui/painting/image_shader.h"
21 #include "flutter/lib/ui/painting/path.h"
22 #include "flutter/lib/ui/painting/path_measure.h"
23 #include "flutter/lib/ui/painting/picture.h"
24 #include "flutter/lib/ui/painting/picture_recorder.h"
25 #include "flutter/lib/ui/painting/vertices.h"
26 #include "flutter/lib/ui/semantics/semantics_update.h"
27 #include "flutter/lib/ui/semantics/semantics_update_builder.h"
28 #include "flutter/lib/ui/text/font_collection.h"
29 #include "flutter/lib/ui/text/paragraph.h"
30 #include "flutter/lib/ui/text/paragraph_builder.h"
31 #include "flutter/lib/ui/window/window.h"
32
33 #if defined(OS_FUCHSIA)
34 #include "flutter/lib/ui/compositing/scene_host.h"
35 #endif
36
37 using tonic::ToDart;
38
39 namespace flutter {
40 namespace {
41
42 static tonic::DartLibraryNatives* g_natives;
43 static tonic::DartLibraryNatives* g_natives_secondary;
44
GetNativeFunction(Dart_Handle name,int argument_count,bool * auto_setup_scope)45 Dart_NativeFunction GetNativeFunction(Dart_Handle name,
46 int argument_count,
47 bool* auto_setup_scope) {
48 return g_natives->GetNativeFunction(name, argument_count, auto_setup_scope);
49 }
50
GetNativeFunctionSecondary(Dart_Handle name,int argument_count,bool * auto_setup_scope)51 Dart_NativeFunction GetNativeFunctionSecondary(Dart_Handle name,
52 int argument_count,
53 bool* auto_setup_scope) {
54 return g_natives_secondary->GetNativeFunction(name, argument_count,
55 auto_setup_scope);
56 }
57
GetSymbol(Dart_NativeFunction native_function)58 const uint8_t* GetSymbol(Dart_NativeFunction native_function) {
59 return g_natives->GetSymbol(native_function);
60 }
61
GetSymbolSecondary(Dart_NativeFunction native_function)62 const uint8_t* GetSymbolSecondary(Dart_NativeFunction native_function) {
63 return g_natives_secondary->GetSymbol(native_function);
64 }
65
66 } // namespace
67
InitForGlobal()68 void DartUI::InitForGlobal() {
69 if (!g_natives) {
70 g_natives = new tonic::DartLibraryNatives();
71 Canvas::RegisterNatives(g_natives);
72 CanvasGradient::RegisterNatives(g_natives);
73 CanvasImage::RegisterNatives(g_natives);
74 CanvasPath::RegisterNatives(g_natives);
75 CanvasPathMeasure::RegisterNatives(g_natives);
76 Codec::RegisterNatives(g_natives);
77 ColorFilter::RegisterNatives(g_natives);
78 DartRuntimeHooks::RegisterNatives(g_natives);
79 EngineLayer::RegisterNatives(g_natives);
80 FontCollection::RegisterNatives(g_natives);
81 FrameInfo::RegisterNatives(g_natives);
82 ImageFilter::RegisterNatives(g_natives);
83 ImageShader::RegisterNatives(g_natives);
84 IsolateNameServerNatives::RegisterNatives(g_natives);
85 Paragraph::RegisterNatives(g_natives);
86 ParagraphBuilder::RegisterNatives(g_natives);
87 Picture::RegisterNatives(g_natives);
88 PictureRecorder::RegisterNatives(g_natives);
89 Scene::RegisterNatives(g_natives);
90 SceneBuilder::RegisterNatives(g_natives);
91 SemanticsUpdate::RegisterNatives(g_natives);
92 SemanticsUpdateBuilder::RegisterNatives(g_natives);
93 Vertices::RegisterNatives(g_natives);
94 Window::RegisterNatives(g_natives);
95 #if defined(OS_FUCHSIA)
96 SceneHost::RegisterNatives(g_natives);
97 #endif
98
99 // Secondary isolates do not provide UI-related APIs.
100 g_natives_secondary = new tonic::DartLibraryNatives();
101 DartRuntimeHooks::RegisterNatives(g_natives_secondary);
102 IsolateNameServerNatives::RegisterNatives(g_natives_secondary);
103 }
104 }
105
InitForIsolate(bool is_root_isolate)106 void DartUI::InitForIsolate(bool is_root_isolate) {
107 FML_DCHECK(g_natives);
108 auto get_native_function =
109 is_root_isolate ? GetNativeFunction : GetNativeFunctionSecondary;
110 auto get_symbol = is_root_isolate ? GetSymbol : GetSymbolSecondary;
111 Dart_Handle result = Dart_SetNativeResolver(
112 Dart_LookupLibrary(ToDart("dart:ui")), get_native_function, get_symbol);
113 if (Dart_IsError(result)) {
114 Dart_PropagateError(result);
115 }
116 }
117
118 } // namespace flutter
119