@nativescript/canvas 2.0.0-webgpu.35 → 2.0.0-webgpu.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/Canvas/common.d.ts +1 -1
  2. package/Canvas/common.js +24 -18
  3. package/Canvas/common.js.map +1 -1
  4. package/Canvas/index.android.js.map +1 -1
  5. package/Canvas/index.ios.js +1 -1
  6. package/Canvas/index.ios.js.map +1 -1
  7. package/Canvas2D/CanvasRenderingContext2D/index.d.ts +2 -1
  8. package/Canvas2D/CanvasRenderingContext2D/index.js +1 -4
  9. package/Canvas2D/CanvasRenderingContext2D/index.js.map +1 -1
  10. package/ImageAsset/index.d.ts +4 -2
  11. package/ImageAsset/index.js +76 -6
  12. package/ImageAsset/index.js.map +1 -1
  13. package/WebGL/WebGLRenderingContext/common.d.ts +1 -1
  14. package/WebGL/WebGLRenderingContext/index.js +4 -3
  15. package/WebGL/WebGLRenderingContext/index.js.map +1 -1
  16. package/WebGPU/GPUCanvasContext.d.ts +2 -1
  17. package/WebGPU/GPUCanvasContext.js.map +1 -1
  18. package/WebGPU/GPUQueue.js +9 -0
  19. package/WebGPU/GPUQueue.js.map +1 -1
  20. package/WebGPU/GPURenderPassEncoder.d.ts +3 -0
  21. package/WebGPU/GPURenderPassEncoder.js +9 -0
  22. package/WebGPU/GPURenderPassEncoder.js.map +1 -1
  23. package/angular/esm2022/index.mjs +4 -4
  24. package/angular/fesm2022/nativescript-canvas-angular.mjs +4 -4
  25. package/angular/fesm2022/nativescript-canvas-angular.mjs.map +1 -1
  26. package/common.js.map +1 -1
  27. package/index.d.ts +2 -1
  28. package/index.js +2 -1
  29. package/index.js.map +1 -1
  30. package/package.json +1 -1
  31. package/platforms/android/canvas-release.aar +0 -0
  32. package/platforms/ios/CanvasNative.xcframework/Info.plist +5 -5
  33. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/CanvasNative +0 -0
  34. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Headers/canvas_native.h +85 -0
  35. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo +0 -0
  36. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios.abi.json +7293 -7997
  37. package/platforms/ios/CanvasNative.xcframework/ios-arm64/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/DWARF/CanvasNative +0 -0
  38. package/platforms/ios/CanvasNative.xcframework/ios-arm64/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/Relocations/aarch64/CanvasNative.yml +681 -681
  39. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/CanvasNative +0 -0
  40. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Headers/canvas_native.h +85 -0
  41. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
  42. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
  43. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios-simulator.abi.json +7293 -7997
  44. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/x86_64-apple-ios-simulator.abi.json +7293 -7997
  45. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/_CodeSignature/CodeResources +6 -6
  46. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/DWARF/CanvasNative +0 -0
  47. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/Relocations/aarch64/CanvasNative.yml +683 -683
  48. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/Relocations/x86_64/CanvasNative.yml +736 -736
  49. package/platforms/ios/src/cpp/CanvasJSIModule.cpp +129 -0
  50. package/platforms/ios/src/cpp/CanvasJSIModule.h +2 -0
  51. package/platforms/ios/src/cpp/ImageAssetImpl.cpp +572 -397
  52. package/platforms/ios/src/cpp/ImageAssetImpl.h +4 -0
  53. package/platforms/ios/src/cpp/webgpu/GPUQueueImpl.cpp +40 -8
  54. package/platforms/ios/src/cpp/webgpu/GPURenderPassEncoderImpl.cpp +67 -0
  55. package/platforms/ios/src/cpp/webgpu/GPURenderPassEncoderImpl.h +4 -0
  56. package/utils.d.ts +1 -1
@@ -23,11 +23,11 @@ void ImageAssetImpl::Init(v8::Local<v8::Object> canvasModule, v8::Isolate *isola
23
23
  v8::Locker locker(isolate);
24
24
  v8::Isolate::Scope isolate_scope(isolate);
25
25
  v8::HandleScope handle_scope(isolate);
26
-
26
+
27
27
  auto ctor = GetCtor(isolate);
28
28
  auto context = isolate->GetCurrentContext();
29
29
  auto func = ctor->GetFunction(context).ToLocalChecked();
30
-
30
+
31
31
  canvasModule->Set(context, ConvertToV8String(isolate, "ImageAsset"), func).IsJust();
32
32
  }
33
33
 
