rmagick 4.1.0.rc2 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rmagick might be problematic. Click here for more details.

Files changed (412) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +63 -0
  3. data/.editorconfig +3 -0
  4. data/.github/workflows/ci.yml +148 -0
  5. data/.gitignore +3 -1
  6. data/.rspec +1 -0
  7. data/.rubocop.yml +24 -0
  8. data/.rubocop_todo.yml +80 -270
  9. data/.yardopts +5 -0
  10. data/CHANGELOG.md +63 -0
  11. data/CONTRIBUTING.md +14 -10
  12. data/README.md +292 -0
  13. data/Rakefile +16 -22
  14. data/before_install_linux.sh +22 -32
  15. data/before_install_osx.sh +56 -2
  16. data/ext/RMagick/extconf.rb +100 -94
  17. data/ext/RMagick/rmagick.c +77 -104
  18. data/ext/RMagick/rmagick.h +74 -70
  19. data/ext/RMagick/rmdraw.c +261 -444
  20. data/ext/RMagick/rmenum.c +96 -113
  21. data/ext/RMagick/rmfill.c +46 -77
  22. data/ext/RMagick/rmilist.c +136 -244
  23. data/ext/RMagick/rmimage.c +3395 -4166
  24. data/ext/RMagick/rminfo.c +531 -737
  25. data/ext/RMagick/rmkinfo.c +21 -87
  26. data/ext/RMagick/rmmain.c +405 -245
  27. data/ext/RMagick/rmmontage.c +60 -126
  28. data/ext/RMagick/rmpixel.c +401 -345
  29. data/ext/RMagick/rmstruct.c +62 -88
  30. data/ext/RMagick/rmutil.c +112 -218
  31. data/lib/rmagick/version.rb +1 -1
  32. data/lib/rmagick_internal.rb +128 -77
  33. data/lib/rvg/clippath.rb +2 -1
  34. data/lib/rvg/container.rb +10 -5
  35. data/lib/rvg/describable.rb +1 -1
  36. data/lib/rvg/embellishable.rb +5 -4
  37. data/lib/rvg/misc.rb +15 -12
  38. data/lib/rvg/paint.rb +2 -1
  39. data/lib/rvg/pathdata.rb +12 -11
  40. data/lib/rvg/rvg.rb +8 -4
  41. data/lib/rvg/stylable.rb +9 -7
  42. data/lib/rvg/text.rb +11 -6
  43. data/lib/rvg/transformable.rb +3 -2
  44. data/lib/rvg/units.rb +1 -1
  45. data/rmagick.gemspec +7 -6
  46. metadata +31 -421
  47. data/.appveyor.yml +0 -57
  48. data/.circleci/config.yml +0 -56
  49. data/.ruby-version +0 -1
  50. data/.simplecov +0 -27
  51. data/.travis.yml +0 -64
  52. data/Doxyfile +0 -1514
  53. data/README.textile +0 -259
  54. data/benchmarks/memory/README.md +0 -50
  55. data/benchmarks/memory/image_new.rb +0 -8
  56. data/benchmarks/memory/rmagick.gnuplot +0 -16
  57. data/doc/.cvsignore +0 -1
  58. data/doc/comtasks.html +0 -287
  59. data/doc/constants.html +0 -1581
  60. data/doc/css/doc.css +0 -299
  61. data/doc/css/popup.css +0 -34
  62. data/doc/css/ref.css +0 -67
  63. data/doc/draw.html +0 -3272
  64. data/doc/ex/InitialCoords.rb +0 -22
  65. data/doc/ex/NewCoordSys.rb +0 -30
  66. data/doc/ex/OrigCoordSys.rb +0 -16
  67. data/doc/ex/PreserveAspectRatio.rb +0 -204
  68. data/doc/ex/RotateScale.rb +0 -36
  69. data/doc/ex/Skew.rb +0 -38
  70. data/doc/ex/Use01.rb +0 -15
  71. data/doc/ex/Use02.rb +0 -20
  72. data/doc/ex/Use03.rb +0 -16
  73. data/doc/ex/ViewBox.rb +0 -31
  74. data/doc/ex/adaptive_threshold.rb +0 -9
  75. data/doc/ex/add_noise.rb +0 -16
  76. data/doc/ex/affine.rb +0 -48
  77. data/doc/ex/affine_transform.rb +0 -20
  78. data/doc/ex/arc.rb +0 -49
  79. data/doc/ex/arcpath.rb +0 -32
  80. data/doc/ex/arcs01.rb +0 -28
  81. data/doc/ex/arcs02.rb +0 -59
  82. data/doc/ex/average.rb +0 -15
  83. data/doc/ex/axes.rb +0 -64
  84. data/doc/ex/baseline_shift01.rb +0 -17
  85. data/doc/ex/bilevel_channel.rb +0 -8
  86. data/doc/ex/blur_image.rb +0 -12
  87. data/doc/ex/border.rb +0 -10
  88. data/doc/ex/bounding_box.rb +0 -42
  89. data/doc/ex/cbezier1.rb +0 -41
  90. data/doc/ex/cbezier2.rb +0 -41
  91. data/doc/ex/cbezier3.rb +0 -41
  92. data/doc/ex/cbezier4.rb +0 -42
  93. data/doc/ex/cbezier5.rb +0 -42
  94. data/doc/ex/cbezier6.rb +0 -53
  95. data/doc/ex/channel.rb +0 -25
  96. data/doc/ex/charcoal.rb +0 -12
  97. data/doc/ex/chop.rb +0 -29
  98. data/doc/ex/circle.rb +0 -33
  99. data/doc/ex/circle01.rb +0 -16
  100. data/doc/ex/clip_path.rb +0 -60
  101. data/doc/ex/coalesce.rb +0 -57
  102. data/doc/ex/color_fill_to_border.rb +0 -29
  103. data/doc/ex/color_floodfill.rb +0 -28
  104. data/doc/ex/color_histogram.rb +0 -47
  105. data/doc/ex/color_reset.rb +0 -11
  106. data/doc/ex/colorize.rb +0 -16
  107. data/doc/ex/colors.rb +0 -64
  108. data/doc/ex/compose_mask.rb +0 -22
  109. data/doc/ex/composite.rb +0 -133
  110. data/doc/ex/composite_layers.rb +0 -52
  111. data/doc/ex/composite_tiled.rb +0 -21
  112. data/doc/ex/contrast.rb +0 -36
  113. data/doc/ex/crop.rb +0 -31
  114. data/doc/ex/crop_with_gravity.rb +0 -42
  115. data/doc/ex/cubic01.rb +0 -43
  116. data/doc/ex/cubic02.rb +0 -91
  117. data/doc/ex/cycle_colormap.rb +0 -21
  118. data/doc/ex/dissolve.rb +0 -12
  119. data/doc/ex/drawcomp.rb +0 -41
  120. data/doc/ex/drop_shadow.rb +0 -60
  121. data/doc/ex/edge.rb +0 -11
  122. data/doc/ex/ellipse.rb +0 -45
  123. data/doc/ex/ellipse01.rb +0 -21
  124. data/doc/ex/emboss.rb +0 -11
  125. data/doc/ex/enhance.rb +0 -28
  126. data/doc/ex/equalize.rb +0 -11
  127. data/doc/ex/evenodd.rb +0 -42
  128. data/doc/ex/fill_pattern.rb +0 -23
  129. data/doc/ex/flatten_images.rb +0 -36
  130. data/doc/ex/flip.rb +0 -11
  131. data/doc/ex/flop.rb +0 -11
  132. data/doc/ex/font_styles.rb +0 -32
  133. data/doc/ex/fonts.rb +0 -16
  134. data/doc/ex/frame.rb +0 -12
  135. data/doc/ex/gaussian_blur.rb +0 -11
  136. data/doc/ex/get_multiline_type_metrics.rb +0 -41
  137. data/doc/ex/get_pixels.rb +0 -45
  138. data/doc/ex/get_type_metrics.rb +0 -142
  139. data/doc/ex/gradientfill.rb +0 -27
  140. data/doc/ex/grav.rb +0 -45
  141. data/doc/ex/gravity.rb +0 -78
  142. data/doc/ex/group.rb +0 -26
  143. data/doc/ex/hatchfill.rb +0 -27
  144. data/doc/ex/image.rb +0 -44
  145. data/doc/ex/images/Apple.miff +0 -0
  146. data/doc/ex/images/Ballerina.jpg +0 -0
  147. data/doc/ex/images/Ballerina3.jpg +0 -0
  148. data/doc/ex/images/Button_0.gif +0 -0
  149. data/doc/ex/images/Button_1.gif +0 -0
  150. data/doc/ex/images/Button_2.gif +0 -0
  151. data/doc/ex/images/Button_3.gif +0 -0
  152. data/doc/ex/images/Button_4.gif +0 -0
  153. data/doc/ex/images/Button_5.gif +0 -0
  154. data/doc/ex/images/Button_6.gif +0 -0
  155. data/doc/ex/images/Button_7.gif +0 -0
  156. data/doc/ex/images/Button_8.gif +0 -0
  157. data/doc/ex/images/Button_9.gif +0 -0
  158. data/doc/ex/images/Button_A.gif +0 -0
  159. data/doc/ex/images/Button_B.gif +0 -0
  160. data/doc/ex/images/Button_C.gif +0 -0
  161. data/doc/ex/images/Button_D.gif +0 -0
  162. data/doc/ex/images/Button_E.gif +0 -0
  163. data/doc/ex/images/Button_F.gif +0 -0
  164. data/doc/ex/images/Button_G.gif +0 -0
  165. data/doc/ex/images/Button_H.gif +0 -0
  166. data/doc/ex/images/Button_I.gif +0 -0
  167. data/doc/ex/images/Button_J.gif +0 -0
  168. data/doc/ex/images/Button_K.gif +0 -0
  169. data/doc/ex/images/Button_L.gif +0 -0
  170. data/doc/ex/images/Button_M.gif +0 -0
  171. data/doc/ex/images/Button_N.gif +0 -0
  172. data/doc/ex/images/Button_O.gif +0 -0
  173. data/doc/ex/images/Button_P.gif +0 -0
  174. data/doc/ex/images/Button_Q.gif +0 -0
  175. data/doc/ex/images/Button_R.gif +0 -0
  176. data/doc/ex/images/Button_S.gif +0 -0
  177. data/doc/ex/images/Button_T.gif +0 -0
  178. data/doc/ex/images/Button_U.gif +0 -0
  179. data/doc/ex/images/Button_V.gif +0 -0
  180. data/doc/ex/images/Button_W.gif +0 -0
  181. data/doc/ex/images/Button_X.gif +0 -0
  182. data/doc/ex/images/Button_Y.gif +0 -0
  183. data/doc/ex/images/Button_Z.gif +0 -0
  184. data/doc/ex/images/Cheetah.jpg +0 -0
  185. data/doc/ex/images/Coffee.png +0 -0
  186. data/doc/ex/images/Flower_Hat.jpg +0 -0
  187. data/doc/ex/images/Gold_Statue.jpg +0 -0
  188. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  189. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  190. data/doc/ex/images/Leaf.miff +0 -0
  191. data/doc/ex/images/No.png +0 -0
  192. data/doc/ex/images/Polynesia.jpg +0 -0
  193. data/doc/ex/images/Red_Rocks.jpg +0 -0
  194. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  195. data/doc/ex/images/Shorts.jpg +0 -0
  196. data/doc/ex/images/Snake.png +0 -0
  197. data/doc/ex/images/Violin.jpg +0 -0
  198. data/doc/ex/images/Yellow_Rose.miff +0 -0
  199. data/doc/ex/images/big-duck.gif +0 -0
  200. data/doc/ex/images/duck.gif +0 -0
  201. data/doc/ex/images/duck0.gif +0 -0
  202. data/doc/ex/images/duck1.gif +0 -0
  203. data/doc/ex/images/duck10.gif +0 -0
  204. data/doc/ex/images/duck11.gif +0 -0
  205. data/doc/ex/images/duck12.gif +0 -0
  206. data/doc/ex/images/duck13.gif +0 -0
  207. data/doc/ex/images/duck14.gif +0 -0
  208. data/doc/ex/images/duck15.gif +0 -0
  209. data/doc/ex/images/duck2.gif +0 -0
  210. data/doc/ex/images/duck3.gif +0 -0
  211. data/doc/ex/images/duck4.gif +0 -0
  212. data/doc/ex/images/duck5.gif +0 -0
  213. data/doc/ex/images/duck6.gif +0 -0
  214. data/doc/ex/images/duck7.gif +0 -0
  215. data/doc/ex/images/duck8.gif +0 -0
  216. data/doc/ex/images/duck9.gif +0 -0
  217. data/doc/ex/images/graydient230x6.gif +0 -0
  218. data/doc/ex/images/image_with_profile.jpg +0 -0
  219. data/doc/ex/images/logo400x83.gif +0 -0
  220. data/doc/ex/images/model.miff +0 -0
  221. data/doc/ex/images/notimplemented.gif +0 -0
  222. data/doc/ex/images/smile.miff +0 -0
  223. data/doc/ex/images/spin.gif +0 -0
  224. data/doc/ex/implode.rb +0 -34
  225. data/doc/ex/level.rb +0 -11
  226. data/doc/ex/level_colors.rb +0 -11
  227. data/doc/ex/line.rb +0 -41
  228. data/doc/ex/line01.rb +0 -21
  229. data/doc/ex/mask.rb +0 -35
  230. data/doc/ex/matte_fill_to_border.rb +0 -39
  231. data/doc/ex/matte_floodfill.rb +0 -32
  232. data/doc/ex/matte_replace.rb +0 -39
  233. data/doc/ex/median_filter.rb +0 -28
  234. data/doc/ex/modulate.rb +0 -11
  235. data/doc/ex/mono.rb +0 -23
  236. data/doc/ex/morph.rb +0 -25
  237. data/doc/ex/mosaic.rb +0 -37
  238. data/doc/ex/motion_blur.rb +0 -11
  239. data/doc/ex/negate.rb +0 -11
  240. data/doc/ex/negate_channel.rb +0 -9
  241. data/doc/ex/nested_rvg.rb +0 -21
  242. data/doc/ex/nonzero.rb +0 -42
  243. data/doc/ex/normalize.rb +0 -11
  244. data/doc/ex/oil_paint.rb +0 -11
  245. data/doc/ex/opacity.rb +0 -37
  246. data/doc/ex/ordered_dither.rb +0 -11
  247. data/doc/ex/path.rb +0 -63
  248. data/doc/ex/pattern1.rb +0 -25
  249. data/doc/ex/pattern2.rb +0 -26
  250. data/doc/ex/polaroid.rb +0 -26
  251. data/doc/ex/polygon.rb +0 -23
  252. data/doc/ex/polygon01.rb +0 -21
  253. data/doc/ex/polyline.rb +0 -22
  254. data/doc/ex/polyline01.rb +0 -21
  255. data/doc/ex/posterize.rb +0 -8
  256. data/doc/ex/preview.rb +0 -8
  257. data/doc/ex/qbezierpath.rb +0 -52
  258. data/doc/ex/quad01.rb +0 -34
  259. data/doc/ex/quantize-m.rb +0 -25
  260. data/doc/ex/radial_blur.rb +0 -9
  261. data/doc/ex/raise.rb +0 -8
  262. data/doc/ex/random_threshold_channel.rb +0 -13
  263. data/doc/ex/rect01.rb +0 -14
  264. data/doc/ex/rect02.rb +0 -20
  265. data/doc/ex/rectangle.rb +0 -34
  266. data/doc/ex/reduce_noise.rb +0 -28
  267. data/doc/ex/remap.rb +0 -11
  268. data/doc/ex/remap_images.rb +0 -19
  269. data/doc/ex/resize_to_fill.rb +0 -8
  270. data/doc/ex/resize_to_fit.rb +0 -8
  271. data/doc/ex/roll.rb +0 -9
  272. data/doc/ex/rotate.rb +0 -44
  273. data/doc/ex/rotate_f.rb +0 -14
  274. data/doc/ex/roundrect.rb +0 -33
  275. data/doc/ex/rubyname.rb +0 -30
  276. data/doc/ex/rvg_clippath.rb +0 -12
  277. data/doc/ex/rvg_linecap.rb +0 -42
  278. data/doc/ex/rvg_linejoin.rb +0 -40
  279. data/doc/ex/rvg_opacity.rb +0 -18
  280. data/doc/ex/rvg_pattern.rb +0 -26
  281. data/doc/ex/rvg_stroke_dasharray.rb +0 -11
  282. data/doc/ex/segment.rb +0 -11
  283. data/doc/ex/sepiatone.rb +0 -7
  284. data/doc/ex/shade.rb +0 -11
  285. data/doc/ex/shadow.rb +0 -30
  286. data/doc/ex/shave.rb +0 -15
  287. data/doc/ex/shear.rb +0 -10
  288. data/doc/ex/sketch.rb +0 -17
  289. data/doc/ex/skewx.rb +0 -51
  290. data/doc/ex/skewy.rb +0 -47
  291. data/doc/ex/smile.rb +0 -126
  292. data/doc/ex/solarize.rb +0 -11
  293. data/doc/ex/sparse_color.rb +0 -55
  294. data/doc/ex/splice.rb +0 -8
  295. data/doc/ex/spread.rb +0 -11
  296. data/doc/ex/stegano.rb +0 -54
  297. data/doc/ex/stroke_dasharray.rb +0 -42
  298. data/doc/ex/stroke_fill.rb +0 -10
  299. data/doc/ex/stroke_linecap.rb +0 -44
  300. data/doc/ex/stroke_linejoin.rb +0 -48
  301. data/doc/ex/stroke_width.rb +0 -49
  302. data/doc/ex/swirl.rb +0 -17
  303. data/doc/ex/text.rb +0 -37
  304. data/doc/ex/text01.rb +0 -16
  305. data/doc/ex/text_align.rb +0 -36
  306. data/doc/ex/text_antialias.rb +0 -37
  307. data/doc/ex/text_styles.rb +0 -19
  308. data/doc/ex/text_undercolor.rb +0 -28
  309. data/doc/ex/texture_fill_to_border.rb +0 -34
  310. data/doc/ex/texture_floodfill.rb +0 -32
  311. data/doc/ex/texturefill.rb +0 -24
  312. data/doc/ex/threshold.rb +0 -13
  313. data/doc/ex/to_blob.rb +0 -13
  314. data/doc/ex/translate.rb +0 -39
  315. data/doc/ex/transparent.rb +0 -38
  316. data/doc/ex/transpose.rb +0 -9
  317. data/doc/ex/transverse.rb +0 -9
  318. data/doc/ex/tref01.rb +0 -24
  319. data/doc/ex/triangle01.rb +0 -15
  320. data/doc/ex/trim.rb +0 -23
  321. data/doc/ex/tspan01.rb +0 -17
  322. data/doc/ex/tspan02.rb +0 -17
  323. data/doc/ex/tspan03.rb +0 -19
  324. data/doc/ex/unsharp_mask.rb +0 -28
  325. data/doc/ex/viewex.rb +0 -33
  326. data/doc/ex/vignette.rb +0 -12
  327. data/doc/ex/watermark.rb +0 -27
  328. data/doc/ex/wave.rb +0 -9
  329. data/doc/ex/wet_floor.rb +0 -58
  330. data/doc/ex/writing_mode01.rb +0 -26
  331. data/doc/ex/writing_mode02.rb +0 -26
  332. data/doc/ilist.html +0 -2056
  333. data/doc/image1.html +0 -4680
  334. data/doc/image2.html +0 -3665
  335. data/doc/image3.html +0 -4522
  336. data/doc/imageattrs.html +0 -1638
  337. data/doc/imusage.html +0 -514
  338. data/doc/index.html +0 -416
  339. data/doc/info.html +0 -1499
  340. data/doc/magick.html +0 -570
  341. data/doc/optequiv.html +0 -2435
  342. data/doc/rvg.html +0 -975
  343. data/doc/rvgclip.html +0 -248
  344. data/doc/rvggroup.html +0 -305
  345. data/doc/rvgimage.html +0 -289
  346. data/doc/rvgpattern.html +0 -475
  347. data/doc/rvgshape.html +0 -406
  348. data/doc/rvgstyle.html +0 -270
  349. data/doc/rvgtext.html +0 -465
  350. data/doc/rvgtspan.html +0 -238
  351. data/doc/rvgtut.html +0 -530
  352. data/doc/rvguse.html +0 -145
  353. data/doc/rvgxform.html +0 -294
  354. data/doc/scripts/doc.js +0 -22
  355. data/doc/scripts/stripeTables.js +0 -23
  356. data/doc/struct.html +0 -1339
  357. data/doc/usage.html +0 -1621
  358. data/examples/constitute.rb +0 -7
  359. data/examples/crop_with_gravity.rb +0 -43
  360. data/examples/demo.rb +0 -323
  361. data/examples/describe.rb +0 -41
  362. data/examples/find_similar_region.rb +0 -34
  363. data/examples/histogram.rb +0 -312
  364. data/examples/identify.rb +0 -174
  365. data/examples/image_opacity.rb +0 -28
  366. data/examples/import_export.rb +0 -31
  367. data/examples/pattern_fill.rb +0 -37
  368. data/examples/rotating_text.rb +0 -45
  369. data/examples/spinner.rb +0 -49
  370. data/examples/thumbnail.rb +0 -64
  371. data/examples/vignette.rb +0 -78
  372. data/spec/rmagick/ImageList1_spec.rb +0 -24
  373. data/spec/rmagick/draw_spec.rb +0 -155
  374. data/spec/rmagick/image/blue_shift_spec.rb +0 -14
  375. data/spec/rmagick/image/channel_entropy_spec.rb +0 -9
  376. data/spec/rmagick/image/composite_spec.rb +0 -72
  377. data/spec/rmagick/image/constitute_spec.rb +0 -13
  378. data/spec/rmagick/image/dispatch_spec.rb +0 -16
  379. data/spec/rmagick/image/dissolve_spec.rb +0 -54
  380. data/spec/rmagick/image/from_blob_spec.rb +0 -12
  381. data/spec/rmagick/image/ping_spec.rb +0 -12
  382. data/spec/rmagick/image/properties_spec.rb +0 -27
  383. data/spec/rmagick/image/read_spec.rb +0 -28
  384. data/spec/spec_helper.rb +0 -9
  385. data/spec/support/issue_200/app.rb +0 -8
  386. data/test/Draw.rb +0 -351
  387. data/test/Enum.rb +0 -228
  388. data/test/Fill.rb +0 -93
  389. data/test/Image1.rb +0 -606
  390. data/test/Image2.rb +0 -1408
  391. data/test/Image3.rb +0 -1086
  392. data/test/ImageList1.rb +0 -858
  393. data/test/ImageList2.rb +0 -375
  394. data/test/Image_attributes.rb +0 -635
  395. data/test/Import_Export.rb +0 -111
  396. data/test/Info.rb +0 -436
  397. data/test/KernelInfo.rb +0 -59
  398. data/test/Magick.rb +0 -311
  399. data/test/Pixel.rb +0 -259
  400. data/test/PolaroidOptions.rb +0 -23
  401. data/test/Preview.rb +0 -26
  402. data/test/Struct.rb +0 -45
  403. data/test/appearance/Montage.rb +0 -26
  404. data/test/appearance/appearance_assertion.rb +0 -13
  405. data/test/appearance/expected/montage_border_color.jpg +0 -0
  406. data/test/cmyk.icm +0 -0
  407. data/test/lib/internal/Draw.rb +0 -811
  408. data/test/lib/internal/Geometry.rb +0 -98
  409. data/test/lib/internal/Magick.rb +0 -40
  410. data/test/srgb.icm +0 -0
  411. data/test/test_all_basic.rb +0 -49
  412. data/test/tmpnam_test.rb +0 -50
