image_pack 0.2.0

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 (319) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +18 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +140 -0
  5. data/THIRD_PARTY_NOTICES.md +8 -0
  6. data/ext/image_pack/extconf.rb +515 -0
  7. data/ext/image_pack/image_pack.c +1618 -0
  8. data/ext/image_pack/vendor/.vendored +1 -0
  9. data/ext/image_pack/vendor/mozjpeg/BUILDING.txt +902 -0
  10. data/ext/image_pack/vendor/mozjpeg/CMakeLists.txt +1593 -0
  11. data/ext/image_pack/vendor/mozjpeg/LICENSE.md +132 -0
  12. data/ext/image_pack/vendor/mozjpeg/README-mozilla.txt +194 -0
  13. data/ext/image_pack/vendor/mozjpeg/README-turbo.txt +346 -0
  14. data/ext/image_pack/vendor/mozjpeg/README.ijg +258 -0
  15. data/ext/image_pack/vendor/mozjpeg/README.md +29 -0
  16. data/ext/image_pack/vendor/mozjpeg/cderror.h +128 -0
  17. data/ext/image_pack/vendor/mozjpeg/cdjpeg.c +156 -0
  18. data/ext/image_pack/vendor/mozjpeg/cdjpeg.h +171 -0
  19. data/ext/image_pack/vendor/mozjpeg/cjpeg.c +961 -0
  20. data/ext/image_pack/vendor/mozjpeg/cmyk.h +60 -0
  21. data/ext/image_pack/vendor/mozjpeg/coderules.txt +78 -0
  22. data/ext/image_pack/vendor/mozjpeg/croptest.in +95 -0
  23. data/ext/image_pack/vendor/mozjpeg/djpeg.c +855 -0
  24. data/ext/image_pack/vendor/mozjpeg/example.txt +464 -0
  25. data/ext/image_pack/vendor/mozjpeg/jaricom.c +157 -0
  26. data/ext/image_pack/vendor/mozjpeg/jcapimin.c +307 -0
  27. data/ext/image_pack/vendor/mozjpeg/jcapistd.c +168 -0
  28. data/ext/image_pack/vendor/mozjpeg/jcarith.c +972 -0
  29. data/ext/image_pack/vendor/mozjpeg/jccoefct.c +609 -0
  30. data/ext/image_pack/vendor/mozjpeg/jccolext.c +144 -0
  31. data/ext/image_pack/vendor/mozjpeg/jccolor.c +721 -0
  32. data/ext/image_pack/vendor/mozjpeg/jcdctmgr.c +1776 -0
  33. data/ext/image_pack/vendor/mozjpeg/jcext.c +219 -0
  34. data/ext/image_pack/vendor/mozjpeg/jchuff.c +1146 -0
  35. data/ext/image_pack/vendor/mozjpeg/jchuff.h +57 -0
  36. data/ext/image_pack/vendor/mozjpeg/jcicc.c +105 -0
  37. data/ext/image_pack/vendor/mozjpeg/jcinit.c +82 -0
  38. data/ext/image_pack/vendor/mozjpeg/jcmainct.c +162 -0
  39. data/ext/image_pack/vendor/mozjpeg/jcmarker.c +844 -0
  40. data/ext/image_pack/vendor/mozjpeg/jcmaster.c +958 -0
  41. data/ext/image_pack/vendor/mozjpeg/jcmaster.h +56 -0
  42. data/ext/image_pack/vendor/mozjpeg/jcomapi.c +109 -0
  43. data/ext/image_pack/vendor/mozjpeg/jconfig.h.in +37 -0
  44. data/ext/image_pack/vendor/mozjpeg/jconfig.txt +93 -0
  45. data/ext/image_pack/vendor/mozjpeg/jconfigint.h.in +44 -0
  46. data/ext/image_pack/vendor/mozjpeg/jcparam.c +991 -0
  47. data/ext/image_pack/vendor/mozjpeg/jcphuff.c +1123 -0
  48. data/ext/image_pack/vendor/mozjpeg/jcprepct.c +351 -0
  49. data/ext/image_pack/vendor/mozjpeg/jcsample.c +522 -0
  50. data/ext/image_pack/vendor/mozjpeg/jcstest.c +126 -0
  51. data/ext/image_pack/vendor/mozjpeg/jctrans.c +408 -0
  52. data/ext/image_pack/vendor/mozjpeg/jdapimin.c +407 -0
  53. data/ext/image_pack/vendor/mozjpeg/jdapistd.c +691 -0
  54. data/ext/image_pack/vendor/mozjpeg/jdarith.c +782 -0
  55. data/ext/image_pack/vendor/mozjpeg/jdatadst-tj.c +198 -0
  56. data/ext/image_pack/vendor/mozjpeg/jdatadst.c +299 -0
  57. data/ext/image_pack/vendor/mozjpeg/jdatasrc-tj.c +194 -0
  58. data/ext/image_pack/vendor/mozjpeg/jdatasrc.c +295 -0
  59. data/ext/image_pack/vendor/mozjpeg/jdcoefct.c +881 -0
  60. data/ext/image_pack/vendor/mozjpeg/jdcoefct.h +83 -0
  61. data/ext/image_pack/vendor/mozjpeg/jdcol565.c +384 -0
  62. data/ext/image_pack/vendor/mozjpeg/jdcolext.c +141 -0
  63. data/ext/image_pack/vendor/mozjpeg/jdcolor.c +881 -0
  64. data/ext/image_pack/vendor/mozjpeg/jdct.h +208 -0
  65. data/ext/image_pack/vendor/mozjpeg/jddctmgr.c +367 -0
  66. data/ext/image_pack/vendor/mozjpeg/jdhuff.c +834 -0
  67. data/ext/image_pack/vendor/mozjpeg/jdhuff.h +247 -0
  68. data/ext/image_pack/vendor/mozjpeg/jdicc.c +167 -0
  69. data/ext/image_pack/vendor/mozjpeg/jdinput.c +408 -0
  70. data/ext/image_pack/vendor/mozjpeg/jdmainct.c +460 -0
  71. data/ext/image_pack/vendor/mozjpeg/jdmainct.h +71 -0
  72. data/ext/image_pack/vendor/mozjpeg/jdmarker.c +1374 -0
  73. data/ext/image_pack/vendor/mozjpeg/jdmaster.c +727 -0
  74. data/ext/image_pack/vendor/mozjpeg/jdmaster.h +33 -0
  75. data/ext/image_pack/vendor/mozjpeg/jdmerge.c +587 -0
  76. data/ext/image_pack/vendor/mozjpeg/jdmerge.h +47 -0
  77. data/ext/image_pack/vendor/mozjpeg/jdmrg565.c +354 -0
  78. data/ext/image_pack/vendor/mozjpeg/jdmrgext.c +184 -0
  79. data/ext/image_pack/vendor/mozjpeg/jdphuff.c +679 -0
  80. data/ext/image_pack/vendor/mozjpeg/jdpostct.c +294 -0
  81. data/ext/image_pack/vendor/mozjpeg/jdsample.c +524 -0
  82. data/ext/image_pack/vendor/mozjpeg/jdsample.h +50 -0
  83. data/ext/image_pack/vendor/mozjpeg/jdtrans.c +156 -0
  84. data/ext/image_pack/vendor/mozjpeg/jerror.c +251 -0
  85. data/ext/image_pack/vendor/mozjpeg/jerror.h +335 -0
  86. data/ext/image_pack/vendor/mozjpeg/jfdctflt.c +169 -0
  87. data/ext/image_pack/vendor/mozjpeg/jfdctfst.c +227 -0
  88. data/ext/image_pack/vendor/mozjpeg/jfdctint.c +288 -0
  89. data/ext/image_pack/vendor/mozjpeg/jidctflt.c +240 -0
  90. data/ext/image_pack/vendor/mozjpeg/jidctfst.c +371 -0
  91. data/ext/image_pack/vendor/mozjpeg/jidctint.c +2627 -0
  92. data/ext/image_pack/vendor/mozjpeg/jidctred.c +409 -0
  93. data/ext/image_pack/vendor/mozjpeg/jinclude.h +147 -0
  94. data/ext/image_pack/vendor/mozjpeg/jmemmgr.c +1180 -0
  95. data/ext/image_pack/vendor/mozjpeg/jmemnobs.c +110 -0
  96. data/ext/image_pack/vendor/mozjpeg/jmemsys.h +178 -0
  97. data/ext/image_pack/vendor/mozjpeg/jmorecfg.h +382 -0
  98. data/ext/image_pack/vendor/mozjpeg/jpeg_nbits_table.h +4098 -0
  99. data/ext/image_pack/vendor/mozjpeg/jpegcomp.h +32 -0
  100. data/ext/image_pack/vendor/mozjpeg/jpegint.h +453 -0
  101. data/ext/image_pack/vendor/mozjpeg/jpeglib.h +1211 -0
  102. data/ext/image_pack/vendor/mozjpeg/jpegtran.c +827 -0
  103. data/ext/image_pack/vendor/mozjpeg/jpegyuv.c +172 -0
  104. data/ext/image_pack/vendor/mozjpeg/jquant1.c +856 -0
  105. data/ext/image_pack/vendor/mozjpeg/jquant2.c +1286 -0
  106. data/ext/image_pack/vendor/mozjpeg/jsimd.h +123 -0
  107. data/ext/image_pack/vendor/mozjpeg/jsimd_none.c +431 -0
  108. data/ext/image_pack/vendor/mozjpeg/jsimddct.h +70 -0
  109. data/ext/image_pack/vendor/mozjpeg/jstdhuff.c +144 -0
  110. data/ext/image_pack/vendor/mozjpeg/jutils.c +133 -0
  111. data/ext/image_pack/vendor/mozjpeg/jversion.h.in +56 -0
  112. data/ext/image_pack/vendor/mozjpeg/libjpeg.map.in +11 -0
  113. data/ext/image_pack/vendor/mozjpeg/libjpeg.txt +3150 -0
  114. data/ext/image_pack/vendor/mozjpeg/rdbmp.c +690 -0
  115. data/ext/image_pack/vendor/mozjpeg/rdcolmap.c +253 -0
  116. data/ext/image_pack/vendor/mozjpeg/rdgif.c +720 -0
  117. data/ext/image_pack/vendor/mozjpeg/rdjpeg.c +160 -0
  118. data/ext/image_pack/vendor/mozjpeg/rdjpgcom.c +494 -0
  119. data/ext/image_pack/vendor/mozjpeg/rdpng.c +194 -0
  120. data/ext/image_pack/vendor/mozjpeg/rdppm.c +781 -0
  121. data/ext/image_pack/vendor/mozjpeg/rdswitch.c +642 -0
  122. data/ext/image_pack/vendor/mozjpeg/rdtarga.c +508 -0
  123. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch32/jccolext-neon.c +148 -0
  124. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch32/jchuff-neon.c +334 -0
  125. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch32/jsimd.c +976 -0
  126. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch32/jsimd_neon.S +1200 -0
  127. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch64/jccolext-neon.c +316 -0
  128. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch64/jchuff-neon.c +411 -0
  129. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch64/jsimd.c +1053 -0
  130. data/ext/image_pack/vendor/mozjpeg/simd/arm/aarch64/jsimd_neon.S +2254 -0
  131. data/ext/image_pack/vendor/mozjpeg/simd/arm/align.h +28 -0
  132. data/ext/image_pack/vendor/mozjpeg/simd/arm/jccolor-neon.c +160 -0
  133. data/ext/image_pack/vendor/mozjpeg/simd/arm/jcgray-neon.c +120 -0
  134. data/ext/image_pack/vendor/mozjpeg/simd/arm/jcgryext-neon.c +106 -0
  135. data/ext/image_pack/vendor/mozjpeg/simd/arm/jchuff.h +131 -0
  136. data/ext/image_pack/vendor/mozjpeg/simd/arm/jcphuff-neon.c +623 -0
  137. data/ext/image_pack/vendor/mozjpeg/simd/arm/jcsample-neon.c +192 -0
  138. data/ext/image_pack/vendor/mozjpeg/simd/arm/jdcolext-neon.c +374 -0
  139. data/ext/image_pack/vendor/mozjpeg/simd/arm/jdcolor-neon.c +141 -0
  140. data/ext/image_pack/vendor/mozjpeg/simd/arm/jdmerge-neon.c +144 -0
  141. data/ext/image_pack/vendor/mozjpeg/simd/arm/jdmrgext-neon.c +723 -0
  142. data/ext/image_pack/vendor/mozjpeg/simd/arm/jdsample-neon.c +569 -0
  143. data/ext/image_pack/vendor/mozjpeg/simd/arm/jfdctfst-neon.c +214 -0
  144. data/ext/image_pack/vendor/mozjpeg/simd/arm/jfdctint-neon.c +376 -0
  145. data/ext/image_pack/vendor/mozjpeg/simd/arm/jidctfst-neon.c +472 -0
  146. data/ext/image_pack/vendor/mozjpeg/simd/arm/jidctint-neon.c +801 -0
  147. data/ext/image_pack/vendor/mozjpeg/simd/arm/jidctred-neon.c +486 -0
  148. data/ext/image_pack/vendor/mozjpeg/simd/arm/jquanti-neon.c +193 -0
  149. data/ext/image_pack/vendor/mozjpeg/simd/arm/neon-compat.h +26 -0
  150. data/ext/image_pack/vendor/mozjpeg/simd/arm/neon-compat.h.in +37 -0
  151. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolext-avx2.asm +578 -0
  152. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolext-mmx.asm +476 -0
  153. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolext-sse2.asm +503 -0
  154. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolor-avx2.asm +121 -0
  155. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolor-mmx.asm +121 -0
  156. data/ext/image_pack/vendor/mozjpeg/simd/i386/jccolor-sse2.asm +120 -0
  157. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgray-avx2.asm +113 -0
  158. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgray-mmx.asm +113 -0
  159. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgray-sse2.asm +112 -0
  160. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgryext-avx2.asm +457 -0
  161. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgryext-mmx.asm +355 -0
  162. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcgryext-sse2.asm +382 -0
  163. data/ext/image_pack/vendor/mozjpeg/simd/i386/jchuff-sse2.asm +761 -0
  164. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcphuff-sse2.asm +662 -0
  165. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcsample-avx2.asm +388 -0
  166. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcsample-mmx.asm +324 -0
  167. data/ext/image_pack/vendor/mozjpeg/simd/i386/jcsample-sse2.asm +351 -0
  168. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolext-avx2.asm +515 -0
  169. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolext-mmx.asm +404 -0
  170. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolext-sse2.asm +458 -0
  171. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolor-avx2.asm +118 -0
  172. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolor-mmx.asm +117 -0
  173. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdcolor-sse2.asm +117 -0
  174. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmerge-avx2.asm +136 -0
  175. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmerge-mmx.asm +123 -0
  176. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmerge-sse2.asm +135 -0
  177. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmrgext-avx2.asm +575 -0
  178. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmrgext-mmx.asm +460 -0
  179. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdmrgext-sse2.asm +517 -0
  180. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdsample-avx2.asm +760 -0
  181. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdsample-mmx.asm +731 -0
  182. data/ext/image_pack/vendor/mozjpeg/simd/i386/jdsample-sse2.asm +724 -0
  183. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctflt-3dn.asm +318 -0
  184. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctflt-sse.asm +369 -0
  185. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctfst-mmx.asm +395 -0
  186. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctfst-sse2.asm +403 -0
  187. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctint-avx2.asm +331 -0
  188. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctint-mmx.asm +620 -0
  189. data/ext/image_pack/vendor/mozjpeg/simd/i386/jfdctint-sse2.asm +633 -0
  190. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctflt-3dn.asm +451 -0
  191. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctflt-sse.asm +571 -0
  192. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctflt-sse2.asm +497 -0
  193. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctfst-mmx.asm +499 -0
  194. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctfst-sse2.asm +501 -0
  195. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctint-avx2.asm +453 -0
  196. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctint-mmx.asm +851 -0
  197. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctint-sse2.asm +858 -0
  198. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctred-mmx.asm +704 -0
  199. data/ext/image_pack/vendor/mozjpeg/simd/i386/jidctred-sse2.asm +592 -0
  200. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquant-3dn.asm +230 -0
  201. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquant-mmx.asm +276 -0
  202. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquant-sse.asm +208 -0
  203. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquantf-sse2.asm +168 -0
  204. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquanti-avx2.asm +188 -0
  205. data/ext/image_pack/vendor/mozjpeg/simd/i386/jquanti-sse2.asm +201 -0
  206. data/ext/image_pack/vendor/mozjpeg/simd/i386/jsimd.c +1312 -0
  207. data/ext/image_pack/vendor/mozjpeg/simd/i386/jsimdcpu.asm +135 -0
  208. data/ext/image_pack/vendor/mozjpeg/simd/jsimd.h +1258 -0
  209. data/ext/image_pack/vendor/mozjpeg/simd/mips/jsimd.c +1143 -0
  210. data/ext/image_pack/vendor/mozjpeg/simd/mips/jsimd_dspr2.S +4543 -0
  211. data/ext/image_pack/vendor/mozjpeg/simd/mips/jsimd_dspr2_asm.h +292 -0
  212. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jccolext-mmi.c +455 -0
  213. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jccolor-mmi.c +148 -0
  214. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jcgray-mmi.c +132 -0
  215. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jcgryext-mmi.c +374 -0
  216. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jcsample-mmi.c +98 -0
  217. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jcsample.h +28 -0
  218. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jdcolext-mmi.c +415 -0
  219. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jdcolor-mmi.c +139 -0
  220. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jdmerge-mmi.c +149 -0
  221. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jdmrgext-mmi.c +615 -0
  222. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jdsample-mmi.c +304 -0
  223. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jfdctfst-mmi.c +255 -0
  224. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jfdctint-mmi.c +398 -0
  225. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jidctfst-mmi.c +395 -0
  226. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jidctint-mmi.c +571 -0
  227. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jquanti-mmi.c +124 -0
  228. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jsimd.c +866 -0
  229. data/ext/image_pack/vendor/mozjpeg/simd/mips64/jsimd_mmi.h +69 -0
  230. data/ext/image_pack/vendor/mozjpeg/simd/mips64/loongson-mmintrin.h +1334 -0
  231. data/ext/image_pack/vendor/mozjpeg/simd/nasm/jcolsamp.inc +135 -0
  232. data/ext/image_pack/vendor/mozjpeg/simd/nasm/jdct.inc +31 -0
  233. data/ext/image_pack/vendor/mozjpeg/simd/nasm/jsimdcfg.inc +93 -0
  234. data/ext/image_pack/vendor/mozjpeg/simd/nasm/jsimdcfg.inc.h +133 -0
  235. data/ext/image_pack/vendor/mozjpeg/simd/nasm/jsimdext.inc +520 -0
  236. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jccolext-altivec.c +269 -0
  237. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jccolor-altivec.c +116 -0
  238. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jcgray-altivec.c +111 -0
  239. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jcgryext-altivec.c +228 -0
  240. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jcsample-altivec.c +159 -0
  241. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jcsample.h +28 -0
  242. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jdcolext-altivec.c +276 -0
  243. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jdcolor-altivec.c +106 -0
  244. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jdmerge-altivec.c +130 -0
  245. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jdmrgext-altivec.c +329 -0
  246. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jdsample-altivec.c +400 -0
  247. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jfdctfst-altivec.c +154 -0
  248. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jfdctint-altivec.c +258 -0
  249. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jidctfst-altivec.c +255 -0
  250. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jidctint-altivec.c +357 -0
  251. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jquanti-altivec.c +250 -0
  252. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jsimd.c +884 -0
  253. data/ext/image_pack/vendor/mozjpeg/simd/powerpc/jsimd_altivec.h +98 -0
  254. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jccolext-avx2.asm +559 -0
  255. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jccolext-sse2.asm +484 -0
  256. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jccolor-avx2.asm +121 -0
  257. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jccolor-sse2.asm +120 -0
  258. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcgray-avx2.asm +113 -0
  259. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcgray-sse2.asm +112 -0
  260. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcgryext-avx2.asm +438 -0
  261. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcgryext-sse2.asm +363 -0
  262. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jchuff-sse2.asm +583 -0
  263. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcphuff-sse2.asm +639 -0
  264. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcsample-avx2.asm +367 -0
  265. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jcsample-sse2.asm +330 -0
  266. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdcolext-avx2.asm +496 -0
  267. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdcolext-sse2.asm +439 -0
  268. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdcolor-avx2.asm +118 -0
  269. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdcolor-sse2.asm +117 -0
  270. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdmerge-avx2.asm +136 -0
  271. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdmerge-sse2.asm +135 -0
  272. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdmrgext-avx2.asm +596 -0
  273. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdmrgext-sse2.asm +538 -0
  274. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdsample-avx2.asm +696 -0
  275. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jdsample-sse2.asm +665 -0
  276. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jfdctflt-sse.asm +355 -0
  277. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jfdctfst-sse2.asm +389 -0
  278. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jfdctint-avx2.asm +320 -0
  279. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jfdctint-sse2.asm +619 -0
  280. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jidctflt-sse2.asm +482 -0
  281. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jidctfst-sse2.asm +491 -0
  282. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jidctint-avx2.asm +418 -0
  283. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jidctint-sse2.asm +847 -0
  284. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jidctred-sse2.asm +574 -0
  285. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jquantf-sse2.asm +155 -0
  286. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jquanti-avx2.asm +163 -0
  287. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jquanti-sse2.asm +188 -0
  288. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jsimd.c +1110 -0
  289. data/ext/image_pack/vendor/mozjpeg/simd/x86_64/jsimdcpu.asm +86 -0
  290. data/ext/image_pack/vendor/mozjpeg/strtest.c +170 -0
  291. data/ext/image_pack/vendor/mozjpeg/structure.txt +900 -0
  292. data/ext/image_pack/vendor/mozjpeg/tjbench.c +1044 -0
  293. data/ext/image_pack/vendor/mozjpeg/tjbenchtest.in +256 -0
  294. data/ext/image_pack/vendor/mozjpeg/tjbenchtest.java.in +215 -0
  295. data/ext/image_pack/vendor/mozjpeg/tjexample.c +406 -0
  296. data/ext/image_pack/vendor/mozjpeg/tjexampletest.in +149 -0
  297. data/ext/image_pack/vendor/mozjpeg/tjexampletest.java.in +151 -0
  298. data/ext/image_pack/vendor/mozjpeg/tjunittest.c +961 -0
  299. data/ext/image_pack/vendor/mozjpeg/tjutil.c +70 -0
  300. data/ext/image_pack/vendor/mozjpeg/tjutil.h +53 -0
  301. data/ext/image_pack/vendor/mozjpeg/transupp.c +2373 -0
  302. data/ext/image_pack/vendor/mozjpeg/transupp.h +243 -0
  303. data/ext/image_pack/vendor/mozjpeg/turbojpeg-jni.c +1259 -0
  304. data/ext/image_pack/vendor/mozjpeg/turbojpeg.c +2320 -0
  305. data/ext/image_pack/vendor/mozjpeg/turbojpeg.h +1784 -0
  306. data/ext/image_pack/vendor/mozjpeg/usage.txt +679 -0
  307. data/ext/image_pack/vendor/mozjpeg/wizard.txt +220 -0
  308. data/ext/image_pack/vendor/mozjpeg/wrbmp.c +552 -0
  309. data/ext/image_pack/vendor/mozjpeg/wrgif.c +580 -0
  310. data/ext/image_pack/vendor/mozjpeg/wrjpgcom.c +577 -0
  311. data/ext/image_pack/vendor/mozjpeg/wrppm.c +366 -0
  312. data/ext/image_pack/vendor/mozjpeg/wrtarga.c +258 -0
  313. data/ext/image_pack/vendor/mozjpeg/yuvjpeg.c +268 -0
  314. data/lib/image_pack/backend.rb +8 -0
  315. data/lib/image_pack/configuration.rb +23 -0
  316. data/lib/image_pack/errors.rb +13 -0
  317. data/lib/image_pack/version.rb +5 -0
  318. data/lib/image_pack.rb +208 -0
  319. metadata +433 -0
