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
@@ -41,7 +41,7 @@ destroy_Montage(void *obj)
41
41
  }
42
42
  if (montage->info)
43
43
  {
44
- (void) DestroyMontageInfo(montage->info);
44
+ DestroyMontageInfo(montage->info);
45
45
  montage->info = NULL;
46
46
  }
47
47
  xfree(montage);
@@ -51,11 +51,7 @@ destroy_Montage(void *obj)
51
51
  /**
52
52
  * Create a new Montage object.
53
53
  *
54
- * Ruby usage:
55
- * - @verbatim Montage.new @endverbatim
56
- *
57
- * @param class the Ruby class to use
58
- * @return a new Montage object
54
+ * @return [Magick::ImageList::Montage] a new Montage object
59
55
  */
60
56
  VALUE
61
57
  Montage_alloc(VALUE class)
@@ -73,7 +69,7 @@ Montage_alloc(VALUE class)
73
69
  }
74
70
 
75
71
  montage_info = CloneMontageInfo(image_info, NULL);
76
- (void) (void) DestroyImageInfo(image_info);
72
+ (void) DestroyImageInfo(image_info);
77
73
 
78
74
  if (!montage_info)
79
75
  {
@@ -94,12 +90,8 @@ Montage_alloc(VALUE class)
94
90
  /**
95
91
  * Set background_color value.
96
92
  *
97
- * Ruby usage:
98
- * - @verbatim Magick::Montage#background_color(color-name) @endverbatim
99
- *
100
- * @param self this object
101
- * @param color the color name
102
- * @return color
93
+ * @param color [Magick::Pixel, String] the color name
94
+ * @return [Magick::Pixel, String] the given color name
103
95
  */
104
96
  VALUE
105
97
  Montage_background_color_eq(VALUE self, VALUE color)
@@ -115,12 +107,8 @@ Montage_background_color_eq(VALUE self, VALUE color)
115
107
  /**
116
108
  * Set border_color value.
117
109
  *
118
- * Ruby usage:
119
- * - @verbatim Magick::Montage#border_color(color-name) @endverbatim
120
- *
121
- * @param self this object
122
- * @param color the color name
123
- * @return color
110
+ * @param color [Magick::Pixel, String] the color name
111
+ * @return [Magick::Pixel, String] the given color name
124
112
  */
125
113
  VALUE
126
114
  Montage_border_color_eq(VALUE self, VALUE color)
@@ -136,12 +124,8 @@ Montage_border_color_eq(VALUE self, VALUE color)
136
124
  /**
137
125
  * Set border_width value.
138
126
  *
139
- * Ruby usage:
140
- * - @verbatim Magick::Montage#border_width(width) @endverbatim
141
- *
142
- * @param self this object
143
- * @param width the width
144
- * @return width
127
+ * @param width [Numeric] the width
128
+ * @return [Numeric] the given width
145
129
  */
146
130
  VALUE
147
131
  Montage_border_width_eq(VALUE self, VALUE width)
@@ -157,12 +141,8 @@ Montage_border_width_eq(VALUE self, VALUE width)
157
141
  /**
158
142
  * Set a composition operator.
159
143
  *
160
- * Ruby usage:
161
- * - @verbatim Magick::Montage#compose(width) @endverbatim
162
- *
163
- * @param self this object
164
- * @param compose the composition operator
165
- * @return compose
144
+ * @param compose [Magick::CompositeOperator] the composition operator
145
+ * @return [Magick::CompositeOperator] the given compose operator
166
146
  */
167
147
  VALUE
168
148
  Montage_compose_eq(VALUE self, VALUE compose)
@@ -178,12 +158,8 @@ Montage_compose_eq(VALUE self, VALUE compose)
178
158
  /**
179
159
  * Set filename value.
180
160
  *
181
- * Ruby usage:
182
- * - @verbatim Magick::Montage#filename(name) @endverbatim
183
- *
184
- * @param self this object
185
- * @param filename the filename
186
- * @return filename
161
+ * @param filename [String] the filename
162
+ * @return [String] filename
187
163
  */
188
164
  VALUE
189
165
  Montage_filename_eq(VALUE self, VALUE filename)
@@ -191,7 +167,7 @@ Montage_filename_eq(VALUE self, VALUE filename)
191
167
  Montage *montage;
192
168
 
193
169
  Data_Get_Struct(self, Montage, montage);
194
- strncpy(montage->info->filename, StringValuePtr(filename), MaxTextExtent-1);
170
+ strlcpy(montage->info->filename, StringValueCStr(filename), sizeof(montage->info->filename));
195
171
  return filename;
196
172
  }
197
173
 
@@ -199,12 +175,8 @@ Montage_filename_eq(VALUE self, VALUE filename)
199
175
  /**
200
176
  * Set fill value.
201
177
  *
202
- * Ruby usage:
203
- * - @verbatim Magick::Montage#fill(color-name) @endverbatim
204
- *
205
- * @param self this object
206
- * @param color the color name
207
- * @return color
178
+ * @param color [Magick::Pixel, String] the color name
179
+ * @return [Magick::Pixel, String] the given color name
208
180
  */
209
181
  VALUE
210
182
  Montage_fill_eq(VALUE self, VALUE color)
@@ -220,12 +192,8 @@ Montage_fill_eq(VALUE self, VALUE color)
220
192
  /**
221
193
  * Set font value.
222
194
  *
223
- * Ruby usage:
224
- * - @verbatim Magick::Montage#font(font-name) @endverbatim
225
- *
226
- * @param self this object
227
- * @param font the font name
228
- * @return font
195
+ * @param font [String] the font name
196
+ * @return [String] the given font name
229
197
  */
230
198
  VALUE
231
199
  Montage_font_eq(VALUE self, VALUE font)
@@ -233,7 +201,7 @@ Montage_font_eq(VALUE self, VALUE font)
233
201
  Montage *montage;
234
202
 
235
203
  Data_Get_Struct(self, Montage, montage);
236
- magick_clone_string(&montage->info->font, StringValuePtr(font));
204
+ magick_clone_string(&montage->info->font, StringValueCStr(font));
237
205
 
238
206
  return font;
239
207
  }
@@ -242,17 +210,12 @@ Montage_font_eq(VALUE self, VALUE font)
242
210
  /**
243
211
  * Set frame value.
244
212
  *
245
- * Ruby usage:
246
- * - @verbatim Magick::Montage#frame(frame-geometry) @endverbatim
247
- *
248
- * Notes:
249
- * - The geometry is a string in the form:
250
- * @verbatim <width>x<height>+<outer-bevel-width>+<inner-bevel-width> @endverbatim
251
- * or a Geometry object
213
+ * - The geometry is a string in the form:
214
+ * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
215
+ * or a Geometry object
252
216
  *
253
- * @param self this object
254
- * @param frame_arg the frame geometry
255
- * @return frame_arg
217
+ * @param frame_arg [String] the frame geometry
218
+ * @see https://www.imagemagick.org/Magick++/Geometry.html
256
219
  */
257
220
  VALUE
258
221
  Montage_frame_eq(VALUE self, VALUE frame_arg)
@@ -261,8 +224,8 @@ Montage_frame_eq(VALUE self, VALUE frame_arg)
261
224
  VALUE frame;
262
225
 
263
226
  Data_Get_Struct(self, Montage, montage);
264
- frame = rm_to_s(frame_arg);
265
- magick_clone_string(&montage->info->frame, StringValuePtr(frame));
227
+ frame = rb_String(frame_arg);
228
+ magick_clone_string(&montage->info->frame, StringValueCStr(frame));
266
229
 
267
230
  RB_GC_GUARD(frame);
268
231
 
@@ -273,12 +236,13 @@ Montage_frame_eq(VALUE self, VALUE frame_arg)
273
236
  /**
274
237
  * Set geometry value.
275
238
  *
276
- * Ruby usage:
277
- * - @verbatim Magick::Montage#geometry(geometry) @endverbatim
239
+ * - The geometry is a string in the form:
240
+ * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
241
+ * or a Geometry object
278
242
  *
279
- * @param self this object
280
- * @param geometry_arg the geometry
281
- * @return geometry_arg
243
+ * @param geometry_arg [String] the geometry
244
+ * @return [String] the given geometry
245
+ * @see https://www.imagemagick.org/Magick++/Geometry.html
282
246
  */