@@ -1,5 +1,5 @@
1
1
  module Magick
2
- VERSION = '4.1.0.rc2'
2
+ VERSION = '4.1.0'
3
3
  MIN_RUBY_VERSION = '2.3.0'
4
4
  MIN_IM_VERSION = '6.7.7'
5
5
  end
@@ -19,6 +19,7 @@ if RUBY_PLATFORM =~ /mingw/i
19
19
  end
20
20
 
21
21
  require 'English'
22
+ require 'observer'
22
23
  require 'RMagick2.so'
23
24
 
24
25
  module Magick
@@ -28,6 +29,29 @@ module Magick
28
29
  IMAGEMAGICK_VERSION = Magick::Magick_version.split[1].split('-').first
29
30
 
30
31
  class << self
32
+ # Describes the image formats supported by ImageMagick.
33
+ # If the optional block is present, calls the block once for each image format.
34
+ # The first argument, +k+, is the format name. The second argument, +v+, is the
35
+ # properties string described below.
36
+ #
37
+ # - +B+ is "*" if the format has native blob support, or " " otherwise.
38
+ # - +R+ is "r" if ImageMagick can read that format, or "-" otherwise.
39
+ # - +W+ is "w" if ImageMagick can write that format, or "-" otherwise.
40
+ # - +A+ is "+" if the format supports multi-image files, or "-" otherwise.
41
+ #
42
+ # @overload formats
43
+ # @return [Hash] the formats hash
44
+ #
45
+ # @overload formats
46
+ # @yield [k, v]
47
+ # @yieldparam k [String] the format name
48
+ # @yieldparam v [String] the properties string
49
+ # @return [Magick]
50
+ #
51
+ # @example
52
+ # p Magick.formats
53
+ # => {"3FR"=>" r-+", "3G2"=>" r-+", "3GP"=>" r-+", "A"=>"*rw+",
54
+ # ...
31
55
  def formats
