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 Enumerable Geometry OptionalMethodArguments HatchFill Draw lib/RMagick.rb lib/rvg/misc.rb ObjectData Application 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 1104
1104:             def initialize(view, width, height, rows)
1105:                 @view = view
1106:                 @width = width
1107:                 @height = height
1108:                 @rows = rows
1109:             end

Public Instance methods

[Source]

      # File lib/RMagick.rb, line 1111
1111:             def [](*args)
1112:                 cols(args)
1113: 
1114:                 # Both View::Pixels and Magick::Pixel implement Observable
1115:                 if @unique
1116:                     pixels = @view[@rows[0]*@width + @cols[0]]
1117:                     pixels.add_observer(self)
1118:                 else
1119:                     pixels = View::Pixels.new
1120:                     each do |x|
1121:                         p = @view[x]
1122:                         p.add_observer(self)
1123:                         pixels << p
1124:                     end
1125:                 end
1126:                 pixels
1127:             end

[Source]

      # File lib/RMagick.rb, line 1129
1129:             def []=(*args)
1130:                 rv = args.delete_at(-1)     # get rvalue
1131:                 if ! rv.is_a?(Pixel)        # must be a Pixel or a color name
1132:                     begin
1133:                         rv = Pixel.from_color(rv)
1134:                     rescue TypeError
1135:                         Kernel.raise TypeError, "cannot convert #{rv.class} into Pixel"
1136:                     end
1137:                 end
1138:                 cols(args)
1139:                 each { |x| @view[x] = rv.dup }
1140:                 changed
1141:                 notify_observers(self)
1142:                 nil
1143:             end

A pixel has been modified. Tell the view.

[Source]

      # File lib/RMagick.rb, line 1146
1146:             def update(pixel)
1147:                 changed
1148:                 notify_observers(self)
1149:                 pixel.delete_observer(self) # Don't need to hear again.
1150:                 nil
1151:             end

Private Instance methods

[Source]

      # File lib/RMagick.rb, line 1155
1155:             def cols(*args)
1156:                 @cols = args[0]     # remove the outermost array
1157:                 @unique = false
1158: 
1159:                 # Convert @rows to an Enumerable object
1160:                 case @rows.length
1161:                     when 0                      # Create a Range for all the rows
1162:                         @rows = Range.new(0, @height, true)
1163:                     when 1                      # Range, Array, or a single integer
1164:                         # if the single element is already an Enumerable
1165:                         # object, get it.
1166:                         if @rows.first.respond_to? :each
1167:                             @rows = @rows.first
1168:                         else
1169:                             @rows = Integer(@rows.first)
1170:                             if @rows < 0
1171:                                 @rows += @height
1172:                             end
1173:                             if @rows < 0 || @rows > @height-1
1174:                                 Kernel.raise IndexError, "index [#{@rows}] out of range"
1175:                             end
1176:                             # Convert back to an array
1177:                             @rows = Array.new(1, @rows)
1178:                             @unique = true
1179:                         end
1180:                     when 2
1181:                         # A pair of integers representing the starting column and the number of columns
1182:                         start = Integer(@rows[0])
1183:                         length = Integer(@rows[1])
1184: 
1185:                         # Negative start -> start from last row
1186:                         if start < 0
1187:                             start += @height
1188:                         end
1189: 
1190:                         if start > @height || start < 0 || length < 0
1191:                                 Kernel.raise IndexError, "index [#{@rows.first}] out of range"
1192:                         else
1193:                             if start + length > @height
1194:                                 length = @height - length
1195:                                 length = [length, 0].max
1196:                             end
1197:                         end
1198:                         # Create a Range for the specified set of rows
1199:                         @rows = Range.new(start, start+length, true)
1200:                 end
1201: 
1202:                 case @cols.length
1203:                     when 0                  # all rows
1204:                         @cols = Range.new(0, @width, true)  # convert to range
1205:                         @unique = false
1206:                     when 1                  # Range, Array, or a single integer
1207:                         # if the single element is already an Enumerable
1208:                         # object, get it.
1209:                         if @cols.first.respond_to? :each
1210:                             @cols = @cols.first
1211:                             @unique = false
1212:                         else
1213:                             @cols = Integer(@cols.first)
1214:                             if @cols < 0
1215:                                 @cols += @width
1216:                             end
1217:                             if @cols < 0 || @cols > @width-1
1218:                                 Kernel.raise IndexError, "index [#{@cols}] out of range"
1219:                             end
1220:                             # Convert back to array
1221:                             @cols = Array.new(1, @cols)
1222:                             @unique &&= true
1223:                         end
1224:                     when 2
1225:                         # A pair of integers representing the starting column and the number of columns
1226:                         start = Integer(@cols[0])
1227:                         length = Integer(@cols[1])
1228: 
1229:                         # Negative start -> start from last row
1230:                         if start < 0
1231:                             start += @width
1232:                         end
1233: 
1234:                         if start > @width || start < 0 || length < 0
1235:                             ; #nop
1236:                         else
1237:                             if start + length > @width
1238:                                 length = @width - length
1239:                                 length = [length, 0].max
1240:                             end
1241:                         end
1242:                         # Create a Range for the specified set of columns
1243:                         @cols = Range.new(start, start+length, true)
1244:                         @unique = false
1245:                 end
1246: 
1247:             end

iterator called from subscript methods

[Source]

      # File lib/RMagick.rb, line 1250
1250:             def each
1251:                 maxrows = @height - 1
1252:                 maxcols = @width - 1
1253: 
1254:                 @rows.each do |j|
1255:                     if j > maxrows
1256:                         Kernel.raise IndexError, "index [#{j}] out of range"
1257:                     end
1258:                     @cols.each do |i|
1259:                         if i > maxcols
1260:                             Kernel.raise IndexError, "index [#{i}] out of range"
1261:                         end
1262:                         yield j*@width + i
1263:                     end
1264:                 end
1265:                 nil    # useless return value
1266:             end

[Validate]