283
247
  VALUE
284
248
  Montage_geometry_eq(VALUE self, VALUE geometry_arg)
@@ -287,8 +251,8 @@ Montage_geometry_eq(VALUE self, VALUE geometry_arg)
287
251
  VALUE geometry;
288
252
 
289
253
  Data_Get_Struct(self, Montage, montage);
290
- geometry = rm_to_s(geometry_arg);
291
- magick_clone_string(&montage->info->geometry, StringValuePtr(geometry));
254
+ geometry = rb_String(geometry_arg);
255
+ magick_clone_string(&montage->info->geometry, StringValueCStr(geometry));
292
256
 
293
257
  RB_GC_GUARD(geometry);
294
258
 
@@ -299,12 +263,8 @@ Montage_geometry_eq(VALUE self, VALUE geometry_arg)
299
263
  /**
300
264
  * Set gravity value.
301
265
  *
302
- * Ruby usage:
303
- * - @verbatim Magick::Montage#gravity(gravity-type) @endverbatim
304
- *
305
- * @param self this object
306
- * @param gravity the gravity type
307
- * @return gravity
266
+ * @param gravity [Magick::GravityType] the gravity type
267
+ * @return [Magick::GravityType] the given gravity
308
268
  */
309
269
  VALUE
310
270
  Montage_gravity_eq(VALUE self, VALUE gravity)
@@ -320,11 +280,7 @@ Montage_gravity_eq(VALUE self, VALUE gravity)
320
280
  /**
321
281
  * Initialize a Montage object. Does nothing currently.
322
282
  *
323
- * Ruby usage:
324
- * - @verbatim Magick::Montage#initialize @endverbatim
325
- *
326
- * @param self this object
327
- * @return self
283
+ * @return [Magick::ImageList::Montage] self
328
284
  */
329
285
  VALUE
330
286
  Montage_initialize(VALUE self)
@@ -337,12 +293,8 @@ Montage_initialize(VALUE self)
337
293
  /**
338
294
  * Set matte_color value.
339
295
  *
340
- * Ruby usage:
341
- * - @verbatim Magick::Montage#matte_color(color-name) @endverbatim
342
- *
343
- * @param self this object
344
- * @param color the color name
345
- * @return color
296
+ * @param color [Magick::Pixel, String] the color name
297
+ * @return [Magick::Pixel, String] the given color name
346
298
  */
347
299
  VALUE
348
300
  Montage_matte_color_eq(VALUE self, VALUE color)
@@ -358,12 +310,8 @@ Montage_matte_color_eq(VALUE self, VALUE color)
358
310
  /**
359
311
  * Set pointsize value.
360
312
  *
361
- * Ruby usage:
362
- * - @verbatim Magick::Montage#pointsize= @endverbatim
363
- *
364
- * @param self this object
365
- * @param size the point size
366
- * @return size
313
+ * @param size [Numeric] the point size
314
+ * @return [Numeric] the given point size
367
315
  */
368
316
  VALUE
369
317
  Montage_pointsize_eq(VALUE self, VALUE size)
@@ -379,12 +327,8 @@ Montage_pointsize_eq(VALUE self, VALUE size)
379
327
  /**
380
328
  * Set shadow value.
381
329
  *
382
- * Ruby usage:
383
- * - @verbatim Magick::Montage#shadow= @endverbatim
384
- *
385
- * @param self this object
386
- * @param shadow the shadow
387
- * @return shadow
330
+ * @param shadow [Bool] true if the shadow will be enabled
331
+ * @return [Bool] the given value
388
332
  */
389
333
  VALUE
390
334
  Montage_shadow_eq(VALUE self, VALUE shadow)
@@ -400,12 +344,8 @@ Montage_shadow_eq(VALUE self, VALUE shadow)
400
344
  /**
401
345
  * Set stroke value.
402
346
  *
403
- * Ruby usage:
404
- * - @verbatim Magick::Montage#stroke(color-name) @endverbatim
405
- *
406
- * @param self this object
407
- * @param color the color name
408
- * @return self
347
+ * @param color [Magick::Pixel, String] the color name
348
+ * @return [Magick::Pixel, String] the given color name
409
349
  */
410
350
  VALUE
411
351
  Montage_stroke_eq(VALUE self, VALUE color)
@@ -421,12 +361,9 @@ Montage_stroke_eq(VALUE self, VALUE color)
421
361
  /**
422
362
  * Set texture value.
423
363
  *
424
- * Ruby usage:
425
- * - @verbatim Montage#texture(texture-image) @endverbatim
426
- *
427
- * @param self this object
428
- * @param texture the texture image
429
- * @return texture
364
+ * @param texture [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
365
+ * imagelist, uses the current image.
366
+ * @return [Magick::Image] the given texture image
430
367
  */
431
368
  VALUE
432
369
  Montage_texture_eq(VALUE self, VALUE texture)
@@ -450,7 +387,7 @@ Montage_texture_eq(VALUE self, VALUE texture)
450
387
  texture_image = rm_check_destroyed(texture);
451
388
 
452
389
  // Write a temp copy of the image & save its name.
453
- rm_write_temp_image(texture_image, temp_name);
390
+ rm_write_temp_image(texture_image, temp_name, sizeof(temp_name));
454
391
  magick_clone_string(&montage->info->texture, temp_name);
455
392
 
456
393
  return texture;
@@ -460,12 +397,13 @@ Montage_texture_eq(VALUE self, VALUE texture)
460
397
  /**
461
398
  * Set tile value.
462
399
  *
463
- * Ruby usage:
464
- * - @verbatim Magick::Montage#tile(tile) @endverbatim
400
+ * - The geometry is a string in the form:
401
+ * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
402
+ * or a Geometry object
465
403
  *
466
- * @param self this object
467
- * @param tile_arg the tile
468
- * @return tile_arg
404
+ * @param tile_arg [String] the tile geometry
405
+ * @return [String] the given tile geometry
406
+ * @see https://www.imagemagick.org/Magick++/Geometry.html
469
407
  */
470
408
  VALUE
471
409
  Montage_tile_eq(VALUE self, VALUE tile_arg)
@@ -474,8 +412,8 @@ Montage_tile_eq(VALUE self, VALUE tile_arg)
474
412
  VALUE tile;
475
413
 
476
414
  Data_Get_Struct(self, Montage, montage);
477
- tile = rm_to_s(tile_arg);
478
- magick_clone_string(&montage->info->tile, StringValuePtr(tile));
415
+ tile = rb_String(tile_arg);
416
+ magick_clone_string(&montage->info->tile, StringValueCStr(tile));
479
417
 
480
418
  RB_GC_GUARD(tile);
481
419
 
@@ -486,12 +424,8 @@ Montage_tile_eq(VALUE self, VALUE tile_arg)
486
424
  /**
487
425
  * Set title value.
488
426
  *
489
- * Ruby usage:
490
- * - @verbatim Magick::Montage#title(title) @endverbatim
491
- *
492
- * @param self this object
493
- * @param title the title
494
- * @return title
427
+ * @param title [String] the title
428
+ * @return [String] the given title
495
429
  */
496
430
  VALUE
497
431
  Montage_title_eq(VALUE self, VALUE title)
@@ -499,7 +433,7 @@ Montage_title_eq(VALUE self, VALUE title)
499
433
  Montage *montage;
500
434
 
501
435
  Data_Get_Struct(self, Montage, montage);
502
- magick_clone_string(&montage->info->title, StringValuePtr(title));
436
+ magick_clone_string(&montage->info->title, StringValueCStr(title));
503
437
  return title;
504
438
  }
505
439
 
@@ -16,53 +16,8 @@
16
16
  #define QueryColorname QueryMagickColorname
17
17
  #endif
18
18
 