32
56
  @formats ||= init_formats
33
57
 
@@ -39,7 +63,26 @@ module Magick
39
63
  end
40
64
  end
41
65
 
42
- # remove reference to the proc at exit
66
+ # If the Magick module attribute +trace_proc+ is set to a Proc object,
67
+ # RMagick calls the proc whenever an image is created or destroyed.
68
+ #
69
+ # You can use this proc to keep track of which images your program has created
70
+ # and which have been destroyed.
71
+ #
72
+ # @param p [Proc] The proc object.
73
+ # The following value will be passed into the proc object.
74
+ # - +which+ - A symbol that indicates which operation the proc is being called for.
75
+ # If the proc is called for an image creation, the value is +:c+.
76
+ # If called for an image destruction, the value is +:d+.
77
+ # - +description+ - A string describing the image. This is the same string that
78
+ # would be returned by calling the image's inspect method.
79
+ # - +id+ - A unique identifier for the image. This identifier is not the same as the object's +object_id+.
80
+ # - +method+ - The name of the method responsible for creating or destroying the image.
81
+ #
82
+ # @example
83
+ # Magick.trace_proc = proc do |which, description, id, method|
84
+ # ...
85
+ # end
43
86
  def trace_proc=(p)
44
87
  m = Mutex.new
45
88
  m.synchronize do
