Initialize new instances
# File lib/RMagick.rb, line 1631 def initialize(*filenames, &block) @images = [] @scene = nil filenames.each { |f| Magick::Image.read(f, &block).each { |n| @images << n } } if length > 0 @scene = length - 1 # last image in array end self end
# File lib/RMagick.rb, line 1390 def *(n) unless n.kind_of? Integer Kernel.raise ArgumentError, "Integer required (#{n.class} given)" end current = get_current() ilist = self.class.new (@images * n).each {|image| ilist << image} ilist.set_current current return ilist end
# File lib/RMagick.rb, line 1401 def <<(obj) is_an_image obj @images << obj @scene = @images.length - 1 self 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
# File lib/RMagick.rb, line 1413 def <=>(other) unless other.kind_of? self.class Kernel.raise TypeError, "#{self.class} required (#{other.class} given)" end size = [self.length, other.length].min size.times do |x| r = self[x] <=> other[x] return r unless r == 0 end if @scene.nil? && other.scene.nil? return 0 elsif @scene.nil? && ! other.scene.nil? Kernel.raise TypeError, "cannot convert nil into #{other.scene.class}" elsif ! @scene.nil? && other.scene.nil? Kernel.raise TypeError, "cannot convert nil into #{self.scene.class}" end r = self.scene <=> other.scene return r unless r == 0 return self.length <=> other.length end
# File lib/RMagick.rb, line 1434 def [](*args) a = @images[*args] if a.respond_to?(:each) then ilist = self.class.new a.each {|image| ilist << image} a = ilist end return a end
# File lib/RMagick.rb, line 1444 def []=(*args) obj = @images.[]=(*args) if obj && obj.respond_to?(:each) then is_an_image_array(obj) set_current obj.last.__id__ elsif obj is_an_image(obj) set_current obj.__id__ else set_current nil end return obj end
ImageList#map took over the “map” name. Use alternatives.
Ensure respond_to? answers correctly when we are delegating to Image
# File lib/RMagick.rb, line 1475 def clear @scene = nil @images.clear end
# File lib/RMagick.rb, line 1480 def clone ditto = dup ditto.freeze if frozen? return ditto end
override Enumerable#collect
# File lib/RMagick.rb, line 1487 def collect(&block) current = get_current() a = @images.collect(&block) ilist = self.class.new a.each {|image| ilist << image} ilist.set_current current return ilist end
# File lib/RMagick.rb, line 1496 def collect!(&block) @images.collect!(&block) is_an_image_array @images self end
# File lib/RMagick.rb, line 1527 def compact current = get_current() ilist = self.class.new a = @images.compact a.each {|image| ilist << image} ilist.set_current current return ilist end
# File lib/RMagick.rb, line 1536 def compact! current = get_current() a = @images.compact! # returns nil if no changes were made set_current current return a.nil? ? nil : self end
# File lib/RMagick.rb, line 1543 def concat(other) is_an_image_array other other.each {|image| @images << image} @scene = length-1 return self end
Make a deep copy
# File lib/RMagick.rb, line 1503 def copy ditto = self.class.new @images.each { |f| ditto << f.copy } ditto.scene = @scene ditto.taint if tainted? return ditto end
Return the current image
# File lib/RMagick.rb, line 1512 def cur_image if ! @scene Kernel.raise IndexError, "no images in this list" end @images[@scene] end
Set same delay for all images
# File lib/RMagick.rb, line 1551 def delay=(d) if Integer(d) < 0 raise ArgumentError, "delay must be greater than or equal to 0" end @images.each { |f| f.delay = Integer(d) } end
# File lib/RMagick.rb, line 1558 def delete(obj, &block) is_an_image obj current = get_current() a = @images.delete(obj, &block) set_current current return a end
# File lib/RMagick.rb, line 1566 def delete_at(ndx) current = get_current() a = @images.delete_at(ndx) set_current current return a end
# File lib/RMagick.rb, line 1573 def delete_if(&block) current = get_current() @images.delete_if(&block) set_current current self end
# File lib/RMagick.rb, line 1580 def dup ditto = self.class.new @images.each {|img| ditto << img} ditto.scene = @scene ditto.taint if tainted? return ditto end
# File lib/RMagick.rb, line 1588 def eql?(other) is_an_image_array other eql = other.eql?(@images) begin # "other" is another ImageList eql &&= @scene == other.scene rescue NoMethodError # "other" is a plain Array end return eql end
# File lib/RMagick.rb, line 1599 def fill(*args, &block) is_an_image args[0] unless block_given? current = get_current() @images.fill(*args, &block) is_an_image_array self set_current current self end
Override Enumerable’s find_all
# File lib/RMagick.rb, line 1609 def find_all(&block) current = get_current() a = @images.find_all(&block) ilist = self.class.new a.each {|image| ilist << image} ilist.set_current current return ilist end
# File lib/RMagick.rb, line 1619 def from_blob(*blobs, &block) if (blobs.length == 0) Kernel.raise ArgumentError, "no blobs given" end blobs.each { |b| Magick::Image.from_blob(b, &block).each { |n| @images << n } } @scene = length - 1 self end
# File lib/RMagick.rb, line 1643 def insert(index, *args) args.each {|image| is_an_image image} current = get_current() @images.insert(index, *args) set_current current return self end
Call inspect for all the images
# File lib/RMagick.rb, line 1652 def inspect img = [] @images.each {|image| img << image.inspect } img = "[" + img.join(",\n") + "]\nscene=#{@scene}" end
Set the number of iterations of an animated GIF
# File lib/RMagick.rb, line 1659 def iterations=(n) n = Integer(n) if n < 0 || n > 65535 Kernel.raise ArgumentError, "iterations must be between 0 and 65535" end @images.each {|f| f.iterations=n} self end
# File lib/RMagick.rb, line 1668 def last(*args) if args.length == 0 a = @images.last else a = @images.last(*args) ilist = self.class.new a.each {|img| ilist << img} @scene = a.length - 1 a = ilist end return a end
Custom marshal/unmarshal for Ruby 1.8.
# File lib/RMagick.rb, line 1682 def marshal_dump() ary = [@scene] @images.each {|i| ary << Marshal.dump(i)} ary end
# File lib/RMagick.rb, line 1688 def marshal_load(ary) @scene = ary.shift @images = [] ary.each {|a| @images << Marshal.load(a)} 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.
# File lib/RMagick.rb, line 1698 def method_missing(methID, *args, &block) begin if @scene @images[@scene].send(methID, *args, &block) else super end rescue NoMethodError Kernel.raise NoMethodError, "undefined method `#{methID.id2name}' for #{self.class}" rescue Exception $@.delete_if { |s| /:in `send'$/.match(s) || /:in `method_missing'$/.match(s) } Kernel.raise end end
Create a new image and add it to the end
# File lib/RMagick.rb, line 1714 def new_image(cols, rows, *fill, &info_blk) self << Magick::Image.new(cols, rows, *fill, &info_blk) end
# File lib/RMagick.rb, line 1718 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
Ping files and concatenate the new images
# File lib/RMagick.rb, line 1730 def ping(*files, &block) if (files.length == 0) Kernel.raise ArgumentError, "no files given" end files.each { |f| Magick::Image.ping(f, &block).each { |n| @images << n } } @scene = length - 1 self end
# File lib/RMagick.rb, line 1741 def pop current = get_current() a = @images.pop # can return nil set_current current return a end
# File lib/RMagick.rb, line 1748 def push(*objs) objs.each do |image| is_an_image image @images << image end @scene = length - 1 self end
Read files and concatenate the new images
# File lib/RMagick.rb, line 1758 def read(*files, &block) if (files.length == 0) Kernel.raise ArgumentError, "no files given" end files.each { |f| Magick::Image.read(f, &block).each { |n| @images << n } } @scene = length - 1 self end
override Enumerable’s reject
# File lib/RMagick.rb, line 1770 def reject(&block) current = get_current() ilist = self.class.new a = @images.reject(&block) a.each {|image| ilist << image} ilist.set_current current return ilist end
# File lib/RMagick.rb, line 1779 def reject!(&block) current = get_current() a = @images.reject!(&block) @images = a if !a.nil? set_current current return a.nil? ? nil : self end
# File lib/RMagick.rb, line 1787 def replace(other) is_an_image_array other current = get_current() @images.clear other.each {|image| @images << image} @scene = self.length == 0 ? nil : 0 set_current current self end
# File lib/RMagick.rb, line 1799 def respond_to?(methID, priv=false) return true if __respond_to__?(methID, priv) if @scene @images[@scene].respond_to?(methID, priv) else super end end
# File lib/RMagick.rb, line 1808 def reverse current = get_current() a = self.class.new @images.reverse_each {|image| a << image} a.set_current current return a end
# File lib/RMagick.rb, line 1816 def reverse! current = get_current() @images.reverse! set_current current self end
# File lib/RMagick.rb, line 1823 def reverse_each @images.reverse_each {|image| yield(image)} self end
Allow scene to be set to nil
# File lib/RMagick.rb, line 1351 def scene=(n) if n.nil? Kernel.raise IndexError, "scene number out of bounds" unless @images.length == 0 @scene = nil return @scene elsif @images.length == 0 Kernel.raise IndexError, "scene number out of bounds" end n = Integer(n) if n < 0 || n > length - 1 Kernel.raise IndexError, "scene number out of bounds" end @scene = n return @scene end
# File lib/RMagick.rb, line 1828 def shift current = get_current() a = @images.shift set_current current return a end
# File lib/RMagick.rb, line 1835 def slice(*args) current = get_current() slice = @images.slice(*args) if slice ilist = self.class.new if slice.respond_to?(:each) then slice.each {|image| ilist << image} else ilist << slice end else ilist = nil end return ilist end
# File lib/RMagick.rb, line 1851 def slice!(*args) current = get_current() a = @images.slice!(*args) set_current current return a end
# File lib/RMagick.rb, line 1858 def ticks_per_second=(t) if Integer(t) < 0 Kernel.raise ArgumentError, "ticks_per_second must be greater than or equal to 0" end @images.each { |f| f.ticks_per_second = Integer(t) } end
# File lib/RMagick.rb, line 1865 def to_a a = Array.new @images.each {|image| a << image} return a end
# File lib/RMagick.rb, line 1871 def uniq current = get_current() a = self.class.new @images.uniq.each {|image| a << image} a.set_current current return a end
# File lib/RMagick.rb, line 1879 def uniq!(*args) current = get_current() a = @images.uniq! set_current current return a.nil? ? nil : self end
# File lib/RMagick.rb, line 1308 def is_an_image(obj) unless obj.kind_of? Magick::Image Kernel.raise ArgumentError, "Magick::Image required (#{obj.class} given)" end true end
Ensure array is always an array of Magick::Image objects
# File lib/RMagick.rb, line 1316 def is_an_image_array(ary) unless ary.respond_to? :each Kernel.raise ArgumentError, "Magick::ImageList or array of Magick::Images required (#{ary.class} given)" end ary.each { |obj| is_an_image obj } true end
Find old current image, update scene number current is the id of the old current image.
# File lib/RMagick.rb, line 1326 def set_current(current) if length() == 0 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| if f.__id__ == current self.scene = i end end return end self.scene = length() - 1 end
Generated with the Darkfish Rdoc Generator 2.