diff --git a/BUILD.gn b/BUILD.gn index 24c7729f4b7e8c69ce0d4b239f9bb7b2dd384fe7..ea48f655dc4c875e66d895c8c77288a101c3fc82 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -8,10 +8,12 @@ group("flutter") { if (is_fuchsia) { # TODO(abarth) Remove this specific list once Fuchsia can build everything. deps = [ - "//flutter/snapshotter", "//flutter/assets", "//flutter/flow", "//flutter/glue", + "//flutter/lib/ui", + "//flutter/snapshotter", + "//flutter/tonic", ] } else { deps = [ diff --git a/lib/ui/BUILD.gn b/lib/ui/BUILD.gn index d9db1a4c2c5dc613fe750cc521ea14e5bbc86281..276ef4fd5d8aea6c5ea90b4ceef80833d3babf96 100644 --- a/lib/ui/BUILD.gn +++ b/lib/ui/BUILD.gn @@ -41,15 +41,10 @@ source_set("ui") { ] deps = [ - "//base", "//flutter/flow", - "//flutter/tonic", "//flutter/glue", - "//lib/tonic", "//flutter/skia", - - # For image_decoding: - "//flutter/sky/engine/platform", - "//flutter/sky/engine/wtf", + "//flutter/tonic", + "//lib/tonic", ] } diff --git a/lib/ui/compositing/scene_builder.cc b/lib/ui/compositing/scene_builder.cc index 22f496c8c4949668956147e7d3b566d143d57ea3..b12e38cf971da3fdf87573174a095d9834c9d762 100644 --- a/lib/ui/compositing/scene_builder.cc +++ b/lib/ui/compositing/scene_builder.cc @@ -145,13 +145,14 @@ void SceneBuilder::pushShaderMask(Shader* shader, addLayer(std::move(layer), m_cullRects.top()); } -void SceneBuilder::addLayer(std::unique_ptr layer, const SkRect& cullRect) { - DCHECK(layer); +void SceneBuilder::addLayer(std::unique_ptr layer, + const SkRect& cullRect) { + FTL_DCHECK(layer); m_cullRects.push(cullRect); if (!m_rootLayer) { - DCHECK(!m_currentLayer); + FTL_DCHECK(!m_currentLayer); m_rootLayer = std::move(layer); m_currentLayer = m_rootLayer.get(); return; diff --git a/lib/ui/painting/image_decoding.cc b/lib/ui/painting/image_decoding.cc index a87bf9f1919770418c0da13fb2522de10541e41d..56852c691cb0849c66dd17ed76f73ee7ecfdeb9f 100644 --- a/lib/ui/painting/image_decoding.cc +++ b/lib/ui/painting/image_decoding.cc @@ -5,23 +5,21 @@ #include "flutter/lib/ui/painting/image_decoding.h" #include "flutter/flow/texture_image.h" -#include "flutter/lib/ui/painting/image.h" -#include "flutter/lib/ui/painting/resource_context.h" #include "flutter/glue/drain_data_pipe_job.h" #include "flutter/glue/movable_wrapper.h" #include "flutter/glue/trace_event.h" +#include "flutter/lib/ui/painting/image.h" +#include "flutter/lib/ui/painting/resource_context.h" +#include "flutter/tonic/dart_state.h" #include "lib/ftl/tasks/task_runner.h" #include "lib/tonic/dart_persistent_value.h" #include "lib/tonic/logging/dart_invoke.h" #include "lib/tonic/mojo_converter.h" #include "lib/tonic/typed_data/uint8_list.h" -#include "flutter/sky/engine/public/platform/Platform.h" -#include "flutter/sky/engine/wtf/PassOwnPtr.h" #include "third_party/skia/include/core/SkImageGenerator.h" using tonic::DartInvoke; using tonic::DartPersistentValue; -using tonic::DartState; using tonic::ToDart; namespace blink { @@ -60,7 +58,7 @@ sk_sp DecodeImage(std::vector buffer) { } void InvokeImageCallback(sk_sp image, - PassOwnPtr callback) { + std::unique_ptr callback) { tonic::DartState* dart_state = callback->dart_state().get(); if (!dart_state) return; @@ -74,11 +72,14 @@ void InvokeImageCallback(sk_sp image, } } -void DecodeImageAndInvokeImageCallback(PassOwnPtr callback, - std::vector buffer) { +void DecodeImageAndInvokeImageCallback( + ftl::RefPtr task_runner, + glue::MovableWrapper> callback, + std::vector buffer) { sk_sp image = DecodeImage(std::move(buffer)); - Platform::current()->GetUITaskRunner()->PostTask( - [callback, image]() { InvokeImageCallback(image, callback); }); + task_runner->PostTask([callback, image]() mutable { + InvokeImageCallback(image, callback.Unwrap()); + }); } void DecodeImageFromDataPipe(Dart_NativeArguments args) { @@ -98,16 +99,21 @@ void DecodeImageFromDataPipe(Dart_NativeArguments args) { return; } - PassOwnPtr callback = - adoptPtr(new DartPersistentValue(DartState::Current(), callback_handle)); + DartState* dart_state = DartState::Current(); + ftl::RefPtr task_runner = dart_state->ui_task_runner(); - Platform::current()->GetIOTaskRunner()->PostTask( - [callback, consumer]() mutable { + auto callback = glue::WrapMovable(std::unique_ptr( + new DartPersistentValue(dart_state, callback_handle))); + + dart_state->io_task_runner()->PostTask( + [task_runner, callback, consumer]() mutable { glue::DrainDataPipeJob* job = nullptr; job = new glue::DrainDataPipeJob( - consumer.Unwrap(), [callback, job](std::vector buffer) { + consumer.Unwrap(), + [task_runner, callback, job](std::vector buffer) { delete job; - DecodeImageAndInvokeImageCallback(callback, std::move(buffer)); + DecodeImageAndInvokeImageCallback(task_runner, callback, + std::move(buffer)); }); }); } @@ -127,16 +133,22 @@ void DecodeImageFromList(Dart_NativeArguments args) { Dart_ThrowException(ToDart("Callback must be a function")); return; } - PassOwnPtr callback = - adoptPtr(new DartPersistentValue(DartState::Current(), callback_handle)); + + DartState* dart_state = DartState::Current(); + ftl::RefPtr task_runner = dart_state->ui_task_runner(); + + auto callback = glue::WrapMovable(std::unique_ptr( + new DartPersistentValue(dart_state, callback_handle))); const char* bytes = reinterpret_cast(list.data()); - PassOwnPtr> buffer = - adoptPtr(new std::vector(bytes, bytes + list.num_elements())); + auto buffer = glue::WrapMovable(std::unique_ptr>( + new std::vector(bytes, bytes + list.num_elements()))); - Platform::current()->GetIOTaskRunner()->PostTask([callback, buffer]() { - DecodeImageAndInvokeImageCallback(callback, std::move(*buffer)); - }); + dart_state->io_task_runner()->PostTask( + [task_runner, callback, buffer]() mutable { + DecodeImageAndInvokeImageCallback(task_runner, callback, + std::move(*buffer.Unwrap())); + }); } } // namespace diff --git a/sky/engine/core/script/ui_dart_state.cc b/sky/engine/core/script/ui_dart_state.cc index 141ef4d2d2a62693667cb9c64dec70ce3dff8f11..69b7f83c16e5744000f0e7c0266e6a0b82d72cd0 100644 --- a/sky/engine/core/script/ui_dart_state.cc +++ b/sky/engine/core/script/ui_dart_state.cc @@ -5,18 +5,21 @@ #include "flutter/sky/engine/core/script/ui_dart_state.h" #include "flutter/sky/engine/core/window/window.h" +#include "flutter/sky/engine/public/platform/Platform.h" namespace blink { UIDartState::UIDartState(IsolateClient* isolate_client, const std::string& url, std::unique_ptr window) - : FlutterDartState(isolate_client, url), - window_(std::move(window)) { + : FlutterDartState(isolate_client, url), window_(std::move(window)) { + ui_task_runner_ = + ftl::RefPtr(Platform::current()->GetUITaskRunner()); + io_task_runner_ = + ftl::RefPtr(Platform::current()->GetIOTaskRunner()); } -UIDartState::~UIDartState() { -} +UIDartState::~UIDartState() {} UIDartState* UIDartState::Current() { return static_cast(DartState::Current()); diff --git a/tonic/dart_state.h b/tonic/dart_state.h index c393e4e1125f87453ce9133d3900bc4f9fc6329b..8d0d3558916773d16357a60b084e33088bb3aa37 100644 --- a/tonic/dart_state.h +++ b/tonic/dart_state.h @@ -5,7 +5,10 @@ #ifndef FLUTTER_TONIC_DART_STATE_H_ #define FLUTTER_TONIC_DART_STATE_H_ +#include + #include "dart/runtime/include/dart_api.h" +#include "lib/ftl/tasks/task_runner.h" #include "lib/tonic/dart_persistent_value.h" #include "lib/tonic/dart_state.h" #include "lib/tonic/scopes/dart_api_scope.h" @@ -21,7 +24,17 @@ class DartState : public tonic::DartState { static DartState* From(Dart_Isolate isolate); static DartState* Current(); + const ftl::RefPtr& ui_task_runner() { + return ui_task_runner_; + } + const ftl::RefPtr& io_task_runner() { + return io_task_runner_; + } + protected: + ftl::RefPtr ui_task_runner_; + ftl::RefPtr io_task_runner_; + FTL_DISALLOW_COPY_AND_ASSIGN(DartState); };