19
- /*
20
- * Declare Pixel channel attribute writers
21
- */
22
- //! Pixel channel attribute writer.
23
- #define DEF_PIXEL_CHANNEL_WRITER(_channel_) \
24
- extern VALUE \
25
- Pixel_##_channel_##_eq(VALUE self, VALUE v) \
26
- { \
27
- Pixel *pixel; \
28
- \
29
- rb_check_frozen(self); \
30
- Data_Get_Struct(self, Pixel, pixel); \
31
- pixel->_channel_ = APP2QUANTUM(v); \
32
- (void) rb_funcall(self, rm_ID_changed, 0); \
33
- (void) rb_funcall(self, rm_ID_notify_observers, 1, self); \
34
- return QUANTUM2NUM((pixel->_channel_)); \
35
- }
36
-
37
-
38
- /*
39
- * Declare Pixel CMYK channel attribute accessors
40
- */
41
- //! Pixel CMYK channel attribute accessor.
42
- #define DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(_cmyk_channel_, _rgb_channel_) \
43
- extern VALUE \
44
- Pixel_##_cmyk_channel_##_eq(VALUE self, VALUE v) \
45
- { \
46
- Pixel *pixel; \
47
- \
48
- rb_check_frozen(self); \
49
- Data_Get_Struct(self, Pixel, pixel); \
50
- pixel->_rgb_channel_ = APP2QUANTUM(v); \
51
- (void) rb_funcall(self, rm_ID_changed, 0); \
52
- (void) rb_funcall(self, rm_ID_notify_observers, 1, self); \
53
- return QUANTUM2NUM(pixel->_rgb_channel_); \
54
- } \
55
- \
56
- extern VALUE \
57
- Pixel_##_cmyk_channel_(VALUE self) \
58
- { \
59
- Pixel *pixel; \
60
- \
61
- Data_Get_Struct(self, Pixel, pixel); \
62
- return INT2NUM(pixel->_rgb_channel_); \
63
- }
64
-
65
19
 
20
+ static VALUE color_arg_rescue(VALUE, VALUE ATTRIBUTE_UNUSED) ATTRIBUTE_NORETURN;
66
21
  static void Color_Name_to_PixelColor(PixelColor *, VALUE);
67
22
 
68
23
 
@@ -81,46 +36,42 @@ destroy_Pixel(Pixel *pixel)
81
36
 
82
37
 
83
38
  /**
84
- * Get Pixel red attribute.
85
- *
86
- * Ruby usage:
87
- * - @verbatim Pixel#red @endverbatim
39
+ * Get Pixel red value.
88
40
  *
89
- * @param self this object
90
- * @return the red value
41
+ * @return [Numeric] the red value
91
42
  */
92
- DEF_ATTR_READER(Pixel, red, int)
43
+ VALUE
44
+ Pixel_red(VALUE self)
45
+ {
46
+ IMPLEMENT_ATTR_READER(Pixel, red, int);
47
+ }
93
48
 
94
49
  /**
95
- * Get Pixel green attribute.
50
+ * Get Pixel green value.
96
51
  *
97
- * Ruby usage:
98
- * - @verbatim Pixel#green @endverbatim
99
- *
100
- * @param self this object
101
- * @return the green value
52
+ * @return [Numeric] the green value
102
53
  */
103
- DEF_ATTR_READER(Pixel, green, int)
54
+ VALUE
55
+ Pixel_green(VALUE self)
56
+ {
57
+ IMPLEMENT_ATTR_READER(Pixel, green, int);
58
+ }
104
59
 
105
60
  /**
106
- * Get Pixel blue attribute.
107
- *
108
- * Ruby usage:
109
- * - @verbatim Pixel#blue @endverbatim
61
+ * Get Pixel blue value.
110
62
  *
111
- * @param self this object
112
- * @return the blue value
63
+ * @return [Numeric] the blue value
113
64
  */
114
- DEF_ATTR_READER(Pixel, blue, int)
65
+ VALUE
66
+ Pixel_blue(VALUE self)
67
+ {
68
+ IMPLEMENT_ATTR_READER(Pixel, blue, int);
69
+ }
115
70
 
116
71
  /**
117
- * Get Pixel alpha attribute.
118
- *
119
- * Ruby usage:
120
- * - @verbatim Pixel#alpha @endverbatim
72
+ * Get Pixel alpha value.
121
73
  *
122
- * @param self this object
123
- * @return the alpha value
74
+ * @return [Numeric] the alpha value
124
75
  */
125
76
  VALUE
126
77
  Pixel_alpha(VALUE self)
@@ -135,70 +86,87 @@ Pixel_alpha(VALUE self)
135
86
  }
136
87
 
137
88
  /**
138
- * Set Pixel red attribute.
89
+ * Set Pixel red value.
139
90
  *
140
- * Ruby usage:
141
- * - @verbatim Pixel#red= @endverbatim
91
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
92
+ * {Magick::Pixel#notify_observers}
93
+ * - Setters return their argument values for backward compatibility to when
94
+ * Pixel was a Struct class.
142
95
  *
143
- * Notes:
144
- * - Pixel is Observable. Setters call changed, notify_observers
145
- * - Setters return their argument values for backward compatibility to when
146
- * Pixel was a Struct class.
147
- *
148
- * @param self this object
149
- * @param v the red value
150
- * @return self
96
+ * @param v [Numeric] the red value
97
+ * @return [Numeric] the given red value
151
98
  */
152
- DEF_PIXEL_CHANNEL_WRITER(red)
99
+ VALUE
100
+ Pixel_red_eq(VALUE self, VALUE v)
101
+ {
102
+ Pixel *pixel;
103
+
104
+ rb_check_frozen(self);
105
+ Data_Get_Struct(self, Pixel, pixel);
106
+ pixel->red = APP2QUANTUM(v);
107
+ rb_funcall(self, rm_ID_changed, 0);
108
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
109
+ return QUANTUM2NUM((pixel->red));
110
+ }
153
111
 
154
112
  /**
155
- * Set Pixel green attribute.
113
+ * Set Pixel green value.
156
114
  *
157
- * Ruby usage:
158
- * - @verbatim Pixel#green= @endverbatim
115
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
116
+ * {Magick::Pixel#notify_observers}
117
+ * - Setters return their argument values for backward compatibility to when
118
+ * Pixel was a Struct class.
159
119
  *
160
- * Notes:
161
- * - Pixel is Observable. Setters call changed, notify_observers
162
- * - Setters return their argument values for backward compatibility to when
163
- * Pixel was a Struct class.
164
- *
165
- * @param self this object
166
- * @param v the green value
167
- * @return self
120
+ * @param v [Numeric] the green value
121
+ * @return [Numeric] the given green value
168
122
  */
169
- DEF_PIXEL_CHANNEL_WRITER(green)
123
+ VALUE
124
+ Pixel_green_eq(VALUE self, VALUE v)
125
+ {
126
+ Pixel *pixel;
127
+
128
+ rb_check_frozen(self);
129
+ Data_Get_Struct(self, Pixel, pixel);
130
+ pixel->green = APP2QUANTUM(v);
131
+ rb_funcall(self, rm_ID_changed, 0);
132
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
133
+ return QUANTUM2NUM((pixel->green));
134
+ }
170
135
 
171
136
  /**
172
- * Set Pixel blue attribute.
137
+ * Set Pixel blue value.
173
138
  *
174
- * Ruby usage:
175
- * - @verbatim Pixel#blue= @endverbatim
139
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
140
+ * {Magick::Pixel#notify_observers}
141
+ * - Setters return their argument values for backward compatibility to when
142
+ * Pixel was a Struct class.
176
143
  *
177
- * Notes:
178
- * - Pixel is Observable. Setters call changed, notify_observers
179
- * - Setters return their argument values for backward compatibility to when
180
- * Pixel was a Struct class.
181
- *
182
- * @param self this object
183
- * @param v the blue value
184
- * @return self
144
+ * @param v [Numeric] the blue value
145
+ * @return [Numeric] the given blue value
185
146
  */
