epeg 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (504) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/MANIFEST +5 -0
  4. data/TODO +1 -0
  5. data/epeg/.dockerignore +4 -0
  6. data/epeg/.gitignore +5 -0
  7. data/epeg/CMakeLists.txt +30 -0
  8. data/epeg/Dockerfile +23 -0
  9. data/epeg/Epeg.h +90 -0
  10. data/epeg/README.md +42 -0
  11. data/epeg/epeg_main.c +1642 -0
  12. data/epeg/epeg_private.h +85 -0
  13. data/epeg/example/.gitignore +1 -0
  14. data/epeg/example/CMakeLists.txt +20 -0
  15. data/epeg/example/example.jpg +0 -0
  16. data/epeg/example/rotatetest.c +29 -0
  17. data/epeg/example/scaletest.c +48 -0
  18. data/epeg/vendor/libjpeg-turbo-2.0.4/BUILDING.md +828 -0
  19. data/epeg/vendor/libjpeg-turbo-2.0.4/CMakeLists.txt +1420 -0
  20. data/epeg/vendor/libjpeg-turbo-2.0.4/ChangeLog.md +1494 -0
  21. data/epeg/vendor/libjpeg-turbo-2.0.4/LICENSE.md +132 -0
  22. data/epeg/vendor/libjpeg-turbo-2.0.4/README.ijg +277 -0
  23. data/epeg/vendor/libjpeg-turbo-2.0.4/README.md +356 -0
  24. data/epeg/vendor/libjpeg-turbo-2.0.4/cderror.h +137 -0
  25. data/epeg/vendor/libjpeg-turbo-2.0.4/cdjpeg.c +145 -0
  26. data/epeg/vendor/libjpeg-turbo-2.0.4/cdjpeg.h +157 -0
  27. data/epeg/vendor/libjpeg-turbo-2.0.4/change.log +315 -0
  28. data/epeg/vendor/libjpeg-turbo-2.0.4/cjpeg.1 +354 -0
  29. data/epeg/vendor/libjpeg-turbo-2.0.4/cjpeg.c +695 -0
  30. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/BuildPackages.cmake +182 -0
  31. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/GNUInstallDirs.cmake +416 -0
  32. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/cmake_uninstall.cmake.in +24 -0
  33. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/testclean.cmake +41 -0
  34. data/epeg/vendor/libjpeg-turbo-2.0.4/cmyk.h +61 -0
  35. data/epeg/vendor/libjpeg-turbo-2.0.4/coderules.txt +78 -0
  36. data/epeg/vendor/libjpeg-turbo-2.0.4/djpeg.1 +296 -0
  37. data/epeg/vendor/libjpeg-turbo-2.0.4/djpeg.c +822 -0
  38. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/annotated.html +104 -0
  39. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/bc_s.png +0 -0
  40. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/bdwn.png +0 -0
  41. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/classes.html +106 -0
  42. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/closed.png +0 -0
  43. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen-extra.css +3 -0
  44. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen.css +1184 -0
  45. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen.png +0 -0
  46. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/dynsections.js +97 -0
  47. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2blank.png +0 -0
  48. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2cl.png +0 -0
  49. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2doc.png +0 -0
  50. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2folderclosed.png +0 -0
  51. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2folderopen.png +0 -0
  52. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2lastnode.png +0 -0
  53. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2link.png +0 -0
  54. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mlastnode.png +0 -0
  55. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mnode.png +0 -0
  56. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mo.png +0 -0
  57. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2node.png +0 -0
  58. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2ns.png +0 -0
  59. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2plastnode.png +0 -0
  60. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2pnode.png +0 -0
  61. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2splitbar.png +0 -0
  62. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2vertline.png +0 -0
  63. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/functions.html +134 -0
  64. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/functions_vars.html +134 -0
  65. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/group___turbo_j_p_e_g.html +2775 -0
  66. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/index.html +90 -0
  67. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/jquery.js +8 -0
  68. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/modules.html +95 -0
  69. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_f.png +0 -0
  70. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_g.png +0 -0
  71. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_h.png +0 -0
  72. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/open.png +0 -0
  73. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_63.html +26 -0
  74. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_63.js +4 -0
  75. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_64.html +26 -0
  76. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_64.js +5 -0
  77. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_68.html +26 -0
  78. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_68.js +4 -0
  79. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6e.html +26 -0
  80. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6e.js +4 -0
  81. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6f.html +26 -0
  82. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6f.js +5 -0
  83. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_72.html +26 -0
  84. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_72.js +4 -0
  85. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_74.html +26 -0
  86. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_74.js +102 -0
  87. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_77.html +26 -0
  88. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_77.js +4 -0
  89. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_78.html +26 -0
  90. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_78.js +4 -0
  91. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_79.html +26 -0
  92. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_79.js +4 -0
  93. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/classes_74.html +26 -0
  94. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/classes_74.js +6 -0
  95. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/close.png +0 -0
  96. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enums_74.html +26 -0
  97. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enums_74.js +8 -0
  98. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enumvalues_74.html +26 -0
  99. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enumvalues_74.js +37 -0
  100. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/functions_74.html +26 -0
  101. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/functions_74.js +31 -0
  102. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/groups_74.html +26 -0
  103. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/groups_74.js +4 -0
  104. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/mag_sel.png +0 -0
  105. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/nomatches.html +12 -0
  106. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search.css +271 -0
  107. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search.js +809 -0
  108. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_l.png +0 -0
  109. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_m.png +0 -0
  110. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_r.png +0 -0
  111. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/typedefs_74.html +26 -0
  112. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/typedefs_74.js +5 -0
  113. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_63.html +26 -0
  114. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_63.js +4 -0
  115. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_64.html +26 -0
  116. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_64.js +5 -0
  117. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_68.html +26 -0
  118. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_68.js +4 -0
  119. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6e.html +26 -0
  120. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6e.js +4 -0
  121. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6f.html +26 -0
  122. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6f.js +5 -0
  123. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_72.html +26 -0
  124. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_72.js +4 -0
  125. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_74.html +26 -0
  126. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_74.js +10 -0
  127. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_77.html +26 -0
  128. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_77.js +4 -0
  129. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_78.html +26 -0
  130. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_78.js +4 -0
  131. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_79.html +26 -0
  132. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_79.js +4 -0
  133. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjregion.html +186 -0
  134. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjscalingfactor.html +148 -0
  135. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjtransform.html +212 -0
  136. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/sync_off.png +0 -0
  137. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/sync_on.png +0 -0
  138. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_a.png +0 -0
  139. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_b.png +0 -0
  140. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_h.png +0 -0
  141. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_s.png +0 -0
  142. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tabs.css +60 -0
  143. data/epeg/vendor/libjpeg-turbo-2.0.4/doxygen-extra.css +3 -0
  144. data/epeg/vendor/libjpeg-turbo-2.0.4/doxygen.config +16 -0
  145. data/epeg/vendor/libjpeg-turbo-2.0.4/example.txt +464 -0
  146. data/epeg/vendor/libjpeg-turbo-2.0.4/jaricom.c +157 -0
  147. data/epeg/vendor/libjpeg-turbo-2.0.4/java/CMakeLists.txt +88 -0
  148. data/epeg/vendor/libjpeg-turbo-2.0.4/java/MANIFEST.MF +2 -0
  149. data/epeg/vendor/libjpeg-turbo-2.0.4/java/README +52 -0
  150. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJBench.java +1021 -0
  151. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJExample.java +405 -0
  152. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJUnitTest.java +960 -0
  153. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/allclasses-frame.html +24 -0
  154. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/allclasses-noframe.html +24 -0
  155. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/constant-values.html +532 -0
  156. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/deprecated-list.html +252 -0
  157. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/help-doc.html +210 -0
  158. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/index-all.html +1029 -0
  159. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/index.html +71 -0
  160. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJ.html +1356 -0
  161. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html +926 -0
  162. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html +241 -0
  163. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html +1255 -0
  164. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJException.html +340 -0
  165. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html +343 -0
  166. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html +751 -0
  167. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html +421 -0
  168. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/YUVImage.html +765 -0
  169. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-frame.html +31 -0
  170. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-summary.html +202 -0
  171. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-tree.html +160 -0
  172. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/overview-tree.html +164 -0
  173. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/package-list +1 -0
  174. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/background.gif +0 -0
  175. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/tab.gif +0 -0
  176. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/titlebar.gif +0 -0
  177. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/titlebar_end.gif +0 -0
  178. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/script.js +30 -0
  179. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/serialized-form.html +176 -0
  180. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/stylesheet.css +474 -0
  181. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJ.java +584 -0
  182. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJCompressor.java +677 -0
  183. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java +76 -0
  184. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +931 -0
  185. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJException.java +78 -0
  186. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJLoader-unix.java.in +59 -0
  187. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJLoader-win.java.in +35 -0
  188. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java +115 -0
  189. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJTransform.java +227 -0
  190. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJTransformer.java +163 -0
  191. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/YUVImage.java +445 -0
  192. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJ.h +129 -0
  193. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJCompressor.h +101 -0
  194. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJDecompressor.h +101 -0
  195. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJTransformer.h +29 -0
  196. data/epeg/vendor/libjpeg-turbo-2.0.4/jcapimin.c +295 -0
  197. data/epeg/vendor/libjpeg-turbo-2.0.4/jcapistd.c +162 -0
  198. data/epeg/vendor/libjpeg-turbo-2.0.4/jcarith.c +932 -0
  199. data/epeg/vendor/libjpeg-turbo-2.0.4/jccoefct.c +449 -0
  200. data/epeg/vendor/libjpeg-turbo-2.0.4/jccolext.c +144 -0
  201. data/epeg/vendor/libjpeg-turbo-2.0.4/jccolor.c +710 -0
  202. data/epeg/vendor/libjpeg-turbo-2.0.4/jcdctmgr.c +721 -0
  203. data/epeg/vendor/libjpeg-turbo-2.0.4/jchuff.c +1096 -0
  204. data/epeg/vendor/libjpeg-turbo-2.0.4/jchuff.h +42 -0
  205. data/epeg/vendor/libjpeg-turbo-2.0.4/jcicc.c +105 -0
  206. data/epeg/vendor/libjpeg-turbo-2.0.4/jcinit.c +77 -0
  207. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmainct.c +162 -0
  208. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmarker.c +664 -0
  209. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmaster.c +640 -0
  210. data/epeg/vendor/libjpeg-turbo-2.0.4/jcomapi.c +109 -0
  211. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfig.h.in +73 -0
  212. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfig.txt +143 -0
  213. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfigint.h.in +31 -0
  214. data/epeg/vendor/libjpeg-turbo-2.0.4/jcparam.c +541 -0
  215. data/epeg/vendor/libjpeg-turbo-2.0.4/jcphuff.c +1105 -0
  216. data/epeg/vendor/libjpeg-turbo-2.0.4/jcprepct.c +351 -0
  217. data/epeg/vendor/libjpeg-turbo-2.0.4/jcsample.c +539 -0
  218. data/epeg/vendor/libjpeg-turbo-2.0.4/jcstest.c +126 -0
  219. data/epeg/vendor/libjpeg-turbo-2.0.4/jctrans.c +400 -0
  220. data/epeg/vendor/libjpeg-turbo-2.0.4/jdapimin.c +407 -0
  221. data/epeg/vendor/libjpeg-turbo-2.0.4/jdapistd.c +639 -0
  222. data/epeg/vendor/libjpeg-turbo-2.0.4/jdarith.c +773 -0
  223. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatadst-tj.c +203 -0
  224. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatadst.c +293 -0
  225. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatasrc-tj.c +194 -0
  226. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatasrc.c +295 -0
  227. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcoefct.c +692 -0
  228. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcoefct.h +82 -0
  229. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcol565.c +384 -0
  230. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcolext.c +143 -0
  231. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcolor.c +883 -0
  232. data/epeg/vendor/libjpeg-turbo-2.0.4/jdct.h +208 -0
  233. data/epeg/vendor/libjpeg-turbo-2.0.4/jddctmgr.c +352 -0
  234. data/epeg/vendor/libjpeg-turbo-2.0.4/jdhuff.c +831 -0
  235. data/epeg/vendor/libjpeg-turbo-2.0.4/jdhuff.h +238 -0
  236. data/epeg/vendor/libjpeg-turbo-2.0.4/jdicc.c +171 -0
  237. data/epeg/vendor/libjpeg-turbo-2.0.4/jdinput.c +408 -0
  238. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmainct.c +460 -0
  239. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmainct.h +71 -0
  240. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmarker.c +1377 -0
  241. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmaster.c +737 -0
  242. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmaster.h +28 -0
  243. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmerge.c +617 -0
  244. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmrg565.c +354 -0
  245. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmrgext.c +184 -0
  246. data/epeg/vendor/libjpeg-turbo-2.0.4/jdphuff.c +687 -0
  247. data/epeg/vendor/libjpeg-turbo-2.0.4/jdpostct.c +294 -0
  248. data/epeg/vendor/libjpeg-turbo-2.0.4/jdsample.c +518 -0
  249. data/epeg/vendor/libjpeg-turbo-2.0.4/jdsample.h +50 -0
  250. data/epeg/vendor/libjpeg-turbo-2.0.4/jdtrans.c +155 -0
  251. data/epeg/vendor/libjpeg-turbo-2.0.4/jerror.c +251 -0
  252. data/epeg/vendor/libjpeg-turbo-2.0.4/jerror.h +316 -0
  253. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctflt.c +169 -0
  254. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctfst.c +227 -0
  255. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctint.c +288 -0
  256. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctflt.c +240 -0
  257. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctfst.c +371 -0
  258. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctint.c +2627 -0
  259. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctred.c +409 -0
  260. data/epeg/vendor/libjpeg-turbo-2.0.4/jinclude.h +88 -0
  261. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemmgr.c +1179 -0
  262. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemnobs.c +115 -0
  263. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemsys.h +178 -0
  264. data/epeg/vendor/libjpeg-turbo-2.0.4/jmorecfg.h +421 -0
  265. data/epeg/vendor/libjpeg-turbo-2.0.4/jpeg_nbits_table.h +4098 -0
  266. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegcomp.h +31 -0
  267. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegint.h +368 -0
  268. data/epeg/vendor/libjpeg-turbo-2.0.4/jpeglib.h +1132 -0
  269. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegtran.1 +295 -0
  270. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegtran.c +601 -0
  271. data/epeg/vendor/libjpeg-turbo-2.0.4/jquant1.c +859 -0
  272. data/epeg/vendor/libjpeg-turbo-2.0.4/jquant2.c +1285 -0
  273. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimd.h +117 -0
  274. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimd_none.c +418 -0
  275. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimddct.h +70 -0
  276. data/epeg/vendor/libjpeg-turbo-2.0.4/jstdhuff.c +143 -0
  277. data/epeg/vendor/libjpeg-turbo-2.0.4/jutils.c +133 -0
  278. data/epeg/vendor/libjpeg-turbo-2.0.4/jversion.h +52 -0
  279. data/epeg/vendor/libjpeg-turbo-2.0.4/libjpeg.map.in +11 -0
  280. data/epeg/vendor/libjpeg-turbo-2.0.4/libjpeg.txt +3144 -0
  281. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/CMakeLists.txt +1 -0
  282. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5.c +275 -0
  283. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5.h +57 -0
  284. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5cmp.c +59 -0
  285. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5hl.c +125 -0
  286. data/epeg/vendor/libjpeg-turbo-2.0.4/rdbmp.c +689 -0
  287. data/epeg/vendor/libjpeg-turbo-2.0.4/rdcolmap.c +254 -0
  288. data/epeg/vendor/libjpeg-turbo-2.0.4/rdgif.c +39 -0
  289. data/epeg/vendor/libjpeg-turbo-2.0.4/rdjpgcom.1 +63 -0
  290. data/epeg/vendor/libjpeg-turbo-2.0.4/rdjpgcom.c +510 -0
  291. data/epeg/vendor/libjpeg-turbo-2.0.4/rdppm.c +766 -0
  292. data/epeg/vendor/libjpeg-turbo-2.0.4/rdrle.c +389 -0
  293. data/epeg/vendor/libjpeg-turbo-2.0.4/rdswitch.c +424 -0
  294. data/epeg/vendor/libjpeg-turbo-2.0.4/rdtarga.c +509 -0
  295. data/epeg/vendor/libjpeg-turbo-2.0.4/release/Distribution.xml.in +24 -0
  296. data/epeg/vendor/libjpeg-turbo-2.0.4/release/License.rtf +20 -0
  297. data/epeg/vendor/libjpeg-turbo-2.0.4/release/ReadMe.txt +5 -0
  298. data/epeg/vendor/libjpeg-turbo-2.0.4/release/Welcome.rtf +17 -0
  299. data/epeg/vendor/libjpeg-turbo-2.0.4/release/deb-control.in +31 -0
  300. data/epeg/vendor/libjpeg-turbo-2.0.4/release/installer.nsi.in +191 -0
  301. data/epeg/vendor/libjpeg-turbo-2.0.4/release/libjpeg.pc.in +10 -0
  302. data/epeg/vendor/libjpeg-turbo-2.0.4/release/libturbojpeg.pc.in +10 -0
  303. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makecygwinpkg.in +66 -0
  304. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makedpkg.in +115 -0
  305. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makemacpkg.in +284 -0
  306. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makerpm.in +30 -0
  307. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makesrpm.in +48 -0
  308. data/epeg/vendor/libjpeg-turbo-2.0.4/release/maketarball.in +51 -0
  309. data/epeg/vendor/libjpeg-turbo-2.0.4/release/rpm.spec.in +221 -0
  310. data/epeg/vendor/libjpeg-turbo-2.0.4/release/uninstall.in +113 -0
  311. data/epeg/vendor/libjpeg-turbo-2.0.4/sharedlib/CMakeLists.txt +99 -0
  312. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/CMakeLists.txt +385 -0
  313. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm/jsimd.c +721 -0
  314. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm/jsimd_neon.S +2878 -0
  315. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm64/jsimd.c +798 -0
  316. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm64/jsimd_neon.S +3433 -0
  317. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/gas-preprocessor.in +1 -0
  318. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-avx2.asm +578 -0
  319. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-mmx.asm +476 -0
  320. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-sse2.asm +503 -0
  321. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-avx2.asm +121 -0
  322. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-mmx.asm +121 -0
  323. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-sse2.asm +120 -0
  324. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-avx2.asm +113 -0
  325. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-mmx.asm +113 -0
  326. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-sse2.asm +112 -0
  327. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-avx2.asm +457 -0
  328. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-mmx.asm +355 -0
  329. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-sse2.asm +382 -0
  330. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jchuff-sse2.asm +424 -0
  331. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcphuff-sse2.asm +660 -0
  332. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-avx2.asm +388 -0
  333. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-mmx.asm +324 -0
  334. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-sse2.asm +351 -0
  335. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-avx2.asm +515 -0
  336. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-mmx.asm +404 -0
  337. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-sse2.asm +458 -0
  338. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-avx2.asm +118 -0
  339. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-mmx.asm +117 -0
  340. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-sse2.asm +117 -0
  341. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-avx2.asm +136 -0
  342. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-mmx.asm +123 -0
  343. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-sse2.asm +135 -0
  344. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-avx2.asm +575 -0
  345. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-mmx.asm +460 -0
  346. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-sse2.asm +517 -0
  347. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-avx2.asm +760 -0
  348. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-mmx.asm +731 -0
  349. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-sse2.asm +724 -0
  350. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctflt-3dn.asm +318 -0
  351. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctflt-sse.asm +369 -0
  352. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctfst-mmx.asm +395 -0
  353. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctfst-sse2.asm +403 -0
  354. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-avx2.asm +331 -0
  355. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-mmx.asm +620 -0
  356. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-sse2.asm +633 -0
  357. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-3dn.asm +451 -0
  358. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-sse.asm +571 -0
  359. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-sse2.asm +497 -0
  360. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctfst-mmx.asm +499 -0
  361. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctfst-sse2.asm +501 -0
  362. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-avx2.asm +453 -0
  363. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-mmx.asm +851 -0
  364. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-sse2.asm +858 -0
  365. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctred-mmx.asm +704 -0
  366. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctred-sse2.asm +592 -0
  367. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-3dn.asm +230 -0
  368. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-mmx.asm +276 -0
  369. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-sse.asm +208 -0
  370. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquantf-sse2.asm +168 -0
  371. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquanti-avx2.asm +188 -0
  372. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquanti-sse2.asm +201 -0
  373. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jsimd.c +1253 -0
  374. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jsimdcpu.asm +135 -0
  375. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/jsimd.h +1083 -0
  376. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jccolext-mmi.c +483 -0
  377. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jccolor-mmi.c +148 -0
  378. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jcsample-mmi.c +100 -0
  379. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jcsample.h +28 -0
  380. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdcolext-mmi.c +424 -0
  381. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdcolor-mmi.c +139 -0
  382. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdsample-mmi.c +245 -0
  383. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jfdctint-mmi.c +398 -0
  384. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jidctint-mmi.c +571 -0
  385. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jquanti-mmi.c +130 -0
  386. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jsimd.c +610 -0
  387. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jsimd_mmi.h +57 -0
  388. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/loongson-mmintrin.h +1324 -0
  389. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd.c +1123 -0
  390. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd_dspr2.S +4479 -0
  391. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd_dspr2_asm.h +292 -0
  392. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jcolsamp.inc +135 -0
  393. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jdct.inc +31 -0
  394. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jpeg_nbits_table.inc +4097 -0
  395. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdcfg.inc +93 -0
  396. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdcfg.inc.h +131 -0
  397. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdext.inc +479 -0
  398. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jccolext-altivec.c +269 -0
  399. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jccolor-altivec.c +116 -0
  400. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcgray-altivec.c +111 -0
  401. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcgryext-altivec.c +228 -0
  402. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcsample-altivec.c +159 -0
  403. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcsample.h +28 -0
  404. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdcolext-altivec.c +276 -0
  405. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdcolor-altivec.c +106 -0
  406. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdmerge-altivec.c +130 -0
  407. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdmrgext-altivec.c +329 -0
  408. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdsample-altivec.c +400 -0
  409. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jfdctfst-altivec.c +154 -0
  410. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jfdctint-altivec.c +258 -0
  411. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jidctfst-altivec.c +255 -0
  412. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jidctint-altivec.c +357 -0
  413. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jquanti-altivec.c +250 -0
  414. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jsimd.c +872 -0
  415. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jsimd_altivec.h +98 -0
  416. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolext-avx2.asm +558 -0
  417. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolext-sse2.asm +483 -0
  418. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolor-avx2.asm +121 -0
  419. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolor-sse2.asm +120 -0
  420. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgray-avx2.asm +113 -0
  421. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgray-sse2.asm +112 -0
  422. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgryext-avx2.asm +437 -0
  423. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgryext-sse2.asm +362 -0
  424. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jchuff-sse2.asm +346 -0
  425. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcphuff-sse2.asm +637 -0
  426. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcsample-avx2.asm +366 -0
  427. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcsample-sse2.asm +329 -0
  428. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolext-avx2.asm +495 -0
  429. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolext-sse2.asm +438 -0
  430. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolor-avx2.asm +118 -0
  431. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolor-sse2.asm +117 -0
  432. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmerge-avx2.asm +136 -0
  433. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmerge-sse2.asm +135 -0
  434. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmrgext-avx2.asm +593 -0
  435. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmrgext-sse2.asm +535 -0
  436. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdsample-avx2.asm +695 -0
  437. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdsample-sse2.asm +664 -0
  438. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctflt-sse.asm +355 -0
  439. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctfst-sse2.asm +389 -0
  440. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctint-avx2.asm +320 -0
  441. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctint-sse2.asm +619 -0
  442. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctflt-sse2.asm +481 -0
  443. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctfst-sse2.asm +490 -0
  444. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctint-avx2.asm +417 -0
  445. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctint-sse2.asm +846 -0
  446. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctred-sse2.asm +573 -0
  447. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquantf-sse2.asm +154 -0
  448. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquanti-avx2.asm +162 -0
  449. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquanti-sse2.asm +187 -0
  450. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jsimd.c +1076 -0
  451. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jsimdcpu.asm +86 -0
  452. data/epeg/vendor/libjpeg-turbo-2.0.4/structure.txt +904 -0
  453. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/nightshot_iso_100.bmp +0 -0
  454. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/nightshot_iso_100.txt +25 -0
  455. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test.scan +5 -0
  456. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test1.icc +0 -0
  457. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test1.icc.txt +20 -0
  458. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test2.icc +0 -0
  459. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test2.icc.txt +20 -0
  460. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testimgari.jpg +0 -0
  461. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testimgint.jpg +0 -0
  462. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig.jpg +0 -0
  463. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig.ppm +4 -0
  464. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig12.jpg +0 -0
  465. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_5674_0098.bmp +0 -0
  466. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_6434_0018a.bmp +0 -0
  467. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_6548_0026a.bmp +0 -0
  468. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbench.c +1031 -0
  469. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbenchtest.in +256 -0
  470. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbenchtest.java.in +215 -0
  471. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexample.c +396 -0
  472. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexampletest.in +149 -0
  473. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexampletest.java.in +151 -0
  474. data/epeg/vendor/libjpeg-turbo-2.0.4/tjunittest.c +931 -0
  475. data/epeg/vendor/libjpeg-turbo-2.0.4/tjutil.c +70 -0
  476. data/epeg/vendor/libjpeg-turbo-2.0.4/tjutil.h +47 -0
  477. data/epeg/vendor/libjpeg-turbo-2.0.4/transupp.c +1628 -0
  478. data/epeg/vendor/libjpeg-turbo-2.0.4/transupp.h +210 -0
  479. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-jni.c +1246 -0
  480. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-mapfile +65 -0
  481. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-mapfile.jni +101 -0
  482. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg.c +2152 -0
  483. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg.h +1744 -0
  484. data/epeg/vendor/libjpeg-turbo-2.0.4/usage.txt +635 -0
  485. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jconfig.h.in +34 -0
  486. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg62-memsrcdst.def +108 -0
  487. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg62.def +106 -0
  488. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg7-memsrcdst.def +110 -0
  489. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg7.def +108 -0
  490. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg8.def +111 -0
  491. data/epeg/vendor/libjpeg-turbo-2.0.4/wizard.txt +212 -0
  492. data/epeg/vendor/libjpeg-turbo-2.0.4/wrbmp.c +558 -0
  493. data/epeg/vendor/libjpeg-turbo-2.0.4/wrgif.c +413 -0
  494. data/epeg/vendor/libjpeg-turbo-2.0.4/wrjpgcom.1 +103 -0
  495. data/epeg/vendor/libjpeg-turbo-2.0.4/wrjpgcom.c +591 -0
  496. data/epeg/vendor/libjpeg-turbo-2.0.4/wrppm.c +365 -0
  497. data/epeg/vendor/libjpeg-turbo-2.0.4/wrrle.c +309 -0
  498. data/epeg/vendor/libjpeg-turbo-2.0.4/wrtarga.c +261 -0
  499. data/epeg.c +131 -0
  500. data/epeg.gemspec +18 -0
  501. data/extconf.rb +80 -0
  502. data/test.jpg +0 -0
  503. data/test.rb +42 -0
  504. metadata +546 -0
