rmagick-windows 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +14 -0
  3. data/.gitignore +23 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +340 -0
  7. data/.simplecov +27 -0
  8. data/.travis.yml +60 -0
  9. data/CHANGELOG.md +915 -0
  10. data/CODE_OF_CONDUCT.md +13 -0
  11. data/CONTRIBUTING.md +50 -0
  12. data/Doxyfile +1514 -0
  13. data/Gemfile +10 -0
  14. data/LICENSE +20 -0
  15. data/README.textile +257 -0
  16. data/Rakefile +188 -0
  17. data/before_install_linux.sh +32 -0
  18. data/before_install_osx.sh +2 -0
  19. data/deprecated/RMagick.rb +6 -0
  20. data/doc/.cvsignore +1 -0
  21. data/doc/comtasks.html +287 -0
  22. data/doc/constants.html +1581 -0
  23. data/doc/css/doc.css +299 -0
  24. data/doc/css/popup.css +34 -0
  25. data/doc/css/ref.css +67 -0
  26. data/doc/draw.html +3272 -0
  27. data/doc/ex/InitialCoords.rb +22 -0
  28. data/doc/ex/NewCoordSys.rb +30 -0
  29. data/doc/ex/OrigCoordSys.rb +16 -0
  30. data/doc/ex/PreserveAspectRatio.rb +204 -0
  31. data/doc/ex/RotateScale.rb +36 -0
  32. data/doc/ex/Skew.rb +38 -0
  33. data/doc/ex/Use01.rb +15 -0
  34. data/doc/ex/Use02.rb +20 -0
  35. data/doc/ex/Use03.rb +16 -0
  36. data/doc/ex/ViewBox.rb +31 -0
  37. data/doc/ex/adaptive_threshold.rb +9 -0
  38. data/doc/ex/add_noise.rb +16 -0
  39. data/doc/ex/affine.rb +48 -0
  40. data/doc/ex/affine_transform.rb +20 -0
  41. data/doc/ex/arc.rb +49 -0
  42. data/doc/ex/arcpath.rb +32 -0
  43. data/doc/ex/arcs01.rb +28 -0
  44. data/doc/ex/arcs02.rb +59 -0
  45. data/doc/ex/average.rb +15 -0
  46. data/doc/ex/axes.rb +64 -0
  47. data/doc/ex/baseline_shift01.rb +17 -0
  48. data/doc/ex/bilevel_channel.rb +8 -0
  49. data/doc/ex/blur_image.rb +12 -0
  50. data/doc/ex/border.rb +10 -0
  51. data/doc/ex/bounding_box.rb +42 -0
  52. data/doc/ex/cbezier1.rb +41 -0
  53. data/doc/ex/cbezier2.rb +41 -0
  54. data/doc/ex/cbezier3.rb +41 -0
  55. data/doc/ex/cbezier4.rb +42 -0
  56. data/doc/ex/cbezier5.rb +42 -0
  57. data/doc/ex/cbezier6.rb +53 -0
  58. data/doc/ex/channel.rb +25 -0
  59. data/doc/ex/charcoal.rb +12 -0
  60. data/doc/ex/chop.rb +29 -0
  61. data/doc/ex/circle.rb +33 -0
  62. data/doc/ex/circle01.rb +16 -0
  63. data/doc/ex/clip_path.rb +60 -0
  64. data/doc/ex/coalesce.rb +57 -0
  65. data/doc/ex/color_fill_to_border.rb +29 -0
  66. data/doc/ex/color_floodfill.rb +28 -0
  67. data/doc/ex/color_histogram.rb +47 -0
  68. data/doc/ex/color_reset.rb +11 -0
  69. data/doc/ex/colorize.rb +16 -0
  70. data/doc/ex/colors.rb +64 -0
  71. data/doc/ex/compose_mask.rb +22 -0
  72. data/doc/ex/composite.rb +133 -0
  73. data/doc/ex/composite_layers.rb +53 -0
  74. data/doc/ex/composite_tiled.rb +21 -0
  75. data/doc/ex/contrast.rb +36 -0
  76. data/doc/ex/crop.rb +31 -0
  77. data/doc/ex/crop_with_gravity.rb +42 -0
  78. data/doc/ex/cubic01.rb +43 -0
  79. data/doc/ex/cubic02.rb +91 -0
  80. data/doc/ex/cycle_colormap.rb +21 -0
  81. data/doc/ex/dissolve.rb +12 -0
  82. data/doc/ex/drawcomp.rb +42 -0
  83. data/doc/ex/drop_shadow.rb +60 -0
  84. data/doc/ex/edge.rb +11 -0
  85. data/doc/ex/ellipse.rb +45 -0
  86. data/doc/ex/ellipse01.rb +21 -0
  87. data/doc/ex/emboss.rb +11 -0
  88. data/doc/ex/enhance.rb +28 -0
  89. data/doc/ex/equalize.rb +11 -0
  90. data/doc/ex/evenodd.rb +42 -0
  91. data/doc/ex/fill_pattern.rb +23 -0
  92. data/doc/ex/flatten_images.rb +36 -0
  93. data/doc/ex/flip.rb +11 -0
  94. data/doc/ex/flop.rb +11 -0
  95. data/doc/ex/font_styles.rb +32 -0
  96. data/doc/ex/fonts.rb +20 -0
  97. data/doc/ex/frame.rb +12 -0
  98. data/doc/ex/gaussian_blur.rb +11 -0
  99. data/doc/ex/get_multiline_type_metrics.rb +41 -0
  100. data/doc/ex/get_pixels.rb +47 -0
  101. data/doc/ex/get_type_metrics.rb +141 -0
  102. data/doc/ex/gradientfill.rb +27 -0
  103. data/doc/ex/grav.rb +45 -0
  104. data/doc/ex/gravity.rb +80 -0
  105. data/doc/ex/group.rb +26 -0
  106. data/doc/ex/hatchfill.rb +27 -0
  107. data/doc/ex/image.rb +44 -0
  108. data/doc/ex/images/Apple.miff +0 -0
  109. data/doc/ex/images/Ballerina.jpg +0 -0
  110. data/doc/ex/images/Ballerina3.jpg +0 -0
  111. data/doc/ex/images/Button_0.gif +0 -0
  112. data/doc/ex/images/Button_1.gif +0 -0
  113. data/doc/ex/images/Button_2.gif +0 -0
  114. data/doc/ex/images/Button_3.gif +0 -0
  115. data/doc/ex/images/Button_4.gif +0 -0
  116. data/doc/ex/images/Button_5.gif +0 -0
  117. data/doc/ex/images/Button_6.gif +0 -0
  118. data/doc/ex/images/Button_7.gif +0 -0
  119. data/doc/ex/images/Button_8.gif +0 -0
  120. data/doc/ex/images/Button_9.gif +0 -0
  121. data/doc/ex/images/Button_A.gif +0 -0
  122. data/doc/ex/images/Button_B.gif +0 -0
  123. data/doc/ex/images/Button_C.gif +0 -0
  124. data/doc/ex/images/Button_D.gif +0 -0
  125. data/doc/ex/images/Button_E.gif +0 -0
  126. data/doc/ex/images/Button_F.gif +0 -0
  127. data/doc/ex/images/Button_G.gif +0 -0
  128. data/doc/ex/images/Button_H.gif +0 -0
  129. data/doc/ex/images/Button_I.gif +0 -0
  130. data/doc/ex/images/Button_J.gif +0 -0
  131. data/doc/ex/images/Button_K.gif +0 -0
  132. data/doc/ex/images/Button_L.gif +0 -0
  133. data/doc/ex/images/Button_M.gif +0 -0
  134. data/doc/ex/images/Button_N.gif +0 -0
  135. data/doc/ex/images/Button_O.gif +0 -0
  136. data/doc/ex/images/Button_P.gif +0 -0
  137. data/doc/ex/images/Button_Q.gif +0 -0
  138. data/doc/ex/images/Button_R.gif +0 -0
  139. data/doc/ex/images/Button_S.gif +0 -0
  140. data/doc/ex/images/Button_T.gif +0 -0
  141. data/doc/ex/images/Button_U.gif +0 -0
  142. data/doc/ex/images/Button_V.gif +0 -0
  143. data/doc/ex/images/Button_W.gif +0 -0
  144. data/doc/ex/images/Button_X.gif +0 -0
  145. data/doc/ex/images/Button_Y.gif +0 -0
  146. data/doc/ex/images/Button_Z.gif +0 -0
  147. data/doc/ex/images/Cheetah.jpg +0 -0
  148. data/doc/ex/images/Coffee.wmf +0 -0
  149. data/doc/ex/images/Flower_Hat.jpg +0 -0
  150. data/doc/ex/images/Gold_Statue.jpg +0 -0
  151. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  152. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  153. data/doc/ex/images/Leaf.miff +0 -0
  154. data/doc/ex/images/No.wmf +0 -0
  155. data/doc/ex/images/Polynesia.jpg +0 -0
  156. data/doc/ex/images/Red_Rocks.jpg +0 -0
  157. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  158. data/doc/ex/images/Shorts.jpg +0 -0
  159. data/doc/ex/images/Snake.wmf +0 -0
  160. data/doc/ex/images/Violin.jpg +0 -0
  161. data/doc/ex/images/Yellow_Rose.miff +0 -0
  162. data/doc/ex/images/big-duck.gif +0 -0
  163. data/doc/ex/images/duck.gif +0 -0
  164. data/doc/ex/images/duck0.gif +0 -0
  165. data/doc/ex/images/duck1.gif +0 -0
  166. data/doc/ex/images/duck10.gif +0 -0
  167. data/doc/ex/images/duck11.gif +0 -0
  168. data/doc/ex/images/duck12.gif +0 -0
  169. data/doc/ex/images/duck13.gif +0 -0
  170. data/doc/ex/images/duck14.gif +0 -0
  171. data/doc/ex/images/duck15.gif +0 -0
  172. data/doc/ex/images/duck2.gif +0 -0
  173. data/doc/ex/images/duck3.gif +0 -0
  174. data/doc/ex/images/duck4.gif +0 -0
  175. data/doc/ex/images/duck5.gif +0 -0
  176. data/doc/ex/images/duck6.gif +0 -0
  177. data/doc/ex/images/duck7.gif +0 -0
  178. data/doc/ex/images/duck8.gif +0 -0
  179. data/doc/ex/images/duck9.gif +0 -0
  180. data/doc/ex/images/graydient230x6.gif +0 -0
  181. data/doc/ex/images/image_with_profile.jpg +0 -0
  182. data/doc/ex/images/logo400x83.gif +0 -0
  183. data/doc/ex/images/model.miff +0 -0
  184. data/doc/ex/images/notimplemented.gif +0 -0
  185. data/doc/ex/images/smile.miff +0 -0
  186. data/doc/ex/images/spin.gif +0 -0
  187. data/doc/ex/implode.rb +34 -0
  188. data/doc/ex/level.rb +11 -0
  189. data/doc/ex/level_colors.rb +11 -0
  190. data/doc/ex/line.rb +41 -0
  191. data/doc/ex/line01.rb +21 -0
  192. data/doc/ex/mask.rb +35 -0
  193. data/doc/ex/matte_fill_to_border.rb +39 -0
  194. data/doc/ex/matte_floodfill.rb +32 -0
  195. data/doc/ex/matte_replace.rb +39 -0
  196. data/doc/ex/median_filter.rb +28 -0
  197. data/doc/ex/modulate.rb +11 -0
  198. data/doc/ex/mono.rb +23 -0
  199. data/doc/ex/morph.rb +25 -0
  200. data/doc/ex/mosaic.rb +35 -0
  201. data/doc/ex/motion_blur.rb +11 -0
  202. data/doc/ex/negate.rb +11 -0
  203. data/doc/ex/negate_channel.rb +9 -0
  204. data/doc/ex/nested_rvg.rb +21 -0
  205. data/doc/ex/nonzero.rb +42 -0
  206. data/doc/ex/normalize.rb +11 -0
  207. data/doc/ex/oil_paint.rb +11 -0
  208. data/doc/ex/opacity.rb +37 -0
  209. data/doc/ex/ordered_dither.rb +11 -0
  210. data/doc/ex/path.rb +63 -0
  211. data/doc/ex/pattern1.rb +25 -0
  212. data/doc/ex/pattern2.rb +26 -0
  213. data/doc/ex/polaroid.rb +27 -0
  214. data/doc/ex/polygon.rb +23 -0
  215. data/doc/ex/polygon01.rb +21 -0
  216. data/doc/ex/polyline.rb +22 -0
  217. data/doc/ex/polyline01.rb +21 -0
  218. data/doc/ex/posterize.rb +8 -0
  219. data/doc/ex/preview.rb +8 -0
  220. data/doc/ex/qbezierpath.rb +52 -0
  221. data/doc/ex/quad01.rb +34 -0
  222. data/doc/ex/quantize-m.rb +25 -0
  223. data/doc/ex/radial_blur.rb +9 -0
  224. data/doc/ex/raise.rb +8 -0
  225. data/doc/ex/random_threshold_channel.rb +13 -0
  226. data/doc/ex/rect01.rb +14 -0
  227. data/doc/ex/rect02.rb +20 -0
  228. data/doc/ex/rectangle.rb +34 -0
  229. data/doc/ex/reduce_noise.rb +28 -0
  230. data/doc/ex/remap.rb +11 -0
  231. data/doc/ex/remap_images.rb +19 -0
  232. data/doc/ex/resize_to_fill.rb +8 -0
  233. data/doc/ex/resize_to_fit.rb +8 -0
  234. data/doc/ex/roll.rb +9 -0
  235. data/doc/ex/rotate.rb +44 -0
  236. data/doc/ex/rotate_f.rb +14 -0
  237. data/doc/ex/roundrect.rb +33 -0
  238. data/doc/ex/rubyname.rb +30 -0
  239. data/doc/ex/rvg_clippath.rb +12 -0
  240. data/doc/ex/rvg_linecap.rb +42 -0
  241. data/doc/ex/rvg_linejoin.rb +40 -0
  242. data/doc/ex/rvg_opacity.rb +18 -0
  243. data/doc/ex/rvg_pattern.rb +26 -0
  244. data/doc/ex/rvg_stroke_dasharray.rb +11 -0
  245. data/doc/ex/segment.rb +11 -0
  246. data/doc/ex/sepiatone.rb +7 -0
  247. data/doc/ex/shade.rb +11 -0
  248. data/doc/ex/shadow.rb +30 -0
  249. data/doc/ex/shave.rb +15 -0
  250. data/doc/ex/shear.rb +10 -0
  251. data/doc/ex/sketch.rb +17 -0
  252. data/doc/ex/skewx.rb +51 -0
  253. data/doc/ex/skewy.rb +47 -0
  254. data/doc/ex/smile.rb +125 -0
  255. data/doc/ex/solarize.rb +11 -0
  256. data/doc/ex/sparse_color.rb +54 -0
  257. data/doc/ex/splice.rb +8 -0
  258. data/doc/ex/spread.rb +11 -0
  259. data/doc/ex/stegano.rb +55 -0
  260. data/doc/ex/stroke_dasharray.rb +42 -0
  261. data/doc/ex/stroke_fill.rb +10 -0
  262. data/doc/ex/stroke_linecap.rb +44 -0
  263. data/doc/ex/stroke_linejoin.rb +48 -0
  264. data/doc/ex/stroke_width.rb +49 -0
  265. data/doc/ex/swirl.rb +17 -0
  266. data/doc/ex/text.rb +37 -0
  267. data/doc/ex/text01.rb +16 -0
  268. data/doc/ex/text_align.rb +36 -0
  269. data/doc/ex/text_antialias.rb +37 -0
  270. data/doc/ex/text_styles.rb +19 -0
  271. data/doc/ex/text_undercolor.rb +28 -0
  272. data/doc/ex/texture_fill_to_border.rb +34 -0
  273. data/doc/ex/texture_floodfill.rb +32 -0
  274. data/doc/ex/texturefill.rb +24 -0
  275. data/doc/ex/threshold.rb +13 -0
  276. data/doc/ex/to_blob.rb +13 -0
  277. data/doc/ex/translate.rb +39 -0
  278. data/doc/ex/transparent.rb +38 -0
  279. data/doc/ex/transpose.rb +9 -0
  280. data/doc/ex/transverse.rb +9 -0
  281. data/doc/ex/tref01.rb +24 -0
  282. data/doc/ex/triangle01.rb +15 -0
  283. data/doc/ex/trim.rb +23 -0
  284. data/doc/ex/tspan01.rb +17 -0
  285. data/doc/ex/tspan02.rb +17 -0
  286. data/doc/ex/tspan03.rb +19 -0
  287. data/doc/ex/unsharp_mask.rb +28 -0
  288. data/doc/ex/viewex.rb +33 -0
  289. data/doc/ex/vignette.rb +12 -0
  290. data/doc/ex/watermark.rb +27 -0
  291. data/doc/ex/wave.rb +9 -0
  292. data/doc/ex/wet_floor.rb +58 -0
  293. data/doc/ex/writing_mode01.rb +26 -0
  294. data/doc/ex/writing_mode02.rb +26 -0
  295. data/doc/ilist.html +2056 -0
  296. data/doc/image1.html +4680 -0
  297. data/doc/image2.html +3665 -0
  298. data/doc/image3.html +4522 -0
  299. data/doc/imageattrs.html +1638 -0
  300. data/doc/imusage.html +514 -0
  301. data/doc/index.html +416 -0
  302. data/doc/info.html +1499 -0
  303. data/doc/magick.html +565 -0
  304. data/doc/optequiv.html +2435 -0
  305. data/doc/rvg.html +975 -0
  306. data/doc/rvgclip.html +248 -0
  307. data/doc/rvggroup.html +305 -0
  308. data/doc/rvgimage.html +289 -0
  309. data/doc/rvgpattern.html +475 -0
  310. data/doc/rvgshape.html +406 -0
  311. data/doc/rvgstyle.html +270 -0
  312. data/doc/rvgtext.html +465 -0
  313. data/doc/rvgtspan.html +238 -0
  314. data/doc/rvgtut.html +530 -0
  315. data/doc/rvguse.html +145 -0
  316. data/doc/rvgxform.html +294 -0
  317. data/doc/scripts/doc.js +22 -0
  318. data/doc/scripts/stripeTables.js +23 -0
  319. data/doc/struct.html +1339 -0
  320. data/doc/usage.html +1621 -0
  321. data/examples/constitute.rb +7 -0
  322. data/examples/crop_with_gravity.rb +42 -0
  323. data/examples/demo.rb +324 -0
  324. data/examples/describe.rb +43 -0
  325. data/examples/find_similar_region.rb +34 -0
  326. data/examples/histogram.rb +321 -0
  327. data/examples/identify.rb +185 -0
  328. data/examples/image_opacity.rb +29 -0
  329. data/examples/import_export.rb +31 -0
  330. data/examples/pattern_fill.rb +38 -0
  331. data/examples/rotating_text.rb +44 -0
  332. data/examples/spinner.rb +49 -0
  333. data/examples/thumbnail.rb +64 -0
  334. data/examples/vignette.rb +78 -0
  335. data/ext/RMagick/extconf.rb +548 -0
  336. data/ext/RMagick/rmagick.c +401 -0
  337. data/ext/RMagick/rmagick.h +1287 -0
  338. data/ext/RMagick/rmdraw.c +2022 -0
  339. data/ext/RMagick/rmenum.c +1235 -0
  340. data/ext/RMagick/rmfill.c +720 -0
  341. data/ext/RMagick/rmilist.c +1270 -0
  342. data/ext/RMagick/rmimage.c +15427 -0
  343. data/ext/RMagick/rminfo.c +2590 -0
  344. data/ext/RMagick/rmmain.c +1741 -0
  345. data/ext/RMagick/rmmontage.c +519 -0
  346. data/ext/RMagick/rmpixel.c +1114 -0
  347. data/ext/RMagick/rmstruct.c +1124 -0
  348. data/ext/RMagick/rmutil.c +1754 -0
  349. data/lib/rmagick.rb +1 -0
  350. data/lib/rmagick/version.rb +6 -0
  351. data/lib/rmagick_internal.rb +1947 -0
  352. data/lib/rvg/clippath.rb +45 -0
  353. data/lib/rvg/container.rb +122 -0
  354. data/lib/rvg/deep_equal.rb +52 -0
  355. data/lib/rvg/describable.rb +47 -0
  356. data/lib/rvg/embellishable.rb +391 -0
  357. data/lib/rvg/misc.rb +723 -0
  358. data/lib/rvg/paint.rb +50 -0
  359. data/lib/rvg/pathdata.rb +126 -0
  360. data/lib/rvg/rvg.rb +283 -0
  361. data/lib/rvg/stretchable.rb +165 -0
  362. data/lib/rvg/stylable.rb +116 -0
  363. data/lib/rvg/text.rb +172 -0
  364. data/lib/rvg/transformable.rb +126 -0
  365. data/lib/rvg/units.rb +63 -0
  366. data/rmagick.gemspec +46 -0
  367. data/spec/rmagick/ImageList1_spec.rb +24 -0
  368. data/spec/rmagick/draw_spec.rb +156 -0
  369. data/spec/rmagick/image/blue_shift_spec.rb +16 -0
  370. data/spec/rmagick/image/composite_spec.rb +140 -0
  371. data/spec/rmagick/image/constitute_spec.rb +15 -0
  372. data/spec/rmagick/image/dispatch_spec.rb +18 -0
  373. data/spec/rmagick/image/from_blob_spec.rb +14 -0
  374. data/spec/rmagick/image/ping_spec.rb +14 -0
  375. data/spec/rmagick/image/properties_spec.rb +29 -0
  376. data/spec/spec_helper.rb +4 -0
  377. data/test/Image1.rb +565 -0
  378. data/test/Image2.rb +1304 -0
  379. data/test/Image3.rb +1030 -0
  380. data/test/ImageList1.rb +806 -0
  381. data/test/ImageList2.rb +385 -0
  382. data/test/Image_attributes.rb +697 -0
  383. data/test/Import_Export.rb +121 -0
  384. data/test/Info.rb +345 -0
  385. data/test/Magick.rb +321 -0
  386. data/test/Pixel.rb +116 -0
  387. data/test/Preview.rb +57 -0
  388. data/test/cmyk.icm +0 -0
  389. data/test/srgb.icm +0 -0
  390. data/test/test_all_basic.rb +38 -0
  391. data/test/tmpnam_test.rb +50 -0
  392. data/wercker.yml +10 -0
  393. metadata +509 -0
