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,29 @@
1
+
2
+ # Ccreate a semi-transparent title for an image.
3
+
4
+ require 'rmagick'
5
+ include Magick
6
+
7
+ puts <<END_INFO
8
+
9
+ This example uses a semi-transparent background color to create a title.
10
+ View the resulting image by entering the command: display image_opacity.miff
11
+
12
+ END_INFO
13
+
14
+ balloons = Image.read('../doc/ex/images/Hot_Air_Balloons_H.jpg').first
15
+ legend = Image.new(160, 50) { self.background_color = '#ffffffc0' }
16
+
17
+ gc = Draw.new
18
+ gc.annotate(legend, 0, 0, 0, 0, 'Balloon Day!\\nFri May 2 2003') do
19
+ self.gravity = CenterGravity
20
+ self.stroke = 'transparent'
21
+ self.fill = 'white'
22
+ self.pointsize = 18
23
+ end
24
+
25
+ result = balloons.composite(legend, SouthGravity, OverCompositeOp)
26
+
27
+ puts '...Writing image_opacity.miff'
28
+ result.write 'image_opacity.miff'
29
+ exit
@@ -0,0 +1,31 @@
1
+ #
2
+ # Demonstrate the export_pixels and import_pixels methods.
3
+ #
4
+
5
+ require 'rmagick'
6
+ include Magick
7
+
8
+ puts <<END_INFO
9
+
10
+ This example demonstrates the export_pixels and import_pixels methods
11
+ by copying an image one row at a time. The result is an copy that
12
+ is identical to the original.
13
+
14
+ END_INFO
15
+
16
+ img = Image.read('../doc/ex/images/Gold_Statue.jpg').first
17
+ copy = Image.new(img.columns, img.rows)
18
+
19
+ begin
20
+ img.rows.times do |r|
21
+ scanline = img.export_pixels(0, r, img.columns, 1, 'RGB')
22
+ copy.import_pixels(0, r, img.columns, 1, 'RGB', scanline)
23
+ end
24
+ rescue NotImplementedError
25
+ $stderr.puts 'The export_pixels and import_pixels methods are not supported' \
26
+ ' by this version of ImageMagick/GraphicsMagick'
27
+ exit
28
+ end
29
+
30
+ copy.write('copy.gif')
31
+ exit
@@ -0,0 +1,38 @@
1
+
2
+ # Demonstrate ImageMagick's new (5.5.7-3 and later) built-in patterns.
3
+ # Create a Fill class that can be reused to fill in new Image backgrounds.
4
+
5
+ # Usage: pattern_fill.rb <name-of-pattern>
6
+ # Try 'checkerboard' or 'verticalsaw'
7
+
8
+ require 'rmagick'
9
+ include Magick
10
+
11
+ puts <<END_INFO
12
+
13
+ This example demonstrates the PATTERN: image format, which is
14
+ new in ImageMagick 5.5.7. Specify the name of any of the
15
+ supported patterns as an argument. For example, try "checkerboard".
16
+
17
+ END_INFO
18
+
19
+ class PatternFill < Magick::TextureFill
20
+ def initialize(name='bricks')
21
+ @pat_img = Magick::Image.read("pattern:#{name}").first
22
+ super(@pat_img)
23
+ end
24
+ end
25
+
26
+ if ARGV[0]
27
+ pattern = ARGV[0]
28
+ else
29
+ $stderr.puts 'Defaulting to checkerboard pattern.'
30
+ pattern = 'checkerboard'
31
+ end
32
+
33
+ # Create a sample image that is 100x bigger than the pattern.
34
+ attrs = Image.ping("pattern:#{pattern}").first
35
+
36
+ tryit = Image.new(10*attrs.columns, 10*attrs.rows, PatternFill.new(pattern))
37
+ tryit.write('pattern_fill.gif')
38
+ exit
@@ -0,0 +1,44 @@
1
+ # Demonstrate the Draw#rotation= method by producing
2
+ # an animated MIFF file showing a rotating text string.
3
+
4
+ require 'rmagick'
5
+ include Magick
6
+
7
+ puts <<END_INFO
8
+ Demonstrate the rotation= attribute in the Draw class
9
+ by producing an animated image. View the output image
10
+ by entering the command: animate rotating_text.miff
11
+ END_INFO
12
+
13
+ text = Draw.new
14
+ text.pointsize = 28
15
+ text.font_weight = BoldWeight
16
+ text.font_style = ItalicStyle
17
+ text.gravity = CenterGravity
18
+
19
+ # Let's make it interesting. Composite the
20
+ # rotated text over a gradient fill background.
21
+ fill = GradientFill.new(100,100,100,100,'yellow','red')
22
+ bg = Image.new(200, 200, fill)
23
+
24
+ # The "none" color is transparent.
25
+ fg = Image.new(bg.columns, bg.rows) { self.background_color = 'none' }
26
+
27
+ # Here's where we'll collect the individual frames.
28
+ animation = ImageList.new
29
+
30
+ 0.step(345,15) do |degrees|
31
+ frame = fg.copy
32
+ text.annotate(frame, 0,0,0,0, 'Rotating Text') do
33
+ self.rotation = degrees
34
+ end
35
+ # Composite the text over the gradient filled background frame.
36
+ animation << bg.composite(frame, CenterGravity, DisplaceCompositeOp)
37
+ end
38
+
39
+ animation.delay = 8
40
+
41
+ #animation.animate
42
+ puts '...Writing rotating_text.gif'
43
+ animation.write('rotating_text.gif')
44
+ exit
@@ -0,0 +1,49 @@
1
+ # Make a 32x32 animated GIF that resembles the OS X animation.
2
+ # This produces a very small (~2.6Kb) GIF file.
3
+
4
+ require 'rmagick'
5
+
6
+ puts <<END_INFO
7
+ This example creates an animated GIF that resembles the OS X "waiting" icon.
8
+ You can view the GIF with the command
9
+
10
+ animate spinner.gif
11
+ END_INFO
12
+
13
+ NFRAMES = 12 # number of frames in the animation
14
+ DIM = 32 # width & height of image in pixels
15
+ DELAY = 100.0 / (NFRAMES/2) # 2 rotations per second
16
+
17
+ # 'frame' is a single frame in the animation.
18
+ frame = Magick::Image.new(DIM, DIM) {self.background_color = 'transparent'}
19
+
20
+ # 'spinner' will contain the frames that make up the animated GIF
21
+ spinner = Magick::ImageList.new
22
+
23
+ # 'level' is the change from darkest gray to white
24
+ level = Magick::QuantumRange / 2 / NFRAMES
25
+
26
+ NFRAMES.times do |x|
27
+ gc = Magick::Draw.new
28
+ gc.translate(DIM/2, DIM/2)
29
+ gc.stroke('none')
30
+ intensity = 0.58 * Magick::QuantumRange
31
+ fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
32
+ gc.fill(fill_color)
33
+ angle = x * (360/NFRAMES)
34
+ NFRAMES.times do
35
+ gc.rotate(angle)
36
+ intensity = [intensity, Magick::QuantumRange].min
37
+ fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
38
+ gc.fill(fill_color)
39
+ gc.roundrectangle(7, -1, 15, 0, 1, 1)
40
+ angle = -(360/NFRAMES)
41
+ intensity += level
42
+ end
43
+ spinner << frame.copy
44
+ gc.draw(spinner)
45
+ end
46
+
47
+ spinner.delay = DELAY
48
+ spinner.compression = Magick::LZWCompression
49
+ spinner.write('spinner.gif')
@@ -0,0 +1,64 @@
1
+ require 'rmagick'
2
+ include Magick
3
+
4
+ puts <<END_INFO
5
+
6
+ This example demonstrates how to make a thumbnail of an image.
7
+ An image is resized to the target size (retaining its original
8
+ aspect ratio, of course) and then "mounted" on a square background
9
+ with raised edges.
10
+
11
+ Usage:
12
+
13
+ ruby thumbnail.rb <filename <size>>
14
+
15
+ where `filename' is the name of an image file and `size' is the
16
+ size of the thumbnail in pixels. The default size is 120 pixels.
17
+ If you don't specify any arguments this script uses a default
18
+ image.
19
+
20
+ END_INFO
21
+
22
+ DEFAULT_SIZE = 120
23
+
24
+ case ARGV.length
25
+ when 2
26
+ size = ARGV[1].to_i
27
+ image = ARGV[0]
28
+ when 1
29
+ image = ARGV[0]
30
+ size = DEFAULT_SIZE
31
+ else
32
+ size = DEFAULT_SIZE
33
+ image = '../doc/ex/images/Flower_Hat.jpg'
34
+ end
35
+
36
+ geom = "#{size}x#{size}"
37
+
38
+ # Read the image and resize it. The `change_geometry' method
39
+ # computes the new image geometry and yields to a block. The
40
+ # return value of the block is the return value of the method.
41
+
42
+ img = Image.read(image)[0]
43
+ img.change_geometry!(geom) { |cols, rows| img.thumbnail! cols, rows }
44
+
45
+ # We need a background to display the thumbnail.
46
+ # Create a square, neutral gray background with raised edges.
47
+ # Make this background slightly larger than the image to allow
48
+ # for the raised border. A 3-pixel raised edge means that the
49
+ # background needs to be 6 pixels larger in each dimension.
50
+
51
+ bg = Image.new(size+6, size+6) { self.background_color = 'gray75' }
52
+ bg = bg.raise(3,3)
53
+
54
+ # Just for the purposes of this example, display the thumbnail background on
55
+ # a larger white background.
56
+
57
+ white_bg = Image.new(size+50, size+50) {self.background_color = 'white'}
58
+ white_bg = white_bg.composite(bg, CenterGravity, OverCompositeOp)
59
+
60
+ # Finally, center the thumbnail on the gray background.
61
+ thumbnail = white_bg.composite(img, CenterGravity, OverCompositeOp)
62
+
63
+ thumbnail.write('thumbnail.gif')
64
+ exit
@@ -0,0 +1,78 @@
1
+ require 'rmagick'
2
+ include Magick
3
+
4
+ puts <<END_INFO
5
+
6
+ vi-gnette (n.) vin-'yet
7
+ A picture that shades off gradually into the surrounding paper.
8
+ Merriam-Webster Dictionary
9
+
10
+ Vignettes are frequently used in formal portraiture and advertising
11
+ images. This example creates a vignette from a picture of a ballerina.
12
+ It takes a few seconds to run. Be patient.
13
+
14
+ END_INFO
15
+
16
+ ballerina = Image.read('../doc/ex/images/Ballerina3.jpg')[0]
17
+
18
+ # Note: this technique won't work with every image. To make a pretty
19
+ # vignette you need an image with a uniform, fairly dark background.
20
+
21
+ # Start by drawing a white oval on a black background. (Although you don't
22
+ # have to use an oval at all! Any shape will work. Try a rounded rectangle.)
23
+ # The black pixels correspond to pixels in the image that will become
24
+ # transparent. The white pixels correspond to pixels in the image that will
25
+ # remain unchanged. Gray pixels, introduced by the blurring below, will
26
+ # become more or less transparent depending on how dark or light the pixel is.
27
+
28
+ # The size of the oval is arbitrary - in this case it's 90% of the
29
+ # size of the image.
30
+
31
+ oval = Image.new(ballerina.columns, ballerina.rows) {self.background_color = 'black'}
32
+ gc = Draw.new
33
+ gc.stroke('white')
34
+ gc.fill('white')
35
+ gc.ellipse(ballerina.columns/2, ballerina.rows/2,
36
+ ballerina.columns/2-(ballerina.columns*0.10),
37
+ ballerina.rows/2-(ballerina.rows*0.10), 0, 360)
38
+ gc.draw(oval)
39
+
40
+ # Add a lot of blurring to the oval. I use blur_image because it's much faster
41
+ # than the gaussian_blur method and produces no observable difference. The
42
+ # exact amount of blurring is a judgment call. The higher the 2nd argument, the
43
+ # more blurring, although increasing the value above 20 doesn't seem to add any
44
+ # additional blurriness.
45
+
46
+ oval = oval.blur_image(0, 20)
47
+
48
+ # The CopyOpacityCompositeOp transforms the opacity level of each image pixel
49
+ # according to the intensity of the composite image pixels. In this case, the
50
+ # black pixels outside the oval become transparent and the white pixels inside
51
+ # the oval remain opaque. Each gray pixel around the border of the oval has a
52
+ # varying level of transparency depending on how dark or light it is.
53
+
54
+ ballerina.matte = true # Ensure the ballerina image's opacity channel is enabled.
55
+ oval.matte = false # Force the CopyOpacityCompositeOp to use pixel intensity
56
+ # to determine how much transparency to add to the ballerina
57
+ # pixels.
58
+
59
+ ballerina = ballerina.composite(oval, CenterGravity, CopyOpacityCompositeOp)
60
+
61
+ # Since the vignette has multiple levels of transparency, we can't
62
+ # save it as a GIF or a JPEG. The PNG format can handle it, though.
63
+
64
+ begin
65
+ ballerina.write('vignette.png')
66
+ rescue ImageMagickError
67
+ puts 'Write failed. No PNG support?'
68
+ # In case PNG support isn't installed, just ignore the exception.
69
+ end
70
+
71
+ # At this point the vignette is complete. However, the `display' method only
72
+ # supports 1`level of transparency. Therefore, composite the vignette over a
73
+ # standard "checkerboard" background. The resulting image will be 100% opaque.
74
+
75
+ checkerboard = Image.read('pattern:checkerboard') {self.size = "#{ballerina.columns}x#{ballerina.rows}"}
76
+ vignette = checkerboard[0].composite(ballerina, CenterGravity, OverCompositeOp)
77
+ vignette.display
78
+ exit
@@ -0,0 +1,548 @@
1
+ lib_dir = File.expand_path('../../lib', File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
3
+ require 'rubygems'
4
+ require 'mkmf'
5
+ require 'date'
6
+
7
+ module RMagick
8
+ class Extconf
9
+ require 'rmagick/version'
10
+ RMAGICK_VERS = ::Magick::VERSION
11
+ MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
12
+ MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr('.','').to_i
13
+
14
+ attr_reader :headers
15
+ def initialize
16
+ configure_compile_options
17
+ assert_can_compile!
18
+ configure_headers
19
+ end
20
+
21
+ def configured_compile_options
22
+ {
23
+ :magick_config => $magick_config,
24
+ :with_magick_wand => $with_magick_wand,
25
+ :pkg_config => $pkg_config,
26
+ :magick_version => $magick_version,
27
+ :local_libs => $LOCAL_LIBS,
28
+ :cflags => $CFLAGS,
29
+ :cppflags => $CPPFLAGS,
30
+ :ldflags => $LDFLAGS,
31
+ :defs => $defs,
32
+ :config_h => $config_h,
33
+ }
34
+ end
35
+
36
+ def configure_headers
37
+ #headers = %w{assert.h ctype.h errno.h float.h limits.h math.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h time.h}
38
+ @headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h}
39
+ headers << 'stdint.h' if have_header('stdint.h') # defines uint64_t
40
+ headers << 'sys/types.h' if have_header('sys/types.h')
41
+
42
+ if have_header('wand/MagickWand.h')
43
+ headers << 'wand/MagickWand.h'
44
+ else
45
+ exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h."
46
+ end
47
+ end
48
+
49
+ def configure_compile_options
50
+ # Magick-config is not available on Windows
51
+ if RUBY_PLATFORM !~ /mswin|mingw/
52
+
53
+ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
54
+ config = defined?(RbConfig) ? ::RbConfig : ::Config
55
+ cc = (ENV['CC'] || config::CONFIG['CC'] || 'gcc').split(' ').first
56
+ unless find_executable(cc)
57
+ exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details."
58
+ end
59
+
60
+ # ugly way to handle which config tool we're going to use...
61
+ $with_magick_wand = false
62
+ $magick_config = false
63
+ $pkg_config = false
64
+
65
+ # Check for Magick-config
66
+ if find_executable('Magick-config') && !has_graphicsmagick_libmagick_dev_compat?
67
+ $magick_config = true
68
+ $magick_version = `Magick-config --version`[/^(\d+\.\d+\.\d+)/]
69
+ elsif find_executable('pkg-config')
70
+ $pkg_config = true
71
+ $magick_version = `pkg-config MagickCore --modversion`[/^(\d+\.\d+\.\d+)/]
72
+ else
73
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config or pkg-config in #{ENV['PATH']}\n"
74
+ end
75
+
76
+ check_multiple_imagemagick_versions
77
+ check_partial_imagemagick_versions
78
+
79
+ # Ensure minimum ImageMagick version
80
+ # Check minimum ImageMagick version if possible
81
+ checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
82
+ Logging.message("Detected ImageMagick version: #{$magick_version}\n")
83
+
84
+ if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
85
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
86
+ end
87
+ end
88
+
89
+ # From ImageMagick 6.9 binaries are split to two and we have to use
90
+ # MagickWand instead of MagickCore
91
+ checking_for("presence of MagickWand API (ImageMagick version >= #{Magick::MIN_WAND_VERSION})") do
92
+ $with_magick_wand = Gem::Version.new($magick_version) >= Gem::Version.new(Magick::MIN_WAND_VERSION)
93
+ if $with_magick_wand
94
+ Logging.message('Detected 6.9+ version, using MagickWand API')
95
+ else
96
+ Logging.message('Older version detected, using MagickCore API')
97
+ end
98
+ end
99
+
100
+ # either set flags using Magick-config, MagickWand-config or pkg-config (new Debian default)
101
+ if $with_magick_wand
102
+ if $magick_config
103
+ # Save flags
104
+ $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `MagickWand-config --cflags`.chomp
105
+ $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `MagickWand-config --cppflags`.chomp
106
+ $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `MagickWand-config --ldflags`.chomp
107
+ $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `MagickWand-config --libs`.chomp
108
+ end
109
+
110
+ if $pkg_config
111
+ # Save flags
112
+ $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
113
+ $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
114
+ $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
115
+ $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
116
+ end
117
+ else
118
+ if $magick_config
119
+ # Save flags
120
+ $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `Magick-config --cflags`.chomp
121
+ $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `Magick-config --cppflags`.chomp
122
+ $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `Magick-config --ldflags`.chomp
123
+ $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `Magick-config --libs`.chomp
124
+ end
125
+
126
+ if $pkg_config
127
+ # Save flags
128
+ $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
129
+ $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
130
+ $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
131
+ $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
132
+ end
133
+ end
134
+
135
+ if RUBY_PLATFORM =~ /darwin/ # osx
136
+ set_archflags_for_osx
137
+ end
138
+
139
+ elsif RUBY_PLATFORM =~ /mingw/ # mingw
140
+
141
+ `magick identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
142
+ abort 'Unable to get ImageMagick version' unless $1
143
+ $magick_version = $1
144
+ unless have_library('CORE_RL_magick_')
145
+ search_paths_for_library_for_mingw
146
+ end
147
+ have_library('X11')
148
+
149
+ else # mswin
150
+
151
+ `magick identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
152
+ abort 'Unable to get ImageMagick version' unless $1
153
+ $magick_version = $1
154
+ $CFLAGS = '-W3'
155
+ $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}
156
+ # The /link option is required by the Makefile but causes warnings in the mkmf.log file.
157
+ $LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"}
158
+ $LOCAL_LIBS = 'CORE_RL_magick_.lib'
159
+ have_library('X11')
160
+
161
+ end
162
+ end
163
+
164
+ # Test for a specific value in an enum type
165
+ def have_enum_value(enum, value, headers=nil, &b)
166
+ checking_for "#{enum}.#{value}" do
167
+ if try_compile(<<"SRC", &b)
168
+ #{COMMON_HEADERS}
169
+ #{cpp_include(headers)}
170
+ /*top*/
171
+ int main() { #{enum} t = #{value}; t = t; return 0; }
172
+ SRC
173
+ $defs.push(format('-DHAVE_ENUM_%s', value.upcase))
174
+ true
175
+ else
176
+ false
177
+ end
178
+ end
179
+ end
180
+
181
+ # Test for multiple values of the same enum type
182
+ def have_enum_values(enum, values, headers=nil, &b)
183
+ values.each do |value|
184
+ have_enum_value(enum, value, headers, &b)
185
+ end
186
+ end
187
+
188
+ def has_graphicsmagick_libmagick_dev_compat?
189
+ config_path = `which Magick-config`.chomp
190
+ if File.exist?(config_path) &&
191
+ File.symlink?(config_path) &&
192
+ File.readlink(config_path) =~ /GraphicsMagick/
193
+ msg = 'Found a graphicsmagick-libmagick-dev-compat installation.'
194
+ Logging.message msg
195
+ message msg+"\n"
196
+ true
197
+ else
198
+ false
199
+ end
200
+ end
201
+
202
+ def exit_failure(msg)
203
+ Logging.message msg
204
+ message msg+"\n"
205
+ exit(1)
206
+ end
207
+
208
+ # Seems like lots of people have multiple versions of ImageMagick installed.
209
+ def check_multiple_imagemagick_versions
210
+ versions = []
211
+ path = ENV['PATH'].split(File::PATH_SEPARATOR)
212
+ path.each do |dir|
213
+ file = File.join(dir, 'Magick-config')
214
+ if File.executable? file
215
+ vers = `#{file} --version`.chomp.strip
216
+ prefix = `#{file} --prefix`.chomp.strip
217
+ versions << [vers, prefix, dir]
218
+ end
219
+ end
220
+ versions.uniq!
221
+ if versions.size > 1
222
+ msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
223
+ versions.each do |vers, prefix, dir|
224
+ msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
225
+ end
226
+ msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
227
+ Logging.message msg
228
+ message msg
229
+ end
230
+ end
231
+
232
+ # Ubuntu (maybe other systems) comes with a partial installation of
233
+ # ImageMagick in the prefix /usr (some libraries, no includes, and no
234
+ # binaries). This causes problems when /usr/lib is in the path (e.g., using
235
+ # the default Ruby installation).
236
+ def check_partial_imagemagick_versions
237
+ prefix = config_string('prefix') || ''
238
+ matches = [
239
+ prefix+'/lib/lib?agick*',
240
+ prefix+'/include/ImageMagick',
241
+ prefix+'/bin/Magick-config',
242
+ ].map do |file_glob|
243
+ Dir.glob(file_glob)
244
+ end
245
+ matches.delete_if { |arr| arr.empty? }
246
+ if 0 < matches.length && matches.length < 3
247
+ msg = "\nWarning: Found a partial ImageMagick installation. Your operating system likely has some built-in ImageMagick libraries but not all of ImageMagick. This will most likely cause problems at both compile and runtime.\nFound partial installation at: "+prefix+"\n"
248
+ Logging.message msg
249
+ message msg
250
+ end
251
+ end
252
+
253
+ # issue #169
254
+ # set ARCHFLAGS appropriately for OSX
255
+ def set_archflags_for_osx
256
+ archflags = []
257
+ fullpath = `which convert`
258
+ fileinfo = `file #{fullpath}`
259
+
260
+ # default ARCHFLAGS
261
+ archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten
262
+
263
+ archs.each do |arch|
264
+ if fileinfo.include?(arch)
265
+ archflags << "-arch #{arch}"
266
+ end
267
+ end
268
+
269
+ if archflags.length != 0
270
+ $ARCH_FLAG = archflags.join(' ')
271
+ end
272
+ end
273
+
274
+ def search_paths_for_library_for_mingw
275
+ msg = 'searching PATH for the ImageMagick library...'
276
+ Logging.message msg
277
+ message msg+"\n"
278
+
279
+ found_lib = false
280
+
281
+ paths = ENV['PATH'].split(File::PATH_SEPARATOR)
282
+ paths.each do |dir|
283
+ lib = File.join(dir, 'lib')
284
+ lib_file = File.join(lib, 'CORE_RL_magick_.lib')
285
+ if File.exist?(lib_file)
286
+ $CPPFLAGS = %Q{-I"#{File.join(dir, 'include')}"}
287
+ $LDFLAGS = %Q{-L"#{lib}"}
288
+ found_lib = have_library('CORE_RL_magick_')
289
+ break if found_lib
290
+ end
291
+ end
292
+
293
+ unless found_lib
294
+ exit_failure <<END_MINGW
295
+ Can't install RMagick #{RMAGICK_VERS}.
296
+ Can't find the ImageMagick library.
297
+ Retry with '--with-opt-dir' option.
298
+ Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
299
+ e.g.
300
+ gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
301
+ END_MINGW
302
+ end
303
+ end
304
+
305
+ def assert_can_compile!
306
+ assert_not_windows!
307
+ assert_minimum_ruby_version!
308
+ assert_has_dev_libs!
309
+ end
310
+
311
+ def assert_not_windows!
312
+ if RUBY_PLATFORM =~ /mswin/
313
+ abort <<END_MSWIN
314
+ +----------------------------------------------------------------------------+
315
+ | This rmagick gem is for use only on Linux, BSD, OS X, and similar systems |
316
+ | that have a gnu or similar toolchain installed. The rmagick-win32 gem is a |
317
+ | pre-compiled version of RMagick bundled with ImageMagick for use on |
318
+ | Microsoft Windows systems. The rmagick-win32 gem is available on RubyForge.|
319
+ | See http://rmagick.rubyforge.org/install-faq.html for more information. |
320
+ +----------------------------------------------------------------------------+
321
+ END_MSWIN
322
+ end
323
+ end
324
+
325
+ def assert_minimum_ruby_version!
326
+ unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
327
+ version = RUBY_VERSION.tr('.','').to_i
328
+ version >= MIN_RUBY_VERS_NO
329
+ end
330
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
331
+ end
332
+ end
333
+
334
+ def assert_has_dev_libs!
335
+ if RUBY_PLATFORM !~ /mswin|mingw/
336
+
337
+ # check for pkg-config if Magick-config doesn't exist
338
+ if $magick_config && `Magick-config --libs`[/\bl\s*(MagickCore|Magick)6?\b/]
339
+ elsif $pkg_config && `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
340
+ else
341
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. " \
342
+ "Can't find the ImageMagick library or one of the dependent libraries. " \
343
+ "Check the mkmf.log file for more detailed information.\n"
344
+ end
345
+ end
346
+ end
347
+
348
+ def create_header_file
349
+ have_func('snprintf', headers)
350
+ ['AcquireImage', # 6.4.1
351
+ 'AffinityImage', # 6.4.3-6
352
+ 'AffinityImages', # 6.4.3-6
353
+ 'AutoGammaImageChannel', # 6.5.5-1
354
+ 'AutoLevelImageChannel', # 6.5.5-1
355
+ 'BlueShiftImage', # 6.5.4-3
356
+ 'ColorMatrixImage', # 6.6.1-0
357
+ 'ConstituteComponentTerminus', # 6.5.7-9
358
+ 'DeskewImage', # 6.4.2-5
359
+ 'DestroyConstitute', # 6.5.7-9(deprecated)
360
+ 'EncipherImage', # 6.3.8-6
361
+ 'EqualizeImageChannel', # 6.3.6-9
362
+ 'EvaluateImages', # 6.8.6-4
363
+ 'FloodfillPaintImage', # 6.3.7
364
+ 'FunctionImageChannel', # 6.4.8-8
365
+ 'GetAuthenticIndexQueue', # 6.4.5-6
366
+ 'GetAuthenticPixels', # 6.4.5-6
367
+ 'GetImageAlphaChannel', # 6.3.9-2
368
+ 'GetMagickFeatures', # 6.5.7-1
369
+ 'GetVirtualPixels', # 6.4.5-6
370
+ 'LevelImageColors', # 6.4.2
371
+ 'LevelColorsImageChannel', # 6.5.6-4
372
+ 'LevelizeImageChannel', # 6.4.2
373
+ 'LiquidRescaleImage', # 6.3.8-2
374
+ 'MagickLibAddendum', # 6.5.9-1
375
+ 'OpaquePaintImageChannel', # 6.3.7-10
376
+ 'QueueAuthenticPixels', # 6.4.5-6
377
+ 'RemapImage', # 6.4.4-0
378
+ 'RemapImages', # 6.4.4-0
379
+ 'RemoveImageArtifact', # 6.3.6
380
+ 'RotationalBlurImage', # 6.8.8-9
381
+ 'RotationalBlurImageChannel', # 6.8.8-9
382
+ 'SelectiveBlurImageChannel', # 6.5.0-3
383
+ 'SetImageAlphaChannel', # 6.3.6-9
384
+ 'SetImageArtifact', # 6.3.6
385
+ 'SetMagickMemoryMethods', # 6.4.1
386
+ 'SparseColorImage', # 6.3.6-?
387
+ 'StatisticImage', # 6.6.8-6
388
+ 'SyncAuthenticPixels', # 6.4.5-6
389
+ 'TransformImageColorspace', # 6.5.1
390
+ 'TransparentPaintImage', # 6.3.7-10
391
+ 'TransparentPaintImageChroma' # 6.4.5-6
392
+ ].each do |func|
393
+ have_func(func, headers)
394
+ end
395
+
396
+ checking_for('QueryMagickColorname() new signature') do
397
+ if try_compile(<<"SRC")
398
+ #{COMMON_HEADERS}
399
+ #{cpp_include(headers)}
400
+ /*top*/
401
+ int main() {
402
+ MagickBooleanType okay;
403
+ Image *image;
404
+ MagickPixelPacket *color;
405
+ char *name;
406
+ ExceptionInfo *exception;
407
+ okay = QueryMagickColorname(image, color, SVGCompliance, name, exception);
408
+ return 0;
409
+ }
410
+ SRC
411
+ $defs.push('-DHAVE_NEW_QUERYMAGICKCOLORNAME')
412
+ true
413
+ else
414
+ false
415
+ end
416
+ end
417
+
418
+ have_struct_member('Image', 'type', headers) # ???
419
+ have_struct_member('DrawInfo', 'kerning', headers) # 6.4.7-8
420
+ have_struct_member('DrawInfo', 'interline_spacing', headers) # 6.5.5-8
421
+ have_struct_member('DrawInfo', 'interword_spacing', headers) # 6.4.8-0
422
+ have_type('DitherMethod', headers) # 6.4.2
423
+ have_type('MagickFunction', headers) # 6.4.8-8
424
+ have_type('ImageLayerMethod', headers) # 6.3.6 replaces MagickLayerMethod
425
+ have_type('long double', headers)
426
+ #have_type("unsigned long long", headers)
427
+ #have_type("uint64_t", headers)
428
+ #have_type("__int64", headers)
429
+ #have_type("uintmax_t", headers)
430
+ #check_sizeof("unsigned long", headers)
431
+ #check_sizeof("Image *", headers)
432
+
433
+ have_enum_values('AlphaChannelType', ['CopyAlphaChannel', # 6.4.3-7
434
+ 'BackgroundAlphaChannel', # 6.5.2-5
435
+ 'RemoveAlphaChannel'], headers) # 6.7.5-1
436
+ have_enum_values('CompositeOperator', ['BlurCompositeOp', # 6.5.3-7
437
+ 'DistortCompositeOp', # 6.5.3-10
438
+ 'LinearBurnCompositeOp', # 6.5.4-3
439
+ 'LinearDodgeCompositeOp', # 6.5.4-3
440
+ 'MathematicsCompositeOp', # 6.5.4-3
441
+ 'PegtopLightCompositeOp', # 6.5.4-3
442
+ 'PinLightCompositeOp', # 6.5.4-3
443
+ 'VividLightCompositeOp'], headers) # 6.5.4-3
444
+ have_enum_values('CompressionType', ['DXT1Compression', # 6.3.9-3
445
+ 'DXT3Compression', # 6.3.9-3
446
+ 'DXT5Compression', # 6.3.9-3
447
+ 'ZipSCompression', # 6.5.5-4
448
+ 'PizCompression', # 6.5.5-4
449
+ 'Pxr24Compression', # 6.5.5-4
450
+ 'B44Compression', # 6.5.5-4
451
+ 'B44ACompression'], headers) # 6.5.5-4
452
+
453
+ have_enum_values('DistortImageMethod', ['BarrelDistortion', # 6.4.2-5
454
+ 'BarrelInverseDistortion', # 6.4.3-8
455
+ 'BilinearForwardDistortion', # 6.5.1-2
456
+ 'BilinearReverseDistortion', # 6.5.1-2
457
+ 'DePolarDistortion', # 6.4.2-6
458
+ 'PolarDistortion', # 6.4.2-6
459
+ 'PolynomialDistortion', # 6.4.2-4
460
+ 'ShepardsDistortion'], headers) # 6.4.2-4
461
+ have_enum_value('DitherMethod', 'NoDitherMethod', headers) # 6.4.3
462
+ have_enum_values('FilterTypes', ['KaiserFilter', # 6.3.6
463
+ 'WelshFilter', # 6.3.6-4
464
+ 'ParzenFilter', # 6.3.6-4
465
+ 'LagrangeFilter', # 6.3.7-2
466
+ 'BohmanFilter', # 6.3.7-2
467
+ 'BartlettFilter', # 6.3.7-2
468
+ 'SentinelFilter'], headers) # 6.3.7-2
469
+ have_enum_values('MagickEvaluateOperator', ['PowEvaluateOperator', # 6.4.1-9
470
+ 'LogEvaluateOperator', # 6.4.2
471
+ 'ThresholdEvaluateOperator', # 6.4.3
472
+ 'ThresholdBlackEvaluateOperator', # 6.4.3
473
+ 'ThresholdWhiteEvaluateOperator', # 6.4.3
474
+ 'GaussianNoiseEvaluateOperator', # 6.4.3
475
+ 'ImpulseNoiseEvaluateOperator', # 6.4.3
476
+ 'LaplacianNoiseEvaluateOperator', # 6.4.3
477
+ 'MultiplicativeNoiseEvaluateOperator', # 6.4.3
478
+ 'PoissonNoiseEvaluateOperator', # 6.4.3
479
+ 'UniformNoiseEvaluateOperator', # 6.4.3
480
+ 'CosineEvaluateOperator', # 6.4.8-5
481
+ 'SineEvaluateOperator', # 6.4.8-5
482
+ 'AddModulusEvaluateOperator'], # 6.4.8-5
483
+ headers)
484
+ have_enum_values('MagickFunction', ['ArcsinFunction', # 6.5.2-8
485
+ 'ArctanFunction', # 6.5.2-8
486
+ 'PolynomialFunction', # 6.4.8-8
487
+ 'SinusoidFunction'], headers) # 6.4.8-8
488
+ have_enum_values('ImageLayerMethod', ['FlattenLayer', # 6.3.6-2
489
+ 'MergeLayer', # 6.3.6
490
+ 'MosaicLayer', # 6.3.6-2
491
+ 'TrimBoundsLayer' ], headers) # 6.4.3-8
492
+ have_enum_values('VirtualPixelMethod', ['HorizontalTileVirtualPixelMethod', # 6.4.2-6
493
+ 'VerticalTileVirtualPixelMethod', # 6.4.2-6
494
+ 'HorizontalTileEdgeVirtualPixelMethod', # 6.5.0-1
495
+ 'VerticalTileEdgeVirtualPixelMethod', # 6.5.0-1
496
+ 'CheckerTileVirtualPixelMethod'], # 6.5.0-1
497
+ headers)
498
+
499
+ headers = ['ruby.h', 'ruby/io.h']
500
+
501
+ have_func('rb_frame_this_func', headers)
502
+
503
+ # Miscellaneous constants
504
+ $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
505
+ $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
506
+
507
+ create_header
508
+ end
509
+
510
+ def create_makefile_file
511
+ create_header_file
512
+ # Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the
513
+ # extconf.h header. Suppress that behavior by removing the symbol array.
514
+ $defs = []
515
+
516
+ # Force re-compilation if the generated Makefile changed.
517
+ $config_h = 'Makefile rmagick.h'
518
+
519
+ create_makefile('RMagick2')
520
+ print_summary
521
+ end
522
+
523
+ def print_summary
524
+ summary = <<"END_SUMMARY"
525
+
526
+
527
+ #{'=' * 70}
528
+ #{DateTime.now.strftime('%a %d%b%y %T')}
529
+ This installation of RMagick #{RMAGICK_VERS} is configured for
530
+ Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
531
+ #{'=' * 70}
532
+
533
+
534
+ END_SUMMARY
535
+
536
+ Logging.message summary
537
+ message summary
538
+ end
539
+ end
540
+ end
541
+
542
+ extconf = RMagick::Extconf.new
543
+ at_exit do
544
+ msg = "Configured compile options: #{extconf.configured_compile_options}"
545
+ Logging.message msg
546
+ message msg+"\n"
547
+ end
548
+ extconf.create_makefile_file