lib/free-image/sources/memory.rb in free-image-0.6.2 vs lib/free-image/sources/memory.rb in free-image-0.7.0
- old
+ new
@@ -1,189 +1,189 @@
-module FreeImage
- typedef :pointer, :memory
-
- #DLL_API void DLL_CALLCONV FreeImage_CloseMemory(FIMEMORY *stream);
- attach_function('FreeImage_CloseMemory', [:memory], :void)
-
- #DLL_API FIMEMORY *DLL_CALLCONV FreeImage_OpenMemory(BYTE *data FI_DEFAULT(0), DWORD size_in_bytes FI_DEFAULT(0));
- attach_function('FreeImage_OpenMemory', [:pointer, :dword], :memory)
-
- # DLL_API FREE_IMAGE_FORMAT DLL_CALLCONV FreeImage_GetFileTypeFromMemory(FIMEMORY *stream, int size FI_DEFAULT(0));
- attach_function('FreeImage_GetFileTypeFromMemory', [:memory, :int], :format)
-
- # DLL_API FIBITMAP *DLL_CALLCONV FreeImage_LoadFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags FI_DEFAULT(0))
- attach_function('FreeImage_LoadFromMemory', [:format, :memory, :int], :pointer)
-
- # DLL_API BOOL DLL_CALLCONV FreeImage_SaveToMemory(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, FIMEMORY *stream, int flags FI_DEFAULT(0));
- 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 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)
-
- #DLL_API BOOL DLL_CALLCONV FreeImage_AcquireMemory(FIMEMORY *stream, BYTE **data, DWORD *size_in_bytes);
- #DLL_API unsigned DLL_CALLCONV FreeImage_WriteMemory(const void *buffer, unsigned size, unsigned count, FIMEMORY *stream);
- #DLL_API FIMULTIBITMAP *DLL_CALLCONV FreeImage_LoadMultiBitmapFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags FI_DEFAULT(0));
- #DLL_API BOOL DLL_CALLCONV FreeImage_SaveMultiBitmapToMemory(FREE_IMAGE_FORMAT fif, FIMULTIBITMAP *bitmap, FIMEMORY *stream, int flags);
-
- # Wrapper for a FreeImage memory stream which allows images to be read and written
- # to memory. Memory streams are usefule for storing images as blobs in a database
- # or writing them to an to a Internet stream.
- class MemoryStream < FFI::AutoPointer
- def self.release(ptr)
- FreeImage.FreeImage_CloseMemory(ptr)
- FreeImage.check_last_error
- end
-
- # Create a new memory stream.
- #
- # == Parameters
- # bytes:: If specified, a binary encoded Ruby string that stores image data. FreeImage
- # will treat the string as read-only. If not specified, a writable MemoryStream
- # is created.
- def initialize(bytes = nil)
- ptr = if bytes
- buf = FFI::MemoryPointer.from_string(bytes)
- FreeImage.FreeImage_OpenMemory(buf, bytes.bytesize)
- else
- FreeImage.FreeImage_OpenMemory(nil, 0)
- end
- FreeImage.check_last_error
-
- super(ptr)
- end
-
- # Returns the size of the memory stream.
- def count
- # Store current position
- pos = FreeImage.FreeImage_TellMemory(self)
- FreeImage.check_last_error
-
- # Go to end of stream to get length
- FreeImage.FreeImage_SeekMemory(self, 0, ::IO::SEEK_END)
- FreeImage.check_last_error
- count = FreeImage.FreeImage_TellMemory(self)
-
- # Restore position
- FreeImage.FreeImage_SeekMemory(self, pos, ::IO::SEEK_SET)
- FreeImage.check_last_error
-
- 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
-
- buffer = FFI::MemoryPointer.new(FFI::Type::CHAR, size * count)
- FreeImage.check_last_error
- size = FreeImage.FreeImage_ReadMemory(buffer, size, count, self)
- buffer.null? ? nil : buffer.read_string
- end
- end
-
- # == Summary
- #
- # Supports loading and saving images to a Ruby string.
- #
- # == Usage
- #
- # # Read an image from a byte string
- # bytes = ::File.read('test/fixtures/lena.png', :encoding => Encoding::BINARY)
- # image = FreeImage::Memory.open(bytes)
- #
- # # Save an image to a byte string
- # dest = FreeImage::Memory.new
- # image.save(dest, :jpeg)
- # dest.bytes
- #
- class Memory < AbstractSource
- ##
- # MemoryStream used to read and write data
- attr_reader :memory
-
- ##
- # :call-seq:
- # file.open(format = nil, flags = 0) -> FreeImage::Bitmap
- #
- # Opens an image from a file.
- #
- # == Parameters
- # format:: By default FreeImage will automatically determine an image's format. However,
- # you may override this value by using this parameter to specify a
- # particular {format}[rdoc-ref:FreeImage.formats].
- # flags:: Format specific flags that control how a bitmap is loaded. These flags are defined
- # as constants on the AbstractSource::Decoder module. Flags can be combined using
- # Ruby's bitwise or operator (|)
- #
- # == Usage
- #
- # source = File.new('<path_to_file>')
- # source.open(:jpeg, AbtractSource::JPEG_QUALITYSUPERB | AbtractSource::JPEG_PROGRESSIVE)
- #
-
- # Create a new FreeImage::File instance that can read and write image data
- # from memory.
- #
- # == Parameters
- # bytes:: If specified, FreeImage will read image from the bytes string and treat
- # it as readonly. If not specified, then FreeImage will create a writable
- # memory stream.
- #
- def initialize(bytes = nil)
- @memory = MemoryStream.new(bytes)
- end
-
- # call-seq:
- # 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)
- FreeImage.check_last_error
- result
- end
-
- ##
- # :call-seq:
- # memory.save(format = nil, flags = 0) -> boolean
- #
- # Saves an image to memory.
- #
- # == Parameters
- # format:: The format[rdoc-ref:FreeImage.formats] to save the image to.
- # flags:: Format specific flags that control how a bitmap is saved. These flags are defined
- # as constants on the AbstractSource::Encoder module. Flags can be combined using
- # Ruby's bitwise or operator (|)
- #
- # == Usage
- #
- # image = Bimap.open('<path_to_file>')
- # 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)
- FreeImage.check_last_error
- result
- end
-
- private
-
- def load(format, flags)
- ptr = FreeImage.FreeImage_LoadFromMemory(format, @memory, flags)
- FreeImage.check_last_error
- ptr
- end
- end
+module FreeImage
+ typedef :pointer, :memory
+
+ #DLL_API void DLL_CALLCONV FreeImage_CloseMemory(FIMEMORY *stream);
+ attach_function('FreeImage_CloseMemory', [:memory], :void)
+
+ #DLL_API FIMEMORY *DLL_CALLCONV FreeImage_OpenMemory(BYTE *data FI_DEFAULT(0), DWORD size_in_bytes FI_DEFAULT(0));
+ attach_function('FreeImage_OpenMemory', [:pointer, :dword], :memory)
+
+ # DLL_API FREE_IMAGE_FORMAT DLL_CALLCONV FreeImage_GetFileTypeFromMemory(FIMEMORY *stream, int size FI_DEFAULT(0));
+ attach_function('FreeImage_GetFileTypeFromMemory', [:memory, :int], :format)
+
+ # DLL_API FIBITMAP *DLL_CALLCONV FreeImage_LoadFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags FI_DEFAULT(0))
+ attach_function('FreeImage_LoadFromMemory', [:format, :memory, :int], :pointer)
+
+ # DLL_API BOOL DLL_CALLCONV FreeImage_SaveToMemory(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, FIMEMORY *stream, int flags FI_DEFAULT(0));
+ 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 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)
+
+ #DLL_API BOOL DLL_CALLCONV FreeImage_AcquireMemory(FIMEMORY *stream, BYTE **data, DWORD *size_in_bytes);
+ #DLL_API unsigned DLL_CALLCONV FreeImage_WriteMemory(const void *buffer, unsigned size, unsigned count, FIMEMORY *stream);
+ #DLL_API FIMULTIBITMAP *DLL_CALLCONV FreeImage_LoadMultiBitmapFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags FI_DEFAULT(0));
+ #DLL_API BOOL DLL_CALLCONV FreeImage_SaveMultiBitmapToMemory(FREE_IMAGE_FORMAT fif, FIMULTIBITMAP *bitmap, FIMEMORY *stream, int flags);
+
+ # Wrapper for a FreeImage memory stream which allows images to be read and written
+ # to memory. Memory streams are usefule for storing images as blobs in a database
+ # or writing them to an to a Internet stream.
+ class MemoryStream < FFI::AutoPointer
+ def self.release(ptr)
+ FreeImage.FreeImage_CloseMemory(ptr)
+ FreeImage.check_last_error
+ end
+
+ # Create a new memory stream.
+ #
+ # == Parameters
+ # bytes:: If specified, a binary encoded Ruby string that stores image data. FreeImage
+ # will treat the string as read-only. If not specified, a writable MemoryStream
+ # is created.
+ def initialize(bytes = nil)
+ ptr = if bytes
+ buf = FFI::MemoryPointer.from_string(bytes)
+ FreeImage.FreeImage_OpenMemory(buf, bytes.bytesize)
+ else
+ FreeImage.FreeImage_OpenMemory(nil, 0)
+ end
+ FreeImage.check_last_error
+
+ super(ptr)
+ end
+
+ # Returns the size of the memory stream.
+ def count
+ # Store current position
+ pos = FreeImage.FreeImage_TellMemory(self)
+ FreeImage.check_last_error
+
+ # Go to end of stream to get length
+ FreeImage.FreeImage_SeekMemory(self, 0, ::IO::SEEK_END)
+ FreeImage.check_last_error
+ count = FreeImage.FreeImage_TellMemory(self)
+
+ # Restore position
+ FreeImage.FreeImage_SeekMemory(self, pos, ::IO::SEEK_SET)
+ FreeImage.check_last_error
+
+ 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
+
+ buffer = FFI::MemoryPointer.new(FFI::Type::CHAR, size * count)
+ FreeImage.check_last_error
+ size = FreeImage.FreeImage_ReadMemory(buffer, size, count, self)
+ buffer.null? ? nil : buffer.read_string
+ end
+ end
+
+ # == Summary
+ #
+ # Supports loading and saving images to a Ruby string.
+ #
+ # == Usage
+ #
+ # # Read an image from a byte string
+ # bytes = ::File.read('test/fixtures/lena.png', :encoding => Encoding::BINARY)
+ # image = FreeImage::Memory.open(bytes)
+ #
+ # # Save an image to a byte string
+ # dest = FreeImage::Memory.new
+ # image.save(dest, :jpeg)
+ # dest.bytes
+ #
+ class Memory < AbstractSource
+ ##
+ # MemoryStream used to read and write data
+ attr_reader :memory
+
+ ##
+ # :call-seq:
+ # file.open(format = nil, flags = 0) -> FreeImage::Bitmap
+ #
+ # Opens an image from a file.
+ #
+ # == Parameters
+ # format:: By default FreeImage will automatically determine an image's format. However,
+ # you may override this value by using this parameter to specify a
+ # particular {format}[rdoc-ref:FreeImage.formats].
+ # flags:: Format specific flags that control how a bitmap is loaded. These flags are defined
+ # as constants on the AbstractSource::Decoder module. Flags can be combined using
+ # Ruby's bitwise or operator (|)
+ #
+ # == Usage
+ #
+ # source = File.new('<path_to_file>')
+ # source.open(:jpeg, AbtractSource::JPEG_QUALITYSUPERB | AbtractSource::JPEG_PROGRESSIVE)
+ #
+
+ # Create a new FreeImage::File instance that can read and write image data
+ # from memory.
+ #
+ # == Parameters
+ # bytes:: If specified, FreeImage will read image from the bytes string and treat
+ # it as readonly. If not specified, then FreeImage will create a writable
+ # memory stream.
+ #
+ def initialize(bytes = nil)
+ @memory = MemoryStream.new(bytes)
+ end
+
+ # call-seq:
+ # 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)
+ FreeImage.check_last_error
+ result
+ end
+
+ ##
+ # :call-seq:
+ # memory.save(format = nil, flags = 0) -> boolean
+ #
+ # Saves an image to memory.
+ #
+ # == Parameters
+ # format:: The format[rdoc-ref:FreeImage.formats] to save the image to.
+ # flags:: Format specific flags that control how a bitmap is saved. These flags are defined
+ # as constants on the AbstractSource[rdoc-ref:FreeImage::AbstractSource::Encoder] class.
+ # Flags can be combined using Ruby's bitwise or operator (|)
+ #
+ # == Usage
+ #
+ # image = Bimap.open('<path_to_file>')
+ # 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)
+ FreeImage.check_last_error
+ result
+ end
+
+ private
+
+ def load(format, flags)
+ ptr = FreeImage.FreeImage_LoadFromMemory(format, @memory, flags)
+ FreeImage.check_last_error
+ ptr
+ end
+ end
end
\ No newline at end of file