rmagick 3.2.0 → 4.3.0

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

Potentially problematic release.


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

Files changed (420) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +63 -0
  3. data/.devcontainer/Dockerfile +14 -0
  4. data/.devcontainer/ImageMagick6/devcontainer.json +11 -0
  5. data/.devcontainer/devcontainer.json +11 -0
  6. data/.devcontainer/setup-repo.sh +10 -0
  7. data/.devcontainer/setup-user.sh +45 -0
  8. data/.editorconfig +3 -0
  9. data/.github/ISSUE_TEMPLATE.md +17 -0
  10. data/.github/workflows/ci.yml +79 -0
  11. data/.gitignore +3 -1
  12. data/.rspec +1 -0
  13. data/.rubocop.yml +24 -0
  14. data/.rubocop_todo.yml +151 -297
  15. data/.yardopts +5 -0
  16. data/CHANGELOG.md +233 -0
  17. data/CODE_OF_CONDUCT.md +122 -7
  18. data/CONTRIBUTING.md +14 -10
  19. data/README.md +326 -0
  20. data/Rakefile +16 -22
  21. data/before_install_linux.sh +22 -28
  22. data/before_install_osx.sh +57 -2
  23. data/ext/RMagick/extconf.rb +149 -105
  24. data/ext/RMagick/rmagick.c +77 -104
  25. data/ext/RMagick/rmagick.h +121 -103
  26. data/ext/RMagick/rmdraw.c +364 -436
  27. data/ext/RMagick/rmenum.c +106 -114
  28. data/ext/RMagick/rmfill.c +149 -70
  29. data/ext/RMagick/rmilist.c +225 -367
  30. data/ext/RMagick/rmimage.c +4751 -4405
  31. data/ext/RMagick/rminfo.c +574 -787
  32. data/ext/RMagick/rmkinfo.c +51 -121
  33. data/ext/RMagick/rmmain.c +454 -286
  34. data/ext/RMagick/rmmontage.c +64 -130
  35. data/ext/RMagick/rmpixel.c +488 -437
  36. data/ext/RMagick/rmstruct.c +83 -96
  37. data/ext/RMagick/rmutil.c +302 -214
  38. data/lib/rmagick/version.rb +1 -1
  39. data/lib/rmagick_internal.rb +138 -93
  40. data/lib/rvg/clippath.rb +2 -1
  41. data/lib/rvg/container.rb +10 -5
  42. data/lib/rvg/describable.rb +1 -1
  43. data/lib/rvg/embellishable.rb +5 -4
  44. data/lib/rvg/misc.rb +15 -12
  45. data/lib/rvg/paint.rb +2 -1
  46. data/lib/rvg/pathdata.rb +12 -11
  47. data/lib/rvg/rvg.rb +12 -8
  48. data/lib/rvg/stylable.rb +9 -7
  49. data/lib/rvg/text.rb +11 -6
  50. data/lib/rvg/transformable.rb +3 -2
  51. data/lib/rvg/units.rb +1 -1
  52. data/rmagick.gemspec +10 -11
  53. metadata +52 -423
  54. data/.appveyor.yml +0 -45
  55. data/.circleci/config.yml +0 -56
  56. data/.ruby-version +0 -1
  57. data/.simplecov +0 -27
  58. data/.travis.yml +0 -62
  59. data/Doxyfile +0 -1514
  60. data/README.textile +0 -259
  61. data/benchmarks/memory/README.md +0 -50
  62. data/benchmarks/memory/image_new.rb +0 -8
  63. data/benchmarks/memory/rmagick.gnuplot +0 -16
  64. data/doc/.cvsignore +0 -1
  65. data/doc/comtasks.html +0 -287
  66. data/doc/constants.html +0 -1581
  67. data/doc/css/doc.css +0 -299
  68. data/doc/css/popup.css +0 -34
  69. data/doc/css/ref.css +0 -67
  70. data/doc/draw.html +0 -3272
  71. data/doc/ex/InitialCoords.rb +0 -22
  72. data/doc/ex/NewCoordSys.rb +0 -30
  73. data/doc/ex/OrigCoordSys.rb +0 -16
  74. data/doc/ex/PreserveAspectRatio.rb +0 -204
  75. data/doc/ex/RotateScale.rb +0 -36
  76. data/doc/ex/Skew.rb +0 -38
  77. data/doc/ex/Use01.rb +0 -15
  78. data/doc/ex/Use02.rb +0 -20
  79. data/doc/ex/Use03.rb +0 -16
  80. data/doc/ex/ViewBox.rb +0 -31
  81. data/doc/ex/adaptive_threshold.rb +0 -9
  82. data/doc/ex/add_noise.rb +0 -16
  83. data/doc/ex/affine.rb +0 -48
  84. data/doc/ex/affine_transform.rb +0 -20
  85. data/doc/ex/arc.rb +0 -49
  86. data/doc/ex/arcpath.rb +0 -32
  87. data/doc/ex/arcs01.rb +0 -28
  88. data/doc/ex/arcs02.rb +0 -59
  89. data/doc/ex/average.rb +0 -15
  90. data/doc/ex/axes.rb +0 -64
  91. data/doc/ex/baseline_shift01.rb +0 -17
  92. data/doc/ex/bilevel_channel.rb +0 -8
  93. data/doc/ex/blur_image.rb +0 -12
  94. data/doc/ex/border.rb +0 -10
  95. data/doc/ex/bounding_box.rb +0 -42
  96. data/doc/ex/cbezier1.rb +0 -41
  97. data/doc/ex/cbezier2.rb +0 -41
  98. data/doc/ex/cbezier3.rb +0 -41
  99. data/doc/ex/cbezier4.rb +0 -42
  100. data/doc/ex/cbezier5.rb +0 -42
  101. data/doc/ex/cbezier6.rb +0 -53
  102. data/doc/ex/channel.rb +0 -25
  103. data/doc/ex/charcoal.rb +0 -12
  104. data/doc/ex/chop.rb +0 -29
  105. data/doc/ex/circle.rb +0 -33
  106. data/doc/ex/circle01.rb +0 -16
  107. data/doc/ex/clip_path.rb +0 -60
  108. data/doc/ex/coalesce.rb +0 -57
  109. data/doc/ex/color_fill_to_border.rb +0 -29
  110. data/doc/ex/color_floodfill.rb +0 -28
  111. data/doc/ex/color_histogram.rb +0 -47
  112. data/doc/ex/color_reset.rb +0 -11
  113. data/doc/ex/colorize.rb +0 -16
  114. data/doc/ex/colors.rb +0 -64
  115. data/doc/ex/compose_mask.rb +0 -22
  116. data/doc/ex/composite.rb +0 -133
  117. data/doc/ex/composite_layers.rb +0 -52
  118. data/doc/ex/composite_tiled.rb +0 -21
  119. data/doc/ex/contrast.rb +0 -36
  120. data/doc/ex/crop.rb +0 -31
  121. data/doc/ex/crop_with_gravity.rb +0 -42
  122. data/doc/ex/cubic01.rb +0 -43
  123. data/doc/ex/cubic02.rb +0 -91
  124. data/doc/ex/cycle_colormap.rb +0 -21
  125. data/doc/ex/dissolve.rb +0 -12
  126. data/doc/ex/drawcomp.rb +0 -41
  127. data/doc/ex/drop_shadow.rb +0 -60
  128. data/doc/ex/edge.rb +0 -11
  129. data/doc/ex/ellipse.rb +0 -45
  130. data/doc/ex/ellipse01.rb +0 -21
  131. data/doc/ex/emboss.rb +0 -11
  132. data/doc/ex/enhance.rb +0 -28
  133. data/doc/ex/equalize.rb +0 -11
  134. data/doc/ex/evenodd.rb +0 -42
  135. data/doc/ex/fill_pattern.rb +0 -23
  136. data/doc/ex/flatten_images.rb +0 -36
  137. data/doc/ex/flip.rb +0 -11
  138. data/doc/ex/flop.rb +0 -11
  139. data/doc/ex/font_styles.rb +0 -32
  140. data/doc/ex/fonts.rb +0 -16
  141. data/doc/ex/frame.rb +0 -12
  142. data/doc/ex/gaussian_blur.rb +0 -11
  143. data/doc/ex/get_multiline_type_metrics.rb +0 -41
  144. data/doc/ex/get_pixels.rb +0 -45
  145. data/doc/ex/get_type_metrics.rb +0 -142
  146. data/doc/ex/gradientfill.rb +0 -27
  147. data/doc/ex/grav.rb +0 -45
  148. data/doc/ex/gravity.rb +0 -78
  149. data/doc/ex/group.rb +0 -26
  150. data/doc/ex/hatchfill.rb +0 -27
  151. data/doc/ex/image.rb +0 -44
  152. data/doc/ex/images/Apple.miff +0 -0
  153. data/doc/ex/images/Ballerina.jpg +0 -0
  154. data/doc/ex/images/Ballerina3.jpg +0 -0
  155. data/doc/ex/images/Button_0.gif +0 -0
  156. data/doc/ex/images/Button_1.gif +0 -0
  157. data/doc/ex/images/Button_2.gif +0 -0
  158. data/doc/ex/images/Button_3.gif +0 -0
  159. data/doc/ex/images/Button_4.gif +0 -0
  160. data/doc/ex/images/Button_5.gif +0 -0
  161. data/doc/ex/images/Button_6.gif +0 -0
  162. data/doc/ex/images/Button_7.gif +0 -0
  163. data/doc/ex/images/Button_8.gif +0 -0
  164. data/doc/ex/images/Button_9.gif +0 -0
  165. data/doc/ex/images/Button_A.gif +0 -0
  166. data/doc/ex/images/Button_B.gif +0 -0
  167. data/doc/ex/images/Button_C.gif +0 -0
  168. data/doc/ex/images/Button_D.gif +0 -0
  169. data/doc/ex/images/Button_E.gif +0 -0
  170. data/doc/ex/images/Button_F.gif +0 -0
  171. data/doc/ex/images/Button_G.gif +0 -0
  172. data/doc/ex/images/Button_H.gif +0 -0
  173. data/doc/ex/images/Button_I.gif +0 -0
  174. data/doc/ex/images/Button_J.gif +0 -0
  175. data/doc/ex/images/Button_K.gif +0 -0
  176. data/doc/ex/images/Button_L.gif +0 -0
  177. data/doc/ex/images/Button_M.gif +0 -0
  178. data/doc/ex/images/Button_N.gif +0 -0
  179. data/doc/ex/images/Button_O.gif +0 -0
  180. data/doc/ex/images/Button_P.gif +0 -0
  181. data/doc/ex/images/Button_Q.gif +0 -0
  182. data/doc/ex/images/Button_R.gif +0 -0
  183. data/doc/ex/images/Button_S.gif +0 -0
  184. data/doc/ex/images/Button_T.gif +0 -0
  185. data/doc/ex/images/Button_U.gif +0 -0
  186. data/doc/ex/images/Button_V.gif +0 -0
  187. data/doc/ex/images/Button_W.gif +0 -0
  188. data/doc/ex/images/Button_X.gif +0 -0
  189. data/doc/ex/images/Button_Y.gif +0 -0
  190. data/doc/ex/images/Button_Z.gif +0 -0
  191. data/doc/ex/images/Cheetah.jpg +0 -0
  192. data/doc/ex/images/Coffee.png +0 -0
  193. data/doc/ex/images/Flower_Hat.jpg +0 -0
  194. data/doc/ex/images/Gold_Statue.jpg +0 -0
  195. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  196. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  197. data/doc/ex/images/Leaf.miff +0 -0
  198. data/doc/ex/images/No.png +0 -0
  199. data/doc/ex/images/Polynesia.jpg +0 -0
  200. data/doc/ex/images/Red_Rocks.jpg +0 -0
  201. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  202. data/doc/ex/images/Shorts.jpg +0 -0
  203. data/doc/ex/images/Snake.png +0 -0
  204. data/doc/ex/images/Violin.jpg +0 -0
  205. data/doc/ex/images/Yellow_Rose.miff +0 -0
  206. data/doc/ex/images/big-duck.gif +0 -0
  207. data/doc/ex/images/duck.gif +0 -0
  208. data/doc/ex/images/duck0.gif +0 -0
  209. data/doc/ex/images/duck1.gif +0 -0
  210. data/doc/ex/images/duck10.gif +0 -0
  211. data/doc/ex/images/duck11.gif +0 -0
  212. data/doc/ex/images/duck12.gif +0 -0
  213. data/doc/ex/images/duck13.gif +0 -0
  214. data/doc/ex/images/duck14.gif +0 -0
  215. data/doc/ex/images/duck15.gif +0 -0
  216. data/doc/ex/images/duck2.gif +0 -0
  217. data/doc/ex/images/duck3.gif +0 -0
  218. data/doc/ex/images/duck4.gif +0 -0
  219. data/doc/ex/images/duck5.gif +0 -0
  220. data/doc/ex/images/duck6.gif +0 -0
  221. data/doc/ex/images/duck7.gif +0 -0
  222. data/doc/ex/images/duck8.gif +0 -0
  223. data/doc/ex/images/duck9.gif +0 -0
  224. data/doc/ex/images/graydient230x6.gif +0 -0
  225. data/doc/ex/images/image_with_profile.jpg +0 -0
  226. data/doc/ex/images/logo400x83.gif +0 -0
  227. data/doc/ex/images/model.miff +0 -0
  228. data/doc/ex/images/notimplemented.gif +0 -0
  229. data/doc/ex/images/smile.miff +0 -0
  230. data/doc/ex/images/spin.gif +0 -0
  231. data/doc/ex/implode.rb +0 -34
  232. data/doc/ex/level.rb +0 -11
  233. data/doc/ex/level_colors.rb +0 -11
  234. data/doc/ex/line.rb +0 -41
  235. data/doc/ex/line01.rb +0 -21
  236. data/doc/ex/mask.rb +0 -35
  237. data/doc/ex/matte_fill_to_border.rb +0 -39
  238. data/doc/ex/matte_floodfill.rb +0 -32
  239. data/doc/ex/matte_replace.rb +0 -39
  240. data/doc/ex/median_filter.rb +0 -28
  241. data/doc/ex/modulate.rb +0 -11
  242. data/doc/ex/mono.rb +0 -23
  243. data/doc/ex/morph.rb +0 -25
  244. data/doc/ex/mosaic.rb +0 -37
  245. data/doc/ex/motion_blur.rb +0 -11
  246. data/doc/ex/negate.rb +0 -11
  247. data/doc/ex/negate_channel.rb +0 -9
  248. data/doc/ex/nested_rvg.rb +0 -21
  249. data/doc/ex/nonzero.rb +0 -42
  250. data/doc/ex/normalize.rb +0 -11
  251. data/doc/ex/oil_paint.rb +0 -11
  252. data/doc/ex/opacity.rb +0 -37
  253. data/doc/ex/ordered_dither.rb +0 -11
  254. data/doc/ex/path.rb +0 -63
  255. data/doc/ex/pattern1.rb +0 -25
  256. data/doc/ex/pattern2.rb +0 -26
  257. data/doc/ex/polaroid.rb +0 -26
  258. data/doc/ex/polygon.rb +0 -23
  259. data/doc/ex/polygon01.rb +0 -21
  260. data/doc/ex/polyline.rb +0 -22
  261. data/doc/ex/polyline01.rb +0 -21
  262. data/doc/ex/posterize.rb +0 -8
  263. data/doc/ex/preview.rb +0 -8
  264. data/doc/ex/qbezierpath.rb +0 -52
  265. data/doc/ex/quad01.rb +0 -34
  266. data/doc/ex/quantize-m.rb +0 -25
  267. data/doc/ex/radial_blur.rb +0 -9
  268. data/doc/ex/raise.rb +0 -8
  269. data/doc/ex/random_threshold_channel.rb +0 -13
  270. data/doc/ex/rect01.rb +0 -14
  271. data/doc/ex/rect02.rb +0 -20
  272. data/doc/ex/rectangle.rb +0 -34
  273. data/doc/ex/reduce_noise.rb +0 -28
  274. data/doc/ex/remap.rb +0 -11
  275. data/doc/ex/remap_images.rb +0 -19
  276. data/doc/ex/resize_to_fill.rb +0 -8
  277. data/doc/ex/resize_to_fit.rb +0 -8
  278. data/doc/ex/roll.rb +0 -9
  279. data/doc/ex/rotate.rb +0 -44
  280. data/doc/ex/rotate_f.rb +0 -14
  281. data/doc/ex/roundrect.rb +0 -33
  282. data/doc/ex/rubyname.rb +0 -30
  283. data/doc/ex/rvg_clippath.rb +0 -12
  284. data/doc/ex/rvg_linecap.rb +0 -42
  285. data/doc/ex/rvg_linejoin.rb +0 -40
  286. data/doc/ex/rvg_opacity.rb +0 -18
  287. data/doc/ex/rvg_pattern.rb +0 -26
  288. data/doc/ex/rvg_stroke_dasharray.rb +0 -11
  289. data/doc/ex/segment.rb +0 -11
  290. data/doc/ex/sepiatone.rb +0 -7
  291. data/doc/ex/shade.rb +0 -11
  292. data/doc/ex/shadow.rb +0 -30
  293. data/doc/ex/shave.rb +0 -15
  294. data/doc/ex/shear.rb +0 -10
  295. data/doc/ex/sketch.rb +0 -17
  296. data/doc/ex/skewx.rb +0 -51
  297. data/doc/ex/skewy.rb +0 -47
  298. data/doc/ex/smile.rb +0 -126
  299. data/doc/ex/solarize.rb +0 -11
  300. data/doc/ex/sparse_color.rb +0 -55
  301. data/doc/ex/splice.rb +0 -8
  302. data/doc/ex/spread.rb +0 -11
  303. data/doc/ex/stegano.rb +0 -54
  304. data/doc/ex/stroke_dasharray.rb +0 -42
  305. data/doc/ex/stroke_fill.rb +0 -10
  306. data/doc/ex/stroke_linecap.rb +0 -44
  307. data/doc/ex/stroke_linejoin.rb +0 -48
  308. data/doc/ex/stroke_width.rb +0 -49
  309. data/doc/ex/swirl.rb +0 -17
  310. data/doc/ex/text.rb +0 -37
  311. data/doc/ex/text01.rb +0 -16
  312. data/doc/ex/text_align.rb +0 -36
  313. data/doc/ex/text_antialias.rb +0 -37
  314. data/doc/ex/text_styles.rb +0 -19
  315. data/doc/ex/text_undercolor.rb +0 -28
  316. data/doc/ex/texture_fill_to_border.rb +0 -34
  317. data/doc/ex/texture_floodfill.rb +0 -32
  318. data/doc/ex/texturefill.rb +0 -24
  319. data/doc/ex/threshold.rb +0 -13
  320. data/doc/ex/to_blob.rb +0 -13
  321. data/doc/ex/translate.rb +0 -39
  322. data/doc/ex/transparent.rb +0 -38
  323. data/doc/ex/transpose.rb +0 -9
  324. data/doc/ex/transverse.rb +0 -9
  325. data/doc/ex/tref01.rb +0 -24
  326. data/doc/ex/triangle01.rb +0 -15
  327. data/doc/ex/trim.rb +0 -23
  328. data/doc/ex/tspan01.rb +0 -17
  329. data/doc/ex/tspan02.rb +0 -17
  330. data/doc/ex/tspan03.rb +0 -19
  331. data/doc/ex/unsharp_mask.rb +0 -28
  332. data/doc/ex/viewex.rb +0 -33
  333. data/doc/ex/vignette.rb +0 -12
  334. data/doc/ex/watermark.rb +0 -27
  335. data/doc/ex/wave.rb +0 -9
  336. data/doc/ex/wet_floor.rb +0 -58
  337. data/doc/ex/writing_mode01.rb +0 -26
  338. data/doc/ex/writing_mode02.rb +0 -26
  339. data/doc/ilist.html +0 -2056
  340. data/doc/image1.html +0 -4680
  341. data/doc/image2.html +0 -3665
  342. data/doc/image3.html +0 -4522
  343. data/doc/imageattrs.html +0 -1638
  344. data/doc/imusage.html +0 -514
  345. data/doc/index.html +0 -416
  346. data/doc/info.html +0 -1499
  347. data/doc/magick.html +0 -570
  348. data/doc/optequiv.html +0 -2435
  349. data/doc/rvg.html +0 -975
  350. data/doc/rvgclip.html +0 -248
  351. data/doc/rvggroup.html +0 -305
  352. data/doc/rvgimage.html +0 -289
  353. data/doc/rvgpattern.html +0 -475
  354. data/doc/rvgshape.html +0 -406
  355. data/doc/rvgstyle.html +0 -270
  356. data/doc/rvgtext.html +0 -465
  357. data/doc/rvgtspan.html +0 -238
  358. data/doc/rvgtut.html +0 -530
  359. data/doc/rvguse.html +0 -145
  360. data/doc/rvgxform.html +0 -294
  361. data/doc/scripts/doc.js +0 -22
  362. data/doc/scripts/stripeTables.js +0 -23
  363. data/doc/struct.html +0 -1339
  364. data/doc/usage.html +0 -1621
  365. data/examples/constitute.rb +0 -7
  366. data/examples/crop_with_gravity.rb +0 -42
  367. data/examples/demo.rb +0 -323
  368. data/examples/describe.rb +0 -41
  369. data/examples/find_similar_region.rb +0 -34
  370. data/examples/histogram.rb +0 -312
  371. data/examples/identify.rb +0 -174
  372. data/examples/image_opacity.rb +0 -28
  373. data/examples/import_export.rb +0 -31
  374. data/examples/pattern_fill.rb +0 -37
  375. data/examples/rotating_text.rb +0 -45
  376. data/examples/spinner.rb +0 -49
  377. data/examples/thumbnail.rb +0 -64
  378. data/examples/vignette.rb +0 -78
  379. data/lib/obsolete.rb +0 -66
  380. data/spec/rmagick/ImageList1_spec.rb +0 -24
  381. data/spec/rmagick/draw_spec.rb +0 -155
  382. data/spec/rmagick/image/blue_shift_spec.rb +0 -14
  383. data/spec/rmagick/image/channel_entropy_spec.rb +0 -9
  384. data/spec/rmagick/image/composite_spec.rb +0 -72
  385. data/spec/rmagick/image/constitute_spec.rb +0 -13
  386. data/spec/rmagick/image/dispatch_spec.rb +0 -16
  387. data/spec/rmagick/image/from_blob_spec.rb +0 -12
  388. data/spec/rmagick/image/ping_spec.rb +0 -12
  389. data/spec/rmagick/image/properties_spec.rb +0 -27
  390. data/spec/rmagick/image/read_spec.rb +0 -28
  391. data/spec/spec_helper.rb +0 -10
  392. data/spec/support/issue_200/app.rb +0 -8
  393. data/test/Draw.rb +0 -351
  394. data/test/Enum.rb +0 -228
  395. data/test/Fill.rb +0 -93
  396. data/test/Image1.rb +0 -627
  397. data/test/Image2.rb +0 -1426
  398. data/test/Image3.rb +0 -1091
  399. data/test/ImageList1.rb +0 -858
  400. data/test/ImageList2.rb +0 -406
  401. data/test/Image_attributes.rb +0 -666
  402. data/test/Import_Export.rb +0 -115
  403. data/test/Info.rb +0 -444
  404. data/test/KernelInfo.rb +0 -67
  405. data/test/Magick.rb +0 -311
  406. data/test/Pixel.rb +0 -285
  407. data/test/PolaroidOptions.rb +0 -23
  408. data/test/Preview.rb +0 -26
  409. data/test/Struct.rb +0 -45
  410. data/test/appearance/Montage.rb +0 -26
  411. data/test/appearance/appearance_assertion.rb +0 -13
  412. data/test/appearance/expected/montage_border_color.jpg +0 -0
  413. data/test/cmyk.icm +0 -0
  414. data/test/lib/Obsolete.rb +0 -30
  415. data/test/lib/internal/Draw.rb +0 -823
  416. data/test/lib/internal/Geometry.rb +0 -98
  417. data/test/lib/internal/Magick.rb +0 -40
  418. data/test/srgb.icm +0 -0
  419. data/test/test_all_basic.rb +0 -49
  420. data/test/tmpnam_test.rb +0 -50
