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/container.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 1125
1125:             def initialize(view, width, height, rows)
1126:                 @view = view
1127:                 @width = width
1128:                 @height = height
1129:                 @rows = rows
1130:             end

Public Instance methods

[Source]

      # File lib/RMagick.rb, line 1132
1132:             def [](*args)
1133:                 cols(args)
1134: 
1135:                 # Both View::Pixels and Magick::Pixel implement Observable
1136:                 if @unique
1137:                     pixels = @view[@rows[0]*@width + @cols[0]]
1138:                     pixels.add_observer(self)
1139:                 else
1140:                     pixels = View::Pixels.new
1141:                     each do |x|
1142:                         p = @view[x]
1143:                         p.add_observer(self)
1144:                         pixels << p
1145:                     end
1146:                 end
1147:                 pixels
1148:             end

[Source]

      # File lib/RMagick.rb, line 1150
1150:             def []=(*args)
1151:                 rv = args.delete_at(-1)     # get rvalue
1152:                 if ! rv.is_a?(Pixel)        # must be a Pixel or a color name
1153:                     begin
1154:                         rv = Pixel.from_color(rv)
1155:                     rescue TypeError
1156:                         Kernel.raise TypeError, "cannot convert #{rv.class} into Pixel"
1157:                     end
1158:                 end
1159:                 cols(args)
1160:                 each { |x| @view[x] = rv.dup }
1161:                 changed
1162:                 notify_observers(self)
1163:                 nil
1164:             end

A pixel has been modified. Tell the view.

[Source]

      # File lib/RMagick.rb, line 1167
1167:             def update(pixel)
1168:                 changed
1169:                 notify_observers(self)
1170:                 pixel.delete_observer(self) # Don't need to hear again.
1171:                 nil
1172:             end

Private Instance methods

[Source]

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

iterator called from subscript methods

[Source]

      # File lib/RMagick.rb, line 1271
1271:             def each
1272:                 maxrows = @height - 1
1273:                 maxcols = @width - 1
1274: 
1275:                 @rows.each do |j|
1276:                     if j > maxrows
1277:                         Kernel.raise IndexError, "index [#{j}] out of range"
1278:                     end
1279:                     @cols.each do |i|
1280:                         if i > maxcols
1281:                             Kernel.raise IndexError, "index [#{i}] out of range"
1282:                         end
1283:                         yield j*@width + i
1284:                     end
1285:                 end
1286:                 nil    # useless return value
1287:             end

[Validate]