@@ -0,0 +1,268 @@
1
+ /*
2
+ * Written by Josh Aas and Tim Terriberry
3
+ * Copyright (c) 2013, Mozilla Corporation
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright notice,
10
+ * this list of conditions and the following disclaimer.
11
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ * this list of conditions and the following disclaimer in the documentation
13
+ * and/or other materials provided with the distribution.
14
+ * 3. Neither the name of the Mozilla Corporation nor the names of its
15
+ * contributors may be used to endorse or promote products derived from this
16
+ * software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
+ * POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+
31
+ /* Expects 4:2:0 YCbCr */
32
+
33
+ /* gcc -std=c99 yuvjpeg.c -I/opt/local/include/ -L/opt/local/lib/ -ljpeg -o yuvjpeg */
34
+
35
+ #include <errno.h>
36
+ #include <stdio.h>
37
+ #include <string.h>
38
+ #include <stdlib.h>
39
+
40
+ #include "jpeglib.h"
41
+
42
+ void extend_edge(JSAMPLE *image, int width, int height, unsigned char *yuv,
43
+ int luma_width, int luma_height, int chroma_width, int chroma_height) {
44
+ int x;
45
+ int y;
46
+
47
+ for (y = 0; y < luma_height; y++) {
48
+ for (x = 0; x < luma_width; x++) {
49
+ image[width*y + x] = yuv[luma_width*y + x];
50
+ }
51
+ }
52
+ for (y = 0; y < chroma_height; y++) {
53
+ for (x = 0; x < chroma_width; x++) {
54
+ image[width*height + (width/2)*y + x] =
55
+ yuv[luma_width*luma_height + chroma_width*y + x];
56
+ image[width*height + (width/2)*((height/2) + y) + x] =
57
+ yuv[luma_width*luma_height + chroma_width*(chroma_height + y) + x];
58
+ }
59
+ }
60
+
61
+ /* Perform right edge extension. */
62
+ for (y = 0; y < luma_height; y++) {
63
+ for (x = luma_width; x < width; x++) {
64
+ image[width*y + x] = image[width*y + (x - 1)];
65
+ }
66
+ }
67
+ for (y = 0; y < chroma_height; y++) {
68
+ for (x = chroma_width; x < width/2; x++) {
69
+ image[width*height + (width/2)*y + x] =
70
+ image[width*height + (width/2)*y + (x - 1)];
71
+ image[width*height + (width/2)*((height/2) + y) + x] =
72
+ image[width*height + (width/2)*((height/2) + y) + (x - 1)];
73
+ }
74
+ }
75
+
76
+ /* Perform bottom edge extension. */
77
+ for (x = 0; x < width; x++) {
78
+ for (y = luma_height; y < height; y++) {
79
+ image[width*y + x] = image[width*(y - 1) + x];
80
+ }
81
+ }
82
+ for (x = 0; x < width/2; x++) {
83
+ for (y = chroma_height; y < height/2; y++) {
84
+ image[width*height + (width/2)*y + x] =
85
+ image[width*height + (width/2)*(y - 1) + x];
86
+ image[width*height + (width/2)*((height/2) + y) + x] =
87
+ image[width*height + (width/2)*((height/2) + (y - 1)) + x];
88
+ }
89
+ }
90
+ }
91
+
92
+ int main(int argc, char *argv[]) {
93
+ long quality;
94
+ int matches;
95
+ int luma_width;
96
+ int luma_height;
97
+ int chroma_width;
98
+ int chroma_height;
99
+ int frame_width;
100
+ int frame_height;
101
+ const char *yuv_path;
102
+ const char *jpg_path;
103
+ FILE *yuv_fd;
104
+ size_t yuv_size;
105
+ unsigned char *yuv_buffer;
106
+ JSAMPLE *jpg_buffer;
107
+ struct jpeg_compress_struct cinfo;
108
+ struct jpeg_error_mgr jerr;
109
+ FILE *jpg_fd;
110
+ JSAMPROW yrow_pointer[16];
111
+ JSAMPROW cbrow_pointer[8];
112
+ JSAMPROW crrow_pointer[8];
113
+ JSAMPROW *plane_pointer[3];
114
+ int y;
115
+
116
+ if (argc != 5) {
117
+ fprintf(stderr, "Required arguments:\n");
118
+ fprintf(stderr, "1. JPEG quality value, 0-100\n");
119
+ fprintf(stderr, "2. Image size (e.g. '512x512')\n");
120
+ fprintf(stderr, "3. Path to YUV input file\n");
121
+ fprintf(stderr, "4. Path to JPG output file\n");
122
+ return 1;
123
+ }
124
+
125
+ errno = 0;
126
+
127
+ quality = strtol(argv[1], NULL, 10);
128
+ if (errno != 0 || quality < 0 || quality > 100) {
129
+ fprintf(stderr, "Invalid JPEG quality value!\n");
130
+ return 1;
131
+ }
132
+
133
+ matches = sscanf(argv[2], "%dx%d", &luma_width, &luma_height);
134
+ if (matches != 2) {
135
+ fprintf(stderr, "Invalid image size input!\n");
136
+ return 1;
137
+ }
138
+ if (luma_width <= 0 || luma_height <= 0) {
139
+ fprintf(stderr, "Invalid image size input!\n");
140
+ return 1;
141
+ }
142
+
143
+ chroma_width = (luma_width + 1) >> 1;
144
+ chroma_height = (luma_height + 1) >> 1;
145
+
146
+ /* Will check these for validity when opening via 'fopen'. */
147
+ yuv_path = argv[3];
148
+ jpg_path = argv[4];
149
+
150
+ yuv_fd = fopen(yuv_path, "r");
151
+ if (!yuv_fd) {
152
+ fprintf(stderr, "Invalid path to YUV file!\n");
153
+ return 1;
154
+ }
155
+
156
+ fseek(yuv_fd, 0, SEEK_END);
157
+ yuv_size = ftell(yuv_fd);
158
+ fseek(yuv_fd, 0, SEEK_SET);
159
+
160
+ /* Check that the file size matches 4:2:0 yuv. */
161
+ if (yuv_size !=
162
+ (size_t)luma_width*luma_height + 2*chroma_width*chroma_height) {
163
+ fclose(yuv_fd);
164
+ fprintf(stderr, "Unexpected input format!\n");
165
+ return 1;
166
+ }
167
+
168
+ yuv_buffer = malloc(yuv_size);
169
+ if (!yuv_buffer) {
170
+ fclose(yuv_fd);
171
+ fprintf(stderr, "Memory allocation failure!\n");
172
+ return 1;
173
+ }
174
+
175
+ if (fread(yuv_buffer, yuv_size, 1, yuv_fd) != 1) {
176
+ fprintf(stderr, "Error reading yuv file\n");
177
+ };
178
+
179
+ fclose(yuv_fd);
180
+
181
+ frame_width = (luma_width + (16 - 1)) & ~(16 - 1);
182
+ frame_height = (luma_height + (16 - 1)) & ~(16 - 1);
183
+
184
+ jpg_buffer =
185
+ malloc(frame_width*frame_height + 2*(frame_width/2)*(frame_height/2));
186
+ if (!jpg_buffer) {
187
+ free(yuv_buffer);
188
+ fprintf(stderr, "Memory allocation failure!\n");
189
+ return 1;
190
+ }
191
+
192
+ extend_edge(jpg_buffer, frame_width, frame_height,
193
+ yuv_buffer, luma_width, luma_height, chroma_width, chroma_height);
194
+
195
+ free(yuv_buffer);
196
+
197
+ cinfo.err = jpeg_std_error(&jerr);
198
+ jpeg_create_compress(&cinfo);
199
+
200
+ jpg_fd = fopen(jpg_path, "wb");
201
+ if (!jpg_fd) {
202
+ free(jpg_buffer);
203
+ fprintf(stderr, "Invalid path to JPEG file!\n");
204
+ return 1;
205
+ }
206
+
207
+ jpeg_stdio_dest(&cinfo, jpg_fd);
208
+
209
+ cinfo.image_width = luma_width;
210
+ cinfo.image_height = luma_height;
211
+ cinfo.input_components = 3;
212
+
213
+ cinfo.in_color_space = JCS_YCbCr;
214
+ jpeg_set_defaults(&cinfo);
215
+
216
+ cinfo.raw_data_in = TRUE;
217
+
218
+ cinfo.comp_info[0].h_samp_factor = 2;
219
+ cinfo.comp_info[0].v_samp_factor = 2;
220
+ cinfo.comp_info[0].dc_tbl_no = 0;
221
+ cinfo.comp_info[0].ac_tbl_no = 0;
222
+ cinfo.comp_info[0].quant_tbl_no = 0;
223
+
224
+ cinfo.comp_info[1].h_samp_factor = 1;
225
+ cinfo.comp_info[1].v_samp_factor = 1;
226
+ cinfo.comp_info[1].dc_tbl_no = 1;
227
+ cinfo.comp_info[1].ac_tbl_no = 1;
228
+ cinfo.comp_info[1].quant_tbl_no = 1;
229
+
230
+ cinfo.comp_info[2].h_samp_factor = 1;
231
+ cinfo.comp_info[2].v_samp_factor = 1;
232
+ cinfo.comp_info[2].dc_tbl_no = 1;
233
+ cinfo.comp_info[2].ac_tbl_no = 1;
234
+ cinfo.comp_info[2].quant_tbl_no = 1;
235
+
236
+ jpeg_set_quality(&cinfo, quality, TRUE);
237
+ cinfo.optimize_coding = TRUE;
238
+
239
+ jpeg_start_compress(&cinfo, TRUE);
240
+
241
+ plane_pointer[0] = yrow_pointer;
242
+ plane_pointer[1] = cbrow_pointer;
243
+ plane_pointer[2] = crrow_pointer;
244
+
245
+ while (cinfo.next_scanline < cinfo.image_height) {
246
+ int scanline;
247
+ scanline = cinfo.next_scanline;
248
+
249
+ for (y = 0; y < 16; y++) {
250
+ yrow_pointer[y] = &jpg_buffer[frame_width*(scanline + y)];
251
+ }
252
+ for (y = 0; y < 8; y++) {
253
+ cbrow_pointer[y] = &jpg_buffer[frame_width*frame_height +
254
+ (frame_width/2)*((scanline/2) + y)];
255
+ crrow_pointer[y] = &jpg_buffer[frame_width*frame_height +
256
+ (frame_width/2)*(frame_height/2) + (frame_width/2)*((scanline/2) + y)];
257
+ }
258
+ jpeg_write_raw_data(&cinfo, plane_pointer, 16);
259
+ }
260
+
261
+ jpeg_finish_compress(&cinfo);
262
+ jpeg_destroy_compress(&cinfo);
263
+
264
+ free(jpg_buffer);
265
+ fclose(jpg_fd);
266
+
267
+ return 0;
268
+ }
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImagePack
4
+ module Backend
5
+ JPEG_TURBO = :jpeg_turbo
6
+ MOZJPEG = :mozjpeg
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImagePack
4
+ class Configuration
5
+ attr_accessor :execution,
6
+ :direct_input_threshold,
7
+ :direct_pixel_threshold,
8
+ :max_pixels,
9
+ :max_width,
10
+ :max_height,
11
+ :max_output_size
12
+
13
+ def initialize
14
+ @execution = :auto
15
+ @direct_input_threshold = 128 * 1024
16
+ @direct_pixel_threshold = 1 * 1024 * 1024
17
+ @max_pixels = 100_000_000
18
+ @max_width = 30_000
19
+ @max_height = 30_000
20
+ @max_output_size = 256 * 1024 * 1024
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImagePack
4
+ class Error < StandardError; end
5
+ class InvalidArgumentError < Error; end
6
+ class InvalidImageError < Error; end
7
+ class UnsupportedError < Error; end
8
+ class LimitExceededError < Error; end
9
+ class EncodeError < Error; end
10
+ class QualityConstraintError < Error; end
11
+ class OutOfMemoryError < Error; end
12
+ class CancelledError < Error; end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImagePack
4
+ VERSION = "0.2.0"
5
+ end
data/lib/image_pack.rb ADDED
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ required = Gem::Version.new("3.4.0")
4
+ current = Gem::Version.new(RUBY_VERSION)
5
+
6
+ if current < required
7
+ raise LoadError,
8
+ "image_pack requires Ruby >= 3.4.0, got #{RUBY_VERSION}. " \
9
+ "Reason: gem relies on RB_NOGVL_OFFLOAD_SAFE / Fiber::Scheduler hooks."
10
+ end
11
+
12
+ require "pathname"
13
+ require_relative "image_pack/version"
14
+ require_relative "image_pack/errors"
15
+ require_relative "image_pack/configuration"
16
+ require_relative "image_pack/backend"
17
+
18
+ begin
19
+ require "image_pack/image_pack"
20
+ rescue LoadError
21
+ ext_dir = File.expand_path("image_pack", __dir__)
22
+ so_path = %w[.bundle .so .dll]
23
+ .map { |ext| File.join(ext_dir, "image_pack#{ext}") }
24
+ .find { |path| File.file?(path) }
25
+
26
+ raise LoadError, "Could not find compiled ImagePack extension. Run: bundle exec rake compile" unless so_path
27
+
28
+ require so_path
29
+ end
30
+
31
+ module ImagePack
32
+ ALGOS = %i[jpeg_turbo mozjpeg].freeze
33
+ EXECUTION_MODES = %i[direct nogvl offload auto].freeze
34
+ DEFAULT_QUALITY = 82
35
+
36
+ class << self
37
+ def configuration
38
+ @configuration ||= Configuration.new
39
+ end
40
+
41
+ def configure
42
+ return configuration unless block_given?
43
+
44
+ yield(configuration)
45
+ configuration
46
+ end
47
+
48
+ def compress(input,
49
+ output: nil,
50
+ algo: :jpeg_turbo,
51
+ quality: nil,
52
+ min_ssim: nil,
53
+ mozjpeg_trellis: true,
54
+ progressive: false,
55
+ strip_metadata: true,
56
+ execution: nil,
57
+ cancellable: false)
58
+ validate_algo!(algo)
59
+ validate_min_ssim!(min_ssim)
60
+ validate_mozjpeg_trellis!(mozjpeg_trellis)
61
+ quality_was_given = !quality.nil?
62
+ effective_quality = quality_was_given ? quality : DEFAULT_QUALITY
63
+ effective_quality = 1 if min_ssim && !quality_was_given
64
+ validate_quality!(effective_quality)
65
+ execution ||= configuration.execution
66
+ validate_execution!(execution)
67
+ validate_cancellable!(algo, execution, cancellable)
68
+
69
+ normalized_input_kind = input_kind!(input)
70
+ normalized_output_kind = output_kind!(output)
71
+ has_scheduler = fiber_scheduler_active?
72
+
73
+ __compress_jpeg(input, normalized_input_kind,
74
+ output, normalized_output_kind,
75
+ algo, effective_quality.to_i,
76
+ min_ssim ? min_ssim.to_f : 0.0,
77
+ mozjpeg_trellis ? 1 : 0,
78
+ progressive ? 1 : 0,
79
+ strip_metadata ? 1 : 0,
80
+ execution,
81
+ cancellable ? 1 : 0,
82
+ has_scheduler ? 1 : 0)
83
+ end
84
+
85
+ def compress_pixels(buffer,
86
+ width:,
87
+ height:,
88
+ channels:,
89
+ output: nil,
90
+ algo: :jpeg_turbo,
91
+ quality: DEFAULT_QUALITY,
92
+ progressive: false,
93
+ execution: nil,
94
+ cancellable: false)
95
+ validate_algo!(algo)
96
+ validate_quality!(quality)
97
+ validate_dimensions!(width, height, channels)
98
+ execution ||= configuration.execution
99
+ validate_execution!(execution)
100
+ validate_cancellable!(algo, execution, cancellable)
101
+
102
+ normalized_output_kind = output_kind!(output)
103
+ has_scheduler = fiber_scheduler_active?
104
+
105
+ __compress_pixels(buffer,
106
+ width.to_i, height.to_i, channels.to_i,
107
+ output, normalized_output_kind,
108
+ algo, quality.to_i,
109
+ progressive ? 1 : 0,
110
+ execution,
111
+ cancellable ? 1 : 0,
112
+ has_scheduler ? 1 : 0)
113
+ end
114
+
115
+ def inspect_image(input)
116
+ __inspect_image(input, input_kind!(input))
117
+ end
118
+
119
+ private
120
+
121
+ def input_kind!(input)
122
+ case input
123
+ when String
124
+ if input.encoding == Encoding::BINARY || input.encoding == Encoding::ASCII_8BIT
125
+ :bytes
126
+ else
127
+ raise InvalidArgumentError, "input path does not exist: #{input.inspect}" unless File.file?(input)
128
+
129
+ :path
130
+ end
131
+ when Pathname
132
+ raise InvalidArgumentError, "input path does not exist: #{input}" unless input.file?
133
+
134
+ :path
135
+ else
136
+ if defined?(IO::Buffer) && input.is_a?(IO::Buffer)
137
+ :io_buffer
138
+ else
139
+ raise InvalidArgumentError,
140
+ "input must be binary String bytes, path String, Pathname, or IO::Buffer"
141
+ end
142
+ end
143
+ end
144
+
145
+ def output_kind!(output)
146
+ return :return_string if output.nil?
147
+ return :path if output.is_a?(String) || output.is_a?(Pathname)
148
+
149
+ raise InvalidArgumentError, "output must be nil, String path, or Pathname in v0.2.0"
150
+ end
151
+
152
+ def validate_algo!(algo)
153
+ return if ALGOS.include?(algo)
154
+
155
+ raise InvalidArgumentError, "algo must be one of #{ALGOS}, got: #{algo.inspect}"
156
+ end
157
+
158
+ def validate_quality!(quality)
159
+ return if quality.is_a?(Integer) && quality.between?(1, 100)
160
+
161
+ raise InvalidArgumentError, "quality must be Integer 1..100, got: #{quality.inspect}"
162
+ end
163
+
164
+ def validate_min_ssim!(min_ssim)
165
+ return if min_ssim.nil?
166
+ return if min_ssim.is_a?(Numeric) && min_ssim.positive? && min_ssim <= 1.0
167
+
168
+ raise InvalidArgumentError, "min_ssim must be Numeric > 0.0 and <= 1.0, got: #{min_ssim.inspect}"
169
+ end
170
+
171
+
172
+ def validate_mozjpeg_trellis!(value)
173
+ return if value == true || value == false
174
+
175
+ raise InvalidArgumentError, "mozjpeg_trellis must be true or false, got: #{value.inspect}"
176
+ end
177
+
178
+ def validate_execution!(execution)
179
+ return if EXECUTION_MODES.include?(execution)
180
+
181
+ raise InvalidArgumentError, "execution must be one of #{EXECUTION_MODES}, got: #{execution.inspect}"
182
+ end
183
+
184
+ def validate_dimensions!(width, height, channels)
185
+ raise InvalidArgumentError, "width must be > 0" unless width.is_a?(Integer) && width.positive?
186
+ raise InvalidArgumentError, "height must be > 0" unless height.is_a?(Integer) && height.positive?
187
+ raise InvalidArgumentError, "channels must be 1, 3 or 4" unless [1, 3, 4].include?(channels)
188
+ end
189
+
190
+ def validate_cancellable!(algo, execution, cancellable)
191
+ return unless cancellable
192
+
193
+ if algo == :jpeg_turbo
194
+ raise InvalidArgumentError,
195
+ "cancellable: true is only supported with algo: :mozjpeg in v0.2.0"
196
+ end
197
+
198
+ return unless execution == :direct
199
+
200
+ raise InvalidArgumentError,
201
+ "cancellable: true requires execution: :nogvl, :offload, or :auto"
202
+ end
203
+
204
+ def fiber_scheduler_active?
205
+ Fiber.respond_to?(:scheduler) && !Fiber.scheduler.nil?
206
+ end
207
+ end
208
+ end