@@ -2,7 +2,6 @@ lib_dir = File.expand_path('../../lib', File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
3
3
  require 'rubygems'
4
4
  require 'mkmf'
5
- require 'date'
6
5
 
7
6
  module RMagick
8
7
  class Extconf
@@ -16,12 +15,14 @@ module RMagick
16
15
  @stdout = $stdout.dup
17
16
 
18
17
  setup_pkg_config_path
19
- configure_compile_options
20
18
  assert_can_compile!
19
+ configure_compile_options
21
20
  configure_headers
22
21
  end
23
22
 
24
23
  def setup_pkg_config_path
24
+ return if RUBY_PLATFORM =~ /mswin|mingw/
25
+
25
26
  if find_executable('brew')
26
27
  pkg_config_path = "#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig"
27
28
  elsif find_executable('pacman')
@@ -40,7 +41,6 @@ module RMagick
40
41
  {
41
42
  magick_version: $magick_version,
42
43
  local_libs: $LOCAL_LIBS,
43
- cflags: $CFLAGS,
44
44
  cppflags: $CPPFLAGS,
45
45
  ldflags: $LDFLAGS,
46
46
  defs: $defs,
@@ -51,7 +51,9 @@ module RMagick
51
51
  def configure_headers
52
52
  @headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h sys/types.h]
53
53
 
54
- if have_header('magick/MagickCore.h')
54
+ if have_header('MagickCore/MagickCore.h')
55
+ headers << 'MagickCore/MagickCore.h'
56
+ elsif have_header('magick/MagickCore.h')
55
57
  headers << 'magick/MagickCore.h'
56
58
  else
57
59
  exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find magick/MagickCore.h."
@@ -62,85 +64,46 @@ module RMagick
62
64
  # Magick-config is not available on Windows
63
65
  if RUBY_PLATFORM !~ /mswin|mingw/
64
66
 
65
- # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
66
- config = defined?(RbConfig) ? ::RbConfig : ::Config
67
- cc = (ENV['CC'] || config::CONFIG['CC'] || 'gcc').split(' ').first
68
- exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cc)
69
-
70
- magick_package = determine_imagemagick_package
71
-
72
- $magick_version = `pkg-config #{magick_package} --modversion`[/^(\d+\.\d+\.\d+)/]
73
-
74
67
  check_multiple_imagemagick_versions