@@ -67,12 +110,14 @@ module Magick
67
110
 
68
111
  class Geometry
69
112
  FLAGS = ['', '%', '!', '<', '>', '@', '^']
70
- RFLAGS = { '%' => PercentGeometry,
71
- '!' => AspectGeometry,
72
- '<' => LessGeometry,
73
- '>' => GreaterGeometry,
74
- '@' => AreaGeometry,
75
- '^' => MinimumGeometry }
113
+ RFLAGS = {
114
+ '%' => PercentGeometry,
115
+ '!' => AspectGeometry,
116
+ '<' => LessGeometry,
117
+ '>' => GreaterGeometry,
118
+ '@' => AreaGeometry,
119
+ '^' => MinimumGeometry
120
+ }
76
121
 
77
122
  attr_accessor :width, :height, :x, :y, :flag
78
123
 
@@ -131,7 +176,7 @@ module Magick
131
176
  str = ''
132
177
  if @width > 0
133
178
  fmt = @width.truncate == @width ? '%d' : '%.2f'
134
- str << format(fmt, @width)
179
+ str << sprintf(fmt, @width)
135
180
  str << '%' if @flag == PercentGeometry
136
181
  end
137
182
 
@@ -139,10 +184,10 @@ module Magick
139
184
 
140
185
  if @height > 0