186
- DEF_PIXEL_CHANNEL_WRITER(blue)
147
+ VALUE
148
+ Pixel_blue_eq(VALUE self, VALUE v)
149
+ {
150
+ Pixel *pixel;
151
+
152
+ rb_check_frozen(self);
153
+ Data_Get_Struct(self, Pixel, pixel);
154
+ pixel->blue = APP2QUANTUM(v);
155
+ rb_funcall(self, rm_ID_changed, 0);
156
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
157
+ return QUANTUM2NUM((pixel->blue));
158
+ }
187
159
 
188
160
  /**
189
- * Set Pixel alpha attribute.
161
+ * Set Pixel alpha value.
190
162
  *
191
- * Ruby usage:
192
- * - @verbatim Pixel#alpha= @endverbatim
163
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
164
+ * {Magick::Pixel#notify_observers}
165
+ * - Setters return their argument values for backward compatibility to when
166
+ * Pixel was a Struct class.
193
167
  *
194
- * Notes:
195
- * - Pixel is Observable. Setters call changed, notify_observers
196
- * - Setters return their argument values for backward compatibility to when
197
- * Pixel was a Struct class.
198
- *
199
- * @param self this object
200
- * @param v the alpha value
201
- * @return self
168
+ * @param v [Numeric] the alpha value
169
+ * @return [Numeric] the given alpha value
202
170
  */
203
171
  VALUE
204
172
  Pixel_alpha_eq(VALUE self, VALUE v)
@@ -209,28 +177,168 @@ Pixel_alpha_eq(VALUE self, VALUE v)
209
177
  Data_Get_Struct(self, Pixel, pixel);
210
178
  #if defined(IMAGEMAGICK_7)
211
179
  pixel->alpha = APP2QUANTUM(v);
212
- (void) rb_funcall(self, rm_ID_changed, 0);
213
- (void) rb_funcall(self, rm_ID_notify_observers, 1, self);
180
+ rb_funcall(self, rm_ID_changed, 0);
181
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
214
182
  return QUANTUM2NUM(pixel->alpha);
215
183
  #else
216
184
  pixel->opacity = QuantumRange - APP2QUANTUM(v);
217
- (void) rb_funcall(self, rm_ID_changed, 0);
218
- (void) rb_funcall(self, rm_ID_notify_observers, 1, self);
185
+ rb_funcall(self, rm_ID_changed, 0);
186
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
219
187
  return QUANTUM2NUM(QuantumRange - pixel->opacity);
220
188
  #endif
221
189
  }
222
190
 
223
- /*
224
- * Get/set Pixel CMYK attributes.
191
+ /**
192
+ * Get Pixel cyan value.
193
+ *
194
+ * @return [Numeric] the cyan value
225
195
  */
226
- DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(cyan, red)
227
- DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(magenta, green)
228
- DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(yellow, blue)
229
- #if defined(IMAGEMAGICK_7)
230
- DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(black, black)
231
- #else
232
- DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(black, opacity)
233
- #endif
196
+ VALUE
197
+ Pixel_cyan(VALUE self)
198
+ {
199
+ Pixel *pixel;
200
+
201
+ Data_Get_Struct(self, Pixel, pixel);
202
+ return INT2NUM(pixel->red);
203
+ }
204
+
205
+ /**
206
+ * Set Pixel cyan value.
207
+ *
208
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
209
+ * {Magick::Pixel#notify_observers}
210
+ * - Setters return their argument values for backward compatibility to when
211
+ * Pixel was a Struct class.
212
+ *
213
+ * @param v [Numeric] the cyan value
214
+ * @return [Numeric] the given cyan value
215
+ */
216
+ VALUE
217
+ Pixel_cyan_eq(VALUE self, VALUE v)
218
+ {
219
+ Pixel *pixel;
220
+
221
+ rb_check_frozen(self);
222
+ Data_Get_Struct(self, Pixel, pixel);
223
+ pixel->red = APP2QUANTUM(v);
224
+ rb_funcall(self, rm_ID_changed, 0);
225
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
226
+ return QUANTUM2NUM(pixel->red);
227
+ }
228
+
229
+ /**
230
+ * Get Pixel magenta value.
231
+ *
232
+ * @return [Numeric] the magenta value
233
+ */
234
+ VALUE
235
+ Pixel_magenta(VALUE self)
236
+ {
237
+ Pixel *pixel;
238
+
239
+ Data_Get_Struct(self, Pixel, pixel);
240
+ return INT2NUM(pixel->green);
241
+ }
242
+
243
+ /**
244
+ * Set Pixel magenta value.
245
+ *
246
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
247
+ * {Magick::Pixel#notify_observers}
248
+ * - Setters return their argument values for backward compatibility to when
249
+ * Pixel was a Struct class.
250
+ *
251
+ * @param v [Numeric] the magenta value
252
+ * @return [Numeric] the given magenta value
253
+ */
254
+ VALUE
255
+ Pixel_magenta_eq(VALUE self, VALUE v)
256
+ {
257
+ Pixel *pixel;
258
+
259
+ rb_check_frozen(self);
260
+ Data_Get_Struct(self, Pixel, pixel);
261
+ pixel->green = APP2QUANTUM(v);
262
+ rb_funcall(self, rm_ID_changed, 0);
263
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
264
+ return QUANTUM2NUM(pixel->green);
265
+ }
266
+
267
+ /**
268
+ * Get Pixel yellow value.
269
+ *
270
+ * @return [Numeric] the yellow value
271
+ */
272
+ VALUE
273
+ Pixel_yellow(VALUE self)
274
+ {
275
+ Pixel *pixel;
276
+
277
+ Data_Get_Struct(self, Pixel, pixel);
278
+ return INT2NUM(pixel->blue);
279
+ }
280
+
281
+ /**
282
+ * Set Pixel yellow value.
283
+ *
284
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
285
+ * {Magick::Pixel#notify_observers}
286
+ * - Setters return their argument values for backward compatibility to when
287
+ * Pixel was a Struct class.
288
+ *
289
+ * @param v [Numeric] the yellow value
290
+ * @return [Numeric] the given yellow value
291
+ */
292
+ VALUE
293
+ Pixel_yellow_eq(VALUE self, VALUE v)
294
+ {
295
+ Pixel *pixel;
296
+
297
+ rb_check_frozen(self);
298
+ Data_Get_Struct(self, Pixel, pixel);
299
+ pixel->blue = APP2QUANTUM(v);
300
+ rb_funcall(self, rm_ID_changed, 0);
301
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
302
+ return QUANTUM2NUM(pixel->blue);
303
+ }
304
+
305
+ /**
306
+ * Get Pixel black value.
307
+ *
308
+ * @return [Numeric] the black value
309
+ */
310
+ VALUE
311
+ Pixel_black(VALUE self)
312
+ {
313
+ Pixel *pixel;
314
+
315
+ Data_Get_Struct(self, Pixel, pixel);
316
+ return INT2NUM(pixel->black);
317
+ }
318
+
319
+ /**
320
+ * Set Pixel black value.
321
+ *
322
+ * - Pixel is Observable. Setters call {Magick::Pixel#changed},
323
+ * {Magick::Pixel#notify_observers}
324
+ * - Setters return their argument values for backward compatibility to when
325
+ * Pixel was a Struct class.
326
+ *
327
+ * @param v [Numeric] the black value
328
+ * @return [Numeric] the given black value
329
+ */
330
+ VALUE
331
+ Pixel_black_eq(VALUE self, VALUE v)
332
+ {
333
+ Pixel *pixel;
334
+
335
+ rb_check_frozen(self);
336
+ Data_Get_Struct(self, Pixel, pixel);
337
+ pixel->black = APP2QUANTUM(v);
338
+ rb_funcall(self, rm_ID_changed, 0);
339
+ rb_funcall(self, rm_ID_notify_observers, 1, self);
340
+ return QUANTUM2NUM(pixel->black);
341
+ }
234
342
 
235
343
 
236
344
  /**
@@ -244,11 +352,10 @@ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(black, opacity)
244
352
  * @throw ArgumentError
245
353
  */
246
354
  static VALUE