75
68
  check_partial_imagemagick_versions
76
69
 
77
- # Ensure minimum ImageMagick version
78
- # Check minimum ImageMagick version if possible
79
- checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
80
- Logging.message("Detected ImageMagick version: #{$magick_version}\n")
81
-
82
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n" if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
83
- end
70
+ libdir = `pkg-config --libs-only-L #{$magick_package}`.chomp.sub('-L', '')
71
+ ldflags = "#{ENV['LDFLAGS']} " + `pkg-config --libs #{$magick_package}`.chomp
72
+ rpath = libdir.empty? ? '' : "-Wl,-rpath,#{libdir}"
84
73
 
85
74
  # Save flags
86
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags #{magick_package}`.chomp
87
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags #{magick_package}`.chomp
88
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs #{magick_package}`.chomp
89
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs #{magick_package}`.chomp
75
+ $CPPFLAGS = "#{ENV['CPPFLAGS']} " + `pkg-config --cflags #{$magick_package}`.chomp
76
+ $LOCAL_LIBS = "#{ENV['LIBS']} " + `pkg-config --libs #{$magick_package}`.chomp
77
+ $LDFLAGS = "#{ldflags} #{rpath}"
90
78
 
91
- set_archflags_for_osx if RUBY_PLATFORM =~ /darwin/ # osx
79
+ unless try_link("int main() { }")
80
+ # if linker does not recognizes '-Wl,-rpath,somewhere' option, it revert to original option
81
+ $LDFLAGS = ldflags
82
+ end
92
83
 