@@ -45,93 +45,102 @@ v8::Local<v8::FunctionTemplate> ImageAssetImpl::GetCtor(v8::Isolate *isolate) {
45
45
  if (ctor != nullptr) {
46
46
  return ctor->Get(isolate);
47
47
  }
48
-
48
+
49
49
  v8::Local<v8::FunctionTemplate> ctorTmpl = v8::FunctionTemplate::New(isolate, Ctor);
50
50
  ctorTmpl->InstanceTemplate()->SetInternalFieldCount(2);
51
51
  ctorTmpl->SetClassName(ConvertToV8String(isolate, "ImageAsset"));
52
-
52
+
53
53
  auto tmpl = ctorTmpl->InstanceTemplate();
54
54
  tmpl->SetInternalFieldCount(2);
55
55
  tmpl->SetAccessor(
56
- ConvertToV8String(isolate, "width"),
57
- GetWidth);
56
+ ConvertToV8String(isolate, "width"),
57
+ GetWidth);
58
58
  tmpl->SetAccessor(
59
- ConvertToV8String(isolate, "height"),
60
- GetHeight);
59
+ ConvertToV8String(isolate, "height"),
60
+ GetHeight);
61
61
  tmpl->SetAccessor(
62
- ConvertToV8String(isolate, "error"),
63
- GetError);
64
-
62
+ ConvertToV8String(isolate, "error"),
63
+ GetError);
64
+
65
65
  tmpl->SetAccessor(
66
- ConvertToV8String(isolate, "__addr"),
67
- GetAddr);
68
-
66
+ ConvertToV8String(isolate, "__addr"),
67
+ GetAddr);
68
+
69
69
  tmpl->Set(
70
- ConvertToV8String(isolate, "__getRef"),
71
- v8::FunctionTemplate::New(isolate, GetReference));
72
-
73
-
74
-
75
- // tmpl->Set(
76
- // ConvertToV8String(isolate, "scale"),
77
- // v8::FunctionTemplate::New(isolate, &Scale));
78
-
70
+ ConvertToV8String(isolate, "__getRef"),
71
+ v8::FunctionTemplate::New(isolate, GetReference));
72
+
73
+
74
+
75
+ // tmpl->Set(
76
+ // ConvertToV8String(isolate, "scale"),
77
+ // v8::FunctionTemplate::New(isolate, &Scale));
78
+
79
79
  tmpl->Set(
80
- ConvertToV8String(isolate, "fromUrlSync"),
81
- v8::FunctionTemplate::New(isolate, &FromUrlSync));
82
-
80
+ ConvertToV8String(isolate, "fromUrlSync"),
81
+ v8::FunctionTemplate::New(isolate, &FromUrlSync));
82
+
83
83
  tmpl->Set(
84
- ConvertToV8String(isolate, "fromUrlCb"),
85
- v8::FunctionTemplate::New(isolate, &FromUrlCb));
86
-
87
-
84
+ ConvertToV8String(isolate, "fromUrlCb"),
85
+ v8::FunctionTemplate::New(isolate, &FromUrlCb));
86
+
87
+
88
88
  tmpl->Set(
89
- ConvertToV8String(isolate, "fromFileSync"),
90
- v8::FunctionTemplate::New(isolate, &FromFileSync));
91
-
89
+ ConvertToV8String(isolate, "fromFileSync"),
90
+ v8::FunctionTemplate::New(isolate, &FromFileSync));
91
+
92
92
  tmpl->Set(
93
- ConvertToV8String(isolate, "fromFileCb"),
94
- v8::FunctionTemplate::New(isolate, &FromFileCb));
95
-
96
-
93
+ ConvertToV8String(isolate, "fromFileCb"),
94
+ v8::FunctionTemplate::New(isolate, &FromFileCb));
95
+
96
+
97
97
  tmpl->Set(
98
- ConvertToV8String(isolate, "fromBytesSync"),
99
- v8::FunctionTemplate::New(isolate, &FromBytesSync));
100
-
98
+ ConvertToV8String(isolate, "fromBytesSync"),
99
+ v8::FunctionTemplate::New(isolate, &FromBytesSync));
100
+
101
101
  tmpl->Set(
102
- ConvertToV8String(isolate, "fromBytesCb"),
103
- v8::FunctionTemplate::New(isolate, &FromBytesCb));
104
-
105
-
102
+ ConvertToV8String(isolate, "fromBytesCb"),
103
+ v8::FunctionTemplate::New(isolate, &FromBytesCb));
104
+
105
+
106
+ tmpl->Set(
107
+ ConvertToV8String(isolate, "fromEncodedBytesSync"),
108
+ v8::FunctionTemplate::New(isolate, &FromEncodedBytesSync));
109
+
110
+ tmpl->Set(
111
+ ConvertToV8String(isolate, "fromEncodedBytesCb"),
112
+ v8::FunctionTemplate::New(isolate, &FromEncodedBytesCb));
113
+
114
+
106
115
  /* tmpl->Set(
107
- ConvertToV8String(isolate, "saveSync"),
108
- v8::FunctionTemplate::New(isolate, &SaveSync));
109
-
110
- tmpl->Set(
111
- ConvertToV8String(isolate, "saveCb"),
112
- v8::FunctionTemplate::New(isolate, &SaveCb));
113
- */
114
-
116
+ ConvertToV8String(isolate, "saveSync"),
117
+ v8::FunctionTemplate::New(isolate, &SaveSync));
118
+
119
+ tmpl->Set(
120
+ ConvertToV8String(isolate, "saveCb"),
121
+ v8::FunctionTemplate::New(isolate, &SaveCb));
122
+ */
123
+
115
124
  cache->ImageAssetTmpl =
116
- std::make_unique<v8::Persistent<v8::FunctionTemplate>>(isolate, ctorTmpl);
125
+ std::make_unique<v8::Persistent<v8::FunctionTemplate>>(isolate, ctorTmpl);
117
126
  return ctorTmpl;
118
127
  }
119
128
 
120
129
  void ImageAssetImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
121
130
  auto isolate = args.GetIsolate();
122
-
131
+
123
132
  auto ret = args.This();
124
-
133
+
125
134
  auto image_asset = canvas_native_image_asset_create();
126
-
135
+
127
136
  auto object = new ImageAssetImpl(image_asset);
128
-
137
+
129
138
  SetNativeType(object, NativeType::ImageAsset);
130
-
139
+
131
140
  ret->SetAlignedPointerInInternalField(0, object);
132
-
141
+
133
142
  object->BindFinalizer(isolate, ret);
134
-
143
+
135
144
  args.GetReturnValue().Set(ret);
136
145
  }
137
146
 
