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