141
186
  fmt = @height.truncate == @height ? '%d' : '%.2f'
142
- str << format(fmt, @height)
187
+ str << sprintf(fmt, @height)
143
188
  str << '%' if @flag == PercentGeometry
144
189
  end
145
- str << format('%+d%+d', @x, @y) if @x != 0 || @y != 0
190
+ str << sprintf('%+d%+d', @x, @y) if @x != 0 || @y != 0
146
191
  str << FLAGS[@flag.to_i] if @flag != PercentGeometry
147
192
  str
148
193
  end
@@ -233,7 +278,7 @@ module Magick
233
278
  # Apply coordinate transformations to support scaling (s), rotation (r),
234
279
  # and translation (t). Angles are specified in radians.
235
280
  def affine(sx, rx, ry, sy, tx, ty)
236
- primitive 'affine ' + format('%g,%g,%g,%g,%g,%g', sx, rx, ry, sy, tx, ty)
281
+ primitive 'affine ' + sprintf('%g,%g,%g,%g,%g,%g', sx, rx, ry, sy, tx, ty)
237
282
  end
238
283
 
239
284
  # Set alpha (make transparent) in image according to the specified
@@ -241,13 +286,15 @@ module Magick
241
286
  def alpha(x, y, method)
242
287
  Kernel.raise ArgumentError, 'Unknown paint method' unless PAINT_METHOD_NAMES.key?(method.to_i)
243
288
  name = Gem::Version.new(Magick::IMAGEMAGICK_VERSION) > Gem::Version.new('7.0.0') ? 'alpha ' : 'matte '
244
- primitive name + format('%g,%g, %s', x, y, PAINT_METHOD_NAMES[method.to_i])
289
+ primitive name + sprintf('%g,%g, %s', x, y, PAINT_METHOD_NAMES[method.to_i])
245
290
  end
246
291
 
247
292
  # Draw an arc.
248
293
  def arc(start_x, start_y, end_x, end_y, start_degrees, end_degrees)
249
- primitive 'arc ' + format('%g,%g %g,%g %g,%g',
250
- start_x, start_y, end_x, end_y, start_degrees, end_degrees)
294
+ primitive 'arc ' + sprintf(
295
+ '%g,%g %g,%g %g,%g',
296
+ start_x, start_y, end_x, end_y, start_degrees, end_degrees
297
+ )
251
298
  end
252
299
 
253
300
  # Draw a bezier curve.
@@ -257,12 +304,12 @@ module Magick
257
304
  elsif points.length.odd?
258
305
  Kernel.raise ArgumentError, 'odd number of arguments specified'
259
306
  end
260
- primitive 'bezier ' + points.map! { |x| format('%g', x) }.join(',')
307
+ primitive 'bezier ' + points.map! { |x| sprintf('%g', x) }.join(',')
261
308
  end
262
309
 
263
310
  # Draw a circle
264
311
  def circle(origin_x, origin_y, perim_x, perim_y)
265
- primitive 'circle ' + format('%g,%g %g,%g', origin_x, origin_y, perim_x, perim_y)
312
+ primitive 'circle ' + sprintf('%g,%g %g,%g', origin_x, origin_y, perim_x, perim_y)
266
313
  end
