Class Magick::Image::View::Rows
In: lib/RMagick.rb
Parent: Object
Enum GeometryValue Stylable RVG\n[lib/rvg/clippath.rb\nlib/rvg/container.rb\nlib/rvg/deep_equal.rb\nlib/rvg/describable.rb\nlib/rvg/embellishable.rb\nlib/rvg/misc.rb\nlib/rvg/paint.rb\nlib/rvg/pathdata.rb\nlib/rvg/rvg.rb\nlib/rvg/stretchable.rb\nlib/rvg/stylable.rb\nlib/rvg/text.rb\nlib/rvg/transformable.rb\nlib/rvg/units.rb] Transformable Stretchable Embellishable Describable Duplicatable Comparable Image ImageList Array Geometry HatchFill Draw lib/RMagick.rb lib/rvg/misc.rb Application ObjectData Pre_ObjectData_Descriptor Envelope Post_ObjectData_Descriptor IPTC Magick dot/m_14_0.png

Methods

[]   []=   cols   each   new   update  

Included Modules

Observable

Public Class methods

[Source]

      # File lib/RMagick.rb, line 1028
1028:             def initialize(view, width, height, rows)
1029:                 @view = view
1030:                 @width = width
1031:                 @height = height
1032:                 @rows = rows
1033:             end

Public Instance methods

[Source]

      # File lib/RMagick.rb, line 1035
1035:             def [](*args)
1036:                 cols(args)
1037: 
1038:                 # Both View::Pixels and Magick::Pixel implement Observable
1039:                 if @unique
1040:                     pixels = @view[@rows[0]*@width + @cols[0]]
1041:                     pixels.add_observer(self)
1042:                 else
1043:                     pixels = View::Pixels.new
1044:                     each do |x|
1045:                         p = @view[x]
1046:                         p.add_observer(self)
1047:                         pixels << p
1048:                     end
1049:                 end
1050:                 pixels
1051:             end

[Source]

      # File lib/RMagick.rb, line 1053
1053:             def []=(*args)
1054:                 rv = args.delete_at(-1)     # get rvalue
1055:                 if ! rv.is_a?(Pixel)        # must be a Pixel or a color name
1056:                     begin
1057:                         rv = Pixel.from_color(rv)
1058:                     rescue TypeError
1059:                         Kernel.raise TypeError, "cannot convert #{rv.class} into Pixel"
1060:                     end
1061:                 end
1062:                 cols(args)
1063:                 each { |x| @view[x] = rv.dup }
1064:                 changed
1065:                 notify_observers(self)
1066:                 nil
1067:             end

A pixel has been modified. Tell the view.

[Source]

      # File lib/RMagick.rb, line 1070
1070:             def update(pixel)
1071:                 changed
1072:                 notify_observers(self)
1073:                 pixel.delete_observer(self) # Don't need to hear again.
1074:                 nil
1075:             end

Private Instance methods

[Source]

      # File lib/RMagick.rb, line 1079
1079:             def cols(*args)
1080:                 @cols = args[0]     # remove the outermost array
1081:                 @unique = false
1082: 
1083:                 # Convert @rows to an Enumerable object
1084:                 case @rows.length
1085:                     when 0                      # Create a Range for all the rows
1086:                         @rows = Range.new(0, @height, true)
1087:                     when 1                      # Range, Array, or a single integer
1088:                         # if the single element is already an Enumerable
1089:                         # object, get it.
1090:                         if @rows.first.respond_to? :each
1091:                             @rows = @rows.first
1092:                         else
1093:                             @rows = Integer(@rows.first)
1094:                             if @rows < 0
1095:                                 @rows += @height
1096:                             end
1097:                             if @rows < 0 || @rows > @height-1
1098:                                 Kernel.raise IndexError, "index [#{@rows}] out of range"
1099:                             end
1100:                             # Convert back to an array
1101:                             @rows = Array.new(1, @rows)
1102:                             @unique = true
1103:                         end
1104:                     when 2
1105:                         # A pair of integers representing the starting column and the number of columns
1106:                         start = Integer(@rows[0])
1107:                         length = Integer(@rows[1])
1108: 
1109:                         # Negative start -> start from last row
1110:                         if start < 0
1111:                             start += @height
1112:                         end
1113: 
1114:                         if start > @height || start < 0 || length < 0
1115:                                 Kernel.raise IndexError, "index [#{@rows.first}] out of range"
1116:                         else
1117:                             if start + length > @height
1118:                                 length = @height - length
1119:                                 length = [length, 0].max
1120:                             end
1121:                         end
1122:                         # Create a Range for the specified set of rows
1123:                         @rows = Range.new(start, start+length, true)
1124:                 end
1125: 
1126:                 case @cols.length
1127:                     when 0                  # all rows
1128:                         @cols = Range.new(0, @width, true)  # convert to range
1129:                         @unique = false
1130:                     when 1                  # Range, Array, or a single integer
1131:                         # if the single element is already an Enumerable
1132:                         # object, get it.
1133:                         if @cols.first.respond_to? :each
1134:                             @cols = @cols.first
1135:                             @unique = false
1136:                         else
1137:                             @cols = Integer(@cols.first)
1138:                             if @cols < 0
1139:                                 @cols += @width
1140:                             end
1141:                             if @cols < 0 || @cols > @width-1
1142:                                 Kernel.raise IndexError, "index [#{@cols}] out of range"
1143:                             end
1144:                             # Convert back to array
1145:                             @cols = Array.new(1, @cols)
1146:                             @unique &&= true
1147:                         end
1148:                     when 2
1149:                         # A pair of integers representing the starting column and the number of columns
1150:                         start = Integer(@cols[0])
1151:                         length = Integer(@cols[1])
1152: 
1153:                         # Negative start -> start from last row
1154:                         if start < 0
1155:                             start += @width
1156:                         end
1157: 
1158:                         if start > @width || start < 0 || length < 0
1159:                             ; #nop
1160:                         else
1161:                             if start + length > @width
1162:                                 length = @width - length
1163:                                 length = [length, 0].max
1164:                             end
1165:                         end
1166:                         # Create a Range for the specified set of columns
1167:                         @cols = Range.new(start, start+length, true)
1168:                         @unique = false
1169:                 end
1170: 
1171:             end

iterator called from subscript methods

[Source]

      # File lib/RMagick.rb, line 1174
1174:             def each
1175:                 maxrows = @height - 1
1176:                 maxcols = @width - 1
1177: 
1178:                 @rows.each do |j|
1179:                     if j > maxrows
1180:                         Kernel.raise IndexError, "index [#{j}] out of range"
1181:                     end
1182:                     @cols.each do |i|
1183:                         if i > maxcols
1184:                             Kernel.raise IndexError, "index [#{i}] out of range"
1185:                         end
1186:                         yield j*@width + i
1187:                     end
1188:                 end
1189:                 nil    # useless return value
1190:             end

[Validate]