class Magick::ImageList
Attributes
Public Class Methods
Source
# File lib/rmagick_internal.rb, line 1552 def initialize(*filenames, &block) @images = [] @scene = nil filenames.each do |f| Magick::Image.read(f, &block).each { |n| @images << n } end @scene = length - 1 if length > 0 # last image in array end
Initialize new instances
Public Instance Methods
Source
# File lib/rmagick_internal.rb, line 1317 def *(other) Kernel.raise ArgumentError, "Integer required (#{other.class} given)" unless other.is_a? Integer current = get_current ilist = self.class.new (@images * other).each { |image| ilist << image } ilist.set_current current ilist end
Source
# File lib/rmagick_internal.rb, line 1326 def <<(obj) assert_image obj @images << obj @scene = @images.length - 1 self end
Source
# File lib/rmagick_internal.rb, line 1338 def <=>(other) return unless other.is_a? self.class size = [length, other.length].min size.times do |x| r = self[x] <=> other[x] return r unless r.zero? end return 0 if @scene.nil? && other.scene.nil? return if @scene.nil? && !other.scene.nil? return if !@scene.nil? && other.scene.nil? r = scene <=> other.scene return r unless r.zero? length <=> other.length end
Compare ImageLists Compare each image in turn until the result of a comparison is not 0. If all comparisons return 0, then
return if A.scene != B.scene return A.length <=> B.length
Source
# File lib/rmagick_internal.rb, line 1357 def [](*args) a = @images[*args] if a.respond_to?(:each) ilist = self.class.new a.each { |image| ilist << image } a = ilist end a end
Source
# File lib/rmagick_internal.rb, line 1367 def []=(*args) obj = @images.[]=(*args) if obj.respond_to?(:each) assert_image_array(obj) set_current obj.last.__id__ elsif obj assert_image(obj) set_current obj.__id__ else set_current nil end end
Ensure respond_to? answers correctly when we are delegating to Image
Source
# File lib/rmagick_internal.rb, line 1402 def clone ditto = dup ditto.freeze if frozen? ditto end
Source
# File lib/rmagick_internal.rb, line 1409 def collect(&block) current = get_current a = @images.map(&block) ilist = self.class.new a.each { |image| ilist << image } ilist.set_current current ilist end
override Enumerable#collect
Source
# File lib/rmagick_internal.rb, line 1418 def collect!(&block) @images.map!(&block) assert_image_array @images self end
Source
# File lib/rmagick_internal.rb, line 1447 def compact current = get_current ilist = self.class.new a = @images.compact a.each { |image| ilist << image } ilist.set_current current ilist end
Source
# File lib/rmagick_internal.rb, line 1456 def compact! current = get_current a = @images.compact! # returns nil if no changes were made set_current current a.nil? ? nil : self end
Source
# File lib/rmagick_internal.rb, line 1463 def concat(other) assert_image_array other other.each { |image| @images << image } @scene = length - 1 self end
Source
# File lib/rmagick_internal.rb, line 1425 def copy ditto = self.class.new @images.each { |f| ditto << f.copy } ditto.scene = @scene ditto end
Make a deep copy
Source
# File lib/rmagick_internal.rb, line 1433 def cur_image Kernel.raise IndexError, 'no images in this list' unless @scene @images[@scene] end
Return the current image
Source
# File lib/rmagick_internal.rb, line 1471 def delay=(d) raise ArgumentError, 'delay must be greater than or equal to 0' if Integer(d) < 0 @images.each { |f| f.delay = Integer(d) } end
Set same delay for all images
Source
# File lib/rmagick_internal.rb, line 1477 def delete(obj, &block) assert_image obj current = get_current a = @images.delete(obj, &block) set_current current a end
Source
# File lib/rmagick_internal.rb, line 1485 def delete_at(ndx) current = get_current a = @images.delete_at(ndx) set_current current a end
Source
# File lib/rmagick_internal.rb, line 1492 def delete_if(&block) current = get_current @images.delete_if(&block) set_current current self end
Source
# File lib/rmagick_internal.rb, line 1810 def destroy! @images.each(&:destroy!) self end
Source
# File lib/rmagick_internal.rb, line 1815 def destroyed? @images.all?(&:destroyed?) end
Source
# File lib/rmagick_internal.rb, line 1499 def dup ditto = self.class.new @images.each { |img| ditto << img } ditto.scene = @scene ditto end
Source
# File lib/rmagick_internal.rb, line 1506 def eql?(other) begin assert_image_array other rescue ArgumentError return false end eql = other.eql?(@images) begin # "other" is another ImageList eql &&= @scene == other.scene rescue NoMethodError # "other" is a plain Array end eql end
Source
# File lib/rmagick_internal.rb, line 1522 def fill(*args, &block) assert_image args[0] unless block current = get_current @images.fill(*args, &block) assert_image_array self set_current current self end
Source
# File lib/rmagick_internal.rb, line 1532 def find_all(&block) current = get_current a = @images.select(&block) ilist = self.class.new a.each { |image| ilist << image } ilist.set_current current ilist end
Override Enumerable’s find_all
Source
# File lib/rmagick_internal.rb, line 1542 def from_blob(*blobs, &block) Kernel.raise ArgumentError, 'no blobs given' if blobs.empty? blobs.each do |b| Magick::Image.from_blob(b, &block).each { |n| @images << n } end @scene = length - 1 self end
Source
# File lib/rmagick_internal.rb, line 1562 def insert(index, *args) args.each { |image| assert_image image } current = get_current @images.insert(index, *args) set_current current self end
Source
# File lib/rmagick_internal.rb, line 1571 def inspect img = @images.map(&:inspect) '[' + img.join(",\n") + "]\nscene=#{@scene}" end
Call inspect for all the images
Source
# File lib/rmagick_internal.rb, line 1577 def iterations=(n) n = Integer(n) Kernel.raise ArgumentError, 'iterations must be between 0 and 65535' if n < 0 || n > 65_535 @images.each { |f| f.iterations = n } end
Set the number of iterations of an animated GIF
Source
# File lib/rmagick_internal.rb, line 1583 def last(*args) if args.empty? a = @images.last else a = @images.last(*args) ilist = self.class.new a.each { |img| ilist << img } @scene = a.length - 1 a = ilist end a end
Source
# File lib/rmagick_internal.rb, line 1597 def marshal_dump ary = [@scene] @images.each { |i| ary << Marshal.dump(i) } ary end
Custom marshal/unmarshal for Ruby 1.8.
Source
# File lib/rmagick_internal.rb, line 1603 def marshal_load(ary) @scene = ary.shift @images = [] ary.each { |a| @images << Marshal.load(a) } end
Source
# File lib/rmagick_internal.rb, line 1613 def method_missing(meth_id, *args, &block) if @scene img = @images[@scene] new_img = img.public_send(meth_id, *args, &block) img.equal?(new_img) ? self : new_img else super end rescue NoMethodError Kernel.raise NoMethodError, "undefined method `#{meth_id.id2name}' for #{self.class}" rescue Exception $ERROR_POSITION.delete_if { |s| /:in `send'$/.match(s) || /:in `method_missing'$/.match(s) } Kernel.raise end
The ImageList class supports the Magick::Image class methods by simply sending the method to the current image. If the method isn’t explicitly supported, send it to the current image in the array. If there are no images, send it up the line. Catch a NameError and emit a useful message.
Source
# File lib/rmagick_internal.rb, line 1629 def new_image(cols, rows, *fill, &info_blk) self << Magick::Image.new(cols, rows, *fill, &info_blk) end
Create a new image and add it to the end
Source
# File lib/rmagick_internal.rb, line 1633 def partition(&block) a = @images.partition(&block) t = self.class.new a[0].each { |img| t << img } t.set_current nil f = self.class.new a[1].each { |img| f << img } f.set_current nil [t, f] end
Source
# File lib/rmagick_internal.rb, line 1645 def ping(*files, &block) Kernel.raise ArgumentError, 'no files given' if files.empty? files.each do |f| Magick::Image.ping(f, &block).each { |n| @images << n } end @scene = length - 1 self end
Ping files and concatenate the new images
Source
# File lib/rmagick_internal.rb, line 1654 def pop current = get_current a = @images.pop # can return nil set_current current a end
Source
# File lib/rmagick_internal.rb, line 1661 def push(*objs) objs.each do |image| assert_image image @images << image end @scene = length - 1 self end
Source
# File lib/rmagick_internal.rb, line 1671 def read(*files, &block) Kernel.raise ArgumentError, 'no files given' if files.empty? files.each do |f| Magick::Image.read(f, &block).each { |n| @images << n } end @scene = length - 1 self end
Read files and concatenate the new images
Source
# File lib/rmagick_internal.rb, line 1681 def reject(&block) current = get_current ilist = self.class.new a = @images.reject(&block) a.each { |image| ilist << image } ilist.set_current current ilist end
override Enumerable’s reject
Source
# File lib/rmagick_internal.rb, line 1690 def reject!(&block) current = get_current a = @images.reject!(&block) @images = a unless a.nil? set_current current a.nil? ? nil : self end
Source
# File lib/rmagick_internal.rb, line 1698 def replace(other) assert_image_array other current = get_current @images.clear other.each { |image| @images << image } @scene = length.zero? ? nil : 0 set_current current self end
Source
# File lib/rmagick_internal.rb, line 1710 def respond_to?(meth_id, priv = false) return true if __respond_to__?(meth_id, priv) if @scene @images[@scene].respond_to?(meth_id, priv) else super end end
Source
# File lib/rmagick_internal.rb, line 1720 def reverse current = get_current a = self.class.new @images.reverse_each { |image| a << image } a.set_current current a end
Source
# File lib/rmagick_internal.rb, line 1728 def reverse! current = get_current @images.reverse! set_current current self end
Source
# File lib/rmagick_internal.rb, line 1735 def reverse_each(&block) @images.reverse_each(&block) self end
Source
# File lib/rmagick_internal.rb, line 1287 def scene=(n) if n.nil? Kernel.raise IndexError, 'scene number out of bounds' unless @images.empty? @scene = nil return elsif @images.empty? Kernel.raise IndexError, 'scene number out of bounds' end n = Integer(n) Kernel.raise IndexError, 'scene number out of bounds' if n < 0 || n > length - 1 @scene = n end
Allow scene to be set to nil
Source
# File lib/rmagick_internal.rb, line 1740 def shift current = get_current a = @images.shift set_current current a end
Source
# File lib/rmagick_internal.rb, line 1747 def slice(*args) slice = @images.slice(*args) if slice ilist = self.class.new if slice.respond_to?(:each) slice.each { |image| ilist << image } else ilist << slice end else ilist = nil end ilist end
Source
# File lib/rmagick_internal.rb, line 1762 def slice!(*args) current = get_current a = @images.slice!(*args) set_current current a end
Source
# File lib/rmagick_internal.rb, line 1392 def sort!(*args, &block) @images.sort!(*args, &block) self end
Source
# File lib/rmagick_internal.rb, line 1769 def ticks_per_second=(t) Kernel.raise ArgumentError, 'ticks_per_second must be greater than or equal to 0' if Integer(t) < 0 @images.each { |f| f.ticks_per_second = Integer(t) } end
Source
# File lib/rmagick_internal.rb, line 1778 def uniq current = get_current a = self.class.new @images.uniq.each { |image| a << image } a.set_current current a end
Source
# File lib/rmagick_internal.rb, line 1786 def uniq!(*_args) current = get_current a = @images.uniq! set_current current a.nil? ? nil : self end
Source
# File lib/rmagick_internal.rb, line 1794 def unshift(obj) assert_image obj @images.unshift(obj) @scene = 0 self end
@scene -> new object
Source
# File lib/rmagick_internal.rb, line 1801 def values_at(*args) a = self.class.new @images.values_at(*args).each { |image| a << image } a.scene = a.length - 1 a end
Protected Instance Methods
Source
# File lib/rmagick_internal.rb, line 1252 def assert_image(obj) Kernel.raise ArgumentError, "Magick::Image required (#{obj.class} given)" unless obj.is_a? Magick::Image end
Source
# File lib/rmagick_internal.rb, line 1257 def assert_image_array(ary) Kernel.raise ArgumentError, "Magick::ImageList or array of Magick::Images required (#{ary.class} given)" unless ary.respond_to? :each ary.each { |obj| assert_image obj } end
Ensure array is always an array of Magick::Image objects
Source
# File lib/rmagick_internal.rb, line 1264 def set_current(current) if length.zero? self.scene = nil return # Don't bother looking for current image elsif scene.nil? || scene >= length self.scene = length - 1 return elsif !current.nil? # Find last instance of "current" in the list. # If "current" isn't in the list, set current to last image. self.scene = length - 1 each_with_index do |f, i| self.scene = i if f.__id__ == current end return end self.scene = length - 1 end
Find old current image, update scene number current is the id of the old current image.
Private Instance Methods
Source
# File lib/rmagick_internal.rb, line 1244 def get_current @images[@scene].__id__ rescue StandardError nil end