lib/free-image/sources/memory.rb in free-image-0.7.1 vs lib/free-image/sources/memory.rb in free-image-0.8.0

- old
+ new

@@ -17,10 +17,13 @@ attach_function('FreeImage_SaveToMemory', [:format, :pointer, :memory, :int], FreeImage::Boolean) #DLL_API unsigned DLL_CALLCONV FreeImage_ReadMemory(void *buffer, unsigned size, unsigned count, FIMEMORY *stream); attach_function('FreeImage_ReadMemory', [:pointer, :ulong, :ulong, :memory], :ulong) + #DLL_API unsigned DLL_CALLCONV FreeImage_WriteMemory(void *buffer, unsigned size, unsigned count, FIMEMORY *stream); + attach_function('FreeImage_WriteMemory', [:pointer, :ulong, :ulong, :memory], :ulong) + # DLL_API long DLL_CALLCONV FreeImage_TellMemory(FIMEMORY *stream); attach_function('FreeImage_TellMemory', [:memory], :long) #DLL_API BOOL DLL_CALLCONV FreeImage_SeekMemory(FIMEMORY *stream, long offset, int origin); attach_function('FreeImage_SeekMemory', [:memory, :long, :int], FreeImage::Boolean) @@ -55,40 +58,47 @@ FreeImage.check_last_error super(ptr) end + def position + result = FreeImage.FreeImage_TellMemory(self) + FreeImage.check_last_error + result + end + + def seek(amount, whence=IO::SEEK_SET) + FreeImage.FreeImage_SeekMemory(self, amount, whence) + FreeImage.check_last_error + end + # Returns the size of the memory stream. def count - # Store current position - pos = FreeImage.FreeImage_TellMemory(self) - FreeImage.check_last_error + last_position = self.position # Go to end of stream to get length - FreeImage.FreeImage_SeekMemory(self, 0, ::IO::SEEK_END) - FreeImage.check_last_error + self.seek(0, ::IO::SEEK_END) count = FreeImage.FreeImage_TellMemory(self) # Restore position - FreeImage.FreeImage_SeekMemory(self, pos, ::IO::SEEK_SET) - FreeImage.check_last_error + self.seek(last_position, ::IO::SEEK_SET) count end # Returns the bytes of the memory stream. def bytes - size = FFI::Type::CHAR.size - # Reset memory to start - FreeImage.FreeImage_SeekMemory(self, 0, ::IO::SEEK_SET) - FreeImage.check_last_error + self.seek(0, ::IO::SEEK_SET) - buffer = FFI::MemoryPointer.new(FFI::Type::CHAR, size * count) + # Create a buffer to store the memory + buffer = FFI::MemoryPointer.new(FFI::Type::CHAR.size, self.count) FreeImage.check_last_error - size = FreeImage.FreeImage_ReadMemory(buffer, size, count, self) - buffer.null? ? nil : buffer.read_string + written = FreeImage.FreeImage_ReadMemory(buffer, FFI::Type::CHAR.size, self.count, self) + + # Return a string + buffer.get_bytes(0, FFI::Type::CHAR.size * count) end end # == Summary # @@ -146,11 +156,14 @@ # memory.format -> :format # # Returns the image format for a memory stream. If the image format cannot be determined # the :unknown will be returned. def format - result = FreeImage.FreeImage_GetFileTypeFromMemory(@memory, 0) + # Reset memory to start + self.memory.seek(0, ::IO::SEEK_SET) + + result = FreeImage.FreeImage_GetFileTypeFromMemory(self.memory, 0) FreeImage.check_last_error result end ## @@ -171,18 +184,18 @@ # dst = FreeImage::Memory.new # dst.save(image, :jpeg, AbtractSource::JPEG_QUALITYSUPERB | AbtractSource::JPEG_PROGRESSIVE) # dst.bytes # def save(bitmap, format, flags = 0) - result = FreeImage.FreeImage_SaveToMemory(format, bitmap, @memory, flags) + result = FreeImage.FreeImage_SaveToMemory(format, bitmap, self.memory, flags) FreeImage.check_last_error result end private def load(format, flags) - ptr = FreeImage.FreeImage_LoadFromMemory(format, @memory, flags) + ptr = FreeImage.FreeImage_LoadFromMemory(format, self.memory, flags) FreeImage.check_last_error ptr end end end \ No newline at end of file