diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index dfb3f54a6..8644d77e4 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -39,11 +39,12 @@ class NativeCFFI { @:cffi private static function lime_application_update (handle:Dynamic):Bool; @:cffi private static function lime_audio_load (data:Dynamic, buffer:Dynamic):Dynamic; @:cffi private static function lime_bytes_from_data_pointer (data:Float, length:Int):Dynamic; - @:cffi private static function lime_bytes_get_data_pointer (data:Dynamic):Float; + @:cffi private static function lime_bytes_get_data_pointer (data:Dynamic, offset:Int):Float; @:cffi private static function lime_bytes_read_file (path:String, bytes:Dynamic):Dynamic; @:cffi private static function lime_cffi_get_native_pointer (ptr:Dynamic):Float; @:cffi private static function lime_clipboard_get_text ():Dynamic; @:cffi private static function lime_clipboard_set_text (text:String):Void; + @:cffi private static function lime_data_pointer_offset (dataPointer:DataPointer, offset:Int):Float; @:cffi private static function lime_deflate_compress (data:Dynamic, bytes:Dynamic):Dynamic; @:cffi private static function lime_deflate_decompress (data:Dynamic, bytes:Dynamic):Dynamic; @:cffi private static function lime_drop_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void; diff --git a/lime/utils/DataPointer.hx b/lime/utils/DataPointer.hx index 50e2af2ac..675fc16c5 100644 --- a/lime/utils/DataPointer.hx +++ b/lime/utils/DataPointer.hx @@ -52,9 +52,9 @@ abstract DataPointer(DataPointerType) to DataPointerType { @:from @:noCompletion public static function fromBytesPointer (pointer:BytePointer):DataPointer { #if (lime_cffi && !macro) - if (pointer == null) return cast 0; - var data:Float = NativeCFFI.lime_bytes_get_data_pointer (pointer.bytes); - return new DataPointer (data + pointer.offset); + if (pointer == null || pointer.bytes == null) return cast 0; + var data:Float = NativeCFFI.lime_bytes_get_data_pointer (pointer.bytes, pointer.offset); + return new DataPointer (data); #elseif (js && !display) return fromBytes (pointer.bytes); #else @@ -68,8 +68,8 @@ abstract DataPointer(DataPointerType) to DataPointerType { #if (lime_cffi && !js && !macro) if (arrayBufferView == null) return cast 0; - var data:Float = NativeCFFI.lime_bytes_get_data_pointer (arrayBufferView.buffer); - return new DataPointer (data + arrayBufferView.byteOffset); + var data:Float = NativeCFFI.lime_bytes_get_data_pointer (arrayBufferView.buffer, arrayBufferView.byteOffset); + return new DataPointer (data); #elseif (js && !display) return new DataPointer (arrayBufferView); #else @@ -97,7 +97,7 @@ abstract DataPointer(DataPointerType) to DataPointerType { #if (lime_cffi && !macro) if (bytes == null) return cast 0; - var data:Float = NativeCFFI.lime_bytes_get_data_pointer (bytes); + var data:Float = NativeCFFI.lime_bytes_get_data_pointer (bytes, 0); return new DataPointer (data); #elseif (js && !display) return fromArrayBuffer (bytes.getData ()); @@ -152,6 +152,19 @@ abstract DataPointer(DataPointerType) to DataPointerType { } + private static function __withOffset (data:DataPointer, offset:Int):DataPointer { + + #if (lime_cffi && !macro) + if (data == 0) return cast 0; + var data:Float = NativeCFFI.lime_data_pointer_offset (data, offset); + return new DataPointer (data); + #else + return null; + #end + + } + + @:noCompletion @:op(A == B) private static inline function equals (a:DataPointer, b:Int):Bool { return (a:Float) == b; } @:noCompletion @:op(A == B) private static inline function equalsPointer (a:DataPointer, b:DataPointer):Bool { return (a:Float) == (b:Float); } @:noCompletion @:op(A > B) private static inline function greaterThan (a:DataPointer, b:Int):Bool { return (a:Float) > b; } @@ -164,10 +177,10 @@ abstract DataPointer(DataPointerType) to DataPointerType { @:noCompletion @:op(A <= B) private static inline function lessThanOrEqualPointer (a:DataPointer, b:CFFIPointer):Bool { return (a:Float) <= b; } @:noCompletion @:op(A != B) private static inline function notEquals (a:DataPointer, b:Int):Bool { return (a:Float) != b; } @:noCompletion @:op(A != B) private static inline function notEqualsPointer (a:DataPointer, b:DataPointer):Bool { return (a:Float) != (b:Float); } - @:noCompletion @:op(A + B) private static inline function plus (a:DataPointer, b:Int):DataPointer { return new DataPointer ((a:Float) + b); } - @:noCompletion @:op(A + B) private static inline function plusPointer (a:DataPointer, b:DataPointer):DataPointer { return new DataPointer ((a:Float) + (b:Float)); } - @:noCompletion @:op(A - B) private static inline function minus (a:DataPointer, b:Int):DataPointer { return new DataPointer ((a:Float) - b); } - @:noCompletion @:op(A - B) private static inline function minusPointer (a:DataPointer, b:DataPointer):DataPointer { return new DataPointer ((a:Float) - (b:Float)); } + @:noCompletion @:op(A + B) private static inline function plus (a:DataPointer, b:Int):DataPointer { return __withOffset (a, b); } + @:noCompletion @:op(A + B) private static inline function plusPointer (a:DataPointer, b:DataPointer):DataPointer { return __withOffset (a, Std.int ((b:Float))); } + @:noCompletion @:op(A - B) private static inline function minus (a:DataPointer, b:Int):DataPointer { return __withOffset (a, -b); } + @:noCompletion @:op(A - B) private static inline function minusPointer (a:DataPointer, b:DataPointer):DataPointer { return __withOffset (a, -Std.int ((b:Float))); } } diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 713ad0f4c..e2252296c 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -224,10 +224,10 @@ namespace lime { } - double lime_bytes_get_data_pointer (value bytes) { + double lime_bytes_get_data_pointer (value bytes, int offset) { Bytes data = Bytes (bytes); - return (uintptr_t)data.Data (); + return (uintptr_t)data.Data () + offset; } @@ -292,6 +292,13 @@ namespace lime { } + double lime_data_pointer_offset (double pointer, int offset) { + + return (uintptr_t)pointer + offset; + + } + + value lime_deflate_compress (value buffer, value bytes) { #ifdef LIME_ZLIB @@ -1773,12 +1780,13 @@ namespace lime { DEFINE_PRIME1 (lime_application_update); DEFINE_PRIME2 (lime_audio_load); DEFINE_PRIME2 (lime_bytes_from_data_pointer); - DEFINE_PRIME1 (lime_bytes_get_data_pointer); + DEFINE_PRIME2 (lime_bytes_get_data_pointer); DEFINE_PRIME2 (lime_bytes_read_file); DEFINE_PRIME1 (lime_cffi_get_native_pointer); DEFINE_PRIME1 (lime_cffi_set_finalizer); DEFINE_PRIME0 (lime_clipboard_get_text); DEFINE_PRIME1v (lime_clipboard_set_text); + DEFINE_PRIME2 (lime_data_pointer_offset); DEFINE_PRIME2 (lime_deflate_compress); DEFINE_PRIME2 (lime_deflate_decompress); DEFINE_PRIME2v (lime_drop_event_manager_register);