@@ -184,7 +193,7 @@ ImageAssetImpl::GetReference(const v8::FunctionCallbackInfo<v8::Value> &args) {
184
193
  args.GetReturnValue().Set(ConvertToV8String(isolate, ret));
185
194
  return;
186
195
  }
187
-
196
+
188
197
  args.GetReturnValue().SetEmptyString();
189
198
  }
190
199
 
@@ -210,9 +219,9 @@ void ImageAssetImpl::FromUrlSync(const v8::FunctionCallbackInfo<v8::Value> &args
210
219
  }
211
220
  auto isolate = args.GetIsolate();
212
221
  auto url = ConvertFromV8String(isolate, args[0]);
213
-
222
+
214
223
  auto done = canvas_native_image_asset_load_from_url(ptr->GetImageAsset(), url.c_str());
215
-
224
+
216
225
  args.GetReturnValue().Set(done);
217
226
  }
218
227
 
@@ -221,90 +230,90 @@ void ImageAssetImpl::FromUrlCb(const v8::FunctionCallbackInfo<v8::Value> &args)
221
230
  if (ptr == nullptr) {
222
231
  return;
223
232
  }
224
-
233
+
225
234
  auto isolate = args.GetIsolate();
226
-
235
+
227
236
  if (args.Length() < 2) {
228
237
  return;
229
238
  }
230
-
239
+
231
240
  auto url = ConvertFromV8String(isolate, args[0]);
232
-
241
+
233
242
  auto asset = canvas_native_image_asset_reference(ptr->asset_);
234
-
243
+
235
244
  auto callback = args[1].As<v8::Function>();
236
-
245
+
237
246
  auto jsi_callback = new JSICallback(isolate, callback);
238
-
247
+
239
248
  #ifdef __ANDROID__
240
-
249
+
241
250
  ALooper_addFd(jsi_callback->looper_,
242
251
  jsi_callback->fd_[0],
243
252
  0,
244
253
  ALOOPER_EVENT_INPUT,
245
254
  [](int fd, int events,
246
255
  void *data) {
247
- auto cb = static_cast<JSICallback *>(data);
248
- bool done;
249
- read(fd, &done,
250
- sizeof(bool));
251
-
252
- v8::Isolate *isolate = cb->isolate_;
253
- v8::Locker locker(isolate);
254
- v8::Isolate::Scope isolate_scope(isolate);
255
- v8::HandleScope handle_scope(isolate);
256
- v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
257
- v8::Local<v8::Context> context = callback->GetCreationContextChecked();
258
- v8::Context::Scope context_scope(context);
259
-
260
- v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
261
-
262
- // v8::TryCatch tc(isolate);
263
-
264
- callback->Call(context, context->Global(), 1,
265
- args); // ignore JS return value
266
-
267
-
268
- delete static_cast<JSICallback *>(data);
269
- return 0;
270
- }, jsi_callback);
271
-
272
-
256
+ auto cb = static_cast<JSICallback *>(data);
257
+ bool done;
258
+ read(fd, &done,
259
+ sizeof(bool));
260
+
261
+ v8::Isolate *isolate = cb->isolate_;
262
+ v8::Locker locker(isolate);
263
+ v8::Isolate::Scope isolate_scope(isolate);
264
+ v8::HandleScope handle_scope(isolate);
265
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
266
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
267
+ v8::Context::Scope context_scope(context);
268
+
269
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
270
+
271
+ // v8::TryCatch tc(isolate);
272
+
273
+ callback->Call(context, context->Global(), 1,
274
+ args); // ignore JS return value
275
+
276
+
277
+ delete static_cast<JSICallback *>(data);
278
+ return 0;
279
+ }, jsi_callback);
280
+
281
+
273
282
  std::thread thread(
274
- [jsi_callback, asset](
275
- const std::string &url) {
276
- auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
277
-
278
- canvas_native_image_asset_release(asset);
279
-
280
- write(jsi_callback->fd_[1],
281
- &done,
282
- sizeof(bool));
283
-
284
- }, std::move(url));
285
-
283
+ [jsi_callback, asset](
284
+ const std::string &url) {
285
+ auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
286
+
287
+ canvas_native_image_asset_release(asset);
288
+
289
+ write(jsi_callback->fd_[1],
290
+ &done,
291
+ sizeof(bool));
292
+
293
+ }, std::move(url));
294
+
286
295
  thread.detach();
287
-
296
+
288
297
  #endif
289
-
290
-
298
+
299
+
291
300
  #ifdef __APPLE__
292
-
301
+
293
302
  auto current_queue = new NSOperationQueueWrapper(true);
294
-
303
+
295
304
  auto queue = new NSOperationQueueWrapper(false);
296
-
297
-
298
-
305
+
306
+
307
+
299
308
  /* std::thread task([jsi_callback, current_queue, asset](std::string url) {
300
-
301
-
309
+
310
+
302
311
  auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
303
-
304
-
312
+
313
+
305
314
  auto main_task = [jsi_callback, current_queue, url, done]() {
306
-
307
-
315
+
316
+
308
317
  v8::Isolate *isolate = jsi_callback->isolate_;
309
318
  v8::Locker locker(isolate);
310
319
  v8::Isolate::Scope isolate_scope(isolate);
@@ -312,43 +321,43 @@ void ImageAssetImpl::FromUrlCb(const v8::FunctionCallbackInfo<v8::Value> &args)
312
321
  v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
313
322
  v8::Local<v8::Context> context = callback->GetCreationContextChecked();
314
323
  v8::Context::Scope context_scope(context);
315
-
324
+
316
325
  v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
317
-
326
+
318
327
  // v8::TryCatch tc(isolate);
319
-
328
+
320
329
  callback->Call(context, context->Global(), 1,
321
330
  args); // ignore JS return value
322
-
323
-
331
+
332
+
324
333
  delete jsi_callback;
325
334
  // delete queue;
326
335
  delete current_queue;
327
-
328
-
336
+
337
+
329
338
  };
330
-
339
+
331
340
  current_queue->addOperation(main_task);
332
-
333
-
341
+
342
+
334
343
  }, std::move(url));
335
-
344
+
336
345
  task.detach();
337
-
346
+
338
347
  */