247
- color_arg_rescue(VALUE arg)
355
+ color_arg_rescue(VALUE arg, VALUE raised_exc ATTRIBUTE_UNUSED)
248
356
  {
249
357
  rb_raise(rb_eTypeError, "argument must be color name or pixel (%s given)",
250
358
  rb_class2name(CLASS_OF(arg)));
251
- return (VALUE)0;
252
359
  }
253
360
 
254
361
 
@@ -275,6 +382,7 @@ Color_to_PixelColor(PixelColor *pp, VALUE color)
275
382
  pp->blue = pixel->blue;
276
383
  #if defined(IMAGEMAGICK_7)
277
384
  pp->alpha = pixel->alpha;
385
+ pp->black = pixel->black;
278
386
  #else
279
387
  pp->opacity = pixel->opacity;
280
388
  #endif
@@ -288,6 +396,44 @@ Color_to_PixelColor(PixelColor *pp, VALUE color)
288
396
  }
289
397
 
290
398
 
399
+ /**
400
+ * Convert either a String color name or a {Magick::Pixel} to a Pixel.
401
+ *
402
+ * No Ruby usage (internal function)
403
+ *
404
+ * @param pp the Pixel to modify
405
+ * @param color the color name or Magick::Pixel
406
+ */
407
+ void
408
+ Color_to_Pixel(Pixel *pp, VALUE color)
409
+ {
410
+ PixelColor pixel_color;
411
+
412
+ memset(pp, 0, sizeof(*pp));
413
+ // Allow color name or Pixel
414
+ if (CLASS_OF(color) == Class_Pixel)
415
+ {
416
+ Pixel *pixel;
417
+
418
+ Data_Get_Struct(color, Pixel, pixel);
419
+ memcpy(pp, pixel, sizeof(Pixel));
420
+ }
421
+ else
422
+ {
423
+ Color_to_PixelColor(&pixel_color, color);
424
+ pp->red = pixel_color.red;
425
+ pp->green = pixel_color.green;
426
+ pp->blue = pixel_color.blue;
427
+ #if defined(IMAGEMAGICK_7)
428
+ pp->alpha = pixel_color.alpha;
429
+ pp->black = pixel_color.black;
430
+ #else
431
+ pp->opacity = pixel_color.opacity;
432
+ #endif
433
+ }
434
+ }
435
+
436
+
291
437
  /**
292
438
  * Convert a color name to a PixelColor
293
439
  *
@@ -305,9 +451,9 @@ Color_Name_to_PixelColor(PixelColor *color, VALUE name_arg)
305
451
  ExceptionInfo *exception;
306
452
 
307
453
  exception = AcquireExceptionInfo();
308
- name = StringValuePtr(name_arg);
454
+ name = StringValueCStr(name_arg);
309
455
  okay = QueryColorCompliance(name, AllCompliance, color, exception);
310
- (void) DestroyExceptionInfo(exception);
456
+ DestroyExceptionInfo(exception);
311
457
  if (!okay)
312
458
  {
313
459
  rb_raise(rb_eArgError, "invalid color name %s", name);
@@ -319,10 +465,7 @@ Color_Name_to_PixelColor(PixelColor *color, VALUE name_arg)
319
465
  /**
320
466
  * Allocate a Pixel object.
321
467
  *
322
- * No Ruby usage (internal function)
323
- *
324
- * @param class the Ruby class to use
325
- * @return a new Magick::Pixel object
468
+ * @return [Magick::Pixel] a new Magick::Pixel object
326
469
  */
327
470
  VALUE
328
471
  Pixel_alloc(VALUE class)
@@ -338,21 +481,17 @@ Pixel_alloc(VALUE class)
338
481
  /**
339
482
  * "Case equal" operator for Pixel.
340
483
  *
341
- * Ruby usage:
342
- * - @verbatim Pixel#=== @endverbatim
343
- *
344
- * @param self this object
345
- * @param other the other object
346
- * @return true or false
484
+ * @param other [Object] the other object
485
+ * @return [Boolean] true or false
347
486
  */
348
487
 
349
488
  VALUE
350
489
  Pixel_case_eq(VALUE self, VALUE other)
