def self.import(filename, options = {})
unless format = options.delete(:format)
md = filename.match /\.([^.]+)\z/
format = md ? md[1].downcase : nil
end
format = format.to_sym if format
if format == :xpm
raise ArgumentError, "Unexpected options #{options.inspect}" unless
options.empty?
ptr = SYM[:gdImageCreateFromXpm].call(filename)[0]
elsif format == :gd2 && !options.empty?
x, y, width, height =
options.delete(:x) || 0, options.delete(:y) || 0,
options.delete(:width) || options.delete(:w),
options.delete(:height) || options.delete(:h)
raise ArgumentError, "Unexpected options #{options.inspect}" unless
options.empty?
raise ArgumentError, 'Missing required option :width' if width.nil?
raise ArgumentError, 'Missing required option :height' if height.nil?
ptr = File.open(filename, 'rb') do |file|
SYM[:gdImageCreateFromGd2Part].call(file, x, y, width, height)[0]
end
else
raise ArgumentError, "Unexpected options #{options.inspect}" unless
options.empty?
create_sym = {
:jpeg => :gdImageCreateFromJpeg,
:jpg => :gdImageCreateFromJpeg,
:png => :gdImageCreateFromPng,
:gif => :gdImageCreateFromGif,
:wbmp => :gdImageCreateFromWBMP,
:gd => :gdImageCreateFromGd,
:gd2 => :gdImageCreateFromGd2,
:xbm => :gdImageCreateFromXbm
}[format]
raise UnrecognizedImageTypeError,
'Format (or file extension) is not recognized' unless create_sym
ptr = File.open(filename, 'rb') { |file| SYM[create_sym].call(file)[0] }
end
raise LibraryError unless ptr
init_image_ptr(ptr)
image = (image_true_color?(ptr) ?
TrueColor : IndexedColor).allocate.init_with_image(ptr)
block_given? ? yield(image) : image
end