339
-
340
-
341
-
342
-
343
-
348
+
349
+
350
+
351
+
352
+
344
353
  auto task = [jsi_callback, current_queue, queue, asset, url]() {
345
-
354
+
346
355
  auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
347
356
  canvas_native_image_asset_release(asset);
348
-
357
+
349
358
  auto main_task = [jsi_callback, current_queue, queue, url, done]() {
350
-
351
-
359
+
360
+
352
361
  v8::Isolate *isolate = jsi_callback->isolate_;
353
362
  v8::Locker locker(isolate);
354
363
  v8::Isolate::Scope isolate_scope(isolate);
@@ -356,31 +365,31 @@ void ImageAssetImpl::FromUrlCb(const v8::FunctionCallbackInfo<v8::Value> &args)
356
365
  v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
357
366
  v8::Local<v8::Context> context = callback->GetCreationContextChecked();
358
367
  v8::Context::Scope context_scope(context);
359
-
368
+
360
369
  v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
361
-
370
+
362
371
  // v8::TryCatch tc(isolate);
363
-
372
+
364
373
  callback->Call(context, context->Global(), 1,
365
374
  args); // ignore JS return value
366
-
367
-
375
+
376
+
368
377
  delete jsi_callback;
369
378
  delete queue;
370
379
  delete current_queue;
371
-
372
-
380
+
381
+
373
382
  };
374
-
383
+
375
384
  current_queue->addOperation(main_task);
376
-
385
+
377
386
  };
378
-
379
-
380
-
387
+
388
+
389
+
381
390
  queue->addOperation(task);
382
391
  #endif
383
-
392
+
384
393
  }
385
394
 
386
395
  void ImageAssetImpl::FromFileSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
@@ -391,9 +400,9 @@ void ImageAssetImpl::FromFileSync(const v8::FunctionCallbackInfo<v8::Value> &arg
391
400
  }
392
401
  auto isolate = args.GetIsolate();
393
402
  auto path = ConvertFromV8String(isolate, args[0]);
394
-
403
+
395
404
  auto done = canvas_native_image_asset_load_from_path(ptr->GetImageAsset(), path.c_str());
396
-
405
+
397
406
  args.GetReturnValue().Set(done);
398
407
  }
399
408
 
@@ -403,85 +412,85 @@ void ImageAssetImpl::FromFileCb(const v8::FunctionCallbackInfo<v8::Value> &args)
403
412
  return;
404
413
  }
405
414
  auto isolate = args.GetIsolate();
406
-
415
+
407
416
  if (args.Length() < 2) {
408
417
  return;
409
418
  }
410
-
419
+
411
420
  auto path = ConvertFromV8String(isolate, args[0]);
412
-
421
+
413
422
  auto asset = canvas_native_image_asset_reference(ptr->GetImageAsset());
414
-
423
+
415
424
  auto callback = args[1].As<v8::Function>();
416
-
425
+
417
426
  auto jsi_callback = new JSICallback(isolate, callback);
418
-
427
+
419
428
  #ifdef __ANDROID__
420
-
429
+
421
430
  ALooper_addFd(jsi_callback->looper_,
422
431
  jsi_callback->fd_[0],
423
432
  0,
424
433
  ALOOPER_EVENT_INPUT,
425
434
  [](int fd, int events,
426
435
  void *data) {
427
- auto cb = static_cast<JSICallback *>(data);
428
- bool done;
429
- read(fd, &done,
430
- sizeof(bool));
431
-
432
- v8::Isolate *isolate = cb->isolate_;
433
- v8::Locker locker(isolate);
434
- v8::Isolate::Scope isolate_scope(isolate);
435
- v8::HandleScope handle_scope(isolate);
436
- v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
437
- v8::Local<v8::Context> context = callback->GetCreationContextChecked();
438
- v8::Context::Scope context_scope(context);
439
-
440
- v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
441
-
442
- v8::TryCatch tc(isolate);
443
-
444
- callback->Call(context, context->Global(), 1,
445
- args); // ignore JS return value
446
-
447
- delete static_cast<JSICallback *>(data);
448
- return 0;
449
- }, jsi_callback);
450
-
451
-
436
+ auto cb = static_cast<JSICallback *>(data);
437
+ bool done;
438
+ read(fd, &done,
439
+ sizeof(bool));
440
+
441
+ v8::Isolate *isolate = cb->isolate_;
442
+ v8::Locker locker(isolate);
443
+ v8::Isolate::Scope isolate_scope(isolate);
444
+ v8::HandleScope handle_scope(isolate);
445
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
446
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
447
+ v8::Context::Scope context_scope(context);
448
+
449
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
450
+
451
+ v8::TryCatch tc(isolate);
452
+
453
+ callback->Call(context, context->Global(), 1,
454
+ args); // ignore JS return value
455
+
456
+ delete static_cast<JSICallback *>(data);
457
+ return 0;
458
+ }, jsi_callback);
459
+
460
+
452
461
  std::thread thread(
453
- [jsi_callback, asset](
454
- const std::string path) {
455
-
456
- auto done = canvas_native_image_asset_load_from_path(asset, path.c_str());
457
-
458
- write(jsi_callback->fd_[1],
459
- &done,
460
- sizeof(bool));
461
-
462
- canvas_native_image_asset_release(asset);
463
-
464
- }, std::move(path));
465
-
462
+ [jsi_callback, asset](
463
+ const std::string path) {
464
+
465
+ auto done = canvas_native_image_asset_load_from_path(asset, path.c_str());
466
+
467
+ write(jsi_callback->fd_[1],
468
+ &done,
469
+ sizeof(bool));
470
+
471
+ canvas_native_image_asset_release(asset);
472
+
473
+ }, std::move(path));
474
+
466
475
  thread.detach();