267
314
 
268
315
  # Invoke a clip-path defined by def_clip_path.
@@ -286,7 +333,7 @@ module Magick
286
333
  # point, replace, floodfill, filltoborder,reset
287
334
  def color(x, y, method)
288
335
  Kernel.raise ArgumentError, "Unknown PaintMethod: #{method}" unless PAINT_METHOD_NAMES.key?(method.to_i)
289
- primitive 'color ' + format('%g,%g,%s', x, y, PAINT_METHOD_NAMES[method.to_i])
336
+ primitive 'color ' + sprintf('%g,%g,%s', x, y, PAINT_METHOD_NAMES[method.to_i])
290
337
  end
291
338
 
292
339
  # Specify EITHER the text decoration (none, underline, overline,
@@ -317,8 +364,10 @@ module Magick
317
364
 
318
365
  # Draw an ellipse
319
366
  def ellipse(origin_x, origin_y, width, height, arc_start, arc_end)
320
- primitive 'ellipse ' + format('%g,%g %g,%g %g,%g',
321
- origin_x, origin_y, width, height, arc_start, arc_end)
367
+ primitive 'ellipse ' + sprintf(
368
+ '%g,%g %g,%g %g,%g',
369
+ origin_x, origin_y, width, height, arc_start, arc_end
370
+ )
322
371
  end
323
372
 
324
373
  # Let anything through, but the only defined argument
@@ -384,7 +433,7 @@ module Magick
384
433
  def image(composite, x, y, width, height, image_file_path)
385
434
  Kernel.raise ArgumentError, 'Unknown composite' unless composite.is_a?(CompositeOperator)
386
435
  composite_name = composite.to_s.sub!('CompositeOp', '')
387
- primitive 'image ' + format('%s %g,%g %g,%g %s', composite_name, x, y, width, height, enquote(image_file_path))
436
+ primitive 'image ' + sprintf('%s %g,%g %g,%g %s', composite_name, x, y, width, height, enquote(image_file_path))
388
437
  end
389
438
 
390
439
  # IM 6.5.5-8 and later
@@ -425,7 +474,7 @@ module Magick
425
474
 
426
475
  # Draw a line
427
476
  def line(start_x, start_y, end_x, end_y)
428
- primitive 'line ' + format('%g,%g %g,%g', start_x, start_y, end_x, end_y)
477
+ primitive 'line ' + sprintf('%g,%g %g,%g', start_x, start_y, end_x, end_y)
429
478
  end
430
479
 
431
480
  # Specify drawing fill and stroke opacities. If the value is a string
@@ -447,7 +496,7 @@ module Magick
447
496
  # as the argument to the 'fill' or 'stroke' methods
448
497
  def pattern(name, x, y, width, height)
449
498
  push('defs')
450
- push("pattern #{name} " + format('%g %g %g %g', x, y, width, height))
499
+ push("pattern #{name} " + sprintf('%g %g %g %g', x, y, width, height))
451
500
  push('graphic-context')
452
501
  yield
453
502
  ensure
@@ -458,13 +507,13 @@ module Magick
458
507
 
459
508
  # Set point to fill color.
460
509
  def point(x, y)
461
- primitive 'point ' + format('%g,%g', x, y)
510
+ primitive 'point ' + sprintf('%g,%g', x, y)
462
511
  end
463
512
 
464
513
  # Specify the font size in points. Yes, the primitive is "font-size" but
465
514
  # in other places this value is called the "pointsize". Give it both names.
466
515
  def pointsize(points)
467
- primitive 'font-size ' + format('%g', points)
516
+ primitive 'font-size ' + sprintf('%g', points)
468
517
  end
469
518
  alias font_size pointsize
470
519
 
@@ -475,7 +524,7 @@ module Magick
475
524
  elsif points.length.odd?
476
525
  Kernel.raise ArgumentError, 'odd number of points specified'
477
526
  end
478
- primitive 'polygon ' + points.map! { |x| format('%g', x) }.join(',')
527
+ primitive 'polygon ' + points.map! { |x| sprintf('%g', x) }.join(',')
479
528
  end
480
529
 
481
530
  # Draw a polyline
@@ -485,7 +534,7 @@ module Magick
485
534
  elsif points.length.odd?
486
535
  Kernel.raise ArgumentError, 'odd number of points specified'
487
536
  end
488
- primitive 'polyline ' + points.map! { |x| format('%g', x) }.join(',')
537
+ primitive 'polyline ' + points.map! { |x| sprintf('%g', x) }.join(',')
489
538
  end
490
539
 
491
540
  # Return to the previously-saved set of whatever
@@ -519,32 +568,36 @@ module Magick
519
568
 
520
569
  # Draw a rectangle
521
570
  def rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
522
- primitive 'rectangle ' + format('%g,%g %g,%g',
523
- upper_left_x, upper_left_y, lower_right_x, lower_right_y)
571
+ primitive 'rectangle ' + sprintf(
572
+ '%g,%g %g,%g',
573
+ upper_left_x, upper_left_y, lower_right_x, lower_right_y
574
+ )
524
575
  end
525
576
 
526
577
  # Specify coordinate space rotation. "angle" is measured in degrees
527
578
  def rotate(angle)
528
- primitive 'rotate ' + format('%g', angle)
579
+ primitive 'rotate ' + sprintf('%g', angle)
529
580
  end
530
581
 
531
582
  # Draw a rectangle with rounded corners
532
583
  def roundrectangle(center_x, center_y, width, height, corner_width, corner_height)
533
- primitive 'roundrectangle ' + format('%g,%g,%g,%g,%g,%g',
534
- center_x, center_y, width, height, corner_width, corner_height)
584
+ primitive 'roundrectangle ' + sprintf(
585
+ '%g,%g,%g,%g,%g,%g',
586
+ center_x, center_y, width, height, corner_width, corner_height
587
+ )
535
588
  end
536
589
 
537
590
  # Specify scaling to be applied to coordinate space on subsequent drawing commands.
538
591
  def scale(x, y)
539
- primitive 'scale ' + format('%g,%g', x, y)
592
+ primitive 'scale ' + sprintf('%g,%g', x, y)
540
593
  end
541
594
 
542
595
  def skewx(angle)
543
- primitive 'skewX ' + format('%g', angle)
596
+ primitive 'skewX ' + sprintf('%g', angle)
544
597
  end