351
490
  {
352
- Pixel *this, *that;
353
-
354
491
  if (CLASS_OF(self) == CLASS_OF(other))
355
492
  {
493
+ Pixel *this, *that;
494
+
356
495
  Data_Get_Struct(self, Pixel, this);
357
496
  Data_Get_Struct(other, Pixel, that);
358
497
  return (this->red == that->red
@@ -372,13 +511,9 @@ Pixel_case_eq(VALUE self, VALUE other)
372
511
  /**
373
512
  * Clone a Pixel.
374
513
  *
375
- * Ruby usage:
376
- * - @verbatim Pixel#clone @endverbatim
377
- *
378
- * @param self this object
379
- * @return a clone
380
- * @see Pixel_dup
381
- * @see Pixel_init_copy
514
+ * @return [Magick::Pixel] a clone object
515
+ * @see #dup
516
+ * @see #initialize_copy
382
517
  */
383
518
  VALUE
384
519
  Pixel_clone(VALUE self)
@@ -400,13 +535,9 @@ Pixel_clone(VALUE self)
400
535
  /**
401
536
  * Duplicate a Pixel.
402
537
  *
403
- * Ruby usage:
404
- * - @verbatim Pixel#dup @endverbatim
405
- *
406
- * @param self this object
407
- * @return a clone
408
- * @see Pixel_clone
409
- * @see Pixel_init_copy
538
+ * @return [Magick::Pixel] a duplicated object
539
+ * @see #clone
540
+ * @see #initialize_copy
410
541
  */
411
542
  VALUE
412
543
  Pixel_dup(VALUE self)
@@ -417,11 +548,6 @@ Pixel_dup(VALUE self)
417
548
  pixel = ALLOC(Pixel);
418
549
  memset(pixel, '\0', sizeof(Pixel));
419
550
  dup = Data_Wrap_Struct(CLASS_OF(self), NULL, destroy_Pixel, pixel);
420
- if (rb_obj_tainted(self))
421
- {
422
- (void) rb_obj_taint(dup);
423
- }
424
-
425
551
  RB_GC_GUARD(dup);
426
552
 
427
553
  return rb_funcall(dup, rm_ID_initialize_copy, 1, self);
@@ -429,14 +555,10 @@ Pixel_dup(VALUE self)
429
555
 
430
556
 
431
557
  /**
432
- * For use with Hash.
558
+ * Equality. Returns true only if receiver and other are the same object.
433
559
  *
434
- * Ruby usage:
435
- * - @verbatim Pixel#eql? @endverbatim
436
- *
437
- * @param self this object
438
- * @param other the other object
439
- * @return true if hash to the same value, otherwise false
560
+ * @param other [Object] the other object
561
+ * @return [Boolean] true if other is the same value, otherwise false
440
562
  */
441
563
  VALUE
442
564
  Pixel_eql_q(VALUE self, VALUE other)
@@ -448,17 +570,11 @@ Pixel_eql_q(VALUE self, VALUE other)
448
570
  /**
449
571
  * Compare pixel values for equality.
450
572
  *
451
- * Ruby usage:
452
- * - @verbatim Pixel#fcmp(other, fuzz, colorspace) @endverbatim
453
- *
454
- * Notes:
455
- * - Default fuzz is 0.0
456
- * - Default colorspace is RGBColorspace
457
- *
458
- * @param argc number of input arguments
459
- * @param argv array of input arguments
460
- * @param self this object
461
- * @return true if equal, otherwise false
573
+ * @overload fcmp(other, fuzz = 0.0, colorspace = Magick::RGBColorspace)
574
+ * @param other [Magick::Pixel] The pixel to which the receiver is compared
575
+ * @param fuzz [Float] The amount of fuzz to allow before the colors are considered to be different
576
+ * @param colorspace [Magick::ColorspaceType] The colorspace
577
+ * @return [Boolean] true if equal, otherwise false
462
578
  */
463
579
  VALUE
464
580
  Pixel_fcmp(int argc, VALUE *argv, VALUE self)
@@ -466,12 +582,10 @@ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
466
582
  double fuzz = 0.0;
467
583
  unsigned int equal;
468
584
  ColorspaceType colorspace = RGBColorspace;
469
- #if defined(IMAGEMAGICK_7)
470
585
  PixelColor this, that;
471
- #else
586
+ #if defined(IMAGEMAGICK_6)
472
587
  Image *image;
473
588
  Info *info;
474
- Pixel *this, *that;
475
589
  #endif
476
590
 
477
591
  switch (argc)
@@ -488,18 +602,16 @@ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
488
602
  break;
489
603
  }
490
604
 
491
- #if defined(IMAGEMAGICK_7)
492
605
  Color_to_PixelColor(&this, self);
493
606
  Color_to_PixelColor(&that, argv[0]);
607
+
608
+ #if defined(IMAGEMAGICK_7)
494
609
  this.fuzz = fuzz;
495
610
  this.colorspace = colorspace;
496
611
  that.fuzz = fuzz;
497
612
  that.colorspace = colorspace;
498
613
  equal = IsFuzzyEquivalencePixelInfo(&this, &that);
499
614
  #else
500
- Data_Get_Struct(self, Pixel, this);
501
- Data_Get_Struct(argv[0], Pixel, that);
502
-
503
615
  // The IsColorSimilar function expects to get the
504
616
  // colorspace and fuzz parameters from an Image structure.
505
617
 
@@ -512,7 +624,7 @@ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
512
624
  image = rm_acquire_image(info);
513
625
 
514
626
  // Delete Info now in case we have to raise an exception
515
- (void) DestroyImageInfo(info);
627
+ DestroyImageInfo(info);
516
628
 
517
629
  if (!image)
518
630
  {
@@ -522,8 +634,8 @@ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
522
634
  image->colorspace = colorspace;
523
635
  image->fuzz = fuzz;
524
636
 
525
- equal = IsColorSimilar(image, this, that);
526
- (void) DestroyImage(image);
637
+ equal = IsColorSimilar(image, &this, &that);
638
+ DestroyImage(image);
527
639
  #endif
528
640
 
529
641
  return equal ? Qtrue : Qfalse;
@@ -531,21 +643,16 @@ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
531
643
 
532
644
 
533
645
  /**
534
- * Construct an Magick::Pixel corresponding to the given color name.
646
+ * Construct an {Magick::Pixel} corresponding to the given color name.
535
647
  *
536
- * Ruby usage:
537
- * - @verbatim Magick::Pixel.from_color(string) @endverbatim
648
+ * - The "inverse" is {Image#to_color}, b/c the conversion of a pixel to a
649
+ * color name requires both a color depth and if the opacity value has
650
+ * meaning.
538
651
  *
539
- * Notes:
540
- * - The "inverse" is Image_to_color, b/c the conversion of a pixel to a
541
- * color name requires both a color depth and if the opacity value has
542
- * meaning (i.e. whether image->matte == True or not).
543
- *
544
- * @param class the Ruby class to use
545
- * @param name the color name
546
- * @return a new Magic::Pixel object
547
- * @see Image_to_color
548
- * @see Pixel_to_color
652
+ * @param name [String] the color name
653
+ * @return [Magick::Pixel] a new Magic::Pixel object
654
+ * @see Magick::Image#to_color
655
+ * @see Magick::Pixel#to_color
549
656
  */
550
657
  VALUE
551
658
  Pixel_from_color(VALUE class ATTRIBUTE_UNUSED, VALUE name)
@@ -555,13 +662,13 @@ Pixel_from_color(VALUE class ATTRIBUTE_UNUSED, VALUE name)
555
662
  MagickBooleanType okay;
556
663
 
557
664
  exception = AcquireExceptionInfo();
558
- okay = QueryColorCompliance(StringValuePtr(name), AllCompliance, &pp, exception);
559
- CHECK_EXCEPTION()
560
- (void) DestroyExceptionInfo(exception);
665
+ okay = QueryColorCompliance(StringValueCStr(name), AllCompliance, &pp, exception);
666
+ CHECK_EXCEPTION();
667
+ DestroyExceptionInfo(exception);
561
668
 
562
669
  if (!okay)
563
670
  {
564
- rb_raise(rb_eArgError, "invalid color name: %s", StringValuePtr(name));
671
+ rb_raise(rb_eArgError, "invalid color name: %s", StringValueCStr(name));
565
672
  }
566
673
 
567
674
  return Pixel_from_PixelColor(&pp);
@@ -571,21 +678,17 @@ Pixel_from_color(VALUE class ATTRIBUTE_UNUSED, VALUE name)
571
678
  /**
572
679
  * Construct an RGB pixel.
573
680
  *
574
- * Ruby usage:
575
- * - @verbatim Pixel#from_hsla(hue, saturation, lightness) @endverbatim
576
- * - @verbatim Pixel#from_hsla(hue, saturation, lightness, alpha) @endverbatim
577
- *
578
- * Notes:
579
- * - Default alpha is 1.0
580
- * - 0 <= hue < 360 OR "0%" <= hue < "100%"
581
- * - 0 <= saturation <= 255 OR "0%" <= saturation <= "100%"
582
- * - 0 <= lightness <= 255 OR "0%" <= lightness <= "100%"
583
- * - 0 <= alpha <= 1 (0 is transparent, 1 is opaque) OR "0%" <= alpha <= "100%"
584
- *
585
- * @param argc number of input arguments
586
- * @param argv array of input arguments
587
- * @param class the Ruby class to use
588
- * @return a new Magick::Pixel object
681
+ * - 0 <= +hue+ < 360 OR "0%" <= +hue+ < "100%"
682
+ * - 0 <= +saturation+ <= 255 OR "0%" <= +saturation+ <= "100%"
683
+ * - 0 <= +lightness+ <= 255 OR "0%" <= +lightness+ <= "100%"
684
+ * - 0 <= +alpha+ <= 1 (0 is transparent, 1 is opaque) OR "0%" <= +alpha+ <= "100%"
685
+ *
686
+ * @overload from_hsla(hue, saturation, lightness, alpha = 1.0)
687
+ * @param hue [Numeric, String] A value in the range.
688
+ * @param saturation [Numeric, String] A value in the range.
689
+ * @param lightness [Numeric, String] A value in the range.
690
+ * @param alpha [Numeric] The alpha value.
691
+ * @return [Magick::Pixel] a new Magick::Pixel object
589
692
  */
590
693
  VALUE
591
694
  Pixel_from_hsla(int argc, VALUE *argv, VALUE class ATTRIBUTE_UNUSED)
@@ -599,14 +702,14 @@ Pixel_from_hsla(int argc, VALUE *argv, VALUE class ATTRIBUTE_UNUSED)
599
702
  switch (argc)
600
703
  {
601
704
  case 4:
602
- a = rm_percentage(argv[3],1.0);
705
+ a = rm_percentage(argv[3], 1.0);
603
706
  alpha = MagickTrue;
604
707
  case 3:
605
708
  // saturation and lightness are out of 255 in new ImageMagicks and
606
709
  // out of 100 in old ImageMagicks. Compromise: always use %.
607
- l = rm_percentage(argv[2],255.0);
608
- s = rm_percentage(argv[1],255.0);
609
- h = rm_percentage(argv[0],360.0);
710
+ l = rm_percentage(argv[2], 255.0);
711
+ s = rm_percentage(argv[1], 255.0);
712
+ h = rm_percentage(argv[0], 360.0);
610
713
  break;
611
714
  default:
612
715
  rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
@@ -633,23 +736,23 @@ Pixel_from_hsla(int argc, VALUE *argv, VALUE class ATTRIBUTE_UNUSED)
633
736
  memset(name, 0, sizeof(name));
634
737
  if (alpha)
635
738
  {
636
- sprintf(name, "hsla(%-2.1f,%-2.1f,%-2.1f,%-2.1f)", h, s, l, a);
739
+ snprintf(name, sizeof(name), "hsla(%-2.1f,%-2.1f,%-2.1f,%-2.1f)", h, s, l, a);
637
740
  }
638
741
  else
639
742
  {
640
- sprintf(name, "hsl(%-2.1f,%-2.1f,%-2.1f)", h, s, l);
743
+ snprintf(name, sizeof(name), "hsl(%-2.1f,%-2.1f,%-2.1f)", h, s, l);
641
744
  }
642
745
 
643
746
  exception = AcquireExceptionInfo();
644
747
 
645
748
  #if defined(IMAGEMAGICK_7)
646
- (void) QueryColorCompliance(name, AllCompliance, &pp, exception);
749
+ QueryColorCompliance(name, AllCompliance, &pp, exception);
647
750
  #else
648
- (void) QueryMagickColor(name, &pp, exception);
751
+ QueryMagickColor(name, &pp, exception);
649
752
  #endif
650
- CHECK_EXCEPTION()
753
+ CHECK_EXCEPTION();
651
754
 
652
- (void) DestroyExceptionInfo(exception);
755
+ DestroyExceptionInfo(exception);
653
756
 
654
757
  return Pixel_from_MagickPixel(&pp);
655
758
  }
@@ -672,14 +775,15 @@ Pixel_from_MagickPixel(const MagickPixel *pp)
672
775
  Pixel *pixel;
673
776
 
674
777
  pixel = ALLOC(Pixel);
675
- pixel->red = ROUND_TO_QUANTUM(pp->red);
676
- pixel->green = ROUND_TO_QUANTUM(pp->green);
677
- pixel->blue = ROUND_TO_QUANTUM(pp->blue);
778
+ pixel->red = pp->red;
779
+ pixel->green = pp->green;
780
+ pixel->blue = pp->blue;
678
781
  #if defined(IMAGEMAGICK_7)
679
- pixel->alpha = ROUND_TO_QUANTUM(pp->alpha);
782
+ pixel->alpha = pp->alpha;
680
783
  #else
681
- pixel->opacity = ROUND_TO_QUANTUM(pp->opacity);
784
+ pixel->opacity = pp->opacity;
682
785
  #endif
786
+ pixel->black = pp->index;
683
787
 
684
788
  return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel);
685
789
  }
@@ -707,8 +811,10 @@ Pixel_from_PixelPacket(const PixelPacket *pp)
707
811
  pixel->blue = pp->blue;
708
812
  #if defined(IMAGEMAGICK_7)
709
813
  pixel->alpha = pp->alpha;
814
+ pixel->black = pp->black;
710
815
  #else
711
816
  pixel->opacity = pp->opacity;
817
+ pixel->black = 0;
712
818
  #endif
713
819
 
714
820
  return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel);
