add alpha/requireAlpha argument when decoding images
remove size checks from setImage (we are assuming the caller knows the correct size) This also adds some monkey-patch methods to js_interop to convert Float32List to a UInt8List (but use this with care, because it will only work for emscripten-allocated objects)
This commit is contained in:
@@ -215,3 +215,10 @@ extension DartBigIntExtension on int {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
extension Float32ListExtension on Float32List {
|
||||
|
||||
Uint8List asUint8List() {
|
||||
return this.buffer.asUint8List(this.offsetInBytes);
|
||||
}
|
||||
}
|
||||
@@ -10,10 +10,22 @@ const FILAMENT_SINGLE_THREADED = true;
|
||||
const FILAMENT_WASM = true;
|
||||
const IS_WINDOWS = false;
|
||||
|
||||
final _allocations = <TypedData>{};
|
||||
|
||||
Int32List makeInt32List(int length) {
|
||||
var ptr = malloc<Int32>(length * 4);
|
||||
var ptr = stackAlloc<Int32>(length * 4);
|
||||
var buf = _NativeLibrary.instance._emscripten_make_int32_buffer(ptr, length);
|
||||
return buf.toDart;
|
||||
var int32List = buf.toDart;
|
||||
_allocations.add(int32List);
|
||||
return int32List;
|
||||
}
|
||||
|
||||
Float32List makeFloat32List(int length) {
|
||||
var ptr = stackAlloc<Float32>(length * 4);
|
||||
var buf = _NativeLibrary.instance._emscripten_make_f32_buffer(ptr, length);
|
||||
var f32List = buf.toDart;
|
||||
_allocations.add(f32List);
|
||||
return f32List;
|
||||
}
|
||||
|
||||
extension type _NativeLibrary(JSObject _) implements JSObject {
|
||||
@@ -34,6 +46,8 @@ extension type _NativeLibrary(JSObject _) implements JSObject {
|
||||
Pointer<Float64> ptr, int length);
|
||||
external Pointer _emscripten_get_byte_offset(JSObject obj);
|
||||
|
||||
external int _emscripten_stack_get_base();
|
||||
external Pointer _emscripten_stack_get_current();
|
||||
external int _emscripten_stack_get_free();
|
||||
|
||||
external void _execute_queue();
|
||||
@@ -47,8 +61,8 @@ extension type _NativeLibrary(JSObject _) implements JSObject {
|
||||
|
||||
extension FreeTypedData<T> on TypedData {
|
||||
void free() {
|
||||
final ptr = Pointer<Void>(this.offsetInBytes);
|
||||
ptr.free();
|
||||
Pointer<Void>(this.offsetInBytes).free();
|
||||
_allocations.remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +78,12 @@ Pointer<T> getPointer<T extends NativeType>(TypedData data, JSObject obj) {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
extension JSBackingBuffer on JSUint8Array {
|
||||
extension JSUint8BackingBuffer on JSUint8Array {
|
||||
@JS('buffer')
|
||||
external JSObject buffer;
|
||||
}
|
||||
|
||||
extension JSFloat32BackingBuffer on JSFloat32Array {
|
||||
@JS('buffer')
|
||||
external JSObject buffer;
|
||||
}
|
||||
@@ -117,7 +136,11 @@ extension Uint8ListExtension on Uint8List {
|
||||
final bar =
|
||||
Uint8ArrayWrapper(NativeLibrary.instance.HEAPU8.buffer, ptr, length)
|
||||
as JSUint8Array;
|
||||
var now = DateTime.now();
|
||||
bar.toDart.setRange(0, length, this);
|
||||
var finished = DateTime.now();
|
||||
print(
|
||||
"uint8list copy finished in ${finished.millisecondsSinceEpoch - now.millisecondsSinceEpoch}ms");
|
||||
return ptr;
|
||||
}
|
||||
}
|
||||
@@ -131,6 +154,11 @@ extension Float32ListExtension on Float32List {
|
||||
bar.toDart.setRange(0, length, this);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
Uint8List asUint8List() {
|
||||
var ptr = Pointer<Uint8>(_NativeLibrary.instance._emscripten_get_byte_offset(this.toJS));
|
||||
return ptr.asTypedList(length * 4);
|
||||
}
|
||||
}
|
||||
|
||||
extension Int16ListExtension on Int16List {
|
||||
@@ -176,6 +204,10 @@ extension Int32ListExtension on Int32List {
|
||||
if (this.lengthInBytes == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
if (_allocations.contains(this)) {
|
||||
return Pointer<Int32>(
|
||||
_NativeLibrary.instance._emscripten_get_byte_offset(this.toJS));
|
||||
}
|
||||
try {
|
||||
this.buffer.asUint8List(this.offsetInBytes);
|
||||
final ptr = getPointer<Int32>(this, this.toJS);
|
||||
@@ -214,12 +246,21 @@ extension Float64ListExtension on Float64List {
|
||||
}
|
||||
}
|
||||
|
||||
extension AsUint8List on Pointer<Uint8> {
|
||||
Uint8List asTypedList(int length) {
|
||||
final start = addr;
|
||||
final wrapper =
|
||||
Uint8ArrayWrapper(NativeLibrary.instance.HEAPU8.buffer, start, length)
|
||||
as JSUint8Array;
|
||||
return wrapper.toDart;
|
||||
}
|
||||
}
|
||||
|
||||
extension AsFloat32List on Pointer<Float> {
|
||||
Float32List asTypedList(int length) {
|
||||
final start = addr;
|
||||
final wrapper =
|
||||
Float32ArrayWrapper(NativeLibrary.instance.HEAPU8.buffer, start, length)
|
||||
as JSFloat32Array;
|
||||
final wrapper = Float32ArrayWrapper(
|
||||
NativeLibrary.instance.HEAPF32.buffer, start, length) as JSFloat32Array;
|
||||
return wrapper.toDart;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -738,11 +738,12 @@ external ffi.Pointer<TLinearImage> Image_createEmpty(
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Pointer<TLinearImage> Function(
|
||||
ffi.Pointer<ffi.Uint8>, ffi.Size, ffi.Pointer<ffi.Char>)>(isLeaf: true)
|
||||
ffi.Pointer<ffi.Uint8>, ffi.Size, ffi.Pointer<ffi.Char>, ffi.Bool alpha)>(isLeaf: true)
|
||||
external ffi.Pointer<TLinearImage> Image_decode(
|
||||
ffi.Pointer<ffi.Uint8> data,
|
||||
int length,
|
||||
ffi.Pointer<ffi.Char> name,
|
||||
bool alpha
|
||||
);
|
||||
|
||||
@ffi.Native<ffi.Pointer<ffi.Float> Function(ffi.Pointer<TLinearImage>)>(
|
||||
@@ -2367,6 +2368,7 @@ external void Image_createEmptyRenderThread(
|
||||
ffi.Pointer<ffi.Uint8>,
|
||||
ffi.Size,
|
||||
ffi.Pointer<ffi.Char>,
|
||||
ffi.Bool,
|
||||
ffi.Pointer<
|
||||
ffi.NativeFunction<
|
||||
ffi.Void Function(ffi.Pointer<TLinearImage>)>>)>(isLeaf: true)
|
||||
@@ -2374,6 +2376,7 @@ external void Image_decodeRenderThread(
|
||||
ffi.Pointer<ffi.Uint8> data,
|
||||
int length,
|
||||
ffi.Pointer<ffi.Char> name,
|
||||
bool alpha,
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<TLinearImage>)>>
|
||||
onComplete,
|
||||
);
|
||||
|
||||
@@ -393,6 +393,7 @@ extension type NativeLibrary(JSObject _) implements JSObject {
|
||||
JSFunction f, String signature);
|
||||
external void removeFunction<T>(Pointer<NativeFunction<T>> f);
|
||||
external JSUint8Array get HEAPU8;
|
||||
external JSFloat32Array get HEAPF32;
|
||||
|
||||
external void _Thermion_resizeCanvas(
|
||||
int width,
|
||||
@@ -812,6 +813,7 @@ extension type NativeLibrary(JSObject _) implements JSObject {
|
||||
Pointer<Uint8> data,
|
||||
size_t length,
|
||||
Pointer<Char> name,
|
||||
bool alpha
|
||||
);
|
||||
external Pointer<Float32> _Image_getBytes(
|
||||
Pointer<TLinearImage> tLinearImage,
|
||||
@@ -1670,6 +1672,7 @@ extension type NativeLibrary(JSObject _) implements JSObject {
|
||||
Pointer<Uint8> data,
|
||||
size_t length,
|
||||
Pointer<Char> name,
|
||||
bool alpha,
|
||||
Pointer<self.NativeFunction<void Function(PointerClass<TLinearImage>)>>
|
||||
onComplete,
|
||||
);
|
||||
@@ -3071,8 +3074,9 @@ self.Pointer<TLinearImage> Image_decode(
|
||||
self.Pointer<Uint8> data,
|
||||
Dart__darwin_size_t length,
|
||||
self.Pointer<Char> name,
|
||||
bool alpha
|
||||
) {
|
||||
final result = _lib._Image_decode(data, length, name);
|
||||
final result = _lib._Image_decode(data, length, name, alpha);
|
||||
return self.Pointer<TLinearImage>(result);
|
||||
}
|
||||
|
||||
@@ -4839,11 +4843,12 @@ void Image_decodeRenderThread(
|
||||
self.Pointer<Uint8> data,
|
||||
Dart__darwin_size_t length,
|
||||
self.Pointer<Char> name,
|
||||
bool alpha,
|
||||
self.Pointer<self.NativeFunction<void Function(Pointer<TLinearImage>)>>
|
||||
onComplete,
|
||||
) {
|
||||
final result =
|
||||
_lib._Image_decodeRenderThread(data, length, name, onComplete.cast());
|
||||
_lib._Image_decodeRenderThread(data, length, name, alpha, onComplete.cast());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user