467
-
476
+
468
477
  #endif
469
-
470
-
478
+
479
+
471
480
  #ifdef __APPLE__
472
-
481
+
473
482
  auto current_queue = new NSOperationQueueWrapper(true);
474
-
483
+
475
484
  auto queue = new NSOperationQueueWrapper(false);
476
-
485
+
477
486
  auto task = [jsi_callback, current_queue, queue, asset, path]() {
478
-
487
+
479
488
  auto done = canvas_native_image_asset_load_from_path(asset, path.c_str());
480
-
489
+
481
490
  canvas_native_image_asset_release(asset);
482
-
491
+
483
492
  auto main_task = [jsi_callback, current_queue, queue, done]() {
484
-
493
+
485
494
  v8::Isolate *isolate = jsi_callback->isolate_;
486
495
  v8::Locker locker(isolate);
487
496
  v8::Isolate::Scope isolate_scope(isolate);
@@ -489,27 +498,27 @@ void ImageAssetImpl::FromFileCb(const v8::FunctionCallbackInfo<v8::Value> &args)
489
498
  v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
490
499
  v8::Local<v8::Context> context = callback->GetCreationContextChecked();
491
500
  v8::Context::Scope context_scope(context);
492
-
501
+
493
502
  v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
494
-
503
+
495
504
  // v8::TryCatch tc(isolate);
496
-
505
+
497
506
  callback->Call(context, context->Global(), 1,
498
507
  args); // ignore JS return value
499
-
500
- delete queue;
501
- delete current_queue;
502
- delete jsi_callback;
503
-
508
+
509
+ delete queue;
510
+ delete current_queue;
511
+ delete jsi_callback;
512
+
504
513
  };
505
-
514
+
506
515
  current_queue->addOperation(main_task);
507
-
516
+
508
517
  };
509
-
518
+
510
519
  queue->addOperation(task);
511
-
512
-
520
+
521
+
513
522
  #endif
514
523
  }
515
524
 
@@ -519,24 +528,32 @@ void ImageAssetImpl::FromBytesSync(const v8::FunctionCallbackInfo<v8::Value> &ar
519
528
  args.GetReturnValue().Set(false);
520
529
  return;
521
530
  }
522
-
523
- auto value = args[0];
524
-
531
+ auto context = args.GetIsolate()->GetCurrentContext();
532
+ auto value = args[2];
533
+
525
534
  if (value->IsObject()) {
526
535
  if (!value->IsArrayBuffer()) {
527
536
  args.GetReturnValue().Set(false);
528
537
  return;
529
538
  }
530
539
  auto buf = value.As<v8::ArrayBuffer>();
531
-
540
+
532
541
  auto size = (uintptr_t) buf->ByteLength();
533
542
  auto data = (uint8_t *) buf->GetBackingStore()->Data();
534
-
535
- auto done = canvas_native_image_asset_load_from_raw(ptr->GetImageAsset(), data, size);
536
-
543
+
544
+ uint32_t width;
545
+ uint32_t height;
546
+ bool done = false;
547
+ if(args[0]->Uint32Value(context).To(&width)
548
+ && args[1]->Uint32Value(context).To(&height)
549
+ ) {
550
+ done = canvas_native_image_asset_load_from_raw(ptr->GetImageAsset(), width, height, data, size);
551
+ }
552
+
537
553
  args.GetReturnValue().Set(done);
554
+ return;
538
555
  }
539
-
556
+
540
557
  args.GetReturnValue().Set(false);
541
558
  }
542
559
 
@@ -546,89 +563,96 @@ void ImageAssetImpl::FromBytesCb(const v8::FunctionCallbackInfo<v8::Value> &args
546
563
  return;
547
564
  }
548
565
  auto isolate = args.GetIsolate();
549
-
566
+
550
567
  if (args.Length() < 2) {
551
568
  return;
552
569
  }
553
-
554
-
555
- auto bytes = args[0].As<v8::ArrayBuffer>();
556
-
570
+
571
+
572
+ auto bytes = args[2].As<v8::ArrayBuffer>();
573
+
557
574
  auto size = bytes->ByteLength();
558
-
575
+
559
576
  auto data = (uint8_t *) bytes->GetBackingStore()->Data();
560
-
577
+
561
578
  auto asset = canvas_native_image_asset_reference(ptr->GetImageAsset());
562
-
563
- auto callback = args[1].As<v8::Function>();
564
-
579
+
580
+ auto context = args.GetIsolate()->GetCurrentContext();
581
+
582
+ uint32_t width;
583
+ uint32_t height;
584
+ args[0]->Uint32Value(context).To(&width);
585
+ args[1]->Uint32Value(context).To(&height);
586
+
587
+ auto callback = args[3].As<v8::Function>();
588
+
565
589
  auto jsi_callback = new JSICallback(isolate, callback);
566
-
590
+
567
591
  #ifdef __ANDROID__
