From 62c5722ab093cdbbcf4cb27885f43306b776a20b Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Wed, 13 Jun 2018 19:41:04 -0700 Subject: [PATCH] Image loading, bytes fixes for HL --- lime/_backend/native/NativeCFFI.hx | 11 +- lime/graphics/Image.hx | 8 +- lime/utils/Bytes.hx | 6 +- project/include/graphics/ImageBuffer.h | 9 +- project/include/utils/Resource.h | 5 +- project/src/ExternalInterface.cpp | 167 +++++++++++++------------ project/src/graphics/ImageBuffer.cpp | 81 +++++++----- project/src/graphics/format/PNG.cpp | 9 +- project/src/utils/Bytes.cpp | 25 ++-- 9 files changed, 190 insertions(+), 131 deletions(-) diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index c1f4e227a..dc15e8b10 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -1,6 +1,7 @@ package lime._backend.native; +import haxe.io.Bytes; import lime.graphics.opengl.GLBuffer; import lime.graphics.opengl.GLFramebuffer; import lime.graphics.opengl.GLProgram; @@ -206,9 +207,9 @@ class NativeCFFI { @:hlNative("lime", "lime_application_update") private static function lime_application_update (handle:CFFIPointer):Bool { return false; } @: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; - @:hlNative("lime", "lime_bytes_get_data_pointer") private static function lime_bytes_get_data_pointer (data:hl.Bytes):Float { return 0; } + @:hlNative("lime", "lime_bytes_get_data_pointer") private static function lime_bytes_get_data_pointer (data:Bytes):Float { return 0; } @:cffi private static function lime_bytes_get_data_pointer_offset (data:Dynamic, offset:Int):Float; - @:cffi private static function lime_bytes_read_file (path:String, bytes:Dynamic):Dynamic; + @:hlNative("lime", "lime_bytes_read_file") private static function lime_bytes_read_file (path:String, bytes:Bytes):Bytes { return null; } @:cffi private static function lime_cffi_get_native_pointer (ptr:Dynamic):Float; @:hlNative("lime", "lime_clipboard_event_manager_register") private static function lime_clipboard_event_manager_register (callback:Void->Void, eventObject:ClipboardEventInfo):Void {} @:cffi private static function lime_clipboard_get_text ():Dynamic; @@ -250,6 +251,8 @@ class NativeCFFI { @:cffi private static function lime_haptic_vibrate (period:Int, duration:Int):Void; @:cffi private static function lime_image_encode (data:Dynamic, type:Int, quality:Int, bytes:Dynamic):Dynamic; @:cffi private static function lime_image_load (data:Dynamic, buffer:Dynamic):Dynamic; + @:hlNative("lime", "lime_image_load_bytes") private static function lime_image_load_bytes (data:Bytes, buffer:ImageBuffer):ImageBuffer { return null; } + @:hlNative("lime", "lime_image_load_file") private static function lime_image_load_file (path:String, buffer:ImageBuffer):ImageBuffer { return null; } @:cffi private static function lime_image_data_util_color_transform (image:Dynamic, rect:Dynamic, colorMatrix:Dynamic):Void; @:cffi private static function lime_image_data_util_copy_channel (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, srcChannel:Int, destChannel:Int):Void; @:cffi private static function lime_image_data_util_copy_pixels (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, alphaImage:Dynamic, alphaPoint:Dynamic, mergeAlpha:Bool):Void; @@ -831,7 +834,11 @@ class NativeCFFI { #if (lime_cffi && !macro && lime_curl) @:cffi private static function lime_curl_getdate (date:String, now:Float):Float; @:cffi private static function lime_curl_global_cleanup ():Void; + #if !hl @:cffi private static function lime_curl_global_init (flags:Int):Int; + #else + private static function lime_curl_global_init (flags:Int):Int { return 0; } + #end @:cffi private static function lime_curl_version ():Dynamic; @:cffi private static function lime_curl_version_info (type:Int):Dynamic; @:cffi private static function lime_curl_easy_cleanup (handle:CFFIPointer):Void; diff --git a/lime/graphics/Image.hx b/lime/graphics/Image.hx index 14808e90d..916af0eda 100644 --- a/lime/graphics/Image.hx +++ b/lime/graphics/Image.hx @@ -1392,9 +1392,9 @@ class Image { var imageBuffer:ImageBuffer = null; #if !cs - imageBuffer = NativeCFFI.lime_image_load (bytes, new ImageBuffer (new UInt8Array (Bytes.alloc (0)))); + imageBuffer = NativeCFFI.lime_image_load_bytes (bytes, new ImageBuffer (new UInt8Array (Bytes.alloc (0)))); #else - var data = NativeCFFI.lime_image_load (bytes, null); + var data = NativeCFFI.lime_image_load_bytes (bytes, null); if (data != null) { imageBuffer = new ImageBuffer (new UInt8Array (@:privateAccess new Bytes (data.data.buffer.length, data.data.buffer.b)), data.width, data.height, data.bitsPerPixel); } @@ -1577,9 +1577,9 @@ class Image { if (CFFI.enabled) { #if !cs - buffer = NativeCFFI.lime_image_load (path, new ImageBuffer (new UInt8Array (Bytes.alloc (0)))); + buffer = NativeCFFI.lime_image_load_file (path, new ImageBuffer (new UInt8Array (Bytes.alloc (0)))); #else - var data = NativeCFFI.lime_image_load (path, null); + var data = NativeCFFI.lime_image_load_file (path, null); if (data != null) { buffer = new ImageBuffer (new UInt8Array (@:privateAccess new Bytes (data.data.buffer.length, data.data.buffer.b)), data.width, data.height, data.bitsPerPixel); } diff --git a/lime/utils/Bytes.hx b/lime/utils/Bytes.hx index d30ed916b..5b77f7a1f 100644 --- a/lime/utils/Bytes.hx +++ b/lime/utils/Bytes.hx @@ -30,8 +30,10 @@ abstract Bytes(HaxeBytes) from HaxeBytes to HaxeBytes { public static function alloc (length:Int):Bytes { - var bytes = HaxeBytes.alloc (length); - return new Bytes (bytes.length, bytes.getData ()); + #if hl + if (length == 0) return new Bytes (0, null); + #end + return HaxeBytes.alloc (length); } diff --git a/project/include/graphics/ImageBuffer.h b/project/include/graphics/ImageBuffer.h index 804f5a62d..108ee9245 100644 --- a/project/include/graphics/ImageBuffer.h +++ b/project/include/graphics/ImageBuffer.h @@ -41,13 +41,13 @@ namespace lime { ImageBuffer (HL_ImageBuffer* imageBuffer); ~ImageBuffer (); - void Blit (const unsigned char *data, int x, int y, int width, int height); + void Blit (const unsigned char* data, int x, int y, int width, int height); void Resize (int width, int height, int bitsPerPixel = 32); int Stride (); - value Value (); + void* Value (); int bitsPerPixel; - ArrayBufferView *data; + ArrayBufferView* data; PixelFormat format; int height; bool premultiplied; @@ -56,7 +56,8 @@ namespace lime { private: - value mValue; + HL_ImageBuffer* _buffer; + value _value; }; diff --git a/project/include/utils/Resource.h b/project/include/utils/Resource.h index f2b47c211..8dbdd6c1d 100644 --- a/project/include/utils/Resource.h +++ b/project/include/utils/Resource.h @@ -2,7 +2,9 @@ #define LIME_UTILS_RESOURCE_H +#include #include +#include namespace lime { @@ -13,7 +15,8 @@ namespace lime { Resource () : data (NULL), path (NULL) {} Resource (const char* path) : data (NULL), path (path) {} - Resource (Bytes *data) : data (data), path (NULL) {} + Resource (HL_String* path) : data (NULL), path (path ? hl_to_utf8 ((const uchar*)path->bytes) : NULL) {} + Resource (Bytes* data) : data (data), path (NULL) {} Bytes *data; const char* path; diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 409ec4181..1aa2d04bc 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -471,6 +471,17 @@ namespace lime { } + HL_PRIM HL_Bytes* hl_lime_bytes_read_file (HL_String* path, HL_Bytes* bytes) { + + if (!path) return 0; + Bytes data (bytes); + data.ReadFile (hl_to_utf8 ((const uchar*)path->bytes)); + HL_Bytes* ret = (HL_Bytes*)data.Value (); + return ret; + + } + + double lime_cffi_get_native_pointer (value handle) { return (uintptr_t)val_data (handle); @@ -1783,7 +1794,7 @@ namespace lime { #ifdef LIME_PNG if (PNG::Decode (&resource, &imageBuffer)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -1791,7 +1802,7 @@ namespace lime { #ifdef LIME_JPEG if (JPEG::Decode (&resource, &imageBuffer)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -1801,31 +1812,31 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_image_load_bytes (HL_Bytes* data, HL_ImageBuffer* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_image_load_bytes (HL_Bytes* data, HL_ImageBuffer* buffer) { - // Resource resource; - // Bytes bytes; + Resource resource; + Bytes bytes; - // ImageBuffer imageBuffer = ImageBuffer (buffer); + ImageBuffer imageBuffer = ImageBuffer (buffer); - // bytes.Set (data); - // resource = Resource (&bytes); + bytes.Set (data); + resource = Resource (&bytes); - // #ifdef LIME_PNG - // if (PNG::Decode (&resource, &imageBuffer)) { + #ifdef LIME_PNG + if (PNG::Decode (&resource, &imageBuffer)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif - // #ifdef LIME_JPEG - // if (JPEG::Decode (&resource, &imageBuffer)) { + #ifdef LIME_JPEG + if (JPEG::Decode (&resource, &imageBuffer)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -1844,7 +1855,7 @@ namespace lime { #ifdef LIME_PNG if (PNG::Decode (&resource, &imageBuffer)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -1852,7 +1863,7 @@ namespace lime { #ifdef LIME_JPEG if (JPEG::Decode (&resource, &imageBuffer)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -1862,30 +1873,30 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_image_load_file (vbyte* data, HL_ImageBuffer* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_image_load_file (HL_String* data, HL_ImageBuffer* buffer) { - // Resource resource; - // Bytes bytes; + Resource resource; + Bytes bytes; - // ImageBuffer imageBuffer = ImageBuffer (buffer); + ImageBuffer imageBuffer = ImageBuffer (buffer); - // resource = Resource (val_string (data)); + resource = Resource (data); - // #ifdef LIME_PNG - // if (PNG::Decode (&resource, &imageBuffer)) { + #ifdef LIME_PNG + if (PNG::Decode (&resource, &imageBuffer)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif - // #ifdef LIME_JPEG - // if (JPEG::Decode (&resource, &imageBuffer)) { + #ifdef LIME_JPEG + if (JPEG::Decode (&resource, &imageBuffer)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -2332,7 +2343,7 @@ namespace lime { #ifdef LIME_JPEG if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -2342,20 +2353,20 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_jpeg_decode_bytes (HL_Bytes* data, bool decodeData, HL_ImageBuffer* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_jpeg_decode_bytes (HL_Bytes* data, bool decodeData, HL_ImageBuffer* buffer) { - // ImageBuffer imageBuffer (buffer); + ImageBuffer imageBuffer (buffer); - // Bytes bytes (data); - // Resource resource = Resource (&bytes); + Bytes bytes (data); + Resource resource = Resource (&bytes); - // #ifdef LIME_JPEG - // if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { + #ifdef LIME_JPEG + if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -2370,7 +2381,7 @@ namespace lime { #ifdef LIME_JPEG if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -2380,18 +2391,18 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_jpeg_decode_file (vbyte* path, bool decodeData, HL_ImageBuffer* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_jpeg_decode_file (HL_String* path, bool decodeData, HL_ImageBuffer* buffer) { - // ImageBuffer imageBuffer (buffer); - // Resource resource = Resource (path.c_str ()); + ImageBuffer imageBuffer (buffer); + Resource resource = Resource (path); - // #ifdef LIME_JPEG - // if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { + #ifdef LIME_JPEG + if (JPEG::Decode (&resource, &imageBuffer, decodeData)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -2667,7 +2678,7 @@ namespace lime { #ifdef LIME_PNG if (PNG::Decode (&resource, &imageBuffer, decodeData)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -2677,19 +2688,19 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_png_decode_bytes (HL_Bytes* data, bool decodeData, HL_ImageBuffer* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_png_decode_bytes (HL_Bytes* data, bool decodeData, HL_ImageBuffer* buffer) { - // ImageBuffer imageBuffer (buffer); - // Bytes bytes (data); - // Resource resource = Resource (&bytes); + ImageBuffer imageBuffer (buffer); + Bytes bytes (data); + Resource resource = Resource (&bytes); - // #ifdef LIME_PNG - // if (PNG::Decode (&resource, &imageBuffer, decodeData)) { + #ifdef LIME_PNG + if (PNG::Decode (&resource, &imageBuffer, decodeData)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -2704,7 +2715,7 @@ namespace lime { #ifdef LIME_PNG if (PNG::Decode (&resource, &imageBuffer, decodeData)) { - return imageBuffer.Value (); + return (value)imageBuffer.Value (); } #endif @@ -2714,18 +2725,18 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_png_decode_file (vbyte* path, bool decodeData, HL_Bytes* buffer) { + HL_PRIM HL_ImageBuffer* hl_lime_png_decode_file (HL_String* path, bool decodeData, HL_ImageBuffer* buffer) { - // ImageBuffer imageBuffer (buffer); - // Resource resource = Resource (path.c_str ()); + ImageBuffer imageBuffer (buffer); + Resource resource = Resource (path); - // #ifdef LIME_PNG - // if (PNG::Decode (&resource, &imageBuffer, decodeData)) { + #ifdef LIME_PNG + if (PNG::Decode (&resource, &imageBuffer, decodeData)) { - // return imageBuffer.Value (); + return (HL_ImageBuffer*)imageBuffer.Value (); - // } - // #endif + } + #endif return 0; @@ -2871,7 +2882,7 @@ namespace lime { } - return buffer.Value (); + return (value)buffer.Value (); } @@ -4194,9 +4205,9 @@ namespace lime { DEFINE_HL_PRIM (_BOOL, lime_application_update, _TCFFIPOINTER); // DEFINE_PRIME2 (lime_audio_load); // DEFINE_PRIME2 (lime_bytes_from_data_pointer); - DEFINE_HL_PRIM (_F64, lime_bytes_get_data_pointer, _BYTES); + DEFINE_HL_PRIM (_F64, lime_bytes_get_data_pointer, _TBYTES); // DEFINE_PRIME2 (lime_bytes_get_data_pointer_offset); - // DEFINE_PRIME2 (lime_bytes_read_file); + DEFINE_HL_PRIM (_TBYTES, lime_bytes_read_file, _STRING _TBYTES); // DEFINE_PRIME1 (lime_cffi_get_native_pointer); // DEFINE_PRIME1 (lime_cffi_set_finalizer); DEFINE_HL_PRIM (_VOID, lime_clipboard_event_manager_register, _FUN(_VOID, _NO_ARG) _TCLIPBOARD_EVENT); @@ -4252,6 +4263,8 @@ namespace lime { // DEFINE_PRIME1v (lime_image_data_util_unmultiply_alpha); // DEFINE_PRIME4 (lime_image_encode); // DEFINE_PRIME2 (lime_image_load); + DEFINE_HL_PRIM (_TIMAGEBUFFER, lime_image_load_bytes, _TBYTES _TIMAGEBUFFER); + DEFINE_HL_PRIM (_TIMAGEBUFFER, lime_image_load_file, _STRING _TIMAGEBUFFER); // DEFINE_PRIME0 (lime_jni_getenv); DEFINE_HL_PRIM (_VOID, lime_joystick_event_manager_register, _FUN(_VOID, _NO_ARG) _TJOYSTICK_EVENT); // DEFINE_PRIME1 (lime_joystick_get_device_guid); @@ -4313,7 +4326,7 @@ namespace lime { // DEFINE_PRIME2v (lime_text_layout_set_language); // DEFINE_PRIME2v (lime_text_layout_set_script); DEFINE_HL_PRIM (_VOID, lime_touch_event_manager_register, _FUN (_VOID, _NO_ARG) _TTOUCH_EVENT); - DEFINE_HL_PRIM (_VOID, lime_window_alert, _TCFFIPOINTER _BYTES _BYTES); + DEFINE_HL_PRIM (_VOID, lime_window_alert, _TCFFIPOINTER _TBYTES _TBYTES); DEFINE_HL_PRIM (_VOID, lime_window_close, _TCFFIPOINTER); DEFINE_HL_PRIM (_TCFFIPOINTER, lime_window_create, _TCFFIPOINTER _I32 _I32 _I32 _STRING); DEFINE_HL_PRIM (_VOID, lime_window_event_manager_register, _FUN (_VOID, _NO_ARG) _TWINDOW_EVENT); diff --git a/project/src/graphics/ImageBuffer.cpp b/project/src/graphics/ImageBuffer.cpp index b3c9ec477..bb7962332 100644 --- a/project/src/graphics/ImageBuffer.cpp +++ b/project/src/graphics/ImageBuffer.cpp @@ -23,7 +23,8 @@ namespace lime { data = 0; premultiplied = false; transparent = false; - mValue = 0; + _buffer = 0; + _value = 0; } @@ -65,7 +66,8 @@ namespace lime { } - mValue = imageBuffer; + _buffer = 0; + _value = imageBuffer; } @@ -81,6 +83,7 @@ namespace lime { transparent = imageBuffer->transparent; premultiplied = imageBuffer->premultiplied; data = new ArrayBufferView (imageBuffer->data); + _buffer = imageBuffer; } else { @@ -91,17 +94,22 @@ namespace lime { data = 0; premultiplied = false; transparent = false; + _buffer = 0; } - mValue = 0; + _value = 0; } ImageBuffer::~ImageBuffer () { - delete data; + if (data) { + + delete data; + + } } @@ -154,36 +162,51 @@ namespace lime { } - value ImageBuffer::Value () { + void* ImageBuffer::Value () { - if (!init) { + if (_buffer) { - id_bitsPerPixel = val_id ("bitsPerPixel"); - id_transparent = val_id ("transparent"); - id_data = val_id ("data"); - id_width = val_id ("width"); - id_height = val_id ("height"); - id_format = val_id ("format"); - id_premultiplied = val_id ("premultiplied"); - init = true; + _buffer->width = width; + _buffer->height = height; + _buffer->bitsPerPixel = bitsPerPixel; + _buffer->format = format; + _buffer->transparent = transparent; + _buffer->premultiplied = premultiplied; + //_buffer->data + return _buffer; + + } else { + + if (!init) { + + id_bitsPerPixel = val_id ("bitsPerPixel"); + id_transparent = val_id ("transparent"); + id_data = val_id ("data"); + id_width = val_id ("width"); + id_height = val_id ("height"); + id_format = val_id ("format"); + id_premultiplied = val_id ("premultiplied"); + init = true; + + } + + if (val_is_null (_value)) { + + _value = alloc_empty_object (); + + } + + alloc_field (_value, id_width, alloc_int (width)); + alloc_field (_value, id_height, alloc_int (height)); + alloc_field (_value, id_bitsPerPixel, alloc_int (bitsPerPixel)); + alloc_field (_value, id_data, data ? data->Value () : alloc_null ()); + alloc_field (_value, id_transparent, alloc_bool (transparent)); + alloc_field (_value, id_format, alloc_int (format)); + alloc_field (_value, id_premultiplied, alloc_bool (premultiplied)); + return _value; } - if (val_is_null (mValue)) { - - mValue = alloc_empty_object (); - - } - - alloc_field (mValue, id_width, alloc_int (width)); - alloc_field (mValue, id_height, alloc_int (height)); - alloc_field (mValue, id_bitsPerPixel, alloc_int (bitsPerPixel)); - alloc_field (mValue, id_data, data ? data->Value () : alloc_null ()); - alloc_field (mValue, id_transparent, alloc_bool (transparent)); - alloc_field (mValue, id_format, alloc_int (format)); - alloc_field (mValue, id_premultiplied, alloc_bool (premultiplied)); - return mValue; - } diff --git a/project/src/graphics/format/PNG.cpp b/project/src/graphics/format/PNG.cpp index 79eb42821..8260a1e78 100644 --- a/project/src/graphics/format/PNG.cpp +++ b/project/src/graphics/format/PNG.cpp @@ -77,7 +77,6 @@ namespace lime { bool PNG::Decode (Resource *resource, ImageBuffer *imageBuffer, bool decodeData) { - unsigned char png_sig[PNG_SIG_SIZE]; png_structp png_ptr; png_infop info_ptr; png_uint_32 width, height; @@ -91,7 +90,8 @@ namespace lime { file = lime::fopen (resource->path, "rb"); if (!file) return false; - int read = lime::fread (png_sig, PNG_SIG_SIZE, 1, file); + unsigned char png_sig[PNG_SIG_SIZE]; + int read = lime::fread (&png_sig, PNG_SIG_SIZE, 1, file); if (png_sig_cmp (png_sig, 0, PNG_SIG_SIZE)) { lime::fclose (file); @@ -101,9 +101,7 @@ namespace lime { } else { - memcpy (png_sig, resource->data->Data (), PNG_SIG_SIZE); - - if (png_sig_cmp (png_sig, 0, PNG_SIG_SIZE)) { + if (png_sig_cmp (resource->data->Data (), 0, PNG_SIG_SIZE)) { return false; @@ -184,6 +182,7 @@ namespace lime { //png_set_bgr (png_ptr); imageBuffer->Resize (width, height, 32); + const unsigned int stride = imageBuffer->Stride (); unsigned char *bytes = imageBuffer->data->Data (); diff --git a/project/src/utils/Bytes.cpp b/project/src/utils/Bytes.cpp index cd76f20c5..7bff0bed2 100644 --- a/project/src/utils/Bytes.cpp +++ b/project/src/utils/Bytes.cpp @@ -41,6 +41,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; } @@ -52,6 +53,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; Resize (size); @@ -65,6 +67,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; Set (bytes); @@ -85,6 +88,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; Set (bytes); @@ -98,6 +102,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; ReadFile (path); @@ -111,6 +116,7 @@ namespace lime { _data = 0; _length = 0; _value = 0; + _bytes = 0; Set (data); @@ -162,7 +168,7 @@ namespace lime { if (size > 0) { Resize (size); - int status = lime::fread (_data, _length, 1, file); + int status = lime::fread (_data, 1, size, file); } @@ -179,7 +185,7 @@ namespace lime { if (size <= 0) { - if (_bytes->b) { + if (_bytes && _bytes->b) { free (_bytes->b); _bytes->b = 0; @@ -190,18 +196,23 @@ namespace lime { } else { - unsigned char* data = (unsigned char*)malloc (size); + unsigned char* data = (unsigned char*)malloc (sizeof (char) * size); if (_bytes->b && _bytes->length) { - memcpy (_bytes->b, data, _bytes->length); + memcpy (data, _bytes->b, _bytes->length < size ? _bytes->length : size); + free (_bytes->b); + + } else if (_bytes->b) { + free (_bytes->b); - _bytes->b = data; - _bytes->length = size; - _data = _bytes->b; } + _bytes->b = data; + _bytes->length = size; + _data = data; + } } else {