@@ -737,8 +843,10 @@ Pixel_from_PixelColor(const PixelColor *pp)
737
843
  pixel->blue = pp->blue;
738
844
  #if defined(IMAGEMAGICK_7)
739
845
  pixel->alpha = pp->alpha;
846
+ pixel->black = pp->black;
740
847
  #else
741
848
  pixel->opacity = pp->opacity;
849
+ pixel->black = 0;
742
850
  #endif
743
851
 
744
852
  return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel);
@@ -746,15 +854,9 @@ Pixel_from_PixelColor(const PixelColor *pp)
746
854
 
747
855
 
748
856
  /**
749
- * Ruby usage:
750
- * - @verbatim Pixel#hash @endverbatim
751
- *
752
- * Notes:
753
- * - INT2FIX left-shifts 1 bit. Sacrifice 1 bit from the opacity attribute to
754
- * the FIXNUM_FLAG.
857
+ * Compute a hash-code.
755
858
  *
756
- * @param self this object
757
- * @return the hash of self
859
+ * @return [Numeric] the hash of self
758
860
  */
759
861
  VALUE
760
862
  Pixel_hash(VALUE self)
@@ -780,14 +882,10 @@ Pixel_hash(VALUE self)
780
882
  /**
781
883
  * Initialize clone, dup methods.
782
884
  *
783
- * Ruby usage:
784
- * - @verbatim Pixel#initialize_copy @endverbatim
785
- *
786
- * @param self this object
787
- * @param orig the original Pixel
788
- * @return self
789
- * @see Pixel_clone
790
- * @see Pixel_dup
885
+ * @param orig [Magick::Pixel] the original Pixel
886
+ * @return [Magick::Pixel] self
887
+ * @see #clone
888
+ * @see #dup
791
889
  */
792
890
  VALUE
793
891
  Pixel_init_copy(VALUE self, VALUE orig)
@@ -804,24 +902,14 @@ Pixel_init_copy(VALUE self, VALUE orig)
804
902
 
805
903
 
806
904
  /**
807
- * Ruby usage:
808
- * - @verbatim Pixel#initialize @endverbatim
809
- * - @verbatim Pixel#initialize(red) @endverbatim
810
- * - @verbatim Pixel#initialize(red,green) @endverbatim
811
- * - @verbatim Pixel#initialize(red,green,blue) @endverbatim
812
- * - @verbatim Pixel#initialize(red,green,blue,opacity) @endverbatim
813
- *
814
- * Notes:
815
- * - Default red is 0.0
816
- * - Default green is 0.0
817
- * - Default blue is 0.0
818
- * - Default opacity is 0.0
819
- * - For backward compatibility, arguments may be nil.
820
- *
821
- * @param argc number of input arguments
822
- * @param argv array of input arguments
823
- * @param self this object
824
- * @return self
905
+ * Initialize Pixel object.
906
+ *
907
+ * @overload initialize(red = 0, green = 0, blue = 0, opacity = 0)
908
+ * @param red [Numeric] The red value
909
+ * @param green [Numeric] The green value
910
+ * @param blue [Numeric] The blue value
911
+ * @param opacity [Numeric] The opacity value
912
+ * @return [Magick::Pixel] self
825
913
  */
826
914
  VALUE
827
915
  Pixel_initialize(int argc, VALUE *argv, VALUE self)
@@ -876,11 +964,7 @@ Pixel_initialize(int argc, VALUE *argv, VALUE self)
876
964
  /**
877
965
  * Return the "intensity" of a pixel.
878
966
  *
879
- * Ruby usage:
880
- * - @verbatim Pixel#intensity @endverbatim
881
- *
882
- * @param self this object
883
- * @return the intensity
967
+ * @return [Numeric] the intensity
884
968
  */
885
969
  VALUE
886
970
  Pixel_intensity(VALUE self)
@@ -901,11 +985,7 @@ Pixel_intensity(VALUE self)
901
985
  /**
902
986
  * Support Marshal.dump.
903
987
  *
904
- * Ruby usage:
905
- * - @verbatim Pixel#marshal_dump @endverbatim
906
- *
907
- * @param self this object
908
- * @return a string representing the dumped pixel
988
+ * @return [Hash] a representing the dumped pixel
909
989
  */
910
990
  VALUE
911
991
  Pixel_marshal_dump(VALUE self)
@@ -933,11 +1013,7 @@ Pixel_marshal_dump(VALUE self)
933
1013
  /**
934
1014
  * Support Marshal.load.
935
1015
  *
936
- * Ruby usage:
937
- * - @verbatim Pixel#marshal_load @endverbatim
938
- *
939
- * @param self this object
940
- * @param dpixel the dumped pixel
1016
+ * @param dpixel [Hash] the dumped pixel
941
1017
  * @return self
942
1018
  */
943
1019
  VALUE
@@ -961,12 +1037,8 @@ Pixel_marshal_load(VALUE self, VALUE dpixel)
961
1037
  /**
962
1038
  * Support Comparable mixin.
963
1039
  *
964
- * Ruby usage:
965
- * - @verbatim Pixel#<=> @endverbatim
966
- *
967
- * @param self this object
968
- * @param other the other Pixel
969
- * @return -1, 0, 1
1040
+ * @param other [Object] the other Pixel
1041
+ * @return [-1, 0, 1, nil] the result of compare
970
1042
  */
971
1043
  VALUE
972
1044
  Pixel_spaceship(VALUE self, VALUE other)