568
-
592
+
569
593
  ALooper_addFd(jsi_callback->looper_,
570
594
  jsi_callback->fd_[0],
571
595
  0,
572
596
  ALOOPER_EVENT_INPUT,
573
597
  [](int fd, int events,
574
598
  void *data) {
575
- auto cb = static_cast<JSICallback *>(data);
576
- bool done;
577
- read(fd, &done,
578
- sizeof(bool));
579
-
580
- v8::Isolate *isolate = cb->isolate_;
581
- v8::Locker locker(isolate);
582
- v8::Isolate::Scope isolate_scope(isolate);
583
- v8::HandleScope handle_scope(isolate);
584
- v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
585
- v8::Local<v8::Context> context = callback->GetCreationContextChecked();
586
- v8::Context::Scope context_scope(context);
587
-
588
- v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
589
-
590
- // v8::TryCatch tc(isolate);
591
-
592
- callback->Call(context, context->Global(), 1,
593
- args); // ignore JS return value
594
-
595
- delete static_cast<JSICallback *>(data);
596
- return 0;
597
- }, jsi_callback);
598
-
599
+ auto cb = static_cast<JSICallback *>(data);
600
+ bool done;
601
+ read(fd, &done,
602
+ sizeof(bool));
603
+
604
+ v8::Isolate *isolate = cb->isolate_;
605
+ v8::Locker locker(isolate);
606
+ v8::Isolate::Scope isolate_scope(isolate);
607
+ v8::HandleScope handle_scope(isolate);
608
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
609
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
610
+ v8::Context::Scope context_scope(context);
611
+
612
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
613
+
614
+ // v8::TryCatch tc(isolate);
615
+
616
+ callback->Call(context, context->Global(), 1,
617
+ args); // ignore JS return value
618
+
619
+ delete static_cast<JSICallback *>(data);
620
+ return 0;
621
+ }, jsi_callback);
622
+
599
623
  std::thread thread(
600
- [jsi_callback, asset, data, size]() {
601
-
602
- auto done = canvas_native_image_asset_load_from_raw(asset, data, size);
603
-
604
- canvas_native_image_asset_release(asset);
605
-
606
- write(jsi_callback->fd_[1],
607
- &done,
608
- sizeof(bool));
609
-
610
- });
611
-
624
+ [jsi_callback, asset, width, height, data, size]() {
625
+
626
+ auto done = canvas_native_image_asset_load_from_raw(asset, width, height, data, size);
627
+
628
+ canvas_native_image_asset_release(asset);
629
+
630
+ write(jsi_callback->fd_[1],
631
+ &done,
632
+ sizeof(bool));
633
+
634
+ });
635
+
612
636
  thread.detach();
613
-
637
+
614
638
  #endif
615
-
616
-
639
+
640
+
617
641
  #ifdef __APPLE__
618
-
642
+
619
643
  auto current_queue = new NSOperationQueueWrapper(true);
620
-
644
+
621
645
  auto queue = new NSOperationQueueWrapper(false);