@@ -0,0 +1,1021 @@
1
+ /*
2
+ * Copyright (C)2009-2014, 2016-2019 D. R. Commander. All Rights Reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions are met:
6
+ *
7
+ * - Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * - Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ * - Neither the name of the libjpeg-turbo Project nor the names of its
13
+ * contributors may be used to endorse or promote products derived from this
14
+ * software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ * POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ import java.io.*;
30
+ import java.awt.image.*;
31
+ import javax.imageio.*;
32
+ import java.util.*;
33
+ import org.libjpegturbo.turbojpeg.*;
34
+
35
+ final class TJBench {
36
+
37
+ private TJBench() {}
38
+
39
+ private static int flags = 0, quiet = 0, pf = TJ.PF_BGR, yuvPad = 1;
40
+ private static boolean compOnly, decompOnly, doTile, doYUV, write = true;
41
+
42
+ static final String[] PIXFORMATSTR = {
43
+ "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY"
44
+ };
45
+
46
+ static final String[] SUBNAME_LONG = {
47
+ "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0", "4:1:1"
48
+ };
49
+
50
+ static final String[] SUBNAME = {
51
+ "444", "422", "420", "GRAY", "440", "411"
52
+ };
53
+
54
+ static final String[] CSNAME = {
55
+ "RGB", "YCbCr", "GRAY", "CMYK", "YCCK"
56
+ };
57
+
58
+ private static TJScalingFactor sf;
59
+ private static int xformOp = TJTransform.OP_NONE, xformOpt = 0;
60
+ private static double benchTime = 5.0, warmup = 1.0;
61
+
62
+
63
+ static double getTime() {
64
+ return (double)System.nanoTime() / 1.0e9;
65
+ }
66
+
67
+
68
+ private static String tjErrorMsg;
69
+ private static int tjErrorCode = -1;
70
+
71
+ static void handleTJException(TJException e) throws TJException {
72
+ String errorMsg = e.getMessage();
73
+ int errorCode = e.getErrorCode();
74
+
75
+ if ((flags & TJ.FLAG_STOPONWARNING) == 0 &&
76
+ errorCode == TJ.ERR_WARNING) {
77
+ if (tjErrorMsg == null || !tjErrorMsg.equals(errorMsg) ||
78
+ tjErrorCode != errorCode) {
79
+ tjErrorMsg = errorMsg;
80
+ tjErrorCode = errorCode;
81
+ System.out.println("WARNING: " + errorMsg);
82
+ }
83
+ } else
84
+ throw e;
85
+ }
86
+
87
+
88
+ static String formatName(int subsamp, int cs) {
89
+ if (cs == TJ.CS_YCbCr)
90
+ return SUBNAME_LONG[subsamp];
91
+ else if (cs == TJ.CS_YCCK)
92
+ return CSNAME[cs] + " " + SUBNAME_LONG[subsamp];
93
+ else
94
+ return CSNAME[cs];
95
+ }
96
+
97
+
98
+ static String sigFig(double val, int figs) {
99
+ String format;
100
+ int digitsAfterDecimal = figs - (int)Math.ceil(Math.log10(Math.abs(val)));
101
+
102
+ if (digitsAfterDecimal < 1)
103
+ format = new String("%.0f");
104
+ else
105
+ format = new String("%." + digitsAfterDecimal + "f");
106
+ return String.format(format, val);
107
+ }
108
+
109
+
110
+ static byte[] loadImage(String fileName, int[] w, int[] h, int pixelFormat)
111
+ throws Exception {
112
+ BufferedImage img = ImageIO.read(new File(fileName));
113
+
114
+ if (img == null)
115
+ throw new Exception("Could not read " + fileName);
116
+ w[0] = img.getWidth();
117
+ h[0] = img.getHeight();
118
+
119
+ int[] rgb = img.getRGB(0, 0, w[0], h[0], null, 0, w[0]);
120
+ int ps = TJ.getPixelSize(pixelFormat);
121
+ int rindex = TJ.getRedOffset(pixelFormat);
122
+ int gindex = TJ.getGreenOffset(pixelFormat);
123
+ int bindex = TJ.getBlueOffset(pixelFormat);
124
+ if ((long)w[0] * (long)h[0] * (long)ps > (long)Integer.MAX_VALUE)
125
+ throw new Exception("Image is too large");
126
+ byte[] dstBuf = new byte[w[0] * h[0] * ps];
127
+ int pixels = w[0] * h[0], dstPtr = 0, rgbPtr = 0;
128
+
129
+ while (pixels-- > 0) {
130
+ dstBuf[dstPtr + rindex] = (byte)((rgb[rgbPtr] >> 16) & 0xff);
131
+ dstBuf[dstPtr + gindex] = (byte)((rgb[rgbPtr] >> 8) & 0xff);
132
+ dstBuf[dstPtr + bindex] = (byte)(rgb[rgbPtr] & 0xff);
133
+ dstPtr += ps;
134
+ rgbPtr++;
135
+ }
136
+ return dstBuf;
137
+ }
138
+
139
+
140
+ static void saveImage(String fileName, byte[] srcBuf, int w, int h,
141
+ int pixelFormat) throws Exception {
142
+ BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
143
+ int pixels = w * h, srcPtr = 0;
144
+ int ps = TJ.getPixelSize(pixelFormat);
145
+ int rindex = TJ.getRedOffset(pixelFormat);
146
+ int gindex = TJ.getGreenOffset(pixelFormat);
147
+ int bindex = TJ.getBlueOffset(pixelFormat);
148
+
149
+ for (int y = 0; y < h; y++) {
150
+ for (int x = 0; x < w; x++, srcPtr += ps) {
151
+ int pixel = (srcBuf[srcPtr + rindex] & 0xff) << 16 |
152
+ (srcBuf[srcPtr + gindex] & 0xff) << 8 |
153
+ (srcBuf[srcPtr + bindex] & 0xff);
154
+
155
+ img.setRGB(x, y, pixel);
156
+ }
157
+ }
158
+ ImageIO.write(img, "bmp", new File(fileName));
159
+ }
160
+
161
+
162
+ /* Decompression test */
163
+ static void decomp(byte[] srcBuf, byte[][] jpegBuf, int[] jpegSize,
164
+ byte[] dstBuf, int w, int h, int subsamp, int jpegQual,
165
+ String fileName, int tilew, int tileh) throws Exception {
166
+ String qualStr = new String(""), sizeStr, tempStr;
167
+ TJDecompressor tjd;
168
+ double elapsed, elapsedDecode;
169
+ int ps = TJ.getPixelSize(pf), i, iter = 0;
170
+ int scaledw = sf.getScaled(w);
171
+ int scaledh = sf.getScaled(h);
172
+ int pitch = scaledw * ps;
173
+ YUVImage yuvImage = null;
174
+
175
+ if (jpegQual > 0)
176
+ qualStr = new String("_Q" + jpegQual);
177
+
178
+ tjd = new TJDecompressor();
179
+
180
+ if (dstBuf == null) {
181
+ if ((long)pitch * (long)scaledh > (long)Integer.MAX_VALUE)
182
+ throw new Exception("Image is too large");
183
+ dstBuf = new byte[pitch * scaledh];
184
+ }
185
+
186
+ /* Set the destination buffer to gray so we know whether the decompressor
187
+ attempted to write to it */
188
+ Arrays.fill(dstBuf, (byte)127);
189
+
190
+ if (doYUV) {
191
+ int width = doTile ? tilew : scaledw;
192
+ int height = doTile ? tileh : scaledh;
193
+
194
+ yuvImage = new YUVImage(width, yuvPad, height, subsamp);
195
+ Arrays.fill(yuvImage.getBuf(), (byte)127);
196
+ }
197
+
198
+ /* Benchmark */
199
+ iter = -1;
200
+ elapsed = elapsedDecode = 0.0;
201
+ while (true) {
202
+ int tile = 0;
203
+ double start = getTime();
204
+
205
+ for (int y = 0; y < h; y += tileh) {
206
+ for (int x = 0; x < w; x += tilew, tile++) {
207
+ int width = doTile ? Math.min(tilew, w - x) : scaledw;
208
+ int height = doTile ? Math.min(tileh, h - y) : scaledh;
209
+
210
+ try {
211
+ tjd.setSourceImage(jpegBuf[tile], jpegSize[tile]);
212
+ } catch (TJException e) { handleTJException(e); }
213
+ if (doYUV) {
214
+ yuvImage.setBuf(yuvImage.getBuf(), width, yuvPad, height, subsamp);
215
+ try {
216
+ tjd.decompressToYUV(yuvImage, flags);
217
+ } catch (TJException e) { handleTJException(e); }
218
+ double startDecode = getTime();
219
+ tjd.setSourceImage(yuvImage);
220
+ try {
221
+ tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags);
222
+ } catch (TJException e) { handleTJException(e); }
223
+ if (iter >= 0)
224
+ elapsedDecode += getTime() - startDecode;
225
+ } else {
226
+ try {
227
+ tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags);
228
+ } catch (TJException e) { handleTJException(e); }
229
+ }
230
+ }
231
+ }
232
+ elapsed += getTime() - start;
233
+ if (iter >= 0) {
234
+ iter++;
235
+ if (elapsed >= benchTime)
236
+ break;
237
+ } else if (elapsed >= warmup) {
238
+ iter = 0;
239
+ elapsed = elapsedDecode = 0.0;
240
+ }
241
+ }
242
+ if (doYUV)
243
+ elapsed -= elapsedDecode;
244
+
245
+ tjd = null;
246
+ for (i = 0; i < jpegBuf.length; i++)
247
+ jpegBuf[i] = null;
248
+ jpegBuf = null; jpegSize = null;
249
+ System.gc();
250
+
251
+ if (quiet != 0) {
252
+ System.out.format("%-6s%s",
253
+ sigFig((double)(w * h) / 1000000. *
254
+ (double)iter / elapsed, 4),
255
+ quiet == 2 ? "\n" : " ");
256
+ if (doYUV)
257
+ System.out.format("%s\n",
258
+ sigFig((double)(w * h) / 1000000. *
259
+ (double)iter / elapsedDecode, 4));
260
+ else if (quiet != 2)
261
+ System.out.print("\n");
262
+ } else {
263
+ System.out.format("%s --> Frame rate: %f fps\n",
264
+ (doYUV ? "Decomp to YUV" : "Decompress "),
265
+ (double)iter / elapsed);
266
+ System.out.format(" Throughput: %f Megapixels/sec\n",
267
+ (double)(w * h) / 1000000. * (double)iter / elapsed);
268
+ if (doYUV) {
269
+ System.out.format("YUV Decode --> Frame rate: %f fps\n",
270
+ (double)iter / elapsedDecode);
271
+ System.out.format(" Throughput: %f Megapixels/sec\n",
272
+ (double)(w * h) / 1000000. *
273
+ (double)iter / elapsedDecode);
274
+ }
275
+ }
276
+
277
+ if (!write) return;
278
+
279
+ if (sf.getNum() != 1 || sf.getDenom() != 1)
280
+ sizeStr = new String(sf.getNum() + "_" + sf.getDenom());
281
+ else if (tilew != w || tileh != h)
282
+ sizeStr = new String(tilew + "x" + tileh);
283
+ else
284
+ sizeStr = new String("full");
285
+ if (decompOnly)
286
+ tempStr = new String(fileName + "_" + sizeStr + ".bmp");
287
+ else
288
+ tempStr = new String(fileName + "_" + SUBNAME[subsamp] + qualStr +
289
+ "_" + sizeStr + ".bmp");
290
+
291
+ saveImage(tempStr, dstBuf, scaledw, scaledh, pf);
292
+ int ndx = tempStr.lastIndexOf('.');
293
+ tempStr = new String(tempStr.substring(0, ndx) + "-err.bmp");
294
+ if (srcBuf != null && sf.getNum() == 1 && sf.getDenom() == 1) {
295
+ if (quiet == 0)
296
+ System.out.println("Compression error written to " + tempStr + ".");
297
+ if (subsamp == TJ.SAMP_GRAY) {
298
+ for (int y = 0, index = 0; y < h; y++, index += pitch) {
299
+ for (int x = 0, index2 = index; x < w; x++, index2 += ps) {
300
+ int rindex = index2 + TJ.getRedOffset(pf);
301
+ int gindex = index2 + TJ.getGreenOffset(pf);
302
+ int bindex = index2 + TJ.getBlueOffset(pf);
303
+ int lum = (int)((double)(srcBuf[rindex] & 0xff) * 0.299 +
304
+ (double)(srcBuf[gindex] & 0xff) * 0.587 +
305
+ (double)(srcBuf[bindex] & 0xff) * 0.114 + 0.5);
306
+
307
+ if (lum > 255) lum = 255;
308
+ if (lum < 0) lum = 0;
309
+ dstBuf[rindex] = (byte)Math.abs((dstBuf[rindex] & 0xff) - lum);
310
+ dstBuf[gindex] = (byte)Math.abs((dstBuf[gindex] & 0xff) - lum);
311
+ dstBuf[bindex] = (byte)Math.abs((dstBuf[bindex] & 0xff) - lum);
312
+ }
313
+ }
314
+ } else {
315
+ for (int y = 0; y < h; y++)
316
+ for (int x = 0; x < w * ps; x++)
317
+ dstBuf[pitch * y + x] =
318
+ (byte)Math.abs((dstBuf[pitch * y + x] & 0xff) -
319
+ (srcBuf[pitch * y + x] & 0xff));
320
+ }
321
+ saveImage(tempStr, dstBuf, w, h, pf);
322
+ }
323
+ }
324
+
325
+
326
+ static void fullTest(byte[] srcBuf, int w, int h, int subsamp, int jpegQual,
327
+ String fileName) throws Exception {
328
+ TJCompressor tjc;
329
+ byte[] tmpBuf;
330
+ byte[][] jpegBuf;
331
+ int[] jpegSize;
332
+ double start, elapsed, elapsedEncode;
333
+ int totalJpegSize = 0, tilew, tileh, i, iter;
334
+ int ps = TJ.getPixelSize(pf);
335
+ int ntilesw = 1, ntilesh = 1, pitch = w * ps;
336
+ String pfStr = PIXFORMATSTR[pf];
337
+ YUVImage yuvImage = null;
338
+
339
+ if ((long)pitch * (long)h > (long)Integer.MAX_VALUE)
340
+ throw new Exception("Image is too large");
341
+ tmpBuf = new byte[pitch * h];
342
+
343
+ if (quiet == 0)
344
+ System.out.format(">>>>> %s (%s) <--> JPEG %s Q%d <<<<<\n", pfStr,
345
+ (flags & TJ.FLAG_BOTTOMUP) != 0 ?
346
+ "Bottom-up" : "Top-down",
347
+ SUBNAME_LONG[subsamp], jpegQual);
348
+
349
+ tjc = new TJCompressor();
350
+
351
+ for (tilew = doTile ? 8 : w, tileh = doTile ? 8 : h; ;
352
+ tilew *= 2, tileh *= 2) {
353
+ if (tilew > w)
354
+ tilew = w;
355
+ if (tileh > h)
356
+ tileh = h;
357
+ ntilesw = (w + tilew - 1) / tilew;
358
+ ntilesh = (h + tileh - 1) / tileh;
359
+
360
+ jpegBuf = new byte[ntilesw * ntilesh][TJ.bufSize(tilew, tileh, subsamp)];
361
+ jpegSize = new int[ntilesw * ntilesh];
362
+
363
+ /* Compression test */
364
+ if (quiet == 1)
365
+ System.out.format("%-4s (%s) %-5s %-3d ", pfStr,
366
+ (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD",
367
+ SUBNAME_LONG[subsamp], jpegQual);
368
+ for (i = 0; i < h; i++)
369
+ System.arraycopy(srcBuf, w * ps * i, tmpBuf, pitch * i, w * ps);
370
+ tjc.setJPEGQuality(jpegQual);
371
+ tjc.setSubsamp(subsamp);
372
+
373
+ if (doYUV) {
374
+ yuvImage = new YUVImage(tilew, yuvPad, tileh, subsamp);
375
+ Arrays.fill(yuvImage.getBuf(), (byte)127);
376
+ }
377
+
378
+ /* Benchmark */
379
+ iter = -1;
380
+ elapsed = elapsedEncode = 0.0;
381
+ while (true) {
382
+ int tile = 0;
383
+
384
+ totalJpegSize = 0;
385
+ start = getTime();
386
+ for (int y = 0; y < h; y += tileh) {
387
+ for (int x = 0; x < w; x += tilew, tile++) {
388
+ int width = Math.min(tilew, w - x);
389
+ int height = Math.min(tileh, h - y);
390
+
391
+ tjc.setSourceImage(srcBuf, x, y, width, pitch, height, pf);
392
+ if (doYUV) {
393
+ double startEncode = getTime();
394
+
395
+ yuvImage.setBuf(yuvImage.getBuf(), width, yuvPad, height,
396
+ subsamp);
397
+ tjc.encodeYUV(yuvImage, flags);
398
+ if (iter >= 0)
399
+ elapsedEncode += getTime() - startEncode;
400
+ tjc.setSourceImage(yuvImage);
401
+ }
402
+ tjc.compress(jpegBuf[tile], flags);
403
+ jpegSize[tile] = tjc.getCompressedSize();
404
+ totalJpegSize += jpegSize[tile];
405
+ }
406
+ }
407
+ elapsed += getTime() - start;
408
+ if (iter >= 0) {
409
+ iter++;
410
+ if (elapsed >= benchTime)
411
+ break;
412
+ } else if (elapsed >= warmup) {
413
+ iter = 0;
414
+ elapsed = elapsedEncode = 0.0;
415
+ }
416
+ }
417
+ if (doYUV)
418
+ elapsed -= elapsedEncode;
419
+
420
+ if (quiet == 1)
421
+ System.out.format("%-5d %-5d ", tilew, tileh);
422
+ if (quiet != 0) {
423
+ if (doYUV)
424
+ System.out.format("%-6s%s",
425
+ sigFig((double)(w * h) / 1000000. *
426
+ (double)iter / elapsedEncode, 4),
427
+ quiet == 2 ? "\n" : " ");
428
+ System.out.format("%-6s%s",
429
+ sigFig((double)(w * h) / 1000000. *
430
+ (double)iter / elapsed, 4),
431
+ quiet == 2 ? "\n" : " ");
432
+ System.out.format("%-6s%s",
433
+ sigFig((double)(w * h * ps) / (double)totalJpegSize,
434
+ 4),
435
+ quiet == 2 ? "\n" : " ");
436
+ } else {
437
+ System.out.format("\n%s size: %d x %d\n", doTile ? "Tile" : "Image",
438
+ tilew, tileh);
439
+ if (doYUV) {
440
+ System.out.format("Encode YUV --> Frame rate: %f fps\n",
441
+ (double)iter / elapsedEncode);
442
+ System.out.format(" Output image size: %d bytes\n",
443
+ yuvImage.getSize());
444
+ System.out.format(" Compression ratio: %f:1\n",
445
+ (double)(w * h * ps) / (double)yuvImage.getSize());
446
+ System.out.format(" Throughput: %f Megapixels/sec\n",
447
+ (double)(w * h) / 1000000. *
448
+ (double)iter / elapsedEncode);
449
+ System.out.format(" Output bit stream: %f Megabits/sec\n",
450
+ (double)yuvImage.getSize() * 8. / 1000000. *
451
+ (double)iter / elapsedEncode);
452
+ }
453
+ System.out.format("%s --> Frame rate: %f fps\n",
454
+ doYUV ? "Comp from YUV" : "Compress ",
455
+ (double)iter / elapsed);
456
+ System.out.format(" Output image size: %d bytes\n",
457
+ totalJpegSize);
458
+ System.out.format(" Compression ratio: %f:1\n",
459
+ (double)(w * h * ps) / (double)totalJpegSize);
460
+ System.out.format(" Throughput: %f Megapixels/sec\n",
461
+ (double)(w * h) / 1000000. * (double)iter / elapsed);
462
+ System.out.format(" Output bit stream: %f Megabits/sec\n",
463
+ (double)totalJpegSize * 8. / 1000000. *
464
+ (double)iter / elapsed);
465
+ }
466
+ if (tilew == w && tileh == h && write) {
467
+ String tempStr = fileName + "_" + SUBNAME[subsamp] + "_" + "Q" +
468
+ jpegQual + ".jpg";
469
+ FileOutputStream fos = new FileOutputStream(tempStr);
470
+
471
+ fos.write(jpegBuf[0], 0, jpegSize[0]);
472
+ fos.close();
473
+ if (quiet == 0)
474
+ System.out.println("Reference image written to " + tempStr);
475
+ }
476
+
477
+ /* Decompression test */
478
+ if (!compOnly)
479
+ decomp(srcBuf, jpegBuf, jpegSize, tmpBuf, w, h, subsamp, jpegQual,
480
+ fileName, tilew, tileh);
481
+ else if (quiet == 1)
482
+ System.out.println("N/A");
483
+
484
+ if (tilew == w && tileh == h) break;
485
+ }
486
+ }
487
+
488
+
489
+ static void decompTest(String fileName) throws Exception {
490
+ TJTransformer tjt;
491
+ byte[][] jpegBuf = null;
492
+ byte[] srcBuf;
493
+ int[] jpegSize = null;
494
+ int totalJpegSize;
495
+ double start, elapsed;
496
+ int ps = TJ.getPixelSize(pf), tile, x, y, iter;
497
+ // Original image
498
+ int w = 0, h = 0, ntilesw = 1, ntilesh = 1, subsamp = -1, cs = -1;
499
+ // Transformed image
500
+ int tw, th, ttilew, ttileh, tntilesw, tntilesh, tsubsamp;
501
+
502
+ FileInputStream fis = new FileInputStream(fileName);
503
+ if (fis.getChannel().size() > (long)Integer.MAX_VALUE)
504
+ throw new Exception("Image is too large");
505
+ int srcSize = (int)fis.getChannel().size();
506
+ srcBuf = new byte[srcSize];
507
+ fis.read(srcBuf, 0, srcSize);
508
+ fis.close();
509
+
510
+ int index = fileName.lastIndexOf('.');
511
+ if (index >= 0)
512
+ fileName = new String(fileName.substring(0, index));
513
+
514
+ tjt = new TJTransformer();
515
+
516
+ try {
517
+ tjt.setSourceImage(srcBuf, srcSize);
518
+ } catch (TJException e) { handleTJException(e); }
519
+ w = tjt.getWidth();
520
+ h = tjt.getHeight();
521
+ subsamp = tjt.getSubsamp();
522
+ cs = tjt.getColorspace();
523
+
524
+ if (quiet == 1) {
525
+ System.out.println("All performance values in Mpixels/sec\n");
526
+ System.out.format("Bitmap JPEG JPEG %s %s Xform Comp Decomp ",
527
+ (doTile ? "Tile " : "Image"),
528
+ (doTile ? "Tile " : "Image"));
529
+ if (doYUV)
530
+ System.out.print("Decode");
531
+ System.out.print("\n");
532
+ System.out.print("Format CS Subsamp Width Height Perf Ratio Perf ");
533
+ if (doYUV)
534
+ System.out.print("Perf");
535
+ System.out.println("\n");
536
+ } else if (quiet == 0)
537
+ System.out.format(">>>>> JPEG %s --> %s (%s) <<<<<\n",
538
+ formatName(subsamp, cs), PIXFORMATSTR[pf],
539
+ (flags & TJ.FLAG_BOTTOMUP) != 0 ?
540
+ "Bottom-up" : "Top-down");
541
+
542
+ for (int tilew = doTile ? 16 : w, tileh = doTile ? 16 : h; ;
543
+ tilew *= 2, tileh *= 2) {
544
+ if (tilew > w)
545
+ tilew = w;
546
+ if (tileh > h)
547
+ tileh = h;
548
+ ntilesw = (w + tilew - 1) / tilew;
549
+ ntilesh = (h + tileh - 1) / tileh;
550
+
551
+ tw = w; th = h; ttilew = tilew; ttileh = tileh;
552
+ if (quiet == 0) {
553
+ System.out.format("\n%s size: %d x %d", (doTile ? "Tile" : "Image"),
554
+ ttilew, ttileh);
555
+ if (sf.getNum() != 1 || sf.getDenom() != 1)
556
+ System.out.format(" --> %d x %d", sf.getScaled(tw),
557
+ sf.getScaled(th));
558
+ System.out.println("");
559
+ } else if (quiet == 1) {
560
+ System.out.format("%-4s (%s) %-5s %-5s ", PIXFORMATSTR[pf],
561
+ (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD",
562
+ CSNAME[cs], SUBNAME_LONG[subsamp]);
563
+ System.out.format("%-5d %-5d ", tilew, tileh);
564
+ }
565
+
566
+ tsubsamp = subsamp;
567
+ if (doTile || xformOp != TJTransform.OP_NONE || xformOpt != 0) {
568
+ if (xformOp == TJTransform.OP_TRANSPOSE ||
569
+ xformOp == TJTransform.OP_TRANSVERSE ||
570
+ xformOp == TJTransform.OP_ROT90 ||
571
+ xformOp == TJTransform.OP_ROT270) {
572
+ tw = h; th = w; ttilew = tileh; ttileh = tilew;
573
+ }
574
+
575
+ if ((xformOpt & TJTransform.OPT_GRAY) != 0)
576
+ tsubsamp = TJ.SAMP_GRAY;
577
+ if (xformOp == TJTransform.OP_HFLIP ||
578
+ xformOp == TJTransform.OP_ROT180)
579
+ tw = tw - (tw % TJ.getMCUWidth(tsubsamp));
580
+ if (xformOp == TJTransform.OP_VFLIP ||
581
+ xformOp == TJTransform.OP_ROT180)
582
+ th = th - (th % TJ.getMCUHeight(tsubsamp));
583
+ if (xformOp == TJTransform.OP_TRANSVERSE ||
584
+ xformOp == TJTransform.OP_ROT90)
585
+ tw = tw - (tw % TJ.getMCUHeight(tsubsamp));
586
+ if (xformOp == TJTransform.OP_TRANSVERSE ||
587
+ xformOp == TJTransform.OP_ROT270)
588
+ th = th - (th % TJ.getMCUWidth(tsubsamp));
589
+ tntilesw = (tw + ttilew - 1) / ttilew;
590
+ tntilesh = (th + ttileh - 1) / ttileh;
591
+
592
+ if (xformOp == TJTransform.OP_TRANSPOSE ||
593
+ xformOp == TJTransform.OP_TRANSVERSE ||
594
+ xformOp == TJTransform.OP_ROT90 ||
595
+ xformOp == TJTransform.OP_ROT270) {
596
+ if (tsubsamp == TJ.SAMP_422)
597
+ tsubsamp = TJ.SAMP_440;
598
+ else if (tsubsamp == TJ.SAMP_440)
599
+ tsubsamp = TJ.SAMP_422;
600
+ }
601
+
602
+ TJTransform[] t = new TJTransform[tntilesw * tntilesh];
603
+ jpegBuf =
604
+ new byte[tntilesw * tntilesh][TJ.bufSize(ttilew, ttileh, subsamp)];
605
+
606
+ for (y = 0, tile = 0; y < th; y += ttileh) {
607
+ for (x = 0; x < tw; x += ttilew, tile++) {
608
+ t[tile] = new TJTransform();
609
+ t[tile].width = Math.min(ttilew, tw - x);
610
+ t[tile].height = Math.min(ttileh, th - y);
611
+ t[tile].x = x;
612
+ t[tile].y = y;
613
+ t[tile].op = xformOp;
614
+ t[tile].options = xformOpt | TJTransform.OPT_TRIM;
615
+ if ((t[tile].options & TJTransform.OPT_NOOUTPUT) != 0 &&
616
+ jpegBuf[tile] != null)
617
+ jpegBuf[tile] = null;
618
+ }
619
+ }
620
+
621
+ iter = -1;
622
+ elapsed = 0.;
623
+ while (true) {
624
+ start = getTime();
625
+ try {
626
+ tjt.transform(jpegBuf, t, flags);
627
+ } catch (TJException e) { handleTJException(e); }
628
+ jpegSize = tjt.getTransformedSizes();
629
+ elapsed += getTime() - start;
630
+ if (iter >= 0) {
631
+ iter++;
632
+ if (elapsed >= benchTime)
633
+ break;
634
+ } else if (elapsed >= warmup) {
635
+ iter = 0;
636
+ elapsed = 0.0;
637
+ }
638
+ }
639
+ t = null;
640
+
641
+ for (tile = 0, totalJpegSize = 0; tile < tntilesw * tntilesh; tile++)
642
+ totalJpegSize += jpegSize[tile];
643
+
644
+ if (quiet != 0) {
645
+ System.out.format("%-6s%s%-6s%s",
646
+ sigFig((double)(w * h) / 1000000. / elapsed, 4),
647
+ quiet == 2 ? "\n" : " ",
648
+ sigFig((double)(w * h * ps) /
649
+ (double)totalJpegSize, 4),
650
+ quiet == 2 ? "\n" : " ");
651
+ } else if (quiet == 0) {
652
+ System.out.format("Transform --> Frame rate: %f fps\n",
653
+ 1.0 / elapsed);
654
+ System.out.format(" Output image size: %d bytes\n",
655
+ totalJpegSize);
656
+ System.out.format(" Compression ratio: %f:1\n",
657
+ (double)(w * h * ps) / (double)totalJpegSize);
658
+ System.out.format(" Throughput: %f Megapixels/sec\n",
659
+ (double)(w * h) / 1000000. / elapsed);
660
+ System.out.format(" Output bit stream: %f Megabits/sec\n",
661
+ (double)totalJpegSize * 8. / 1000000. / elapsed);
662
+ }
663
+ } else {
664
+ if (quiet == 1)
665
+ System.out.print("N/A N/A ");
666
+ jpegBuf = new byte[1][TJ.bufSize(ttilew, ttileh, subsamp)];
667
+ jpegSize = new int[1];
668
+ jpegBuf[0] = srcBuf;
669
+ jpegSize[0] = srcSize;
670
+ }
671
+
672
+ if (w == tilew)
673
+ ttilew = tw;
674
+ if (h == tileh)
675
+ ttileh = th;
676
+ if ((xformOpt & TJTransform.OPT_NOOUTPUT) == 0)
677
+ decomp(null, jpegBuf, jpegSize, null, tw, th, tsubsamp, 0,
678
+ fileName, ttilew, ttileh);
679
+ else if (quiet == 1)
680
+ System.out.println("N/A");
681
+
682
+ jpegBuf = null;
683
+ jpegSize = null;
684
+
685
+ if (tilew == w && tileh == h) break;
686
+ }
687
+ }
688
+
689
+
690
+ static void usage() throws Exception {
691
+ int i;
692
+ TJScalingFactor[] scalingFactors = TJ.getScalingFactors();
693
+ int nsf = scalingFactors.length;
694
+ String className = new TJBench().getClass().getName();
695
+
696
+ System.out.println("\nUSAGE: java " + className);
697
+ System.out.println(" <Inputfile (BMP)> <Quality> [options]\n");
698
+ System.out.println(" java " + className);
699
+ System.out.println(" <Inputfile (JPG)> [options]\n");
700
+ System.out.println("Options:\n");
701
+ System.out.println("-alloc = Dynamically allocate JPEG image buffers");
702
+ System.out.println("-bottomup = Test bottom-up compression/decompression");
703
+ System.out.println("-tile = Test performance of the codec when the image is encoded as separate");
704
+ System.out.println(" tiles of varying sizes.");
705
+ System.out.println("-rgb, -bgr, -rgbx, -bgrx, -xbgr, -xrgb =");
706
+ System.out.println(" Test the specified color conversion path in the codec (default = BGR)");
707
+ System.out.println("-fastupsample = Use the fastest chrominance upsampling algorithm available in");
708
+ System.out.println(" the underlying codec");
709
+ System.out.println("-fastdct = Use the fastest DCT/IDCT algorithms available in the underlying");
710
+ System.out.println(" codec");
711
+ System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the");
712
+ System.out.println(" underlying codec");
713
+ System.out.println("-progressive = Use progressive entropy coding in JPEG images generated by");
714
+ System.out.println(" compression and transform operations.");
715
+ System.out.println("-subsamp <s> = When testing JPEG compression, this option specifies the level");
716
+ System.out.println(" of chrominance subsampling to use (<s> = 444, 422, 440, 420, 411, or");
717
+ System.out.println(" GRAY). The default is to test Grayscale, 4:2:0, 4:2:2, and 4:4:4 in");
718
+ System.out.println(" sequence.");
719
+ System.out.println("-quiet = Output results in tabular rather than verbose format");
720
+ System.out.println("-yuv = Test YUV encoding/decoding functions");
721
+ System.out.println("-yuvpad <p> = If testing YUV encoding/decoding, this specifies the number of");
722
+ System.out.println(" bytes to which each row of each plane in the intermediate YUV image is");
723
+ System.out.println(" padded (default = 1)");
724
+ System.out.println("-scale M/N = Scale down the width/height of the decompressed JPEG image by a");
725
+ System.out.print(" factor of M/N (M/N = ");
726
+ for (i = 0; i < nsf; i++) {
727
+ System.out.format("%d/%d", scalingFactors[i].getNum(),
728
+ scalingFactors[i].getDenom());
729
+ if (nsf == 2 && i != nsf - 1)
730
+ System.out.print(" or ");
731
+ else if (nsf > 2) {
732
+ if (i != nsf - 1)
733
+ System.out.print(", ");
734
+ if (i == nsf - 2)
735
+ System.out.print("or ");
736
+ }
737
+ if (i % 8 == 0 && i != 0)
738
+ System.out.print("\n ");
739
+ }
740
+ System.out.println(")");
741
+ System.out.println("-hflip, -vflip, -transpose, -transverse, -rot90, -rot180, -rot270 =");
742
+ System.out.println(" Perform the corresponding lossless transform prior to");
743
+ System.out.println(" decompression (these options are mutually exclusive)");
744
+ System.out.println("-grayscale = Perform lossless grayscale conversion prior to decompression");
745
+ System.out.println(" test (can be combined with the other transforms above)");
746
+ System.out.println("-copynone = Do not copy any extra markers (including EXIF and ICC profile data)");
747
+ System.out.println(" when transforming the image.");
748
+ System.out.println("-benchtime <t> = Run each benchmark for at least <t> seconds (default = 5.0)");
749
+ System.out.println("-warmup <t> = Run each benchmark for <t> seconds (default = 1.0) prior to");
750
+ System.out.println(" starting the timer, in order to prime the caches and thus improve the");
751
+ System.out.println(" consistency of the results.");
752
+ System.out.println("-componly = Stop after running compression tests. Do not test decompression.");
753
+ System.out.println("-nowrite = Do not write reference or output images (improves consistency");
754
+ System.out.println(" of performance measurements.)");
755
+ System.out.println("-stoponwarning = Immediately discontinue the current");
756
+ System.out.println(" compression/decompression/transform operation if the underlying codec");
757
+ System.out.println(" throws a warning (non-fatal error)\n");
758
+ System.out.println("NOTE: If the quality is specified as a range (e.g. 90-100), a separate");
759
+ System.out.println("test will be performed for all quality values in the range.\n");
760
+ System.exit(1);
761
+ }
762
+
763
+
764
+ public static void main(String[] argv) {
765
+ byte[] srcBuf = null;
766
+ int w = 0, h = 0, minQual = -1, maxQual = -1;
767
+ int minArg = 1, retval = 0;
768
+ int subsamp = -1;
769
+
770
+ try {
771
+
772
+ if (argv.length < minArg)
773
+ usage();
774
+
775
+ String tempStr = argv[0].toLowerCase();
776
+ if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg"))
777
+ decompOnly = true;
778
+
779
+ System.out.println("");
780
+
781
+ if (!decompOnly) {
782
+ minArg = 2;
783
+ if (argv.length < minArg)
784
+ usage();
785
+ try {
786
+ minQual = Integer.parseInt(argv[1]);
787
+ } catch (NumberFormatException e) {}
788
+ if (minQual < 1 || minQual > 100)
789
+ throw new Exception("Quality must be between 1 and 100.");
790
+ int dashIndex = argv[1].indexOf('-');
791
+ if (dashIndex > 0 && argv[1].length() > dashIndex + 1) {
792
+ try {
793
+ maxQual = Integer.parseInt(argv[1].substring(dashIndex + 1));
794
+ } catch (NumberFormatException e) {}
795
+ }
796
+ if (maxQual < 1 || maxQual > 100)
797
+ maxQual = minQual;
798
+ }
799
+
800
+ if (argv.length > minArg) {
801
+ for (int i = minArg; i < argv.length; i++) {
802
+ if (argv[i].equalsIgnoreCase("-tile")) {
803
+ doTile = true; xformOpt |= TJTransform.OPT_CROP;
804
+ } else if (argv[i].equalsIgnoreCase("-fastupsample")) {
805
+ System.out.println("Using fast upsampling code\n");
806
+ flags |= TJ.FLAG_FASTUPSAMPLE;
807
+ } else if (argv[i].equalsIgnoreCase("-fastdct")) {
808
+ System.out.println("Using fastest DCT/IDCT algorithm\n");
809
+ flags |= TJ.FLAG_FASTDCT;
810
+ } else if (argv[i].equalsIgnoreCase("-accuratedct")) {
811
+ System.out.println("Using most accurate DCT/IDCT algorithm\n");
812
+ flags |= TJ.FLAG_ACCURATEDCT;
813
+ } else if (argv[i].equalsIgnoreCase("-progressive")) {
814
+ System.out.println("Using progressive entropy coding\n");
815
+ flags |= TJ.FLAG_PROGRESSIVE;
816
+ } else if (argv[i].equalsIgnoreCase("-rgb"))
817
+ pf = TJ.PF_RGB;
818
+ else if (argv[i].equalsIgnoreCase("-rgbx"))
819
+ pf = TJ.PF_RGBX;
820
+ else if (argv[i].equalsIgnoreCase("-bgr"))
821
+ pf = TJ.PF_BGR;
822
+ else if (argv[i].equalsIgnoreCase("-bgrx"))
823
+ pf = TJ.PF_BGRX;
824
+ else if (argv[i].equalsIgnoreCase("-xbgr"))
825
+ pf = TJ.PF_XBGR;
826
+ else if (argv[i].equalsIgnoreCase("-xrgb"))
827
+ pf = TJ.PF_XRGB;
828
+ else if (argv[i].equalsIgnoreCase("-bottomup"))
829
+ flags |= TJ.FLAG_BOTTOMUP;
830
+ else if (argv[i].equalsIgnoreCase("-quiet"))
831
+ quiet = 1;
832
+ else if (argv[i].equalsIgnoreCase("-qq"))
833
+ quiet = 2;
834
+ else if (argv[i].equalsIgnoreCase("-scale") && i < argv.length - 1) {
835
+ int temp1 = 0, temp2 = 0;
836
+ boolean match = false, scanned = true;
837
+ Scanner scanner = new Scanner(argv[++i]).useDelimiter("/");
838
+
839
+ try {
840
+ temp1 = scanner.nextInt();
841
+ temp2 = scanner.nextInt();
842
+ } catch (Exception e) {}
843
+ if (temp2 <= 0) temp2 = 1;
844
+ if (temp1 > 0) {
845
+ TJScalingFactor[] scalingFactors = TJ.getScalingFactors();
846
+
847
+ for (int j = 0; j < scalingFactors.length; j++) {
848
+ if ((double)temp1 / (double)temp2 ==
849
+ (double)scalingFactors[j].getNum() /
850
+ (double)scalingFactors[j].getDenom()) {
851
+ sf = scalingFactors[j];
852
+ match = true; break;
853
+ }
854
+ }
855
+ if (!match) usage();
856
+ } else
857
+ usage();
858
+ } else if (argv[i].equalsIgnoreCase("-hflip"))
859
+ xformOp = TJTransform.OP_HFLIP;
860
+ else if (argv[i].equalsIgnoreCase("-vflip"))
861
+ xformOp = TJTransform.OP_VFLIP;
862
+ else if (argv[i].equalsIgnoreCase("-transpose"))
863
+ xformOp = TJTransform.OP_TRANSPOSE;
864
+ else if (argv[i].equalsIgnoreCase("-transverse"))
865
+ xformOp = TJTransform.OP_TRANSVERSE;
866
+ else if (argv[i].equalsIgnoreCase("-rot90"))
867
+ xformOp = TJTransform.OP_ROT90;
868
+ else if (argv[i].equalsIgnoreCase("-rot180"))
869
+ xformOp = TJTransform.OP_ROT180;
870
+ else if (argv[i].equalsIgnoreCase("-rot270"))
871
+ xformOp = TJTransform.OP_ROT270;
872
+ else if (argv[i].equalsIgnoreCase("-grayscale"))
873
+ xformOpt |= TJTransform.OPT_GRAY;
874
+ else if (argv[i].equalsIgnoreCase("-nooutput"))
875
+ xformOpt |= TJTransform.OPT_NOOUTPUT;
876
+ else if (argv[i].equalsIgnoreCase("-copynone"))
877
+ xformOpt |= TJTransform.OPT_COPYNONE;
878
+ else if (argv[i].equalsIgnoreCase("-benchtime") &&
879
+ i < argv.length - 1) {
880
+ double temp = -1;
881
+
882
+ try {
883
+ temp = Double.parseDouble(argv[++i]);
884
+ } catch (NumberFormatException e) {}
885
+ if (temp > 0.0)
886
+ benchTime = temp;
887
+ else
888
+ usage();
889
+ } else if (argv[i].equalsIgnoreCase("-warmup") &&
890
+ i < argv.length - 1) {
891
+ double temp = -1;
892
+
893
+ try {
894
+ temp = Double.parseDouble(argv[++i]);
895
+ } catch (NumberFormatException e) {}
896
+ if (temp >= 0.0) {
897
+ warmup = temp;
898
+ System.out.format("Warmup time = %.1f seconds\n\n", warmup);
899
+ } else
900
+ usage();
901
+ } else if (argv[i].equalsIgnoreCase("-yuv")) {
902
+ System.out.println("Testing YUV planar encoding/decoding\n");
903
+ doYUV = true;
904
+ } else if (argv[i].equalsIgnoreCase("-yuvpad") &&
905
+ i < argv.length - 1) {
906
+ int temp = 0;
907
+
908
+ try {
909
+ temp = Integer.parseInt(argv[++i]);
910
+ } catch (NumberFormatException e) {}
911
+ if (temp >= 1)
912
+ yuvPad = temp;
913
+ } else if (argv[i].equalsIgnoreCase("-subsamp") &&
914
+ i < argv.length - 1) {
915
+ i++;
916
+ if (argv[i].toUpperCase().startsWith("G"))
917
+ subsamp = TJ.SAMP_GRAY;
918
+ else if (argv[i].equals("444"))
919
+ subsamp = TJ.SAMP_444;
920
+ else if (argv[i].equals("422"))
921
+ subsamp = TJ.SAMP_422;
922
+ else if (argv[i].equals("440"))
923
+ subsamp = TJ.SAMP_440;
924
+ else if (argv[i].equals("420"))
925
+ subsamp = TJ.SAMP_420;
926
+ else if (argv[i].equals("411"))
927
+ subsamp = TJ.SAMP_411;
928
+ } else if (argv[i].equalsIgnoreCase("-componly"))
929
+ compOnly = true;
930
+ else if (argv[i].equalsIgnoreCase("-nowrite"))
931
+ write = false;
932
+ else if (argv[i].equalsIgnoreCase("-stoponwarning"))
933
+ flags |= TJ.FLAG_STOPONWARNING;
934
+ else usage();
935
+ }
936
+ }
937
+
938
+ if (sf == null)
939
+ sf = new TJScalingFactor(1, 1);
940
+
941
+ if ((sf.getNum() != 1 || sf.getDenom() != 1) && doTile) {
942
+ System.out.println("Disabling tiled compression/decompression tests, because those tests do not");
943
+ System.out.println("work when scaled decompression is enabled.");
944
+ doTile = false;
945
+ }
946
+
947
+ if (!decompOnly) {
948
+ int[] width = new int[1], height = new int[1];
949
+
950
+ srcBuf = loadImage(argv[0], width, height, pf);
951
+ w = width[0]; h = height[0];
952
+ int index = -1;
953
+ if ((index = argv[0].lastIndexOf('.')) >= 0)
954
+ argv[0] = argv[0].substring(0, index);
955
+ }
956
+
957
+ if (quiet == 1 && !decompOnly) {
958
+ System.out.println("All performance values in Mpixels/sec\n");
959
+ System.out.format("Bitmap JPEG JPEG %s %s ",
960
+ (doTile ? "Tile " : "Image"),
961
+ (doTile ? "Tile " : "Image"));
962
+ if (doYUV)
963
+ System.out.print("Encode ");
964
+ System.out.print("Comp Comp Decomp ");
965
+ if (doYUV)
966
+ System.out.print("Decode");
967
+ System.out.print("\n");
968
+ System.out.print("Format Subsamp Qual Width Height ");
969
+ if (doYUV)
970
+ System.out.print("Perf ");
971
+ System.out.print("Perf Ratio Perf ");
972
+ if (doYUV)
973
+ System.out.print("Perf");
974
+ System.out.println("\n");
975
+ }
976
+
977
+ if (decompOnly) {
978
+ decompTest(argv[0]);
979
+ System.out.println("");
980
+ System.exit(retval);
981
+ }
982
+
983
+ System.gc();
984
+ if (subsamp >= 0 && subsamp < TJ.NUMSAMP) {
985
+ for (int i = maxQual; i >= minQual; i--)
986
+ fullTest(srcBuf, w, h, subsamp, i, argv[0]);
987
+ System.out.println("");
988
+ } else {
989
+ for (int i = maxQual; i >= minQual; i--)
990
+ fullTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]);
991
+ System.out.println("");
992
+ System.gc();
993
+ for (int i = maxQual; i >= minQual; i--)
994
+ fullTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]);
995
+ System.out.println("");
996
+ System.gc();
997
+ for (int i = maxQual; i >= minQual; i--)
998
+ fullTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]);
999
+ System.out.println("");
1000
+ System.gc();
1001
+ for (int i = maxQual; i >= minQual; i--)
1002
+ fullTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]);
1003
+ System.out.println("");
1004
+ }
1005
+
1006
+ } catch (Exception e) {
1007
+ if (e instanceof TJException) {
1008
+ TJException tje = (TJException)e;
1009
+
1010
+ System.out.println((tje.getErrorCode() == TJ.ERR_WARNING ?
1011
+ "WARNING: " : "ERROR: ") + tje.getMessage());
1012
+ } else
1013
+ System.out.println("ERROR: " + e.getMessage());
1014
+ e.printStackTrace();
1015
+ retval = -1;
1016
+ }
1017
+
1018
+ System.exit(retval);
1019
+ }
1020
+
1021
+ }