@@ -978,25 +1050,25 @@ Pixel_spaceship(VALUE self, VALUE other)
978
1050
 
979
1051
  if (this->red != that->red)
980
1052
  {
981
- return INT2NUM((this->red - that->red)/abs(this->red - that->red));
1053
+ return INT2NUM((this->red - that->red)/abs((int)(this->red - that->red)));
982
1054
  }
983
1055
  else if(this->green != that->green)
984
1056
  {
985
- return INT2NUM((this->green - that->green)/abs(this->green - that->green));
1057
+ return INT2NUM((this->green - that->green)/abs((int)(this->green - that->green)));
986
1058
  }
987
1059
  else if(this->blue != that->blue)
988
1060
  {
989
- return INT2NUM((this->blue - that->blue)/abs(this->blue - that->blue));
1061
+ return INT2NUM((this->blue - that->blue)/abs((int)(this->blue - that->blue)));
990
1062
  }
991
1063
  #if defined(IMAGEMAGICK_7)
992
1064
  else if(this->alpha != that->alpha)
993
1065
  {
994
- return INT2NUM((this->alpha - that->alpha)/abs(this->alpha - that->alpha));
1066
+ return INT2NUM((this->alpha - that->alpha)/abs((int)(this->alpha - that->alpha)));
995
1067
  }
996
1068
  #else
997
1069
  else if(this->opacity != that->opacity)
998
1070
  {
999
- return INT2NUM(((QuantumRange - this->opacity) - (QuantumRange - that->opacity))/abs((QuantumRange - this->opacity) - (QuantumRange - that->opacity)));
1071
+ return INT2NUM(((QuantumRange - this->opacity) - (QuantumRange - that->opacity))/abs((int)((QuantumRange - this->opacity) - (QuantumRange - that->opacity))));
1000
1072
  }
1001
1073
  #endif
1002
1074
 
@@ -1008,16 +1080,11 @@ Pixel_spaceship(VALUE self, VALUE other)
1008
1080
 
1009
1081
 
1010
1082
  /**
1011
- * Return [hue, saturation, lightness, alpha] in the same ranges as
1012
- * Pixel_from_hsla.
1013
- *
1014
- *
1015
- * Ruby usage:
1016
- * - @verbatim Pixel#to_hsla @endverbatim
1083
+ * Return [+hue+, +saturation+, +lightness+, +alpha+] in the same ranges as
1084
+ * {Magick::Pixel.from_hsla}.
1017
1085
  *
1018
- * @param self this object
1019
- * @return an array with hsla data
1020
- * @see Pixel_from_hsla
1086
+ * @return [Array<Float>] an array with hsla data
1087
+ * @see Pixel.from_hsla
1021
1088
  */
1022
1089
  VALUE
1023
1090
  Pixel_to_hsla(VALUE self)
@@ -1098,24 +1165,12 @@ rm_set_magick_pixel_packet(Pixel *pixel, MagickPixel *pp)
1098
1165
  /**
1099
1166
  * Return the color name corresponding to the pixel values.
1100
1167
  *
1101
- * Ruby usage:
1102
- * - @verbatim Magick::Pixel#to_color @endverbatim
1103
- * - @verbatim Magick::Pixel#to_color(compliance) @endverbatim
1104
- * - @verbatim Magick::Pixel#to_color(compliance, alpha) @endverbatim
1105
- * - @verbatim Magick::Pixel#to_color(compliance, alpha, depth) @endverbatim
1106
- * - @verbatim Magick::Pixel#to_color(compliance, alpha, depth, hex) @endverbatim
1107
- *
1108
- * Notes:
1109
- * - Default compliance is AllCompliance
1110
- * - Default alpha is false
1111
- * - Default depth is MAGICKCORE_QUANTUM_DEPTH
1112
- * - Default hex is false
1113
- * - The conversion respects the value of the 'opacity' field in the Pixel
1114
- *
1115
- * @param argc number of input arguments
1116
- * @param argv array of input arguments
1117
- * @param self this object
1118
- * @return the color name as a String
1168
+ * @overload to_color(compliance = Magick::AllCompliance, alpha = false, depth = Magick::MAGICKCORE_QUANTUM_DEPTH, hex = false)
1169
+ * @param compliance [Magick::ComplianceType] A ComplianceType constant
1170
+ * @param alpha [Boolean] If false, the pixel's alpha attribute is ignored
1171
+ * @param depth [Numeric] An image depth
1172
+ * @param hex [Boolean] If true, represent the color name in hex format
1173
+ * @return [String] the color name as a String
1119
1174
  */
1120
1175
  VALUE
1121
1176
  Pixel_to_color(int argc, VALUE *argv, VALUE self)
@@ -1167,7 +1222,7 @@ Pixel_to_color(int argc, VALUE *argv, VALUE self)
1167
1222
 
1168
1223
  info = CloneImageInfo(NULL);
1169
1224
  image = rm_acquire_image(info);
1170
- (void) DestroyImageInfo(info);
1225
+ DestroyImageInfo(info);
1171
1226
 
1172
1227
  if (!image)
1173
1228
  {
@@ -1177,7 +1232,12 @@ Pixel_to_color(int argc, VALUE *argv, VALUE self)
1177
1232
  exception = AcquireExceptionInfo();
1178
1233
 
1179
1234
  image->depth = depth;
1180
- #if defined(IMAGEMAGICK_6)
1235
+ #if defined(IMAGEMAGICK_7)
1236
+ if (alpha)
1237
+ {
1238
+ image->alpha_trait = BlendPixelTrait;
1239
+ }
1240
+ #else
1181
1241
  image->matte = alpha;
1182
1242
  #endif
1183
1243
 
@@ -1197,16 +1257,16 @@ Pixel_to_color(int argc, VALUE *argv, VALUE self)
1197
1257
  #endif
1198
1258
  mpp.depth = (unsigned long) min(1.0 * image->depth, 16.0);
1199
1259
  }
1200
- (void) GetColorTuple(&mpp, MagickTrue, name);
1260
+ GetColorTuple(&mpp, MagickTrue, name);
1201
1261
  }
1202
1262
  else
1203
1263
  {
1204
- (void) QueryColorname(image, &mpp, compliance, name, exception);
1264
+ QueryColorname(image, &mpp, compliance, name, exception);
1205
1265
  }
1206
1266
 
1207
- (void) DestroyImage(image);
1208
- CHECK_EXCEPTION()
1209
- (void) DestroyExceptionInfo(exception);
1267
+ DestroyImage(image);
1268
+ CHECK_EXCEPTION();
1269
+ DestroyExceptionInfo(exception);
1210
1270
 
1211
1271
  // Always return a string, even if it's ""
1212
1272
  return rb_str_new2(name);
@@ -1214,13 +1274,9 @@ Pixel_to_color(int argc, VALUE *argv, VALUE self)
1214
1274
 
1215
1275
 
1216
1276
  /**
1217
- * Create a string representation of a Magick::Pixel.
1218
- *
1219
- * Ruby usage:
1220
- * - @verbatim Magick::Pixel#to_s @endverbatim
1277
+ * Return a string representation of a {Magick::Pixel} object.
1221
1278
  *
1222
- * @param self this object
1223
- * @return the string
1279
+ * @return [String] the string
1224
1280
  */
1225
1281
  VALUE
1226
1282
  Pixel_to_s(VALUE self)
@@ -1229,7 +1285,7 @@ Pixel_to_s(VALUE self)
1229
1285
  char buff[100];
1230
1286
 
1231
1287
  Data_Get_Struct(self, Pixel, pixel);
1232
- sprintf(buff, "red=" QuantumFormat ", green=" QuantumFormat ", blue=" QuantumFormat ", alpha=" QuantumFormat,
1288
+ snprintf(buff, sizeof(buff), "red=" QuantumFormat ", green=" QuantumFormat ", blue=" QuantumFormat ", alpha=" QuantumFormat,
1233
1289
  pixel->red, pixel->green, pixel->blue,
1234
1290
  #if defined(IMAGEMAGICK_7)
1235
1291
  pixel->alpha);