622
-
623
- auto task = [jsi_callback, current_queue, queue, asset, data, size]() {
624
-
625
- auto done = canvas_native_image_asset_load_from_raw(asset, data, size);
626
-
646
+
647
+ auto task = [jsi_callback, current_queue, queue, asset, width, height,data, size]() {
648
+
649
+ auto done = canvas_native_image_asset_load_from_raw(asset, width, height, data, size);
650
+
627
651
  canvas_native_image_asset_release(asset);
628
-
652
+
629
653
  auto main_task = [jsi_callback, current_queue, queue, done]() {
630
-
631
-
654
+
655
+
632
656
  v8::Isolate *isolate = jsi_callback->isolate_;
633
657
  v8::Locker locker(isolate);
634
658
  v8::Isolate::Scope isolate_scope(isolate);
@@ -636,141 +660,150 @@ void ImageAssetImpl::FromBytesCb(const v8::FunctionCallbackInfo<v8::Value> &args
636
660
  v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
637
661
  v8::Local<v8::Context> context = callback->GetCreationContextChecked();
638
662
  v8::Context::Scope context_scope(context);
639
-
663
+
640
664
  v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
641
-
665
+
642
666
  // v8::TryCatch tc(isolate);
643
-
667
+
644
668
  callback->Call(context, context->Global(), 1,
645
669
  args); // ignore JS return value
646
-
647
-
670
+
671
+
648
672
  delete jsi_callback;
649
673
  delete queue;
650
674
  delete current_queue;
651
-
652
-
675
+
676
+
653
677
  };
654
-
678
+
655
679
  current_queue->addOperation(main_task);
656
-
680
+
657
681
  };
658
-
682
+
659
683
  queue->addOperation(task);
660
684
  #endif
661
-
685
+
662
686
  }
663
687
 
664
- /*
665
- void ImageAssetImpl::SaveSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
688
+
689
+ void ImageAssetImpl::FromEncodedBytesSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
666
690
  ImageAssetImpl *ptr = GetPointer(args.This());
667
691
  if (ptr == nullptr) {
668
692
  args.GetReturnValue().Set(false);
669
693
  return;
670
694
  }
671
-
672
- auto isolate = args.GetIsolate();
673
- auto context = isolate->GetCurrentContext();
674
- auto path = ConvertFromV8String(isolate, args[0]);
675
- auto format = args[1]->Uint32Value(context).ToChecked();
676
- auto done = canvas_native_image_asset_save_path(ptr->GetImageAsset(), path.c_str(), format);
677
-
678
- args.GetReturnValue().Set(done);
695
+
696
+ auto value = args[0];
697
+
698
+ if (value->IsObject()) {
699
+ if (!value->IsArrayBuffer()) {
700
+ args.GetReturnValue().Set(false);
701
+ return;
702
+ }
703
+ auto buf = value.As<v8::ArrayBuffer>();
704
+
705
+ auto size = (uintptr_t) buf->ByteLength();
706
+ auto data = (uint8_t *) buf->GetBackingStore()->Data();
707
+
708
+ auto done = canvas_native_image_asset_load_from_raw_encoded(ptr->GetImageAsset(), data,
709
+ size);
710
+
711
+ args.GetReturnValue().Set(done);
712
+ return;
713
+ }
714
+
715
+ args.GetReturnValue().Set(false);
679
716
  }
680
717
 
681
- void ImageAssetImpl::SaveCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
718
+ void ImageAssetImpl::FromEncodedBytesCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
682
719
  ImageAssetImpl *ptr = GetPointer(args.This());
683
720
  if (ptr == nullptr) {
684
721
  return;
685
722
  }
686
723
  auto isolate = args.GetIsolate();
687
- auto context = isolate->GetCurrentContext();
724
+
688
725
  if (args.Length() < 2) {
689
726
  return;
690
727
  }
691
-
692
-
693
- auto path = ConvertFromV8String(isolate, args[0]);
694
-
695
- auto format = args[1]->Uint32Value(context).ToChecked();
696
-
697
- auto asset = canvas_native_image_asset_shared_clone(
698
- ptr->GetImageAsset());
699
-
728
+
729
+
730
+ auto bytes = args[0].As<v8::ArrayBuffer>();
731
+
732
+ auto size = bytes->ByteLength();
733
+
734
+ auto data = (uint8_t *) bytes->GetBackingStore()->Data();
735
+
736
+ auto asset = canvas_native_image_asset_reference(ptr->GetImageAsset());
737
+
700
738
  auto callback = args[1].As<v8::Function>();
701
-
739
+
702
740
  auto jsi_callback = new JSICallback(isolate, callback);
703
-
704
-
741
+
705
742
  #ifdef __ANDROID__
706
-
743
+
707
744
  ALooper_addFd(jsi_callback->looper_,
708
745
  jsi_callback->fd_[0],
709
746
  0,
710
747
  ALOOPER_EVENT_INPUT,
711
748
  [](int fd, int events,
712
749
  void *data) {
713
- auto cb = static_cast<JSICallback *>(data);
714
- bool done;
715
- read(fd, &done,
716
- sizeof(bool));
717
-
718
- v8::Isolate *isolate = cb->isolate_;
719
- v8::Locker locker(isolate);
720
- v8::Isolate::Scope isolate_scope(isolate);
721
- v8::HandleScope handle_scope(isolate);
722
- v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
723
- v8::Local<v8::Context> context = callback->GetCreationContextChecked();
724
- v8::Context::Scope context_scope(context);
725
-
726
- v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
727
-
728
- // v8::TryCatch tc(isolate);
729
-
730
- callback->Call(context, context->Global(), 1,
731
- args); // ignore JS return value
732
-
733
- delete static_cast<JSICallback *>(data);
734
- return 0;
735
- }, jsi_callback);
736
-
750
+ auto cb = static_cast<JSICallback *>(data);
751
+ bool done;
752
+ read(fd, &done,
753
+ sizeof(bool));
754
+
755
+ v8::Isolate *isolate = cb->isolate_;
756
+ v8::Locker locker(isolate);
757
+ v8::Isolate::Scope isolate_scope(isolate);
758
+ v8::HandleScope handle_scope(isolate);
759
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
760
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
761
+ v8::Context::Scope context_scope(context);
762
+
763
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
764
+
765
+ // v8::TryCatch tc(isolate);
766
+
767
+ callback->Call(context, context->Global(), 1,
768
+ args); // ignore JS return value
769
+
770
+ delete static_cast<JSICallback *>(data);
771
+ return 0;
772
+ }, jsi_callback);
773
+
737
774
  std::thread thread(
738
- [jsi_callback, asset, format](
739
- const std::string &path) {
740
-
741
- auto done = canvas_native_image_asset_save_path(asset,
742
- path.c_str(),
743
- format);
744
-
745
- canvas_native_image_asset_destroy(asset);
746
-
747
- write(jsi_callback->fd_[1],
748
- &done,
749
- sizeof(bool));
750
-
751
- }, std::move(path));
752
-
753
-
775
+ [jsi_callback, asset, data, size]() {
776
+
777
+ auto done = canvas_native_image_asset_load_from_raw_encoded(asset, data, size);
778
+
779
+ canvas_native_image_asset_release(asset);
780
+
781
+ write(jsi_callback->fd_[1],
782
+ &done,
783
+ sizeof(bool));
784
+
785
+ });
786
+
754
787
  thread.detach();
755
-
788
+
756
789
  #endif
757
-
758
-
790
+
791
+
759
792
  #ifdef __APPLE__
760
-
793
+
761
794
  auto current_queue = new NSOperationQueueWrapper(true);
762
-
795
+
763
796
  auto queue = new NSOperationQueueWrapper(false);
764
-
765
- auto task = [jsi_callback, current_queue, queue, asset, path, format]() {
766
-
767
- auto done = canvas_native_image_asset_save_path(asset, path.c_str(), format);
768
-
769
- canvas_native_image_asset_destroy(asset);
770
-
797
+
798
+ auto task = [jsi_callback, current_queue, queue, asset, data, size]() {
799
+
800
+ auto done = canvas_native_image_asset_load_from_raw_encoded(asset, data, size);
801
+
802
+ canvas_native_image_asset_release(asset);
803
+
771
804
  auto main_task = [jsi_callback, current_queue, queue, done]() {
772
-
773
-
805
+
806
+
774
807
  v8::Isolate *isolate = jsi_callback->isolate_;
775
808
  v8::Locker locker(isolate);
776
809
  v8::Isolate::Scope isolate_scope(isolate);
@@ -778,30 +811,172 @@ void ImageAssetImpl::SaveCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
778
811
  v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
779
812
  v8::Local<v8::Context> context = callback->GetCreationContextChecked();
780
813
  v8::Context::Scope context_scope(context);
781
-
814
+
782
815
  v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
783
-
816
+
784
817
  // v8::TryCatch tc(isolate);
785
-
818
+
786
819
  callback->Call(context, context->Global(), 1,
787
820
  args); // ignore JS return value
788
-
789
-
821
+
822
+
790
823
  delete jsi_callback;
791
824
  delete queue;
792
825
  delete current_queue;
793
-
794
-
826
+
827
+
795
828
  };
829
+
796
830
  current_queue->addOperation(main_task);
831
+
797
832
  };
798
-
833
+
799
834
  queue->addOperation(task);
800
835
  #endif
801
-
802
-
836
+
803
837
  }
804
- */
838
+
839
+ /*
840
+ void ImageAssetImpl::SaveSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
841
+ ImageAssetImpl *ptr = GetPointer(args.This());
842
+ if (ptr == nullptr) {
843
+ args.GetReturnValue().Set(false);
844
+ return;
845
+ }
846
+
847
+ auto isolate = args.GetIsolate();
848
+ auto context = isolate->GetCurrentContext();
849
+ auto path = ConvertFromV8String(isolate, args[0]);
850
+ auto format = args[1]->Uint32Value(context).ToChecked();
851
+ auto done = canvas_native_image_asset_save_path(ptr->GetImageAsset(), path.c_str(), format);
852
+
853
+ args.GetReturnValue().Set(done);
854
+ }
855
+
856
+ void ImageAssetImpl::SaveCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
857
+ ImageAssetImpl *ptr = GetPointer(args.This());
858
+ if (ptr == nullptr) {
859
+ return;
860
+ }
861
+ auto isolate = args.GetIsolate();
862
+ auto context = isolate->GetCurrentContext();
863
+ if (args.Length() < 2) {
864
+ return;
865
+ }
866
+
867
+
868
+ auto path = ConvertFromV8String(isolate, args[0]);
869
+
870
+ auto format = args[1]->Uint32Value(context).ToChecked();
871
+
872
+ auto asset = canvas_native_image_asset_shared_clone(
873
+ ptr->GetImageAsset());
874
+
875
+ auto callback = args[1].As<v8::Function>();
876
+
877
+ auto jsi_callback = new JSICallback(isolate, callback);
878
+
879
+
880
+ #ifdef __ANDROID__
881
+
882
+ ALooper_addFd(jsi_callback->looper_,
883
+ jsi_callback->fd_[0],
884
+ 0,
885
+ ALOOPER_EVENT_INPUT,
886
+ [](int fd, int events,
887
+ void *data) {
888
+ auto cb = static_cast<JSICallback *>(data);
889
+ bool done;
890
+ read(fd, &done,
891
+ sizeof(bool));
892
+
893
+ v8::Isolate *isolate = cb->isolate_;
894
+ v8::Locker locker(isolate);
895
+ v8::Isolate::Scope isolate_scope(isolate);
896
+ v8::HandleScope handle_scope(isolate);
897
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
898
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
899
+ v8::Context::Scope context_scope(context);
900
+
901
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
902
+
903
+ // v8::TryCatch tc(isolate);
904
+
905
+ callback->Call(context, context->Global(), 1,
906
+ args); // ignore JS return value
907
+
908
+ delete static_cast<JSICallback *>(data);
909
+ return 0;
910
+ }, jsi_callback);
911
+
912
+ std::thread thread(
913
+ [jsi_callback, asset, format](
914
+ const std::string &path) {
915
+
916
+ auto done = canvas_native_image_asset_save_path(asset,
917
+ path.c_str(),
918
+ format);
919
+
920
+ canvas_native_image_asset_destroy(asset);
921
+
922
+ write(jsi_callback->fd_[1],
923
+ &done,
924
+ sizeof(bool));
925
+
926
+ }, std::move(path));
927
+
928
+
929
+ thread.detach();
930
+
931
+ #endif
932
+
933
+
934
+ #ifdef __APPLE__
935
+
936
+ auto current_queue = new NSOperationQueueWrapper(true);
937
+
938
+ auto queue = new NSOperationQueueWrapper(false);
939
+
940
+ auto task = [jsi_callback, current_queue, queue, asset, path, format]() {
941
+
942
+ auto done = canvas_native_image_asset_save_path(asset, path.c_str(), format);
943
+
944
+ canvas_native_image_asset_destroy(asset);
945
+
946
+ auto main_task = [jsi_callback, current_queue, queue, done]() {
947
+
948
+
949
+ v8::Isolate *isolate = jsi_callback->isolate_;
950
+ v8::Locker locker(isolate);
951
+ v8::Isolate::Scope isolate_scope(isolate);
952
+ v8::HandleScope handle_scope(isolate);
953
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
954
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
955
+ v8::Context::Scope context_scope(context);
956
+
957
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
958
+
959
+ // v8::TryCatch tc(isolate);
960
+
961
+ callback->Call(context, context->Global(), 1,
962
+ args); // ignore JS return value
963
+
964
+
965
+ delete jsi_callback;
966
+ delete queue;
967
+ delete current_queue;
968
+
969
+
970
+ };
971
+ current_queue->addOperation(main_task);
972
+ };
973
+
974
+ queue->addOperation(task);
975
+ #endif
976
+
977
+
978
+ }
979
+ */
805
980
 
806
981
  const ImageAsset *ImageAssetImpl::GetImageAsset() {
807
982
  return this->asset_;