rmagick 4.0.0 → 5.3.0

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