def self.load(src)
case src
when File
pos = src.pos
magic = src.read(4)
src.pos = pos
create = {
:jpeg => :gdImageCreateFromJpeg,
:png => :gdImageCreateFromPng,
:gif => :gdImageCreateFromGif,
:wbmp => :gdImageCreateFromWBMP,
:gd2 => :gdImageCreateFromGd2
}
args = [src.to_ptr]
when String
magic = src
create = {
:jpeg => :gdImageCreateFromJpegPtr,
:png => :gdImageCreateFromPngPtr,
:gif => :gdImageCreateFromGifPtr,
:wbmp => :gdImageCreateFromWBMPPtr,
:gd2 => :gdImageCreateFromGd2Ptr
}
args = [src.length, src]
else
raise TypeError, 'Unexpected argument type'
end
type = data_type(magic) or
raise UnrecognizedImageTypeError, 'Image data format is not recognized'
ptr = SYM[create[type]].call(*args)[0]
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