@@ -23,7 +23,10 @@ using tonic::ToDart;
23
23
namespace blink {
24
24
namespace {
25
25
26
- sk_sp<SkImage> DecodeImage (sk_sp<SkData> buffer) {
26
+ static constexpr const char * kDecodeImageTraceTag = " DecodeImage" ;
27
+
28
+ sk_sp<SkImage> DecodeImage (sk_sp<SkData> buffer, size_t trace_id) {
29
+ TRACE_FLOW_STEP (" flutter" , kDecodeImageTraceTag , trace_id);
27
30
TRACE_EVENT0 (" blink" , " DecodeImage" );
28
31
29
32
if (buffer == nullptr || buffer->isEmpty ()) {
@@ -42,10 +45,13 @@ sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer) {
42
45
}
43
46
44
47
void InvokeImageCallback (sk_sp<SkImage> image,
45
- std::unique_ptr<DartPersistentValue> callback) {
48
+ std::unique_ptr<DartPersistentValue> callback,
49
+ size_t trace_id) {
46
50
tonic::DartState* dart_state = callback->dart_state ().get ();
47
- if (!dart_state)
51
+ if (!dart_state) {
52
+ TRACE_FLOW_END (" flutter" , kDecodeImageTraceTag , trace_id);
48
53
return ;
54
+ }
49
55
tonic::DartState::Scope scope (dart_state);
50
56
if (!image) {
51
57
DartInvoke (callback->value (), {Dart_Null ()});
@@ -54,30 +60,37 @@ void InvokeImageCallback(sk_sp<SkImage> image,
54
60
resultImage->set_image (std::move (image));
55
61
DartInvoke (callback->value (), {ToDart (resultImage)});
56
62
}
63
+ TRACE_FLOW_END (" flutter" , kDecodeImageTraceTag , trace_id);
57
64
}
58
65
59
66
void DecodeImageAndInvokeImageCallback (
60
67
std::unique_ptr<DartPersistentValue> callback,
61
- sk_sp<SkData> buffer) {
62
- sk_sp<SkImage> image = DecodeImage ( std::move (buffer));
63
- Threads::UI ()-> PostTask (
64
- ftl::MakeCopyable ([ callback = std::move (callback), image ]() mutable {
65
- InvokeImageCallback (image, std::move (callback));
66
- }));
68
+ sk_sp<SkData> buffer,
69
+ size_t trace_id) {
70
+ sk_sp<SkImage> image = DecodeImage ( std::move (buffer), trace_id);
71
+ Threads::UI ()-> PostTask ( ftl::MakeCopyable ([
72
+ callback = std::move (callback), image, trace_id
73
+ ]() mutable { InvokeImageCallback (image, std::move (callback), trace_id); }));
67
74
}
68
75
69
76
void DecodeImageFromList (Dart_NativeArguments args) {
77
+ static size_t trace_counter = 1 ;
78
+ const size_t trace_id = trace_counter++;
79
+ TRACE_FLOW_BEGIN (" flutter" , kDecodeImageTraceTag , trace_id);
80
+
70
81
Dart_Handle exception = nullptr ;
71
82
72
83
tonic::Uint8List list =
73
84
tonic::DartConverter<tonic::Uint8List>::FromArguments (args, 0 , exception);
74
85
if (exception) {
86
+ TRACE_FLOW_END (" flutter" , kDecodeImageTraceTag , trace_id);
75
87
Dart_ThrowException (exception);
76
88
return ;
77
89
}
78
90
79
91
Dart_Handle callback_handle = Dart_GetNativeArgument (args, 1 );
80
92
if (!Dart_IsClosure (callback_handle)) {
93
+ TRACE_FLOW_END (" flutter" , kDecodeImageTraceTag , trace_id);
81
94
Dart_ThrowException (ToDart (" Callback must be a function" ));
82
95
return ;
83
96
}
@@ -87,9 +100,10 @@ void DecodeImageFromList(Dart_NativeArguments args) {
87
100
Threads::IO ()->PostTask (ftl::MakeCopyable ([
88
101
callback = std::make_unique<DartPersistentValue>(
89
102
tonic::DartState::Current (), callback_handle),
90
- buffer = std::move (buffer)
103
+ buffer = std::move (buffer), trace_id
91
104
]() mutable {
92
- DecodeImageAndInvokeImageCallback (std::move (callback), std::move (buffer));
105
+ DecodeImageAndInvokeImageCallback (std::move (callback), std::move (buffer),
106
+ trace_id);
93
107
}));
94
108
}
95
109
0 commit comments