93
- elsif RUBY_PLATFORM =~ /mingw/ # mingw
84
+ configure_archflags_for_osx($magick_package) if RUBY_PLATFORM =~ /darwin/ # osx
94
85
 
95
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
96
- abort 'Unable to get ImageMagick version' unless Regexp.last_match(1)
97
- $magick_version = Regexp.last_match(1)
86
+ elsif RUBY_PLATFORM =~ /mingw/ # mingw
98
87
 
99
88
  dir_paths = search_paths_for_library_for_windows
100
89
  $CPPFLAGS = %(-I"#{dir_paths[:include]}")
101
90
  $LDFLAGS = %(-L"#{dir_paths[:lib]}")
91
+ $LDFLAGS << ' -lucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
102
92
 
103
- have_library('CORE_RL_magick_')
93
+ have_library(im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_' : 'CORE_RL_magick_')
104
94
 
105
95
  else # mswin
106
96
 
107
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
108
- abort 'Unable to get ImageMagick version' unless Regexp.last_match(1)
109
- $magick_version = Regexp.last_match(1)
110
-
111
97
  dir_paths = search_paths_for_library_for_windows
112
98
  $CPPFLAGS << %( -I"#{dir_paths[:include]}")
113
99
  $LDFLAGS << %( -libpath:"#{dir_paths[:lib]}")
100
+ $LDFLAGS << ' -libpath:ucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
114
101
 
115
- $LOCAL_LIBS = 'CORE_RL_magick_.lib'
102
+ $LOCAL_LIBS = im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib'
116
103
 
117
104
  end
118
105
 
119
- $CFLAGS << (have_macro('__GNUC__') ? ' -std=gnu99' : ' -std=c99')
120
- end
121
-
122
- # Test for a specific value in an enum type
123
- def have_enum_value(enum, value, headers = nil, &b)
124
- checking_for "#{enum}.#{value}" do
125
- if try_compile(<<"SRC", &b)
126
- #{COMMON_HEADERS}
127
- #{cpp_include(headers)}
128
- /*top*/
129
- int main() { #{enum} t = #{value}; t = t; return 0; }
130
- SRC
131
- $defs.push(format('-DHAVE_ENUM_%s', value.upcase))
132
- true
133
- else
134
- false
135
- end
136
- end
137
- end
138
-
139
- # Test for multiple values of the same enum type
140
- def have_enum_values(enum, values, headers = nil, &b)
141
- values.each do |value|
142
- have_enum_value(enum, value, headers, &b)
143
- end
106
+ $CPPFLAGS << (have_macro('__GNUC__') ? ' -std=gnu99' : ' -std=c99')
144
107
  end
145
108
 
146
109
  def exit_failure(msg)
@@ -161,11 +124,7 @@ SRC
161
124
  end
162
125
 
163
126
  def determine_imagemagick_package
164
- unless find_executable('pkg-config')
165
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find pkg-config in #{ENV['PATH']}\n"
166
- end
167
-
168
- packages = `pkg-config --list-all`.scan(/(ImageMagick\-6[\.A-Z0-9]+) .*/).flatten
127
+ packages = `pkg-config --list-all`.scan(/(ImageMagick\-[\.A-Z0-9]+) .*/).flatten
169
128
 
170
129
  # For ancient version of ImageMagick 6 we need a different regex
171
130
  if packages.empty?
@@ -176,6 +135,23 @@ SRC
176
135
  exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find ImageMagick with pkg-config\n"
177
136
  end
178
137
 
138
+ if packages.length > 1
139
+
140
+ im7_packages = packages.grep(/\AImageMagick-7/)
141
+
142
+ if im7_packages.any?
143
+ checking_for('forced use of ImageMagick 6') do
144
+ if ENV['USE_IMAGEMAGICK_6']
145
+ packages -= im7_packages
146
+ true
147
+ else
148
+ packages = im7_packages
149
+ false
150
+ end
151
+ end
152
+ end
153
+ end
154
+
179
155
  if packages.length > 1
180
156
  package_lines = packages.map { |package| " - #{package}" }.join("\n")
181
157
  msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n#{package_lines}\n\n"
@@ -226,21 +202,33 @@ SRC
226
202
  matches.delete_if(&:empty?)
227
203
  return unless !matches.empty? && matches.length < 3
228
204
 
229
- 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"
205
+ msg = <<~MESSAGE
206
+
207
+ Warning: Found a partial ImageMagick installation. Your operating
208
+ system likely has some built-in ImageMagick libraries but not all of
209
+ ImageMagick. This will most likely cause problems at both compile and
210
+ runtime.
211
+ Found partial installation at: #{prefix}
212
+
213
+ MESSAGE
214
+
230
215
  Logging.message msg
231
216
  message msg
232
217
  end
233
218
 
234
219
  # issue #169
235
220
  # set ARCHFLAGS appropriately for OSX
236
- def set_archflags_for_osx
237
- archflags = []
238
- fullpath = `which convert`
239
- fileinfo = `file #{fullpath}`
221
+ def configure_archflags_for_osx(magick_package)
222
+ return unless `pkg-config #{magick_package} --libs-only-L`.match(%r{-L(.+)/lib})
223
+
224
+ imagemagick_dir = Regexp.last_match(1)
225
+ command = Dir.glob(File.join(imagemagick_dir, "bin/*")).select { |file| File.executable? file }.first
226
+ fileinfo = `file #{command}`
240
227
 
241
228
  # default ARCHFLAGS
242
229
  archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten
243
230
 
231
+ archflags = []
244
232
  archs.each do |arch|
245
233
  archflags << "-arch #{arch}" if fileinfo.include?(arch)
246
234
  end
@@ -259,7 +247,7 @@ SRC
259
247
  paths = ENV['PATH'].split(File::PATH_SEPARATOR)
260
248
  paths.each do |dir|
261
249
  lib = File.join(dir, 'lib')
262
- lib_file = File.join(lib, 'CORE_RL_magick_.lib')
250
+ lib_file = File.join(lib, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
263
251
  next unless File.exist?(lib_file)
264
252
 
265
253
  dir_paths[:include] = File.join(dir, 'include')
@@ -271,57 +259,101 @@ SRC
271
259
 
272
260
  return dir_paths if found_lib
273
261
 
274
- exit_failure <<END_MINGW
275
- Can't install RMagick #{RMAGICK_VERS}.
276
- Can't find the ImageMagick library.
277
- Retry with '--with-opt-dir' option.
278
- Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
279
- e.g.
280
- gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
281
- END_MINGW
262
+ exit_failure <<~END_MINGW
263
+ Can't install RMagick #{RMAGICK_VERS}.
264
+ Can't find the ImageMagick library.
265
+ Retry with '--with-opt-dir' option.
266
+ Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
267
+ e.g.
268
+ gem install rmagick -- '--with-opt-dir=\"C:\\Program Files\\ImageMagick-6.9.1-Q16\"'
269
+ END_MINGW
282
270
  end
283
271
 
284
272
  def assert_can_compile!
285
273
  assert_minimum_ruby_version!
286
274
  assert_has_dev_libs!
275
+
276
+ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
277
+ cc = (ENV['CC'] || RbConfig::CONFIG['CC'] || 'gcc').split(' ').first
278
+ exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cc)
287
279
  end
288
280
 
289
281
  def assert_minimum_ruby_version!
290
- unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
282
+ supported = checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
291
283
  Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(MIN_RUBY_VERS)
292
284
  end
293
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
294
- end
285
+
286
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n" unless supported
295
287
  end
296
288
 
297
289
  def assert_has_dev_libs!
298
- return unless RUBY_PLATFORM !~ /mswin|mingw/
290
+ failure_message = <<~END_FAILURE
291
+ Can't install RMagick #{RMAGICK_VERS}.
292
+ Can't find the ImageMagick library or one of the dependent libraries.
293
+ Check the mkmf.log file for more detailed information.
294
+ END_FAILURE
295
+
296
+ if RUBY_PLATFORM !~ /mswin|mingw/
297
+ unless find_executable('pkg-config')
298
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find pkg-config in #{ENV['PATH']}\n"
299
+ end
300
+
301
+ unless `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
302
+ exit_failure failure_message
303
+ end
299
304
 
300
- unless `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
301
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. " \
302
- "Can't find the ImageMagick library or one of the dependent libraries. " \
303
- "Check the mkmf.log file for more detailed information.\n"
305
+ $magick_package = determine_imagemagick_package
306
+ $magick_version = `pkg-config #{$magick_package} --modversion`[/^(\d+\.\d+\.\d+)/]
307
+ else
308
+ `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
309
+ $magick_version = Regexp.last_match(1)
310
+ exit_failure failure_message unless $magick_version
311
+ end
312
+
313
+ # Ensure minimum ImageMagick version
314
+ # Check minimum ImageMagick version if possible
315
+ checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
316
+ Logging.message("Detected ImageMagick version: #{$magick_version}\n")
317
+
318
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n" if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
304
319
  end
305
320
  end
306
321
 
307
322
  def create_header_file
308
- [
323
+ ruby_api = [
324
+ 'rb_gc_adjust_memory_usage' # Ruby 2.4.0
325
+ ]
326
+ memory_api = %w[
327
+ posix_memalign
328
+ malloc_usable_size
329
+ malloc_size
330
+ _aligned_msize
331
+ ]
332
+ imagemagick_api = [
309
333
  'GetImageChannelEntropy', # 6.9.0-0
310
- 'SetImageGray' # 6.9.1-10
311
- ].each do |func|
334
+ 'SetImageGray', # 6.9.1-10
335
+ 'SetMagickAlignedMemoryMethods' # 7.0.9-0
336
+ ]
337
+
338
+ check_api = ruby_api + memory_api + imagemagick_api
339
+ check_api.each do |func|
312
340
  have_func(func, headers)
313
341
  end
314
342
 
343
+ unless have_header('malloc.h')
344
+ have_header('malloc/malloc.h')
345
+ end
346
+
315
347
  # Miscellaneous constants
316
348
  $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
317
349
  $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
318
350
 
319
- if Gem::Version.new($magick_version) >= Gem::Version.new('6.8.9')
320
- $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1')
321
- end
322
- if Gem::Version.new($magick_version) >= Gem::Version.new('6.9.0')
323
- $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1')
324
- end
351
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1') if im_version_at_least?('6.8.9')
352
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1') if im_version_at_least?('6.9.0')
353
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_10=1') if im_version_at_least?('6.9.10')
354
+ $defs.push('-DIMAGEMAGICK_7=1') if im_version_at_least?('7.0.0')
355
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_8=1') if im_version_at_least?('7.0.8')
356
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_10=1') if im_version_at_least?('7.0.10')
325
357
 
326
358
  create_header
327
359
  end
@@ -333,24 +365,36 @@ END_MINGW
333
365
  $defs = []
334
366
 
335
367
  # Force re-compilation if the generated Makefile changed.
336
- $config_h = 'Makefile rmagick.h'
368
+ $config_h = 'Makefile'
337
369
 
338
370
  create_makefile('RMagick2')
339
371
  print_summary
340
372
  end
341
373
 
342
- def print_summary
343
- summary = <<"END_SUMMARY"
374
+ def magick_command
375
+ @magick_command ||= if find_executable('magick')
376
+ 'magick'
377
+ elsif find_executable('identify')
378
+ 'identify'
379
+ else
380
+ raise NotImplementedError, "no executable found for ImageMagick"
381
+ end
382
+ end
344
383
 
384
+ def im_version_at_least?(version)
385
+ Gem::Version.new($magick_version) >= Gem::Version.new(version)
386
+ end
345
387
 
346
- #{'=' * 70}
347
- #{DateTime.now.strftime('%a %d %b %y %T')}
348
- This installation of RMagick #{RMAGICK_VERS} is configured for
349
- Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
350
- #{'=' * 70}
388
+ def print_summary
389
+ summary = <<~"END_SUMMARY"
390
+ #{'=' * 70}
391
+ #{Time.now.strftime('%a %d %b %y %T')}
392
+ This installation of RMagick #{RMAGICK_VERS} is configured for
393
+ Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
394
+ #{'=' * 70}
351
395
 
352
396
 
353
- END_SUMMARY
397
+ END_SUMMARY
354
398
 
355
399
  Logging.message summary
356
400
  message summary