30 Dart_Handle callback_handle) {
31 if (!Dart_IsClosure(callback_handle)) {
35 tonic::Uint8List dataList = tonic::Uint8List(
data);
37 auto sk_data = MakeSkDataWithCopy(dataList.data(), dataList.num_elements());
39 auto buffer = fml::MakeRefCounted<ImmutableBuffer>(sk_data);
47 Dart_Handle asset_name_handle,
48 Dart_Handle callback_handle) {
50 if (!Dart_IsClosure(callback_handle)) {
54 uint8_t* chars =
nullptr;
55 intptr_t asset_length = 0;
57 Dart_StringToUTF8(asset_name_handle, &chars, &asset_length);
58 if (Dart_IsError(result)) {
62 std::string asset_name = std::string{
reinterpret_cast<const char*
>(chars),
63 static_cast<size_t>(asset_length)};
66 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
67 auto* buffer_callback_ptr =
69 auto* buffer_handle_ptr =
77 [buffer_callback_ptr, buffer_handle_ptr](
const sk_sp<SkData>& sk_data,
78 size_t buffer_size)
mutable {
79 std::unique_ptr<tonic::DartPersistentValue> buffer_handle(
81 std::unique_ptr<tonic::DartPersistentValue> buffer_callback(
84 auto dart_state = buffer_callback->dart_state().lock();
95 auto buffer = fml::MakeRefCounted<ImmutableBuffer>(sk_data);
100 dart_state->GetConcurrentTaskRunner()->PostTask(
101 [asset_name = std::move(asset_name),
102 asset_manager = std::move(asset_manager),
103 ui_task_runner = std::move(ui_task_runner), ui_task] {
104 std::unique_ptr<fml::Mapping> mapping =
105 asset_manager->GetAsMapping(asset_name);
107 sk_sp<SkData> sk_data;
108 size_t buffer_size = 0;
109 if (mapping !=
nullptr) {
110 buffer_size = mapping->GetSize();
111 const void* bytes =
static_cast<const void*
>(mapping->GetMapping());
112 sk_data = MakeSkDataWithCopy(bytes, buffer_size);
114 ui_task_runner->PostTask(
115 [sk_data = std::move(sk_data), ui_task = ui_task, buffer_size]() {
116 ui_task(sk_data, buffer_size);
123 Dart_Handle file_path_handle,
124 Dart_Handle callback_handle) {
126 if (!Dart_IsClosure(callback_handle)) {
130 uint8_t* chars =
nullptr;
131 intptr_t file_path_length = 0;
133 Dart_StringToUTF8(file_path_handle, &chars, &file_path_length);
134 if (Dart_IsError(result)) {
138 std::string file_path = std::string{
reinterpret_cast<const char*
>(chars),
139 static_cast<size_t>(file_path_length)};
142 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
143 auto* buffer_callback_ptr =
145 auto* buffer_handle_ptr =
149 [buffer_callback_ptr, buffer_handle_ptr](
const sk_sp<SkData>& sk_data,
150 size_t buffer_size)
mutable {
151 std::unique_ptr<tonic::DartPersistentValue> buffer_handle(
153 std::unique_ptr<tonic::DartPersistentValue> buffer_callback(
154 buffer_callback_ptr);
155 auto dart_state = buffer_callback->dart_state().lock();
166 auto buffer = fml::MakeRefCounted<ImmutableBuffer>(sk_data);
171 dart_state->GetConcurrentTaskRunner()->PostTask(
172 [file_path = std::move(file_path),
173 ui_task_runner = std::move(ui_task_runner), ui_task] {
174 auto mapping = std::make_unique<fml::FileMapping>(
fml::OpenFile(
177 sk_sp<SkData> sk_data;
178 size_t buffer_size = 0;
179 if (mapping->IsValid()) {
180 buffer_size = mapping->GetSize();
181 const void* bytes =
static_cast<const void*
>(mapping->GetMapping());
182 sk_data = MakeSkDataWithCopy(bytes, buffer_size);
184 ui_task_runner->PostTask(
185 [sk_data = std::move(sk_data), ui_task = ui_task, buffer_size]() {
186 ui_task(sk_data, buffer_size);
199sk_sp<SkData> ImmutableBuffer::MakeSkDataWithCopy(
const void*
data,
202 return SkData::MakeEmpty();
205 size_t mapping_length =
length +
sizeof(size_t);
206 void* mapping = ::mmap(
nullptr, mapping_length, PROT_READ | PROT_WRITE,
207 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
209 if (mapping == MAP_FAILED) {
210 return SkData::MakeEmpty();
213 *
reinterpret_cast<size_t*
>(mapping) = mapping_length;
214 void* mapping_data =
reinterpret_cast<char*
>(mapping) +
sizeof(
size_t);
217 SkData::ReleaseProc proc = [](
const void* ptr,
void* context) {
218 size_t* size_ptr =
reinterpret_cast<size_t*
>(context);
220 if (::munmap(
const_cast<void*
>(context), *size_ptr) == -1) {
221 FML_LOG(ERROR) <<
"munmap of codec SkData failed";
225 return SkData::MakeWithProc(mapping_data,
length, proc, mapping);
230sk_sp<SkData> ImmutableBuffer::MakeSkDataWithCopy(
const void*
data,
sk_sp< SkData > data() const
Callers should not modify the returned data. This is not exposed to Dart.
static Dart_Handle initFromAsset(Dart_Handle buffer_handle, Dart_Handle asset_name_handle, Dart_Handle callback_handle)
static Dart_Handle init(Dart_Handle buffer_handle, Dart_Handle data, Dart_Handle callback_handle)
size_t length() const
The length of the data in bytes.
static Dart_Handle initFromFile(Dart_Handle buffer_handle, Dart_Handle file_path_handle, Dart_Handle callback_handle)
~ImmutableBuffer() override
PlatformConfiguration * platform_configuration() const
static UIDartState * Current()
static void ThrowIfUIOperationsProhibited()
void AssociateWithDartWrapper(Dart_Handle wrappable)
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
#define FML_LOG(severity)
#define FML_DCHECK(condition)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
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 to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
internal::CopyableLambda< T > MakeCopyable(T lambda)
fml::UniqueFD OpenFile(const char *path, bool create_if_necessary, FilePermission permission)
This can open a directory on POSIX, but not on Windows.
Dart_Handle ToDart(const T &object)
Dart_Handle DartInvoke(Dart_Handle closure, std::initializer_list< Dart_Handle > args)