545
598
 
546
599
  def skewy(angle)
547
- primitive 'skewY ' + format('%g', angle)
600
+ primitive 'skewY ' + sprintf('%g', angle)
548
601
  end
549
602
 
550
603
  # Specify the object stroke, a color name or pattern name.
@@ -574,7 +627,7 @@ module Magick
574
627
 
575
628
  # Specify the initial offset in the dash pattern
576
629
  def stroke_dashoffset(value = 0)
577
- primitive 'stroke-dashoffset ' + format('%g', value)
630
+ primitive 'stroke-dashoffset ' + sprintf('%g', value)
578
631
  end
579
632
 
580
633
  def stroke_linecap(value)
@@ -601,7 +654,7 @@ module Magick
601
654
 
602
655
  # Specify stroke (outline) width in pixels.
603
656
  def stroke_width(pixels)
604
- primitive 'stroke-width ' + format('%g', pixels)
657
+ primitive 'stroke-width ' + sprintf('%g', pixels)
605
658
  end
606
659
 
607
660
  # Draw text at position x,y. Add quotes to text that is not already quoted.
@@ -619,7 +672,7 @@ module Magick
619
672
  # escape existing braces, surround with braces
620
673
  text = '{' + text.gsub(/[}]/) { |b| '\\' + b } + '}'
621
674
  end
622
- primitive 'text ' + format('%g,%g %s', x, y, text)
675
+ primitive 'text ' + sprintf('%g,%g %s', x, y, text)
623
676
  end
624
677
 
625
678
  # Specify text alignment relative to a given point
@@ -648,7 +701,7 @@ module Magick
648
701
  # Specify center of coordinate space to use for subsequent drawing
649
702
  # commands.
650
703
  def translate(x, y)
651
- primitive 'translate ' + format('%g,%g', x, y)
704
+ primitive 'translate ' + sprintf('%g,%g', x, y)
652
705
  end
653
706
  end # class Magick::Draw
654
707
 
@@ -856,7 +909,7 @@ module Magick
856
909
  else
857
910
  get_exif_by_number # ensure properties is populated with exif data
858
911
  tag.each do |num|
859
- rval = self[format('#%04X', num.to_i)]
912
+ rval = self[sprintf('#%04X', num.to_i)]
860
913
  hash[num] = rval == 'unknown' ? nil : rval
861
914
  end
862
915
  end
@@ -1064,7 +1117,7 @@ module Magick
1064
1117
 
1065
1118
  # Define a getter and a setter for each channel.
1066
1119
  %i[red green blue opacity].each do |c|
1067
- module_eval <<-END_EVAL
1120
+ module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
1068
1121
  def #{c}