@@ -0,0 +1,1114 @@
1
+ /**************************************************************************//**
2
+ * Contains Pixel class methods.
3
+ *
4
+ * Copyright © 2002 - 2009 by Timothy P. Hunter
5
+ *
6
+ * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or
7
+ *
8
+ * @file rmpixel.c
9
+ * @version $Id: rmpixel.c,v 1.7 2009/12/21 10:34:58 baror Exp $
10
+ * @author Tim Hunter
11
+ ******************************************************************************/
12
+
13
+ #include "rmagick.h"
14
+
15
+
16
+
17
+
18
+ static void Color_Name_to_PixelPacket(PixelPacket *, VALUE);
19
+
20
+
21
+
22
+
23
+ /**
24
+ * Free the storage associated with a Pixel object.
25
+ *
26
+ * No Ruby usage (internal function)
27
+ *
28
+ * @param pixel the Pixel object to destroy
29
+ */
30
+ void
31
+ destroy_Pixel(Pixel *pixel)
32
+ {
33
+ xfree(pixel);
34
+ }
35
+
36
+
37
+ /**
38
+ * Get Pixel red attribute.
39
+ *
40
+ * Ruby usage:
41
+ * - @verbatim Pixel#red @endverbatim
42
+ *
43
+ * @param self this object
44
+ * @return the red value
45
+ */
46
+ DEF_ATTR_READER(Pixel, red, int)
47
+
48
+ /**
49
+ * Get Pixel green attribute.
50
+ *
51
+ * Ruby usage:
52
+ * - @verbatim Pixel#green @endverbatim
53
+ *
54
+ * @param self this object
55
+ * @return the green value
56
+ */
57
+ DEF_ATTR_READER(Pixel, green, int)
58
+
59
+ /**
60
+ * Get Pixel blue attribute.
61
+ *
62
+ * Ruby usage:
63
+ * - @verbatim Pixel#blue @endverbatim
64
+ *
65
+ * @param self this object
66
+ * @return the blue value
67
+ */
68
+ DEF_ATTR_READER(Pixel, blue, int)
69
+
70
+ /**
71
+ * Get Pixel opacity attribute.
72
+ *
73
+ * Ruby usage:
74
+ * - @verbatim Pixel#opacity @endverbatim
75
+ *
76
+ * @param self this object
77
+ * @return the opacity value
78
+ */
79
+ DEF_ATTR_READER(Pixel, opacity, int)
80
+
81
+ /**
82
+ * Set Pixel red attribute.
83
+ *
84
+ * Ruby usage:
85
+ * - @verbatim Pixel#red= @endverbatim
86
+ *
87
+ * Notes:
88
+ * - Pixel is Observable. Setters call changed, notify_observers
89
+ * - Setters return their argument values for backward compatibility to when
90
+ * Pixel was a Struct class.
91
+ *
92
+ * @param self this object
93
+ * @param v the red value
94
+ * @return self
95
+ */
96
+ DEF_PIXEL_CHANNEL_WRITER(red)
97
+
98
+ /**
99
+ * Set Pixel green attribute.
100
+ *
101
+ * Ruby usage:
102
+ * - @verbatim Pixel#green= @endverbatim
103
+ *
104
+ * Notes:
105
+ * - Pixel is Observable. Setters call changed, notify_observers
106
+ * - Setters return their argument values for backward compatibility to when
107
+ * Pixel was a Struct class.
108
+ *
109
+ * @param self this object
110
+ * @param v the green value
111
+ * @return self
112
+ */
113
+ DEF_PIXEL_CHANNEL_WRITER(green)
114
+
115
+ /**
116
+ * Set Pixel blue attribute.
117
+ *
118
+ * Ruby usage:
119
+ * - @verbatim Pixel#blue= @endverbatim
120
+ *
121
+ * Notes:
122
+ * - Pixel is Observable. Setters call changed, notify_observers
123
+ * - Setters return their argument values for backward compatibility to when
124
+ * Pixel was a Struct class.
125
+ *
126
+ * @param self this object
127
+ * @param v the blue value
128
+ * @return self
129
+ */
130
+ DEF_PIXEL_CHANNEL_WRITER(blue)
131
+
132
+ /**
133
+ * Set Pixel opacity attribute.
134
+ *
135
+ * Ruby usage:
136
+ * - @verbatim Pixel#opacity= @endverbatim
137
+ *
138
+ * Notes:
139
+ * - Pixel is Observable. Setters call changed, notify_observers
140
+ * - Setters return their argument values for backward compatibility to when
141
+ * Pixel was a Struct class.
142
+ *
143
+ * @param self this object
144
+ * @param v the opacity value
145
+ * @return self
146
+ */
147
+ DEF_PIXEL_CHANNEL_WRITER(opacity)
148
+
149
+
150
+ /*
151
+ * Get/set Pixel CMYK attributes.
152
+ */
153
+ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(cyan, red)
154
+ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(magenta, green)
155
+ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(yellow, blue)
156
+ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(black, opacity)
157
+
158
+
159
+ /**
160
+ * Raise ArgumentError if the color name cannot be converted to a string via
161
+ * rb_str_to_str.
162
+ *
163
+ * No Ruby usage (internal function)
164
+ *
165
+ * @param arg the argument to convert
166
+ * @return 0
167
+ * @throw ArgumentError
168
+ */
169
+ static VALUE
170
+ color_arg_rescue(VALUE arg)
171
+ {
172
+ rb_raise(rb_eTypeError, "argument must be color name or pixel (%s given)",
173
+ rb_class2name(CLASS_OF(arg)));
174
+ return (VALUE)0;
175
+ }
176
+
177
+
178
+ /**
179
+ * Convert either a String color name or a Magick::Pixel to a PixelPacket.
180
+ *
181
+ * No Ruby usage (internal function)
182
+ *
183
+ * @param pp the PixelPacket to modify
184
+ * @param color the color name or Magick::Pixel
185
+ */
186
+ void
187
+ Color_to_PixelPacket(PixelPacket *pp, VALUE color)
188
+ {
189
+ Pixel *pixel;
190
+
191
+ // Allow color name or Pixel
192
+ if (CLASS_OF(color) == Class_Pixel)
193
+ {
194
+ Data_Get_Struct(color, Pixel, pixel);
195
+ *pp = *pixel;
196
+ }
197
+ else
198
+ {
199
+ // require 'to_str' here instead of just 'to_s'.
200
+ color = rb_rescue(rb_str_to_str, color, color_arg_rescue, color);
201
+ Color_Name_to_PixelPacket(pp, color);
202
+ }
203
+ }
204
+
205
+
206
+ /**
207
+ * Convert a color name to a PixelPacket
208
+ *
209
+ * No Ruby usage (internal function)
210
+ *
211
+ * @param color the PixelPacket to modify
212
+ * @param name_arg the coor name
213
+ * @throw ArgumentError
214
+ */
215
+ static void
216
+ Color_Name_to_PixelPacket(PixelPacket *color, VALUE name_arg)
217
+ {
218
+ MagickBooleanType okay;
219
+ char *name;
220
+ ExceptionInfo *exception;
221
+
222
+ exception = AcquireExceptionInfo();
223
+ name = StringValuePtr(name_arg);
224
+ okay = QueryColorDatabase(name, color, exception);
225
+ (void) DestroyExceptionInfo(exception);
226
+ if (!okay)
227
+ {
228
+ rb_raise(rb_eArgError, "invalid color name %s", name);
229
+ }
230
+ }
231
+
232
+
233
+
234
+ /**
235
+ * Allocate a Pixel object.
236
+ *
237
+ * No Ruby usage (internal function)
238
+ *
239
+ * @param class the Ruby class to use
240
+ * @return a new Magick::Pixel object
241
+ */
242
+ VALUE
243
+ Pixel_alloc(VALUE class)
244
+ {
245
+ Pixel *pixel;
246
+
247
+ pixel = ALLOC(Pixel);
248
+ memset(pixel, '\0', sizeof(Pixel));
249
+ return Data_Wrap_Struct(class, NULL, destroy_Pixel, pixel);
250
+ }
251
+
252
+
253
+ /**
254
+ * "Case equal" operator for Pixel.
255
+ *
256
+ * Ruby usage:
257
+ * - @verbatim Pixel#=== @endverbatim
258
+ *
259
+ * @param self this object
260
+ * @param other the other object
261
+ * @return true or false
262
+ */
263
+
264
+ VALUE
265
+ Pixel_case_eq(VALUE self, VALUE other)
266
+ {
267
+ Pixel *this, *that;
268
+
269
+ if (CLASS_OF(self) == CLASS_OF(other))
270
+ {
271
+ Data_Get_Struct(self, Pixel, this);
272
+ Data_Get_Struct(other, Pixel, that);
273
+ return (this->red == that->red
274
+ && this->blue == that->blue
275
+ && this->green == that->green
276
+ && this->opacity == that->opacity) ? Qtrue : Qfalse;
277
+ }
278
+
279
+ return Qfalse;
280
+ }
281
+
282
+
283
+ /**
284
+ * Clone a Pixel.
285
+ *
286
+ * Ruby usage:
287
+ * - @verbatim Pixel#clone @endverbatim
288
+ *
289
+ * @param self this object
290
+ * @return a clone
291
+ * @see Pixel_dup
292
+ * @see Pixel_init_copy
293
+ */
294
+ VALUE
295
+ Pixel_clone(VALUE self)
296
+ {
297
+ VALUE clone;
298
+
299
+ clone = Pixel_dup(self);
300
+ if (OBJ_FROZEN(self))
301
+ {
302
+ OBJ_FREEZE(clone);
303
+ }
304
+
305
+ RB_GC_GUARD(clone);
306
+
307
+ return clone;
308
+ }
309
+
310
+
311
+ /**
312
+ * Duplicate a Pixel.
313
+ *
314
+ * Ruby usage:
315
+ * - @verbatim Pixel#dup @endverbatim
316
+ *
317
+ * @param self this object
318
+ * @return a clone
319
+ * @see Pixel_clone
320
+ * @see Pixel_init_copy
321
+ */
322
+ VALUE
323
+ Pixel_dup(VALUE self)
324
+ {
325
+ Pixel *pixel;
326
+ VALUE dup;
327
+
328
+ pixel = ALLOC(Pixel);
329
+ memset(pixel, '\0', sizeof(Pixel));
330
+ dup = Data_Wrap_Struct(CLASS_OF(self), NULL, destroy_Pixel, pixel);
331
+ if (rb_obj_tainted(self))
332
+ {
333
+ (void) rb_obj_taint(dup);
334
+ }
335
+
336
+ RB_GC_GUARD(dup);
337
+
338
+ return rb_funcall(dup, rm_ID_initialize_copy, 1, self);
339
+ }
340
+
341
+
342
+ /**
343
+ * For use with Hash.
344
+ *
345
+ * Ruby usage:
346
+ * - @verbatim Pixel#eql? @endverbatim
347
+ *
348
+ * @param self this object
349
+ * @param other the other object
350
+ * @return true if hash to the same value, otherwise false
351
+ */
352
+ VALUE
353
+ Pixel_eql_q(VALUE self, VALUE other)
354
+ {
355
+ return NUM2INT(Pixel_spaceship(self, other)) == 0 ? Qtrue : Qfalse;
356
+ }
357
+
358
+
359
+ /**
360
+ * Compare pixel values for equality.
361
+ *
362
+ * Ruby usage:
363
+ * - @verbatim Pixel#fcmp(other, fuzz, colorspace) @endverbatim
364
+ *
365
+ * Notes:
366
+ * - Default fuzz is 0.0
367
+ * - Default colorspace is RGBColorspace
368
+ *
369
+ * @param argc number of input arguments
370
+ * @param argv array of input arguments
371
+ * @param self this object
372
+ * @return true if equal, otherwise false
373
+ */
374
+ VALUE
375
+ Pixel_fcmp(int argc, VALUE *argv, VALUE self)
376
+ {
377
+ Image *image;
378
+ Info *info;
379
+
380
+ Pixel *this, *that;
381
+ ColorspaceType colorspace = RGBColorspace;
382
+ double fuzz = 0.0;
383
+ unsigned int equal;
384
+
385
+ switch (argc)
386
+ {
387
+ case 3:
388
+ VALUE_TO_ENUM(argv[2], colorspace, ColorspaceType);
389
+ case 2:
390
+ fuzz = NUM2DBL(argv[1]);
391
+ case 1:
392
+ // Allow 1 argument
393
+ break;
394
+ default:
395
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 3)", argc);
396
+ break;
397
+ }
398
+
399
+ Data_Get_Struct(self, Pixel, this);
400
+ Data_Get_Struct(argv[0], Pixel, that);
401
+
402
+ // The IsColorSimilar function expects to get the
403
+ // colorspace and fuzz parameters from an Image structure.
404
+
405
+ info = CloneImageInfo(NULL);
406
+ if (!info)
407
+ {
408
+ rb_raise(rb_eNoMemError, "not enough memory to continue");
409
+ }
410
+
411
+ image = AcquireImage(info);
412
+
413
+ // Delete Info now in case we have to raise an exception
414
+ (void) DestroyImageInfo(info);
415
+
416
+ if (!image)
417
+ {
418
+ rb_raise(rb_eNoMemError, "not enough memory to continue");
419
+ }
420
+
421
+ image->colorspace = colorspace;
422
+ image->fuzz = fuzz;
423
+
424
+ equal = IsColorSimilar(image, this, that);
425
+ (void) DestroyImage(image);
426
+
427
+ return equal ? Qtrue : Qfalse;
428
+ }
429
+
430
+
431
+ /**
432
+ * Construct an Magick::Pixel corresponding to the given color name.
433
+ *
434
+ * Ruby usage:
435
+ * - @verbatim Magick::Pixel.from_color(string) @endverbatim
436
+ *
437
+ * Notes:
438
+ * - The "inverse" is Image_to_color, b/c the conversion of a pixel to a
439
+ * color name requires both a color depth and if the opacity value has
440
+ * meaning (i.e. whether image->matte == True or not).
441
+ *
442
+ * @param class the Ruby class to use
443
+ * @param name the color name
444
+ * @return a new Magic::Pixel object
445
+ * @see Image_to_color
446
+ * @see Pixel_to_color
447
+ */
448
+ VALUE
449
+ Pixel_from_color(VALUE class, VALUE name)
450
+ {
451
+ PixelPacket pp;
452
+ ExceptionInfo *exception;
453
+ MagickBooleanType okay;
454
+
455
+ class = class; // defeat "never referenced" message from icc
456
+
457
+ exception = AcquireExceptionInfo();
458
+ okay = QueryColorDatabase(StringValuePtr(name), &pp, exception);
459
+ CHECK_EXCEPTION()
460
+ (void) DestroyExceptionInfo(exception);
461
+
462
+ if (!okay)
463
+ {
464
+ rb_raise(rb_eArgError, "invalid color name: %s", StringValuePtr(name));
465
+ }
466
+
467
+ return Pixel_from_PixelPacket(&pp);
468
+ }
469
+
470
+
471
+ /**
472
+ * Construct an RGB pixel.
473
+ *
474
+ * Ruby usage:
475
+ * - @verbatim Pixel#from_hsla(hue, saturation, lightness) @endverbatim
476
+ * - @verbatim Pixel#from_hsla(hue, saturation, lightness, alpha) @endverbatim
477
+ *
478
+ * Notes:
479
+ * - Default alpha is 1.0
480
+ * - 0 <= hue < 360 OR "0%" <= hue < "100%"
481
+ * - 0 <= saturation <= 255 OR "0%" <= saturation <= "100%"
482
+ * - 0 <= lightness <= 255 OR "0%" <= lightness <= "100%"
483
+ * - 0 <= alpha <= 1 (0 is transparent, 1 is opaque) OR "0%" <= alpha <= "100%"
484
+ * - Replaces brain-dead Pixel_from_HSL.
485
+ *
486
+ * @param argc number of input arguments
487
+ * @param argv array of input arguments
488
+ * @param class the Ruby class to use
489
+ * @return a new Magick::Pixel object
490
+ */
491
+ VALUE
492
+ Pixel_from_hsla(int argc, VALUE *argv, VALUE class)
493
+ {
494
+ double h, s, l, a = 1.0;
495
+ MagickPixelPacket pp;
496
+ ExceptionInfo *exception;
497
+ char name[50];
498
+ MagickBooleanType alpha = MagickFalse;
499
+
500
+ class = class; // defeat "unused parameter" message.
501
+
502
+ switch (argc)
503
+ {
504
+ case 4:
505
+ a = rm_percentage(argv[3],1.0);
506
+ alpha = MagickTrue;
507
+ case 3:
508
+ // saturation and lightness are out of 255 in new ImageMagicks and
509
+ // out of 100 in old ImageMagicks. Compromise: always use %.
510
+ l = rm_percentage(argv[2],255.0);
511
+ s = rm_percentage(argv[1],255.0);
512
+ h = rm_percentage(argv[0],360.0);
513
+ break;
514
+ default:
515
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
516
+ break;
517
+ }
518
+
519
+ if (alpha && (a < 0.0 || a > 1.0))
520
+ {
521
+ rb_raise(rb_eRangeError, "alpha %g out of range [0.0, 1.0]", a);
522
+ }
523
+ if (l < 0.0 || l > 255.0)
524
+ {
525
+ rb_raise(rb_eRangeError, "lightness %g out of range [0.0, 255.0]", l);
526
+ }
527
+ if (s < 0.0 || s > 255.0)
528
+ {
529
+ rb_raise(rb_eRangeError, "saturation %g out of range [0.0, 255.0]", s);
530
+ }
531
+ if (h < 0.0 || h >= 360.0)
532
+ {
533
+ rb_raise(rb_eRangeError, "hue %g out of range [0.0, 360.0)", h);
534
+ }
535
+
536
+ // Ugly way of checking for change in ImageMagick 6.5.6-5 to see whether
537
+ // saturation/lightness should be out of 255 or out of 100.
538
+ if(MagickLibVersion < 0x656 ||
539
+ (MagickLibVersion == 0x656 && strcmp(MagickLibSubversion,"-5") <= 0) )
540
+ {
541
+ s = s/2.55;
542
+ l = l/2.55;
543
+ }
544
+
545
+ memset(name, 0, sizeof(name));
546
+ if (alpha)
547
+ {
548
+ sprintf(name, "hsla(%-2.1f,%-2.1f,%-2.1f,%-2.1f)", h, s, l, a);
549
+ }
550
+ else
551
+ {
552
+ sprintf(name, "hsl(%-2.1f,%-2.1f,%-2.1f)", h, s, l);
553
+ }
554
+
555
+ exception = AcquireExceptionInfo();
556
+
557
+ (void) QueryMagickColor(name, &pp, exception);
558
+ CHECK_EXCEPTION()
559
+
560
+ (void) DestroyExceptionInfo(exception);
561
+
562
+ return Pixel_from_MagickPixelPacket(&pp);
563
+ }
564
+
565
+
566
+ /**
567
+ * Construct an RGB pixel from the array [hue, saturation, luminosity].
568
+ *
569
+ * Ruby usage:
570
+ * - @verbatim Pixel.from_HSL @endverbatim
571
+ *
572
+ * @param class the Ruby class to use
573
+ * @param hsl the array
574
+ * @return a new Magick::Pixel object
575
+ * @deprecated This method has been deprecated. Please use Pixel_from_hsla.
576
+ */
577
+ VALUE
578
+ Pixel_from_HSL(VALUE class, VALUE hsl)
579
+ {
580
+ PixelPacket rgb;
581
+ double hue, saturation, luminosity;
582
+
583
+ class = class; // defeat "never referenced" message from icc
584
+ memset(&rgb, 0, sizeof(rgb));
585
+
586
+ hsl = rb_Array(hsl); // Ensure array
587
+ if (RARRAY_LEN(hsl) < 3)
588
+ {
589
+ rb_raise(rb_eArgError, "array argument must have at least 3 elements");
590
+ }
591
+
592
+ hue = NUM2DBL(rb_ary_entry(hsl, 0));
593
+ saturation = NUM2DBL(rb_ary_entry(hsl, 1));
594
+ luminosity = NUM2DBL(rb_ary_entry(hsl, 2));
595
+
596
+ rb_warning("Pixel#from_HSL is deprecated; use from_hsla");
597
+ ConvertHSLToRGB(hue, saturation, luminosity,
598
+ &rgb.red, &rgb.green, &rgb.blue);
599
+ return Pixel_from_PixelPacket(&rgb);
600
+ }
601
+
602
+
603
+ /**
604
+ * Create a Magick::Pixel object from a MagickPixelPacket structure.
605
+ *
606
+ * No Ruby usage (internal function)
607
+ *
608
+ * Notes:
609
+ * - Bypasses normal Pixel.new, Pixel#initialize methods
610
+ *
611
+ * @param pp the MagickPixelPacket
612
+ * @return a new Magick::Pixel object
613
+ */
614
+ VALUE
615
+ Pixel_from_MagickPixelPacket(const MagickPixelPacket *pp)
616
+ {
617
+ Pixel *pixel;
618
+
619
+ pixel = ALLOC(Pixel);
620
+ pixel->red = ROUND_TO_QUANTUM(pp->red);
621
+ pixel->green = ROUND_TO_QUANTUM(pp->green);
622
+ pixel->blue = ROUND_TO_QUANTUM(pp->blue);
623
+ pixel->opacity = ROUND_TO_QUANTUM(pp->opacity);
624
+
625
+ return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel);
626
+ }
627
+
628
+
629
+ /**
630
+ * Create a Magick::Pixel object from a PixelPacket structure.
631
+ *
632
+ * No Ruby usage (internal function)
633
+ *
634
+ * Notes:
635
+ * - Bypasses normal Pixel.new, Pixel#initialize methods
636
+ *
637
+ * @param pp the PixelPacket
638
+ * @return a new Magick::Pixel object
639
+ */
640
+ VALUE
641
+ Pixel_from_PixelPacket(const PixelPacket *pp)
642
+ {
643
+ Pixel *pixel;
644
+
645
+ pixel = ALLOC(Pixel);
646
+ *pixel = *pp;
647
+ return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel);
648
+ }
649
+
650
+
651
+ /**
652
+ * Ruby usage:
653
+ * - @verbatim Pixel#hash @endverbatim
654
+ *
655
+ * Notes:
656
+ * - INT2FIX left-shifts 1 bit. Sacrifice 1 bit from the opacity attribute to
657
+ * the FIXNUM_FLAG.
658
+ *
659
+ * @param self this object
660
+ * @return the hash of self
661
+ */
662
+ VALUE
663
+ Pixel_hash(VALUE self)
664
+ {
665
+ Pixel *pixel;
666
+ unsigned int hash;
667
+
668
+ Data_Get_Struct(self, Pixel, pixel);
669
+
670
+ hash = ScaleQuantumToChar(pixel->red) << 24;
671
+ hash += ScaleQuantumToChar(pixel->green) << 16;
672
+ hash += ScaleQuantumToChar(pixel->blue) << 8;
673
+ hash += ScaleQuantumToChar(pixel->opacity);
674
+
675
+ return UINT2NUM(hash >> 1);
676
+ }
677
+
678
+
679
+ /**
680
+ * Initialize clone, dup methods.
681
+ *
682
+ * Ruby usage:
683
+ * - @verbatim Pixel#initialize_copy @endverbatim
684
+ *
685
+ * @param self this object
686
+ * @param orig the original Pixel
687
+ * @return self
688
+ * @see Pixel_clone
689
+ * @see Pixel_dup
690
+ */
691
+ VALUE
692
+ Pixel_init_copy(VALUE self, VALUE orig)
693
+ {
694
+ Pixel *copy, *original;
695
+
696
+ Data_Get_Struct(orig, Pixel, original);
697
+ Data_Get_Struct(self, Pixel, copy);
698
+
699
+ *copy = *original;
700
+
701
+ return self;
702
+ }
703
+
704
+
705
+ /**
706
+ * Ruby usage:
707
+ * - @verbatim Pixel#initialize @endverbatim
708
+ * - @verbatim Pixel#initialize(red) @endverbatim
709
+ * - @verbatim Pixel#initialize(red,green) @endverbatim
710
+ * - @verbatim Pixel#initialize(red,green,blue) @endverbatim
711
+ * - @verbatim Pixel#initialize(red,green,blue,opacity) @endverbatim
712
+ *
713
+ * Notes:
714
+ * - Default red is 0.0
715
+ * - Default green is 0.0
716
+ * - Default blue is 0.0
717
+ * - Default opacity is 0.0
718
+ * - For backward compatibility, arguments may be nil.
719
+ *
720
+ * @param argc number of input arguments
721
+ * @param argv array of input arguments
722
+ * @param self this object
723
+ * @return self
724
+ */
725
+ VALUE
726
+ Pixel_initialize(int argc, VALUE *argv, VALUE self)
727
+ {
728
+ Pixel *pixel;
729
+
730
+ Data_Get_Struct(self, Pixel, pixel);
731
+
732
+ switch(argc)
733
+ {
734
+ case 4:
735
+ if (argv[3] != Qnil)
736
+ {
737
+ pixel->opacity = APP2QUANTUM(argv[3]);
738
+ }
739
+ case 3:
740
+ if (argv[2] != Qnil)
741
+ {
742
+ pixel->blue = APP2QUANTUM(argv[2]);
743
+ }
744
+ case 2:
745
+ if (argv[1] != Qnil)
746
+ {
747
+ pixel->green = APP2QUANTUM(argv[1]);
748
+ }
749
+ case 1:
750
+ if (argv[0] != Qnil)
751
+ {
752
+ pixel->red = APP2QUANTUM(argv[0]);
753
+ }
754
+ case 0:
755
+ break;
756
+ default:
757
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc);
758
+ }
759
+
760
+ return self;
761
+ }
762
+
763
+
764
+ /**
765
+ * Return the "intensity" of a pixel.
766
+ *
767
+ * Ruby usage:
768
+ * - @verbatim Pixel#intensity @endverbatim
769
+ *
770
+ * @param self this object
771
+ * @return the intensity
772
+ */
773
+ VALUE
774
+ Pixel_intensity(VALUE self)
775
+ {
776
+ Pixel *pixel;
777
+ Quantum intensity;
778
+
779
+ Data_Get_Struct(self, Pixel, pixel);
780
+
781
+ intensity = ROUND_TO_QUANTUM((0.299*pixel->red)
782
+ + (0.587*pixel->green)
783
+ + (0.114*pixel->blue));
784
+
785
+ return QUANTUM2NUM((unsigned long) intensity);
786
+ }
787
+
788
+
789
+ /**
790
+ * Support Marshal.dump.
791
+ *
792
+ * Ruby usage:
793
+ * - @verbatim Pixel#marshal_dump @endverbatim
794
+ *
795
+ * @param self this object
796
+ * @return a string representing the dumped pixel
797
+ */
798
+ VALUE
799
+ Pixel_marshal_dump(VALUE self)
800
+ {
801
+ Pixel *pixel;
802
+ VALUE dpixel;
803
+
804
+ Data_Get_Struct(self, Pixel, pixel);
805
+ dpixel = rb_hash_new();
806
+ rb_hash_aset(dpixel, CSTR2SYM("red"), QUANTUM2NUM(pixel->red));
807
+ rb_hash_aset(dpixel, CSTR2SYM("green"), QUANTUM2NUM(pixel->green));
808
+ rb_hash_aset(dpixel, CSTR2SYM("blue"), QUANTUM2NUM(pixel->blue));
809
+ rb_hash_aset(dpixel, CSTR2SYM("opacity"), QUANTUM2NUM(pixel->opacity));
810
+
811
+ RB_GC_GUARD(dpixel);
812
+
813
+ return dpixel;
814
+ }
815
+
816
+
817
+ /**
818
+ * Support Marshal.load.
819
+ *
820
+ * Ruby usage:
821
+ * - @verbatim Pixel#marshal_load @endverbatim
822
+ *
823
+ * @param self this object
824
+ * @param dpixel the dumped pixel
825
+ * @return self
826
+ */
827
+ VALUE
828
+ Pixel_marshal_load(VALUE self, VALUE dpixel)
829
+ {
830
+ Pixel *pixel;
831
+
832
+ Data_Get_Struct(self, Pixel, pixel);
833
+ pixel->red = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("red")));
834
+ pixel->green = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("green")));
835
+ pixel->blue = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("blue")));
836
+ pixel->opacity = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("opacity")));
837
+ return self;
838
+ }
839
+
840
+
841
+ /**
842
+ * Support Comparable mixin.
843
+ *
844
+ * Ruby usage:
845
+ * - @verbatim Pixel#<=> @endverbatim
846
+ *
847
+ * @param self this object
848
+ * @param other the other Pixel
849
+ * @return -1, 0, 1
850
+ */
851
+ VALUE
852
+ Pixel_spaceship(VALUE self, VALUE other)
853
+ {
854
+ Pixel *this, *that;
855
+
856
+ Data_Get_Struct(self, Pixel, this);
857
+ Data_Get_Struct(other, Pixel, that);
858
+
859
+ if (this->red != that->red)
860
+ {
861
+ return INT2NUM((this->red - that->red)/abs(this->red - that->red));
862
+ }
863
+ else if(this->green != that->green)
864
+ {
865
+ return INT2NUM((this->green - that->green)/abs(this->green - that->green));
866
+ }
867
+ else if(this->blue != that->blue)
868
+ {
869
+ return INT2NUM((this->blue - that->blue)/abs(this->blue - that->blue));
870
+ }
871
+ else if(this->opacity != that->opacity)
872
+ {
873
+ return INT2NUM((this->opacity - that->opacity)/abs(this->opacity - that->opacity));
874
+ }
875
+
876
+ // Values are equal, check class.
877
+
878
+ return rb_funcall(CLASS_OF(self), rb_intern("<=>"), 1, CLASS_OF(other));
879
+
880
+ }
881
+
882
+
883
+ /**
884
+ * Return [hue, saturation, lightness, alpha] in the same ranges as
885
+ * Pixel_from_hsla.
886
+ *
887
+ *
888
+ * Ruby usage:
889
+ * - @verbatim Pixel#to_hsla @endverbatim
890
+ *
891
+ * Notes:
892
+ * - Replace brain-dead Pixel_to_HSL.
893
+ *
894
+ * @param self this object
895
+ * @return an array with hsla data
896
+ * @see Pixel_from_hsla
897
+ */
898
+ VALUE
899
+ Pixel_to_hsla(VALUE self)
900
+ {
901
+ double hue, sat, lum, alpha;
902
+ Pixel *pixel;
903
+ VALUE hsla;
904
+
905
+ Data_Get_Struct(self, Pixel, pixel);
906
+
907
+ ConvertRGBToHSL(pixel->red, pixel->green, pixel->blue, &hue, &sat, &lum);
908
+ hue *= 360.0;
909
+ sat *= 255.0;
910
+ lum *= 255.0;
911
+
912
+ if (pixel->opacity == OpaqueOpacity)
913
+ {
914
+ alpha = 1.0;
915
+ }
916
+ else if (pixel->opacity == TransparentOpacity)
917
+ {
918
+ alpha = 0.0;
919
+ }
920
+ else
921
+ {
922
+ alpha = (double)(QuantumRange - pixel->opacity) / (double)QuantumRange;
923
+ }
924
+
925
+ hsla = rb_ary_new3(4, rb_float_new(hue), rb_float_new(sat), rb_float_new(lum), rb_float_new(alpha));
926
+
927
+ RB_GC_GUARD(hsla);
928
+
929
+ return hsla;
930
+ }
931
+
932
+ /**
933
+ * Convert an RGB pixel to the array [hue, saturation, luminosity].
934
+ *
935
+ * Ruby usage:
936
+ * - @verbatim Pixel#to_HSL @endverbatim
937
+ *
938
+ * @param self this object
939
+ * @return an array with hsl data
940
+ * @deprecated This method has been deprecated. Please use Pixel_to_hsla.
941
+ */
942
+ VALUE
943
+ Pixel_to_HSL(VALUE self)
944
+ {
945
+ Pixel *pixel;
946
+ double hue, saturation, luminosity;
947
+ VALUE hsl;
948
+
949
+ Data_Get_Struct(self, Pixel, pixel);
950
+
951
+ rb_warning("Pixel#to_HSL is deprecated; use to_hsla");
952
+ ConvertRGBToHSL(pixel->red, pixel->green, pixel->blue, &hue, &saturation, &luminosity);
953
+
954
+ hsl = rb_ary_new3(3, rb_float_new(hue), rb_float_new(saturation),
955
+ rb_float_new(luminosity));
956
+
957
+ RB_GC_GUARD(hsl);
958
+
959
+ return hsl;
960
+ }
961
+
962
+
963
+ /**
964
+ * Return the color name corresponding to the pixel values.
965
+ *
966
+ * Ruby usage:
967
+ * - @verbatim Magick::Pixel#to_color @endverbatim
968
+ * - @verbatim Magick::Pixel#to_color(compliance) @endverbatim
969
+ * - @verbatim Magick::Pixel#to_color(compliance, matte) @endverbatim
970
+ * - @verbatim Magick::Pixel#to_color(compliance, matte, depth) @endverbatim
971
+ * - @verbatim Magick::Pixel#to_color(compliance, matte, depth, hex) @endverbatim
972
+ *
973
+ * Notes:
974
+ * - Default compliance is AllCompliance
975
+ * - Default matte is false
976
+ * - Default depth is MAGICKCORE_QUANTUM_DEPTH
977
+ * - Default hex is false
978
+ * - The conversion respects the value of the 'opacity' field in the Pixel
979
+ *
980
+ * @param argc number of input arguments
981
+ * @param argv array of input arguments
982
+ * @param self this object
983
+ * @return the color name as a String
984
+ */
985
+ VALUE
986
+ Pixel_to_color(int argc, VALUE *argv, VALUE self)
987
+ {
988
+ Info *info;
989
+ Image *image;
990
+ Pixel *pixel;
991
+ MagickPixelPacket mpp;
992
+ MagickBooleanType hex = MagickFalse;
993
+ char name[MaxTextExtent];
994
+ ExceptionInfo *exception;
995
+ ComplianceType compliance = AllCompliance;
996
+ unsigned int matte = MagickFalse;
997
+ unsigned int depth = MAGICKCORE_QUANTUM_DEPTH;
998
+
999
+ switch (argc)
1000
+ {
1001
+ case 4:
1002
+ hex = RTEST(argv[3]);
1003
+ case 3:
1004
+ depth = NUM2UINT(argv[2]);
1005
+
1006
+ // Ensure depth is appropriate for the way xMagick was compiled.
1007
+ switch (depth)
1008
+ {
1009
+ case 8:
1010
+ #if MAGICKCORE_QUANTUM_DEPTH == 16 || MAGICKCORE_QUANTUM_DEPTH == 32
1011
+ case 16:
1012
+ #endif
1013
+ #if MAGICKCORE_QUANTUM_DEPTH == 32
1014
+ case 32:
1015
+ #endif
1016
+ break;
1017
+ default:
1018
+ rb_raise(rb_eArgError, "invalid depth (%d)", depth);
1019
+ break;
1020
+ }
1021
+ case 2:
1022
+ matte = RTEST(argv[1]);
1023
+ case 1:
1024
+ VALUE_TO_ENUM(argv[0], compliance, ComplianceType);
1025
+ case 0:
1026
+ break;
1027
+ default:
1028
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc);
1029
+ }
1030
+
1031
+ Data_Get_Struct(self, Pixel, pixel);
1032
+
1033
+ info = CloneImageInfo(NULL);
1034
+ image = AcquireImage(info);
1035
+ image->depth = depth;
1036
+ image->matte = matte;
1037
+ (void) DestroyImageInfo(info);
1038
+
1039
+ GetMagickPixelPacket(image, &mpp);
1040
+ rm_set_magick_pixel_packet(pixel, &mpp);
1041
+
1042
+ exception = AcquireExceptionInfo();
1043
+
1044
+ #if defined(HAVE_NEW_QUERYMAGICKCOLORNAME)
1045
+ // Support for hex-format color names moved out of QueryMagickColorname
1046
+ // in 6.4.1-9. The 'hex' argument was removed as well.
1047
+ if (hex)
1048
+ {
1049
+ if (compliance == XPMCompliance)
1050
+ {
1051
+ mpp.matte = MagickFalse;
1052
+ mpp.depth = (unsigned long) min(1.0 * image->depth, 16.0);
1053
+ }
1054
+ (void) GetColorTuple(&mpp, MagickTrue, name);
1055
+ }
1056
+ else
1057
+ {
1058
+ (void) QueryMagickColorname(image, &mpp, compliance, name, exception);
1059
+ }
1060
+ #else
1061
+ (void) QueryMagickColorname(image, &mpp, compliance, hex, name, exception);
1062
+ #endif
1063
+ (void) DestroyImage(image);
1064
+ CHECK_EXCEPTION()
1065
+ (void) DestroyExceptionInfo(exception);
1066
+
1067
+ // Always return a string, even if it's ""
1068
+ return rb_str_new2(name);
1069
+ }
1070
+
1071
+
1072
+ /**
1073
+ * Create a string representation of a Magick::Pixel.
1074
+ *
1075
+ * Ruby usage:
1076
+ * - @verbatim Magick::Pixel#to_s @endverbatim
1077
+ *
1078
+ * @param self this object
1079
+ * @return the string
1080
+ */
1081
+ VALUE
1082
+ Pixel_to_s(VALUE self)
1083
+ {
1084
+ Pixel *pixel;
1085
+ char buff[100];
1086
+
1087
+ Data_Get_Struct(self, Pixel, pixel);
1088
+ sprintf(buff, "red=" QuantumFormat ", green=" QuantumFormat ", blue=" QuantumFormat ", opacity=" QuantumFormat
1089
+ , pixel->red, pixel->green, pixel->blue, pixel->opacity);
1090
+ return rb_str_new2(buff);
1091
+ }
1092
+
1093
+
1094
+ /**
1095
+ * Convert a PixelPacket to a MagickPixelPacket.
1096
+ *
1097
+ * No Ruby usage (internal function)
1098
+ *
1099
+ * Notes:
1100
+ * - Same code as the private function SetMagickPixelPacket in ImageMagick.
1101
+ *
1102
+ * @param pixel the pixel
1103
+ * @param pp the MagickPixelPacket to be modified
1104
+ */
1105
+ void
1106
+ rm_set_magick_pixel_packet(Pixel *pixel, MagickPixelPacket *pp)
1107
+ {
1108
+ pp->red = (MagickRealType) pixel->red;
1109
+ pp->green = (MagickRealType) pixel->green;
1110
+ pp->blue = (MagickRealType) pixel->blue;
1111
+ pp->opacity = (MagickRealType) pixel->opacity;
1112
+ pp->index = (MagickRealType) 0.0;
1113
+ }
1114
+