1069
1122
  return collect { |p| p.#{c} }
1070
1123
  end
@@ -1120,7 +1173,6 @@ module Magick
1120
1173
  each { |x| @view[x] = rv.dup }
1121
1174
  changed
1122
1175
  notify_observers(self)
1123
- nil
1124
1176
  end
1125
1177
 
1126
1178
  # A pixel has been modified. Tell the view.
@@ -1243,16 +1295,14 @@ module Magick
1243
1295
 
1244
1296
  protected
1245
1297
 
1246
- def is_an_image(obj)
1298
+ def assert_image(obj)
1247
1299
  Kernel.raise ArgumentError, "Magick::Image required (#{obj.class} given)" unless obj.is_a? Magick::Image
1248
- true
1249
1300
  end
1250
1301
 
1251
1302
  # Ensure array is always an array of Magick::Image objects
1252
- def is_an_image_array(ary)
1303
+ def assert_image_array(ary)
1253
1304
  Kernel.raise ArgumentError, "Magick::ImageList or array of Magick::Images required (#{ary.class} given)" unless ary.respond_to? :each
1254
- ary.each { |obj| is_an_image obj }
1255
- true
1305
+ ary.each { |obj| assert_image obj }
1256
1306
  end
1257
1307
 
1258
1308
  # Find old current image, update scene number
@@ -1284,7 +1334,7 @@ module Magick
1284
1334
  if n.nil?
1285
1335
  Kernel.raise IndexError, 'scene number out of bounds' unless @images.length.zero?
1286
1336
  @scene = nil
1287
- return @scene
1337
+ return
1288
1338
  elsif @images.length.zero?
1289
1339
  Kernel.raise IndexError, 'scene number out of bounds'
1290
1340
  end
@@ -1292,13 +1342,12 @@ module Magick
1292
1342
  n = Integer(n)
1293
1343
  Kernel.raise IndexError, 'scene number out of bounds' if n < 0 || n > length - 1
1294
1344
  @scene = n
1295
- @scene
1296
1345
  end
1297
1346
 
1298
1347
  # All the binary operators work the same way.
1299
1348
  # 'other' should be either an ImageList or an Array
1300
1349
  %w[& + - |].each do |op|
1301
- module_eval <<-END_BINOPS
1350
+ module_eval <<-END_BINOPS, __FILE__, __LINE__ + 1
1302
1351
  def #{op}(other)
1303
1352
  ilist = self.class.new
1304
1353
  begin
@@ -1308,7 +1357,7 @@ module Magick
1308
1357
  end
1309
1358
  current = get_current()
1310
1359
  a.each do |image|
1311
- is_an_image image
1360
+ assert_image image
1312
1361
  ilist << image
1313
1362
  end
1314
1363
  ilist.set_current current
@@ -1327,7 +1376,7 @@ module Magick
1327
1376
  end
1328
1377
 
1329
1378
  def <<(obj)
1330
- is_an_image obj
1379
+ assert_image obj
1331
1380
  @images << obj
1332
1381
  @scene = @images.length - 1
1333
1382
  self
@@ -1368,20 +1417,21 @@ module Magick
1368
1417
  def []=(*args)
1369
1418
  obj = @images.[]=(*args)
1370
1419
  if obj && obj.respond_to?(:each)
1371
- is_an_image_array(obj)
1420
+ assert_image_array(obj)
1372
1421
  set_current obj.last.__id__
1373
1422
  elsif obj
1374
- is_an_image(obj)
1423
+ assert_image(obj)
1375
1424
  set_current obj.__id__
1376
1425
  else
1377
1426
  set_current nil
1378
1427
  end
1379
- obj
1380
1428
  end
1381
1429
 
1382
- %i[at each each_index empty? fetch
1383
- first hash include? index length rindex sort!].each do |mth|
1384
- module_eval <<-END_SIMPLE_DELEGATES
1430
+ %i[
1431
+ at each each_index empty? fetch
1432
+ first hash include? index length rindex sort!
1433
+ ].each do |mth|
1434
+ module_eval <<-END_SIMPLE_DELEGATES, __FILE__, __LINE__ + 1
1385
1435
  def #{mth}(*args, &block)
1386
1436
  @images.#{mth}(*args, &block)
1387
1437
  end
@@ -1403,7 +1453,7 @@ module Magick
1403
1453
  # override Enumerable#collect
1404
1454
  def collect(&block)
1405
1455
  current = get_current
1406
- a = @images.collect(&block)
1456
+ a = @images.map(&block)
1407
1457
  ilist = self.class.new
1408
1458
  a.each { |image| ilist << image }
1409
1459
  ilist.set_current current
@@ -1411,8 +1461,8 @@ module Magick
1411
1461
  end
1412
1462
 
1413
1463
  def collect!(&block)
1414
- @images.collect!(&block)
1415
- is_an_image_array @images
1464
+ @images.map!(&block)
1465
+ assert_image_array @images
1416
1466
  self
1417
1467
  end
1418
1468
 
@@ -1421,7 +1471,6 @@ module Magick
1421
1471
  ditto = self.class.new
1422
1472
  @images.each { |f| ditto << f.copy }
1423
1473
  ditto.scene = @scene
1424
- ditto.taint if tainted?
1425
1474
  ditto
1426
1475
  end
1427
1476
 
@@ -1432,6 +1481,7 @@ module Magick
1432
1481
  end
1433
1482
 
1434
1483
  # ImageList#map took over the "map" name. Use alternatives.
1484
+ alias map collect
1435
1485
  alias __map__ collect
1436
1486
  alias map! collect!
1437
1487
  alias __map__! collect!
@@ -1456,7 +1506,7 @@ module Magick
1456
1506
  end
1457
1507
 
1458
1508
  def concat(other)
1459
- is_an_image_array other
1509
+ assert_image_array other
1460
1510
  other.each { |image| @images << image }
1461
1511
  @scene = length - 1
1462
1512
  self
@@ -1470,7 +1520,7 @@ module Magick
1470
1520
  end
1471
1521
 
1472
1522
  def delete(obj, &block)
1473
- is_an_image obj
1523
+ assert_image obj
1474
1524
  current = get_current
1475
1525
  a = @images.delete(obj, &block)
1476
1526
  set_current current
@@ -1495,12 +1545,11 @@ module Magick
1495
1545
  ditto = self.class.new
1496
1546
  @images.each { |img| ditto << img }
1497
1547
  ditto.scene = @scene
1498
- ditto.taint if tainted?
1499
1548
  ditto
1500
1549
  end
1501
1550
 
1502
1551
  def eql?(other)
1503
- is_an_image_array other
1552
+ assert_image_array other
1504
1553
  eql = other.eql?(@images)
1505
1554
  begin # "other" is another ImageList
1506
1555
  eql &&= @scene == other.scene
@@ -1511,10 +1560,10 @@ module Magick
1511
1560
  end
1512
1561
 
1513
1562
  def fill(*args, &block)
1514
- is_an_image args[0] unless block_given?
1563
+ assert_image args[0] unless block_given?
1515
1564
  current = get_current
1516
1565
  @images.fill(*args, &block)
1517
- is_an_image_array self
1566
+ assert_image_array self
1518
1567
  set_current current
1519
1568
  self
1520
1569
  end
@@ -1522,7 +1571,7 @@ module Magick
1522
1571
  # Override Enumerable's find_all
1523
1572
  def find_all(&block)
1524
1573
  current = get_current
1525
- a = @images.find_all(&block)
1574
+ a = @images.select(&block)
1526
1575
  ilist = self.class.new
1527
1576
  a.each { |image| ilist << image }
1528
1577
  ilist.set_current current
@@ -1546,14 +1595,12 @@ module Magick
1546
1595
  filenames.each do |f|
1547
1596
  Magick::Image.read(f, &block).each { |n| @images << n }
1548
1597
  end
1549
- if length > 0
1550
- @scene = length - 1 # last image in array
1551
- end
1552
- self
1598
+
1599
+ @scene = length - 1 if length > 0 # last image in array
1553
1600
  end
1554
1601
 
1555
1602
  def insert(index, *args)
1556
- args.each { |image| is_an_image image }
1603
+ args.each { |image| assert_image image }
1557
1604
  current = get_current
1558
1605
  @images.insert(index, *args)
1559
1606
  set_current current
@@ -1572,7 +1619,6 @@ module Magick
1572
1619
  n = Integer(n)
1573
1620
  Kernel.raise ArgumentError, 'iterations must be between 0 and 65535' if n < 0 || n > 65_535
1574
1621
  @images.each { |f| f.iterations = n }
1575
- self
1576
1622
  end
1577
1623
 
1578
1624
  def last(*args)
@@ -1653,7 +1699,7 @@ module Magick
1653
1699
 
1654
1700
  def push(*objs)
1655
1701
  objs.each do |image|
1656
- is_an_image image
1702
+ assert_image image
1657
1703
  @images << image
1658
1704
  end
1659
1705
  @scene = length - 1
@@ -1689,7 +1735,7 @@ module Magick
1689
1735
  end
1690
1736
 
1691
1737
  def replace(other)
1692
- is_an_image_array other
1738
+ assert_image_array other
1693
1739
  current = get_current
1694
1740
  @images.clear
1695
1741
  other.each { |image| @images << image }
@@ -1787,7 +1833,7 @@ module Magick
1787
1833
 
1788
1834
  # @scene -> new object
1789
1835
  def unshift(obj)
1790
- is_an_image obj
1836
+ assert_image obj
1791
1837
  @images.unshift(obj)
1792
1838
  @scene = 0
1793
1839
  self
@@ -1804,6 +1850,11 @@ module Magick
1804
1850
  alias indices values_at
1805
1851
  end # Magick::ImageList
1806
1852
 
1853
+ class Pixel
1854
+ # include Observable for Image::View class
1855
+ include Observable
1856
+ end
1857
+
1807
1858
  # Collects non-specific optional method arguments
1808
1859
  class OptionalMethodArguments
1809
1860
  def initialize(img)